diff --git a/docs/integrations/data-ingestion/clickpipes/kafka/index.md b/docs/integrations/data-ingestion/clickpipes/kafka/index.md index 7022039e647..d02835dbce0 100644 --- a/docs/integrations/data-ingestion/clickpipes/kafka/index.md +++ b/docs/integrations/data-ingestion/clickpipes/kafka/index.md @@ -15,9 +15,9 @@ keywords: ['Kafka ClickPipes', 'Apache Kafka', 'streaming ingestion', 'real-time | Page | Description | |-----|-----| -| [Reference](/integrations/clickpipes/kafka/reference) | Details supported formats, sources, delivery semantics, authentication and experimental features supported by Kafka ClickPipes | -| [Schema registries for Kafka ClickPipe](/integrations/clickpipes/kafka/schema-registries) | How to integrate for ClickPipes with a schema registry for schema management | | [Creating your first Kafka ClickPipe](/integrations/clickpipes/kafka/create-your-first-kafka-clickpipe) | Step-by-step guide to creating your first Kafka ClickPipe. | -| [Kafka ClickPipes FAQ](/integrations/clickpipes/kafka/faq) | Frequently asked questions about ClickPipes for Kafka | +| [Schema registries for Kafka ClickPipe](/integrations/clickpipes/kafka/schema-registries) | How to integrate for ClickPipes with a schema registry for schema management | +| [Reference](/integrations/clickpipes/kafka/reference) | Details supported formats, sources, delivery semantics, authentication and experimental features supported by Kafka ClickPipes | | [Best practices](/integrations/clickpipes/kafka/best-practices) | Details best practices to follow when working with Kafka ClickPipes | +| [Kafka ClickPipes FAQ](/integrations/clickpipes/kafka/faq) | Frequently asked questions about ClickPipes for Kafka | \ No newline at end of file diff --git a/gt-lock.json b/gt-lock.json index 1f746dd8d5f..3252cd928d2 100644 --- a/gt-lock.json +++ b/gt-lock.json @@ -35,161 +35,172 @@ "jp": { "updatedAt": "2025-11-26T07:24:12.065Z" } + }, + "89619e87afb3075fb8d7e908131d96b27f2ee4544b802e747e4ac0033cbb7775": { + "jp": { + "updatedAt": "2025-11-29T02:56:02.514Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:02.516Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:56:02.517Z" + } } }, "24bb0ca99917fdfda706556c75c640db16b12f966ea7bd58e1e9a8bdf4be5146": { "40c867ec4bd9ff53ca41f19ef2fb11bce1cd4d6f82211f50a350bacfd56350a1": { "jp": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.546Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.547Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.534Z" } } }, "2f81498e8b60c281ca710a3a25f611bf79424982fa85bce630e1d4182f252536": { "e5431d96bed4f0f93b507ffa84836d28b1d715ac31c199864a10370ec3b6f040": { "jp": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.523Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:56:02.483Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.529Z" } } }, "37e1e1dcfe884bd88e97aa22d6ed7fc14323b326449d12f0a5644f15bd4ba087": { "bd75344d33495d82bb1ddbeeb77d5b1f53a6ecb5f788cb9eadaa606a67b5ba96": { "jp": { - "updatedAt": "2025-11-26T07:24:02.664Z" + "updatedAt": "2025-11-29T02:56:02.543Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.543Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.548Z" } } }, "49041ac358e6a0f1cdae73923da607add5f9d37fe3320250b5457924d09bcecc": { "d61c6739096f5de9a1f340500324926cc206fe878ab16df77def05d0ba746d3c": { "jp": { - "updatedAt": "2025-11-26T07:24:02.666Z" + "updatedAt": "2025-11-29T02:56:02.548Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.544Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.538Z" } } }, "4abc97ebd23c7b3dacc0e18e77499272b51b908bd0c2a7a823d153d3c00f7613": { "7817d141aff4e4b1ceaca87c554c551bc1add23bd534611e2704fba56223fbfe": { "jp": { - "updatedAt": "2025-11-26T07:24:02.664Z" + "updatedAt": "2025-11-29T02:56:02.543Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.545Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.535Z" } } }, "4e7333f7ff430819ccfae5b1f2b2ee97508f58db11c3e67c31430385b0618503": { "1a899ad20af5d3dc3c495e6ddc0c3ff5aacc9df838675e487a6910da0a531675": { "jp": { - "updatedAt": "2025-11-26T07:24:12.065Z" + "updatedAt": "2025-11-29T02:56:02.521Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.531Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.528Z" } } }, "6f13745927dfcaff0a5b759cdfc9dc47aba26e811ab26776ee363cd821f7d585": { "be6c5629590606c77cd44d60b8cb153a6e8b1ae6d9f710967b3ea692cfc8cb6d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.664Z" + "updatedAt": "2025-11-29T02:56:02.542Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.538Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.663Z" + "updatedAt": "2025-11-29T02:56:02.540Z" } } }, "8ad40f5399ed36401edb12df869b1d441ff2d635581938c63d4f0a611fb977ae": { "16565c6a0928275a3a601a45f18823227dc886a00aad5531244bec633d3e8af4": { "jp": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.564Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.565Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.533Z" } } }, "a3ea3f0c344313a1d3ad7969f1c82ef13af419e6eec98da91153c8735fd46730": { "df3510130e5bdcdacd162718bb228e62987c548fea96f8a9e94123cc6b9a78d5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.065Z" + "updatedAt": "2025-11-29T02:56:02.522Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.522Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.065Z" + "updatedAt": "2025-11-29T02:56:02.520Z" } } }, "b4b7e3ea48cb57c88168d17bf4d4f7d74e58a613803386d3229332939508c542": { "67faf8569421939ba33d4c9fdc3b64f28fcc3bc298cc8c8b43a29bf3499a6898": { "jp": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.567Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.533Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.566Z" } } }, "bed5256b181dbcf92c02187749ebbf45c60b6bbfdee1789c1848984b6be1d78d": { "614647c380ff18e7b1672f19190809fcf15ba05429ff7f93a33f6c77255ba9ba": { "jp": { - "updatedAt": "2025-11-26T07:24:02.664Z" + "updatedAt": "2025-11-29T02:56:02.541Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.547Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.539Z" } } }, "c2811557e4f56ffd6e37b0f9f6558971e9d45005c22c3c19ebaef586f1591687": { "b9aea39ae1b4e63fef7a92d27750dfc746ac0ac174e77a895050ed0d24ff1ea7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:56:02.483Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.524Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.065Z" + "updatedAt": "2025-11-29T02:56:02.520Z" } } }, @@ -218,403 +229,403 @@ }, "a4c073207b34a9e6e51079c57f0e06190c406d676367e982df527e7379cf105d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.504Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.065Z" + "updatedAt": "2025-11-29T02:56:02.507Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.505Z" } } }, "d59e7e7594ae44f151cb9c65dc0cf67dc9998af7e3a974cffc3d0f0dabce2e18": { "7f90a5a780c1bb26935f70fb9cdd36714ca975e36d84b530b0b75f565410ba0a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.523Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.526Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.529Z" } } }, "d89bc73ed23da882f0c45593180a3989cb6844bd38d6496ab6cb5ab328d51083": { "42fe50c1e729beb1bfa14d29e80c4f579a068ebbfa39aa1ffe25b2bb963a815a": { "jp": { - "updatedAt": "2025-11-26T07:24:02.672Z" + "updatedAt": "2025-11-29T02:56:02.531Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.530Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.527Z" } } }, "e8ae18c3678baf91b2255e5eab22effc78193c605230851316718cfb95063b2c": { "b8eaf5b30dc66a5bf4e27198f07863a95cd60a2e8b15d9fe7e86cc6f6eb603a7": { "jp": { - "updatedAt": "2025-11-26T07:24:02.672Z" + "updatedAt": "2025-11-29T02:56:02.568Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.566Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.567Z" } } }, "e92405c74b1c19a280775296a5640f2c7646bfabd9d6af48d6359d9a4f09c9d8": { "c9015dfa533bb72f0fe4f1f5a455b0a5497c12b645e908ee88d9686adff07027": { "jp": { - "updatedAt": "2025-11-26T07:24:02.664Z" + "updatedAt": "2025-11-29T02:56:02.542Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.539Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.666Z" + "updatedAt": "2025-11-29T02:56:02.549Z" } } }, "ea04f6329e37f5487414c9b64a5e1602d705f1fc914807a5e16d95932f4ded16": { "c2794c8cfb2c5d8f3ad408c1a6ee6d92accd0948ff2682cca78897d7cef83daf": { "jp": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.524Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.528Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.525Z" } } }, "ed828a4311942b25614d0fd962b572a6dc329c0d92a3891dce42290c1d8324f1": { "78977a9c19b7aa2ba08361a0d6ca3390d032f6997a67d280a40d8974f768bb52": { "jp": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.532Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.065Z" + "updatedAt": "2025-11-29T02:56:02.519Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.067Z" + "updatedAt": "2025-11-29T02:56:02.532Z" } } }, "ef555d903b99c706a7fbc048a6888f3d3743693968bc76912f338d53af846b0c": { "c84825f7cf888bad7b7b5ec57d4a3941f8dc40c7526398600864fd18a77516ef": { "zh": { - "updatedAt": "2025-11-26T07:24:02.664Z" + "updatedAt": "2025-11-29T02:56:02.542Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.544Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.664Z" + "updatedAt": "2025-11-29T02:56:02.541Z" } } }, "fb2a4bdb7f2883fa7ac9878a6d4e978def652c408e4ef95784547eef9e313dbb": { "20e4763f0f7057430907de10bf00a918aa2e762becf34af686b125a9da4fe458": { "jp": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:56:02.481Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:56:02.482Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.066Z" + "updatedAt": "2025-11-29T02:56:02.526Z" } } }, "22760d417a52c66f14bee182587d458d0737a616dd14cb09748b4c725fc5809f": { "c6ca08107fa6822548ad3adc5de4b6fdf1d9860224c2cd62047f42bce72b1c12": { "jp": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.746Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.745Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.908Z" + "updatedAt": "2025-11-29T02:56:02.774Z" } } }, "3e38c1623307fe1538f034436996c45b6ce42cebe6a35b146ba34a354e7b226a": { "7d9c49d88230712b6849bcab6640651373295cad7888223291eb46da868626e3": { "jp": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.787Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.782Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.781Z" } } }, "434f73c99193146064105db19ce337122de0d78915918472d56f5393dc41a913": { "07acf0a2f2bf2cdedbe6696ce78f98b197df5722eecc5a214cf1d15173619bb2": { "jp": { - "updatedAt": "2025-11-26T07:24:18.914Z" + "updatedAt": "2025-11-29T02:56:02.800Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.908Z" + "updatedAt": "2025-11-29T02:56:02.774Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.908Z" + "updatedAt": "2025-11-29T02:56:02.775Z" } } }, "4fa6a5d68016ad855e418c2e88b5a37793256913a0caceaf33014edf61107509": { "1ed9748c6ebe33e1898f694a866a318e321540cc9186ac29b7621da0715118c5": { "jp": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.790Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.791Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.779Z" } } }, "5dcaaaf5a4d53dc33da6680731d152b4a88a8d4e9c6058a18e521c7629865fb2": { "11c49d7827257644d730176fb691cb3d9705b0b2caafb1ee0ef7b70e70446275": { "jp": { - "updatedAt": "2025-11-26T07:24:18.905Z" + "updatedAt": "2025-11-29T02:56:02.766Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.906Z" + "updatedAt": "2025-11-29T02:56:02.769Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.906Z" + "updatedAt": "2025-11-29T02:56:02.769Z" } } }, "6687b017941230cd05da5ec3d3b0b3a66c8da07927fdb43f62a2732581460749": { "df9979ccd3ace6a4ab1b704d9d4b233c9092cf3e747331f0d940179f918f015b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.673Z" + "updatedAt": "2025-11-29T02:56:02.537Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.672Z" + "updatedAt": "2025-11-29T02:56:02.535Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.673Z" + "updatedAt": "2025-11-29T02:56:02.536Z" } } }, "69aa1e22d1867f2dd9082998e597234169f92ed3ba4c3d6af26b34ffa82e4a48": { "aea97333102d80bfe523bef5b3932706938c1ab2307337cf20451a0633f0d7a0": { "jp": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.765Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.908Z" + "updatedAt": "2025-11-29T02:56:02.744Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.906Z" + "updatedAt": "2025-11-29T02:56:02.767Z" } } }, "78ae413a62554c8c5ae5ac8301b68726066573d500bb6c8caabdecefd781bb3f": { "754657766dba43bf89b81e0a5c15e318411e3d1782280b5ae5d185edc97b8e9b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.745Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.744Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.907Z" + "updatedAt": "2025-11-29T02:56:02.773Z" } } }, "7c0a1f3dadfd423b5f66993109c1e8bde0a0b4ff555067d9e6cd275bdaa7a391": { "ef65d65a01188f23ada0aa6a4be2fd11257542de621c6ad17c666a4b0b2aabf4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.796Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.793Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.794Z" } } }, "8d9acd4ed372d08f28519dfb01b6900545df9f42502ac21f0ef6bd86b724c724": { "3ca361084040c6efbaef261b3b4c88e38d022539f3e58645a4023be45b9ed7f2": { "jp": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.792Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.780Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.908Z" + "updatedAt": "2025-11-29T02:56:02.747Z" } } }, "902fba8b39d6b163ee66698d8bd12433740962a53ec93d756ebdc9d11cc5c531": { "dc72366dcf698c0d7f7b5eed229fd9a7dbb9776362cc9399cf927769376a9098": { "jp": { - "updatedAt": "2025-11-26T07:24:18.905Z" + "updatedAt": "2025-11-29T02:56:02.766Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.906Z" + "updatedAt": "2025-11-29T02:56:02.768Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.906Z" + "updatedAt": "2025-11-29T02:56:02.768Z" } } }, "9414d7ed4d45271d4677e8083e81b7732a750c4dcd8dc182b14ce11749a9ec63": { "55348a4fc23db936f15885093540b12ab2d7159c2a91617e4058fef961a3c4ea": { "jp": { - "updatedAt": "2025-11-26T07:24:02.672Z" + "updatedAt": "2025-11-29T02:56:02.569Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.672Z" + "updatedAt": "2025-11-29T02:56:02.568Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.673Z" + "updatedAt": "2025-11-29T02:56:02.536Z" } } }, "9ac02f1c2289520aeb58725683781053f5ba6bf828b2e8585540596060f1f416": { "ae1a2a308feb0c5c6d10c67047a4b5867fd643296e4e816743b7e2e297fa0f5b": { "jp": { - "updatedAt": "2025-11-26T07:24:18.907Z" + "updatedAt": "2025-11-29T02:56:02.772Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.907Z" + "updatedAt": "2025-11-29T02:56:02.773Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.747Z" } } }, "9c7cf003973e27e4edaecd818b57b1e653cdfc8e936c45c67e314eb7123327be": { "1bca9e04eb1cf2d68b948ebb6ff7b813d50c8faada3f1ee2a8c561e9d96d6882": { "jp": { - "updatedAt": "2025-11-26T07:24:02.673Z" + "updatedAt": "2025-11-29T02:56:02.545Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.673Z" + "updatedAt": "2025-11-29T02:56:02.546Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.665Z" + "updatedAt": "2025-11-29T02:56:02.545Z" } } }, "9d1a4cd9443c6b88ad09c86205631318b2554cff25df4445681bef27a63f1923": { "6349c4d8161b7c14d291e4b3a1c44b280c0eb9f067739c2cbeccc19c6800a2de": { "ru": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.794Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.795Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.791Z" } } }, "abe1e09771cc949a765515b0f1ae2d0c4a6ab90fceae133c7ea3efdc49fb65a6": { "3a86b5256b89e144630a5cab1fb1ee8cee76bb30374fd9a861dacc440a7b8bd9": { "jp": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.746Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.743Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.742Z" } } }, "ad7599fbe857ed33f8231ed240a179e73c2e77cfa5e658ffca7502e66d2eeb8d": { "fadc1396d5e8d2ef81e08c49dd8a08b01468ff70c1b1463a692904b2403b88dc": { "jp": { - "updatedAt": "2025-11-26T07:24:18.906Z" + "updatedAt": "2025-11-29T02:56:02.769Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.907Z" + "updatedAt": "2025-11-29T02:56:02.771Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.907Z" + "updatedAt": "2025-11-29T02:56:02.771Z" } } }, "b299c52ac5ef4f3399408a89f700027a4da61547b988cd85ef190b1cd544d809": { "ab3b1379019677d4f056b27b40d79c7a1d368792ecee4e8e04d9224e7f40f825": { "jp": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.785Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.779Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.786Z" } } }, "b776eb4f7e91ceadeb1cd902e4a72be31912c8f40357421634f01d720427d7cf": { "a157eb7d7ffd46e8626bd3b8ed555fd32deed480e675bf80cec9536c2cc53b70": { "jp": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.781Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.908Z" + "updatedAt": "2025-11-29T02:56:02.776Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.789Z" } } }, "d294fb78df318396bfabb26180e94ed0286f348799a54a338dbcac4df2d501a8": { "2c1ad0e8f79ff31317243d7b0ba63abc05a794bb4cf50ddf3ab6a05a73136433": { "jp": { - "updatedAt": "2025-11-26T07:24:18.907Z" + "updatedAt": "2025-11-29T02:56:02.772Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.906Z" + "updatedAt": "2025-11-29T02:56:02.770Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.907Z" + "updatedAt": "2025-11-29T02:56:02.772Z" } } }, "fb88079d51f44c0605f104c400878c73b1676f5d7360de0915e1f533962516d7": { "83b74506a046cca4bef2d9a75f263d66bc8cbdf6902a726a083fb24ba240c90a": { "jp": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.770Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.767Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.766Z" } } }, "08c0c301774aaa88b81ec6aa095f55e7824eafa1cbace5b623dc7c79a65127d2": { "69fd950d01a73a4628cd2ff26fd88bc864432af7ec9c2a0b214e105e41696130": { "jp": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.778Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.790Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.780Z" } } }, @@ -632,299 +643,299 @@ }, "9c5e775eb155a68364a368b61b5125ad1624928bd6d74c078e880457d501c280": { "jp": { - "updatedAt": "2025-11-26T07:24:02.707Z" + "updatedAt": "2025-11-29T02:56:02.810Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.707Z" + "updatedAt": "2025-11-29T02:56:02.809Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.707Z" + "updatedAt": "2025-11-29T02:56:02.811Z" } } }, "3a3e4cf73cd863c0103607437eb8b4f6836337cfd7e83bdd562015c4ed9cdd6d": { "086e3e89b5951923ddf12df84d937ba158991125876b5f6d842de358bbe8b3fe": { "jp": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.814Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.814Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.818Z" } } }, "4603feefc1d42187f8cdc33b837b161e0fc3b5c8376d6cd191411f0dd562ad31": { "a1d7bce3db202c9b4687ae92810df1230088ea23aa2c8009af476b02206e65cc": { "jp": { - "updatedAt": "2025-11-26T07:24:18.915Z" + "updatedAt": "2025-11-29T02:56:02.803Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.707Z" + "updatedAt": "2025-11-29T02:56:02.809Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:02.806Z" } } }, "490be0352814516ee6591ee5f8e07875e2139020d864d540140e0fa494298d5d": { "d23d41d10643691da14255ad0f85c7b97475432325af1c17be68df9efc12be5a": { "jp": { - "updatedAt": "2025-11-26T07:24:18.914Z" + "updatedAt": "2025-11-29T02:56:02.799Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.914Z" + "updatedAt": "2025-11-29T02:56:02.799Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.914Z" + "updatedAt": "2025-11-29T02:56:02.798Z" } } }, "55b28fab1ba94c3606d033461bcc70376b43d613080d008d80ef6eeee311b377": { "256a3209f20639b3de6006d270d351fa95df57bd7f581ffda6773fd8eba690c7": { "jp": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.823Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.813Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.815Z" } } }, "617059ab9b90c50e356730de729f0ae69ee3763a1e279dd764ff91a7fb180dcc": { "d57355b7ce2374ff50888d99d345884771d8478a28a50565e264c7183444541e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.826Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.819Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.816Z" } } }, "752a92de3795a78c42039024533716b1bebd226dc5c16f6d9e6c32db92868aa9": { "3a70208f4d63a66f6cafa72e823a27c94a0b217c643d65060e75846cf03db29d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.797Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.798Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.800Z" } } }, "7c8202b183dd3bd51127bf5cff1d877fc101a710d10076050d3769cec7237315": { "cce8610caf1b6ee18be42bc4b4573a409a2178a60d7e7fdf9aa312bb9a0e96af": { "jp": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.788Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.787Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.793Z" } } }, "7d8c9d047aa047d949a0099bf7badab51bf4cbb1242283616136def6a2087241": { "ae00c1636361dff35e6ca1fc517dd76ec664cbc4f992d5bcfebb7e2a76f626c4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.784Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.789Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.783Z" } } }, "828d49017ac2a72d1fb53055bb4787df9014bcdf6914a82ba88ded05b27ec9d4": { "9d68c2d46ac27369e5a5becf238948336518cad4fd978e7648cd41b1f743b1b1": { "jp": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.842Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.846Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.841Z" } } }, "9970d9a6d501f36cf179c0419231b9d795a4c633dddeb9b278e8ba7a601a3f30": { "5509618b18f9e3d905b42bcca3ca87b185e363a986c08a3c7adaa67ea9d4602e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.790Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.912Z" + "updatedAt": "2025-11-29T02:56:02.792Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.908Z" + "updatedAt": "2025-11-29T02:56:02.776Z" } } }, "a1bad3f4a716dc84c050e5be3e8486b6c74375173ac25b4b6faa1e07928f68dc": { "2ea331fabd4829ebc7e1af163a669bd7da7ebae75dc79796126ab275fd4d3c95": { "jp": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.781Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.779Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.913Z" + "updatedAt": "2025-11-29T02:56:02.795Z" } } }, "b5fa886fabf17ebc48a6ca47fc6a8992d00da4b99785793543e0d888695a2688": { "259e7cbd211ad2a2649e5a8f0da300650ca51664a447e45289d100bfcdfc34d1": { "jp": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.812Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.811Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.829Z" } } }, "c1a7d6a20f956b50b1038cee0a820dd57189fc686d14660b023d1fc67ab2e1e9": { "dbc44ae26a03c1b8c3405262a6dd56a831c655163c2cd640d1e27879c8e4aead": { "jp": { - "updatedAt": "2025-11-26T07:24:18.914Z" + "updatedAt": "2025-11-29T02:56:02.801Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.914Z" + "updatedAt": "2025-11-29T02:56:02.797Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.914Z" + "updatedAt": "2025-11-29T02:56:02.801Z" } } }, "c369c0aa928f8264daf73b2cb8b5d20b0f760cd84c596ca63fb6e80bf182b3ac": { "081e5ae543866b5886ecf7decd8d4a80af7f854626b8b8136631cf04a6c7a9f8": { "jp": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.820Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.815Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.816Z" } } }, "c6c433287e0c8c560d8ccfdb9dab1b764948e7aad08d8083787ea5a2ba4ffa25": { "3fa66f5214cb83c0d151b0adefad829fdec772c62100ad8be67b2c2d29a51136": { "jp": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.838Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.825Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.835Z" } } }, "cee9dba64ce2a735e188505d45af71b74c5cd69ece6c6e7512832d84898157a2": { "ba71fb39dc5dad8ed0cc9385af226ee8ccfe87b891afdfae44d4b68d6a6800ce": { "jp": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.817Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.791Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.775Z" } } }, "f03ea3286759068addb766b5b98317ea84803343105fd081b75322828bf9d201": { "8049194481456bef5558bf7d7d6cc3b522680055cc050dd06c21001990efaa95": { "jp": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.782Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.777Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.786Z" } } }, "f820ad66299aa0044ecdcc3298f5727903d52ea9ce19686054f70d9df707a8ec": { "1c6d8e151f574eb1c808a7932e470939d01ddf3adbd9a088012790d70765d510": { "jp": { - "updatedAt": "2025-11-26T07:24:18.910Z" + "updatedAt": "2025-11-29T02:56:02.783Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.785Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.777Z" } } }, "fe8dc3e8a42089566aa7dbdc1b163232b94dab755cd8f716e5050a20b9da71be": { "8e5a24d4923c146d3ff29a36c8d08b801a6681568d413d11ee21ab25c5a588ff": { "jp": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.784Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.909Z" + "updatedAt": "2025-11-29T02:56:02.778Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.911Z" + "updatedAt": "2025-11-29T02:56:02.784Z" } } }, "1468ae293b5d12d0ded8668dbb023988cbdb44ac496923a1ef6653864352d921": { "99c4f7270820d4fdcb92c4d24d5487f3eaa377c46e721e913d45645dba75a74f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.856Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.859Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.858Z" } } }, "1c112808a954d78a709e3ae05703950bc5804f9e55e3e98efd93efb0f0f879e0": { "a0ef058ccb99a1b138a4a98ffca0037cb2b496f227c55108b8beef337ba82d66": { "jp": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.834Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.820Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.819Z" } } }, "2317505b4b1b1557458b6ec9caf09937e43cf133543d04e2637e9cd6e0693bc2": { "8b6d58a1ca1a770a40180a524a20350aef1a747a1a0f59ef6bd9eb53764a7d1b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.864Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:56:02.855Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.864Z" } } }, @@ -939,694 +950,705 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.083Z" } + }, + "8f390179712abdfde1d16a03f079c6ebbbd781d3f020e59b2ef3af3be4bb0205": { + "ru": { + "updatedAt": "2025-11-29T02:56:02.851Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:56:02.851Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:02.852Z" + } } }, "3371d95238c92603c162eaed8138395ca44e47b22ad969c5099f7e599ec16c22": { "2a161bba41a266518443feea5a759cf299dbc3fdeb7b00fd74b546abae68dff0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.837Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.839Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.835Z" } } }, "34148aef91a7ca42367acb2003b2045d6893d713fd20c6ef4a4a8fe6b505125c": { "0df15707cc19ce74ec40c00d884f8f77eb33786d03f5831e131804575fce02b5": { "jp": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:56:02.848Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:56:02.847Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:56:02.848Z" } } }, "5c385581f9c65edaaae75a74b6646a142de547cd3f20a408953b75ba33586e2c": { "8dc4eb869f4a048ed04d5883545cce095cb2df351eba54b486a29c615fe29cb3": { "jp": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.830Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.813Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.828Z" } } }, "650a560be33079fccc4800a89f7ceabf7333009b1cfb0105d0e77b22a9afd9c8": { "609636eeb62cf3a4bd5ce284becb34bda3b97c2382d2dfd89320e13d69bf22d7": { "jp": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:56:02.849Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:56:02.886Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:56:02.883Z" } } }, "66edaa5c8dc32a1f831593b8a49a8f90c9de66304dbe8e78969217a73f2200c0": { "3a20ac6682c2e8633f0f56d7c381698dc85b1777367c924c9a05d2c329c4fda0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.832Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.823Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.828Z" } } }, "67113cbc50d80beb99c25a836c1c97bf312030d10537561666f2d9afcf9f3145": { "bc5d1e200e64a767369cc0ffad68cd1dc62da9a6230b0c00c0c10c90dcbef298": { "jp": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.825Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.827Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.824Z" } } }, "6986025ddfdb6e69c9d68bae98e09599b7bd5252a433fe1c14839522e57376a7": { "6a07a797478a7c19aa592d19f3fd5211e2bae00db7fd3cef33b175016a1b1b29": { "jp": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.830Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.833Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.833Z" } } }, "8e1acaa9709e95b6354d4bb719b069fee08bc3794641756333aba5003eb9475d": { "e8f0f6277f744012426a53a6027257e33c4b16cb2ca45dda3d90d4b73b3d4c5b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.712Z" + "updatedAt": "2025-11-29T02:56:02.838Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.711Z" + "updatedAt": "2025-11-29T02:56:02.831Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.827Z" } } }, "a5aac8ce0e37bc2df7af5f69708607c2c9b46cbe068e3172847b3191394faffe": { "38d2828e9bd727652c3233af76ea089e954aba2db55328f8cf1f43ca609f19ff": { "jp": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:56:02.852Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.857Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:56:02.856Z" } } }, "af5c9aba153f2323766f5c2833f6dfb1a669b295e319d579f4546ea448e8d7e7": { "0d9634f2d0d51799480d3e5d225d816eb09fdf75e544bf3b04b2fe1385fb9619": { "zh": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.868Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.866Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.082Z" + "updatedAt": "2025-11-29T02:56:02.861Z" } } }, "b01e9e50dff0d52b1c86ddcce64d477f77a182599c27ebb6752763a0c4cf1884": { "4bf15471d437e48ecaf706869ad9127730c8b915f392e00ca4b38372ff596b01": { "jp": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.842Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.840Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.841Z" } } }, "b721aaf83ea7701a82587311ffcd215fa0fddd0ac9d459193fd26188e0680183": { "906c00a6ef80e7715d21aae24374b2b2d044fcdc7b9d5c6c2c7341ecd0753821": { "jp": { - "updatedAt": "2025-11-26T07:24:02.708Z" + "updatedAt": "2025-11-29T02:56:02.812Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.817Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.709Z" + "updatedAt": "2025-11-29T02:56:02.817Z" } } }, "de08ffcb57e92eb891276970020672bdbe190e2ad13861a7a5a14fe04f7eff24": { "b11091547782b23a3e69aa42aa789855dc525b51b00a033b1cffebdd4f69711f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.840Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.836Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.832Z" } } }, "ea2d038b6989e3982d873c583fb3c15212b691b2e747de62d4d28c3e4b11a23d": { "68f32501aba4af446aa28658a6859e797a66b66f975249f4a21ec435c8e2e471": { "jp": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:56:02.845Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:56:02.843Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.715Z" + "updatedAt": "2025-11-29T02:56:02.837Z" } } }, "f56b183aebaa9c102a1630d41b724bdd0ef7984c2f5be9f15f51bb83994e0265": { "0e4b6a498cb6259a81c3b89b57fc27d109c9f7c4517473e5f6371c0a4d14e7e7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:56:02.884Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.084Z" + "updatedAt": "2025-11-29T02:56:02.884Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:56:02.885Z" } } }, "f80606d0e748135944fda4f0b2bd5df8b58807fb2f4c06c85b06e12fca82e935": { "2aa54fbd8a8eef1da3872abeaa7ad8858d0e7a55684ee9afd514540bcb055f29": { "jp": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.847Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.844Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.713Z" + "updatedAt": "2025-11-29T02:56:02.844Z" } } }, "f90130006ab67f0f1f9729094d7e71d602684a6c03306792b40387ebeda24cbd": { "044f9d08748a2a48a556c183ed0bada874cc4ce848cad6b1bf87fba782fe7d9b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.082Z" + "updatedAt": "2025-11-29T02:56:02.862Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.082Z" + "updatedAt": "2025-11-29T02:56:02.853Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.082Z" + "updatedAt": "2025-11-29T02:56:02.854Z" } } }, "fff1cff77ce23873924a1766144be6a0a4bc145a4beaf1c7902459c008cbd536": { "6b16dc8b034758efca2a7dec7fe695e186e4ef2f750e4a6ba872d28a906012b3": { "jp": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.821Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.822Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.710Z" + "updatedAt": "2025-11-29T02:56:02.822Z" } } }, "0007ef5eb0fc8520aeab373a05b58e2db16ece5be3074e20646fd984e7bb2153": { "534ae688e369810666e881d18767610a7df7671083edd5debe450d3827e074c5": { "jp": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.873Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:56:02.850Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.880Z" } } }, "05fa5078290d9319b91e520b8d624cd018e97d963be0d0e1cd22ca7e37e899e9": { "4a4c4d4b7b75c17db47caabac407cb6678d38f795ad11e688adfe6762b928d79": { "jp": { - "updatedAt": "2025-11-26T07:24:12.084Z" + "updatedAt": "2025-11-29T02:56:02.881Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.084Z" + "updatedAt": "2025-11-29T02:56:02.879Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.875Z" } } }, "16a9baec9aea4c6dd78355c05288783f630be08b0af1a257fb205b45c7adc066": { "b1a72f898456e3c08b49f6f0e73a4fc33fa3bad39fab513c1db89294a3fb923a": { "jp": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.872Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.865Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.869Z" } } }, "24203d0280dc684588776442ac330a354e834de5789e13b7f7068042627350dc": { "19fc846b48f319f018e4f670ace8976874e318a091bb09940eed158a6c8e8569": { "ru": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.909Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.911Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.899Z" } } }, "2fa693bc37b3a10adc8d79217e3b09168dc83b1d1e169414c8ff196815fec6f9": { "9e33b9e6995d58fab1e0c61f6a5436f2184d7c49af88577359d93f178ead07d6": { "jp": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.906Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.914Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.923Z" } } }, "437aab42be9088c95b44d049c562b541333adb34c7167b0341f25eeb6f1da633": { "673a9dec5d05173b117bf71c194bcbd9250ea1e8e6162c76a5ac07819b4a0314": { "jp": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.878Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.084Z" + "updatedAt": "2025-11-29T02:56:02.883Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.084Z" + "updatedAt": "2025-11-29T02:56:02.882Z" } } }, "4d14e175d2ad5b7f1f59197782ca672764811be0a7694da0d93c40a71707c218": { "2f6f3975ac07a17d2e6c12809f029b5fcecdc238f96cab5409c924b908db77fe": { "jp": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.868Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.870Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.871Z" } } }, "57e4e9dfa0451001fd8054b08c62e1b7e7899bf69d75440b300be4c4a727b99e": { "37f3dda8e8d9a3dd2ccbec3bdd564d2de4200f5a0108f14e3cb3cbe1f05fbe96": { "jp": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.876Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.869Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.875Z" } } }, "60e6b2c95bf2975a8ad16addf92ca2f2b8ef9b6f0267eedb1b1609cf83bd7bf0": { "8b24d0eebf933022f5b7646dbd76005a200ed0eb134c91ef2ce37429b92f838e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:56:02.914Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:56:02.923Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:56:02.911Z" } } }, "666059b00db591c1a56ce4963af6165fb3c9b12689bc7bd2d002ad9f8261acdb": { "60035e65e48fd5fdb3a14661c3ac4811bb8496f2b211e4fe284e3d6b420921c0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.910Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.919Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.920Z" } } }, "7431d11049418c30c908694305424392c5e608ecfdf0bd5bb5e82ff877dd01f3": { "3c1e299227977efd8ca6ccf93ac2673c11fbfdfe441a0d0784400200278822ac": { "jp": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:56:02.888Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:56:02.889Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:56:02.866Z" } } }, "7cad50f4cd617547f24613bf26b7d92863268b13a23a167f7afafe1105d9b80d": { "fc4b5c37a2e9cd403b127f9b0e95af107c0815b1c7bb98e1eebae04bc96ad554": { "jp": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.865Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:56:02.860Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.864Z" } } }, "8b1e7b5824a25229b63b6cae491572266d76a2f3619bbb37de99f10f9cb281d7": { "b39b1a9501a0d4efe97c7c462447f2f7f762c085e32781115e4e01abed9470bf": { "jp": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:56:02.880Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:56:02.881Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.877Z" } } }, "a3a1fbd31e0aaa187d657bd8045fa61bc9f31995880bcb5d5758a3e184f5ecb5": { "28ea6e40b848e91414d2d23698b6689414783f37c844f3f15e49942c2f8d0f73": { "jp": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.877Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.874Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.874Z" } } }, "adb57f6c330a361767cc8e018fdeac391e70be9310b007ddc867750c55383217": { "6bffe63c913aa6f222b1d3f7660678d89871583dfc5b85a5472e73ccd48f0852": { "jp": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.921Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.910Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.916Z" } } }, "b0f947d3a4638d92601c813f2511beb5008821e82e066594946d2230ae518888": { "e2d7964de87a21a4f56589f9ef750a5f70e553620f06ce8ed541c52c8e2fd182": { "jp": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:56:02.863Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.867Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.871Z" } } }, "b581e8a0971d1d07fd92c09611201fbc0ec1f2ad10e9a9e9462297b6dbe79f67": { "49ae124d0469e31fa1e3318ed468a02b4e75af99b0ad807441a4e18f29afb644": { "jp": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:56:02.861Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.718Z" + "updatedAt": "2025-11-29T02:56:02.867Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:56:02.857Z" } } }, "c5ec668978bc00da55afaed8bf387ab8e40f7e8cc8a5c3c85b6528469658dbac": { "2760c235bba120190e9792afc2791f4b14241f22634e6dcfd806b0f0c8a2f30f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.083Z" + "updatedAt": "2025-11-29T02:56:02.870Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.082Z" + "updatedAt": "2025-11-29T02:56:02.854Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.082Z" + "updatedAt": "2025-11-29T02:56:02.862Z" } } }, "d0878e46ea2d9748ef2ef35fa15820d74801d2e823a8c466520717410dca0e30": { "34f3e7285aa8956a7287c85c05fbbc6f82a3d73d51e58594a18dd7c4e673674b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.922Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.913Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:56:02.918Z" } } }, "d84d842f939c18587480808dae2c357d93b19f0503165ffbbb5df5723ed8d18f": { "78c6fc1825dfef395f2920f37ae3b83e7a55e08e381e14e11ade4b0633972ca7": { "jp": { - "updatedAt": "2025-11-26T07:24:02.719Z" + "updatedAt": "2025-11-29T02:56:02.872Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:56:02.858Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:56:02.860Z" } } }, "e16fa51bab7c52534a6634130d4aa9d5f4eaf5a9199be40465cc25c632091ca6": { "9a45c83991713cae83ff2b9ff52e3fac9bc7cf89dc4ce06aee3062459ba62f83": { "jp": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.912Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.905Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.906Z" } } }, "00385c907824ee916e1d2ab90ec1343952049a30fbb273cd705e54e19e5e54dd": { "a1e228059158c6496d116286e96a0ffb78b193d02679d41dffd889c4ae3f4ae5": { "jp": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.925Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.925Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.926Z" } } }, "2026a346cf904938db3b958bccd4a5998e0f9c3e806206b6a7de6c5a43e41346": { "99e01b88c76b26cea06cf6daf392581a33f358c37c5d4b5081a274912cfb4fdd": { "jp": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.900Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.903Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.895Z" } } }, "2283119a59e486c7e332715c4be76c78e6606cc8fef66284fa0397e91f6e9842": { "89e926971a9cb3deeda49f638cbf8679ad56a009190bf99db1a5f7d3b55c106e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.892Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.901Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.893Z" } } }, "3b5e4827235bde4cab69ea0d512c4769c70579291411c713544bf464dec162c8": { "e5ffb2aae3eda69d46997485801b157c3e85f0837446fbd682ac417320b69197": { "jp": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.913Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.902Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.904Z" } } }, "51a4e1d93b002b635941f3a0b969d77f5e76ffcf3ab01cc6c0302553a48f2dea": { "e3cf07cdc5c67cae3f9a9be2ea541fbdda42c2a33f509a3d16926cfb4c4fa296": { "jp": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.899Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:56:02.891Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.894Z" } } }, "51ffd052b5e18acec3f8c2fc6fc9f2de6d509c5f9b55c4e653df085e2f4cce96": { "e67a2d890c9d442e3c7a7f02a0d5c6afcdb1928ff906f575bbf304c7f7799b2f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.922Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.915Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.924Z" } } }, "58660987b73352ad4963dda3033196dbfd0c791f7ea7184da7b8ed72a70d23c7": { "e6384b2ee9b82af275d9a7823132ca573a701a7955a267deaca2eba7848c0139": { "jp": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.941Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.957Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.956Z" } } }, "5ae00fffd365a54fbda628a19a927576375cc455c591c16a26e7ed16b919a10f": { "2c1fe0f08e90b42f0362e7d55eb555bccf6bc9522b4eee5aa410eecb5a6ff63a": { "jp": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.945Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.948Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.941Z" } } }, "62a28a91cc967d2076cb4a8ae68eb32bb7dc0a91eac1089fc166676f54731dc3": { "4fb613d98fb6ff221944b46d4a102b8b41af0362055b5e31a68dcbedb5e8be6b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.898Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.894Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.908Z" } } }, "62cac186a0d5d595a384019a8da0f2587e8ec388e9fa723441881ad21746e53e": { "5315f9a99c66f3565ee182e7d8faf811aa2e4a227524f9f573eb826dc8b5c51e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.938Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.919Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.900Z" } } }, "64c029683442a95f0d9971d2c2a2f011b21167a916369b96ea20390f74a96eb2": { "27ea13a9d6a87686196565d791a629223843e1c311b9bff9edf44c593e511703": { "jp": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.950Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.949Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.938Z" } } }, "812c31122c49b26a28f2af399b63cac7fdb8dbff9b0eccb1a55146b1f53d9141": { "1ebe27a88b5652f04a87609b29cf3e09b5dc4ad9bfe9681936296ff736f2d7ce": { "jp": { - "updatedAt": "2025-11-26T07:24:02.734Z" + "updatedAt": "2025-11-29T02:56:02.908Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.917Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.915Z" } } }, "8aa6821981ce9839d00fc14d757392848b9750acc4bf8539c334cf2d5871f908": { "a27ad75b9e2993bcfc4ac7d0eda9c06a190e908e4e85725e849767c67999764d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.916Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.920Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.907Z" } } }, "8f6142d5329a13cb865837bf5f90f1676c0ed34132ae0b7413c66ad9fee106c2": { "b5efc55478dd9c26c80dffe9ed741b395f4d2368d8eee6c9c3149cd4fc4eebc1": { "jp": { - "updatedAt": "2025-11-26T07:24:02.735Z" + "updatedAt": "2025-11-29T02:56:02.957Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.946Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.736Z" + "updatedAt": "2025-11-29T02:56:02.959Z" } } }, @@ -1646,494 +1668,494 @@ "afd2f2eebd8416c23bdeb683cdf48c7d32f86769fb59accaa3e0399bedfbc689": { "9b1791199c987e23d27abeedfa5722370720553cfd8a6405ee7112cebcc27c6d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.896Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.892Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.902Z" } } }, "b353f551e48bc3b4c88a7db0d857fefd25c028f8d05216430afdb76e3bd832b4": { "6d6603c2d993968e3e2fb68963df1f14bb64c291c769f84522294cc56cd80d73": { "jp": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.897Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.732Z" + "updatedAt": "2025-11-29T02:56:02.898Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.907Z" } } }, "ba6c4ca640fe7b3f714cda5b21aa83f56d6987a93c06b0f52403fcf16442d4a3": { "73a0749a7a37be27b2b679011c93ceeaf5407fff6130ef17dcbbbc612aee0d5f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.949Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.940Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.948Z" } } }, "c85686859f3f25046db0082f882182fadaaa53c9674e2b8421280d74f206eb40": { "add68d9d7c2384a1f4236b30131c64724392237b73f94a4430f8fd215046f46f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.942Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.954Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.952Z" } } }, "e58beba1ecf7893bfe1389d8eb8c6388801ea9f76c74eaadcbaa400a86832dc0": { "80e13888b6bfca7d175470bafcc2e30a1e88dcbbdaa15cac209fa66c4f44bddb": { "jp": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.944Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.942Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.947Z" } } }, "f437d5d62e24e71773573d12295d6070b2013b4f10635e752fc5e0c0c6f3d5b6": { "69df1b4df06653852e7ced5d6197d910291dedd2d1b27599cd5608fd1b4a5214": { "jp": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:56:02.890Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.731Z" + "updatedAt": "2025-11-29T02:56:02.895Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.733Z" + "updatedAt": "2025-11-29T02:56:02.904Z" } } }, "03f61172ad909b158589d51b6d4f89a053de0b09127cf415c34413087bd48c4b": { "a5c008c72acddb7fec319268bb5dce0d0fb9a1f10d18c2c90a95d993d9f5a960": { "jp": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:56:02.927Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.994Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.970Z" } } }, "0b7dab5f7a039f1859e3a70738566e228a8859b0025e472a76cd8fa2c67c6c28": { "1d8df38a053cb69ce2a27d4691e5cdfd13a6b160e9a02fa3f683e748d317ea48": { "jp": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.951Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.954Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.935Z" } } }, "2864b967eeeaa7eaa2100c52550f0c77a534e954059ecfcc0991f21bc889bda3": { "feaa20d52a8757a137658d5066422bdbf2de0a87efa96000934a084ad78bfddf": { "jp": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.956Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.928Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.887Z" } } }, "36663ad730f89d83d4a65b5956ac48db373b0bcfbd0f2bb4062dc5f3bcaf2839": { "8841bb2bfdc1346e286a40346e8503829d958b3bac30b715d775b50f451b49ee": { "jp": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.931Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.930Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.930Z" } } }, "374986e8dd5ccd248058ea18a5c0798d535a4a7501a33eff5fd9b80a782b7c15": { "7b0998df0969746e6c19524cb961e7ff6d7e59afe83c51976450a953fc8b3ffa": { "jp": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:56:02.926Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.970Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.969Z" } } }, "3cb23211e097156c0f1a78ad405746a39a30a7fca3e113e221a2bbde60fc5c66": { "30bc5b33601dc47abebcade817fd66b12ac5351751c6ed875945668d80c959b2": { "jp": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.939Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.947Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.936Z" } } }, "6ce48a90c46614816b7c3a238012b7692f39fa7b3d52104f4f0f92d895004b22": { "7e344ba2b2f6753012aae6adc6fcc5f046670439fd5badb29bee696648c4a317": { "jp": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:56:02.997Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:56:02.997Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:56:02.973Z" } } }, "707c0fedc72655fa1c912bcb76b320d66a9ab9c8fe5e939a4df2863fdd7f82b8": { "7c543d5ef5d836f674d6873f133f02c4ab70829715b347650c196ee93273deae": { "zh": { - "updatedAt": "2025-11-26T07:24:02.745Z" + "updatedAt": "2025-11-29T02:56:02.972Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:56:02.964Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:56:02.964Z" } } }, "730dcd6bd51a2d8afa76fc973bedd9b4d7162629dcf690b192df4cac1fc39566": { "ed51d6c3026594d0ef90de441bf36dff57ad4a32048a288a0186952eb2f80596": { "jp": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.976Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:02.989Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.928Z" } } }, "8c4b511502097e5142007ba6bf89d86ef9d582ca174f395180742175d5bd4f05": { "f3274830262e5f01f74d8474761446b9f8a9c83ae245d4cee233a6cd17284b39": { "jp": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.950Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.939Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.946Z" } } }, "8eeb2d38e63485d3f399d528cce00b3fa0310df2d513c8b5aed0077ee217c69c": { "87d6c2b8c54e666cd98b21f88f6b978a41ee92fbde390f5a595aae7d2c59164f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:56:02.994Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:56:02.995Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.963Z" } } }, "8efa94c2eaa8cf8e3ca888069c1494fbfe5679752549f9d0a41d641f2aad43da": { "481fbe7fef11ec970a0109b0e44e9a8165cf0e73e56a0466f038d0efcf74f657": { "jp": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:56:02.998Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.745Z" + "updatedAt": "2025-11-29T02:56:02.971Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:56:02.998Z" } } }, "94747a3cb7498dd41f7f7aaed2f670f003087b3543cf7752be3b39b62c021927": { "f7bca2db0af5de7e2c67ebc1c65c226c309288e7f073d34318c2747b6d1e9327": { "jp": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.932Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.935Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.934Z" } } }, "9be36d6e2bdbfee1f50c6de39175a6e538f2d986429211ef53b12ab0e0031ef0": { "1dee3abbec10bfa0b3995067899a721e47f20ee051715db74e0ac726fa434d54": { "jp": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.929Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.958Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.961Z" } } }, "ba0db243d349404c81abcb5ac1b3df54c29742957ec4ab33b24830ddab68f7a2": { "1f879e7772ed8e095b07f85578bd401df3a64cd4e5498296092756cccd875121": { "jp": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.943Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.933Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.936Z" } } }, "cb8f8c1219ce7a92277d5329ae659c90b78edb06139fda7cb67e9143f6a4f1a8": { "708faeaebbf5c4dabd6c9a9eb715cafd5178cbb6ceacc376b982a574ba6496b0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:56:02.886Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.737Z" + "updatedAt": "2025-11-29T02:56:02.888Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.931Z" } } }, "cf42c21f80f60055d0087c0e795d8976b1d91223e0fe30f342746b23878b6c6d": { "6d3f845905f3f2b2a1be610957281c22628e8585866ee195f1e005cecbd69e88": { "jp": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.952Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.962Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.955Z" } } }, "d0e7cc516637ef8ff263a061c7c16bafdf014cfae7ce60448c7e0fcce8c6dfd7": { "e57a30777e558c8d76cfdd0c7355a7d8d9e150e93787b8eaedcd4f95150f489f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:02.989Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.963Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.745Z" + "updatedAt": "2025-11-29T02:56:02.971Z" } } }, "dc560181da04dee98b254f616102cfdbf1969c4c794080bd3b5dd88e33f63287": { "f7b3da6309249ba57146453a20fb02f1da444cc9f6b9ff15796e49d19986d9d8": { "jp": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.953Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.741Z" + "updatedAt": "2025-11-29T02:56:02.951Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.937Z" } } }, "e390b76711ccf2a7eb5d962d037354b40ec5f4bd6b5e88c7a59d4fe98d2af88f": { "959a1807df034b8088bb146f4b89e2d5ea2dea86233fa18c9a28c35bbea95719": { "jp": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.945Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.958Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.959Z" } } }, "f362b87c61313b355b28fda5f77765651cb599066809f44030b3c1010865fa5c": { "498198cf31ab4d64e31b4a2d37da8c4597bed364756e0feb2aad51f2859ac1fb": { "jp": { - "updatedAt": "2025-11-26T07:24:02.740Z" + "updatedAt": "2025-11-29T02:56:02.944Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.739Z" + "updatedAt": "2025-11-29T02:56:02.934Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.738Z" + "updatedAt": "2025-11-29T02:56:02.933Z" } } }, "f5a9bb73dfebbd60d3ebe96194e16c204bbf24a1a4ad7b46bb262a754dac54b2": { "e78c91e1856bb6bb61d73c20e01d2f69ad12b8495c3f0d7fef84e1558681ea40": { "jp": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.960Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.960Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.742Z" + "updatedAt": "2025-11-29T02:56:02.953Z" } } }, "1370f12b87482a2e8d057a8b41e9ea94795da80127f778fde4628181bbdcc429": { "f8146d175696fd61b1124db8aa052124a23329de9472ab05df373240407f0ecd": { "jp": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:56:03.002Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:56:02.965Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:02.990Z" } } }, "25e58c45c99cdd21fc20a817b3bc1c4d1448cfd9024cc4ed56ae9462032d790b": { "6bb9f7de8fea38f23bfe3fefc31fa9cf8d67d55bb09bb2f9a1806c8d39795f52": { "jp": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.979Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.987Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.988Z" } } }, "2f8b276c8b17327a8cd29e02e2e0215fcd7745a9618f81983784ed62a0124e22": { "fd3cd87bae11809fdfbaa52ebbe4afbe61f3cc9cca3ae69d12c598a97c478f9e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:02.992Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:56:02.967Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:56:02.966Z" } } }, "376f1f3d79070d024492b0852fcc46275cc6894795ef5c9378fe6a8039d04b64": { "57d1e9d86f14ce94f3b9606be0c45891a1cddf024b0cd28892082e2bebf224ff": { "jp": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.016Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.022Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:56:03.001Z" } } }, "3b20b82fd209471b97a1109eecaadcd504d69c6421631143f81852d506036bfa": { "deab720ce649678d8772ed32576b254176937947561eccdb5dd266ddcf5b5d50": { "jp": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:56:02.965Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.019Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.007Z" } } }, "5315751710a23b80f9bf1ed7f31831d089dbe93c3c8fb90d20b7744073d0bf57": { "a66560c3d607504cdffd12261e02d0e673e576056f78a84ca9ecdf329603c56d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:56:02.975Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:02.991Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:02.991Z" } } }, "8d92e8b825b034ea42c644cd23567811b46adb33b6d540b842b64c0196ff3b53": { "292f22bc13c3bd83386dc5ae82bec9ed457e6f79b25efab444ce03844d88e825": { "jp": { - "updatedAt": "2025-11-26T07:24:02.745Z" + "updatedAt": "2025-11-29T02:56:02.969Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:56:02.974Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:56:02.974Z" } } }, "9845c4be459de6543c79bb52ebef31089a7b6dde5c4bcbf294e6b614cb8b73ef": { "f7ab2f792dc532d79e54d2172ab842ea8bb45d24fbea3c48d921219d21bb9a5d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.745Z" + "updatedAt": "2025-11-29T02:56:02.972Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:56:02.967Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.976Z" } } }, "994f995f28518f9032c149f031eb9e817c8a85f3b0139de3abda3966eec97f40": { "0299673d875da310e70873db6a17323b8be0705c8b4b17c562c9e797b225acf4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:56:02.996Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:56:02.992Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:56:02.993Z" } } }, "9e812084882765188d8e23b9cfcbf9a3edeb29e9461a1cec110df416342b0289": { "e16e8324972fb51ec759f18c31f84b12438b5b468badc9732e3a35eecb40c277": { "jp": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:56:03.000Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.020Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.013Z" } } }, @@ -2148,83 +2170,94 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.089Z" } + }, + "c1ad37c48321ab74d0fa77243447624e6c987f44ca3469a08d251c3e5a869de0": { + "jp": { + "updatedAt": "2025-11-29T02:56:02.982Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:02.984Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:56:02.984Z" + } } }, "a9a515c52dba44d2cbab844922d2f769a5af11a34775d83c1bd8d9c97e4bb6f3": { "85a2a4117446131c96b792674a9cf5594566bfe0b7f1098d2210537e80d0fb0d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.006Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.007Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.008Z" } } }, "af360983b516284a69f939f103f1882eaf99d33139f9033142ae3561946f32c7": { "33be4cf9c98cef60c81c9a896da5f27cad1a7e71f69e85818494ce4b7ec03b2b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.988Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.986Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.979Z" } } }, "b204fb8610ce0fe2a5504ac8ae74eb658b2c80f1a1d885dc2b85d71bc34129bb": { "0aee55116dc7c452f61e8eb411e60595d3f877d5ebfa1d1c034f028155bf44bd": { "jp": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:56:02.968Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:02.990Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:56:02.973Z" } } }, "bf09040d678e6760987c57861f7d46d0c83dc84b582441fa87e7ac9756c76f6b": { "ee66bac04fe1df0381e777810c8adb5c9d16229f663ce7ef30a2a0506899ac5c": { "ru": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.008Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.015Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.018Z" } } }, "c50d8bd0ecc6ee24b7f928b73255956cae71fabfe25096539cdb974c7f167191": { "f1fb2f5d8ab4009a1d0458d1d0604ea822a372927443fb49fae37168711e0dc8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.025Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.023Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.021Z" } } }, "cabd7d221b503f016f6d425976074155c6ab65f9918739e83cc1d703e06ce9c9": { "7ca705d224c1a2bae3bf661451d8d9ee2d0404abce117b56dcde2161981ea1cb": { "jp": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.978Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:56:02.975Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.747Z" + "updatedAt": "2025-11-29T02:56:02.977Z" } } }, @@ -2239,1630 +2272,1641 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.090Z" } + }, + "ef2a79c4910a450c4d299109576b26b3e4d3c1f0d7cbf8aec0cb3af68cf84848": { + "zh": { + "updatedAt": "2025-11-29T02:56:02.981Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:02.982Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:02.983Z" + } } }, "d6382580d57e06e3adb4f63249975c1e63e439afb1528089085bb16be9e0bfd5": { "e66f44bf486dac3ec176125edd9a39b1b6741ccec945cdd42e270d60579a2194": { "jp": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:56:02.993Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:56:02.968Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:56:02.996Z" } } }, "dcbbbc894548f52a28f1dbe2761c66552c70c361ecde98f969015dcee3764a48": { "626e208c3631b5c7c63439845c92c76d534c35cdc0c557b51aac33578683ffb8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.009Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:56:02.999Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:56:03.000Z" } } }, "e3d2222cd9a6fac9acbf681cd3446dfd1fc4c2866524e4195206634d0d76acc6": { "7dd41862d4380d06fce8d5aee44728bdd5365a42f0ef1ef5d0a91b55cde5c29f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:02.986Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:02.985Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:02.980Z" } } }, "02291322e0d8f494b80f9d8e9c482282d8b548c6ae56afa37d022b164b99b054": { "14c2feb63b9f987820db166804e40ef404c44c5a695f647c2463bc6c7919d96e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.010Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:03.006Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.011Z" } } }, "13dade465ba8d6e7014eb44c3923f9c834a481123903922ddf6e33bb4ee775db": { "d6e6aa07741897774555a1f0eac0954dd331322344f830c9f304dbdca6fc532c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.071Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.071Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.072Z" } } }, "1e6a9268be90fc10ba5ab851817ae61b0167c3ce6990f2a5d9ebdb1ee6eec11d": { "986717639b58978e5f1cc565ca5bcaef17e4babedbaaace23e272cc8c401372c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.025Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.021Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.022Z" } } }, "290372a9e8da36b9b0dbc38f3a77bf8307b785738d5ba00a31fddfd12681d63a": { "435164419830229ab742e3ae11858464c9c8878bcf4a2bb3d6166ec4642f545e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.072Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.073Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.070Z" } } }, "2aca9c20ab8bbeb98fd4fbb9f62e8ae777bccbfb6417cbddb786afea95af4499": { "866097183364ceafca0351ea2755c4d597ff856cbd6ea28946d96c0d30d28ff7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:56:03.027Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.027Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.024Z" } } }, "381da73f1de48015917a484d7c2e45bb2557d1a326b8ff4560cb55a72d1de6ce": { "58f15d2dfce6c37907b066f99ba2b6b1bad2cefdd56e52bb79e7839fed922624": { "jp": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.070Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.016Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:03.005Z" } } }, "40b25bc5f9906b1b6c1e3fb64539dfc6d270a427153142c668cd16a039ebcb00": { "957d995119871468184ae861bc8fb42689e205013b5a1a037710ce22110de58f": { "jp": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.017Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.014Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.012Z" } } }, "52853976e012785457c250daee6b0280f9e8e88fcbc6a4a02eaf7315f2758fc9": { "35936f5dd5b5ed9baf260d39b24862296fecf4c8c909f41e2a0999a8db0a3772": { "jp": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.068Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.069Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.070Z" } } }, "5a2a174332bfb9a0cdf7cfe65d8e91568153937327d15d632b2c09aba2aba728": { "e8ae2af14396db3064dca28b82c864d44d320c9ce456d8e334f9b158902bf4fe": { "jp": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:03.004Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.020Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.014Z" } } }, "5f3d913c7a8c4ceda7fa835ce07f7441c4f601788cc68210c993d3dda60335e4": { "758768db465ee7223ab470e594b649587b038bfaa85fe340aea1e4aa3c4bd92a": { "jp": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:03.055Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:03.054Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.048Z" } } }, "6312de56aa12f4e18450ee81ed026306d225a603f4e118425c63d475b267e36f": { "05a0d0bd2cfc6068766a3aeeefe69b1d78a4b4f120052aeaeddd00b384c6828c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.018Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.010Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.013Z" } } }, "6439efcca906a994e35faf64afc92947e6ce60d7db71c07200375b94c1ec08a0": { "b590592b2b9abba8d294cbb837fba6f0bf9ec95a8c5f2d979542c7f80d2cae21": { "jp": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.018Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.024Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.017Z" } } }, "645c6b21a98f21e01e529f7978413fd1fd62c80916d3b27f0533877e73361460": { "9190dd15a568419dc8f69602836e2291f52c2c494b8a21b5d535f8100ce666fd": { "jp": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.052Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.039Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.051Z" } } }, "81e55d728a63e9d9620a0aa9a0f3152c86d8f4228a2480791e9cad5a8de39a05": { "0a7dd0ec6b5989e1b77f3754697c20347971441c557b816d890bf2b9648ca561": { "jp": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.044Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.038Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.053Z" } } }, "99dad4c2046d97de9c9a10225dad41defe9ab46dd46ee1ebf18685fa87671a2e": { "06b367fa8b09d7fd9415ccb9f2fa0fb03df266adda026a80d2f81729bad14302": { "jp": { - "updatedAt": "2025-11-26T07:24:02.743Z" + "updatedAt": "2025-11-29T02:56:02.962Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:56:03.001Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.026Z" } } }, "9d3e2980fe828b01727089a5b229444dc083a28f187a3ec09ad16a7eb1eb6d78": { "27aa4e4f10c34b32aa528db752d7176b33e61894bc9750f14367f23ebacba5e8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.023Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:56:03.028Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.095Z" + "updatedAt": "2025-11-29T02:56:03.025Z" } } }, "c491de2fc423ab10dbad66f7c1ced660f15c3f92d3220edeb2ccd84ee9575232": { "6fd80c5323889b79422bdbfe9fd8a32fb4bc56870affd9f018e096ec38fde0cd": { "jp": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.026Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.921Z" + "updatedAt": "2025-11-29T02:56:03.029Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.920Z" + "updatedAt": "2025-11-29T02:56:03.028Z" } } }, "cd73972a4d037347d81b6309d5ebdd4973e65b4708a5a1c61e961a7e349f0783": { "9206b8172e5adaad17f8c6eb0cded1360735c838b0a3363c600dce6cc6abbcef": { "jp": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.045Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:56:03.035Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.038Z" } } }, "cd764deae766f8c6f6cfe6b576e74bb1f602bfacbb3821340a5850510d57a818": { "b6693ed657d428f4853a8fcd97aaa704f7a982e5e86c5fb8e5ce372b12c11e69": { "jp": { - "updatedAt": "2025-11-26T07:24:18.921Z" + "updatedAt": "2025-11-29T02:56:03.029Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.921Z" + "updatedAt": "2025-11-29T02:56:03.030Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.921Z" + "updatedAt": "2025-11-29T02:56:03.030Z" } } }, "fd4807eb1e777b66ccc79335d7b822af7ba8bb6dcbbf18e3ae8c53f548f20928": { "455e4d7b70315644264125e3a1e3a329d14b945c29bd48454b379b5247f97bdd": { "jp": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.012Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.918Z" + "updatedAt": "2025-11-29T02:56:03.014Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.917Z" + "updatedAt": "2025-11-29T02:56:03.007Z" } } }, "fdc92b085b658968ee987d63323feb976df8a0ac7995cde6f13318c84abd0c59": { "7843455825f9c1828f408c376329311aba7d3c1e14b345e73ef9ad5b93e5b005": { "jp": { - "updatedAt": "2025-11-26T07:24:18.919Z" + "updatedAt": "2025-11-29T02:56:03.019Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.015Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.094Z" + "updatedAt": "2025-11-29T02:56:03.009Z" } } }, "07722b6c1b943ed20bf3ff6d22b1b257d5a8695ae4b4553850f4bd4af3c5d2c7": { "2dcd7f352db514064395ba3b8d67b798124850b8ab716d08d01b773649c588b0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:03.059Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.749Z" + "updatedAt": "2025-11-29T02:56:03.060Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.749Z" + "updatedAt": "2025-11-29T02:56:03.060Z" } } }, "1777f3ba683ace75433dd34468539a9e9d67ef87d9f67a65737e86954611e774": { "3acf5735b7405bf65c0204cd16078ddc21713f4e46ed2d0238fb8871eb19b84c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.047Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.922Z" + "updatedAt": "2025-11-29T02:56:03.036Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.046Z" } } }, "1d262ab176214afd2615461f6d7dcbc00bf893bd453c8cad2f9b625f5b34ed8e": { "2ba14b7281983a683a98e1fb919f7ee7317f7cf3b6fce775f1d12a76ea1e67e6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.042Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.053Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.922Z" + "updatedAt": "2025-11-29T02:56:03.035Z" } } }, "34dd8a3ad912132054af7846a7af1d6c6f27c8de9f83f63c9354d5a326b6a82c": { "8e8980f8eff31a76117d3215f17a1cba9a0ee6234c2cce918781f484742ac397": { "jp": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.047Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.050Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.928Z" + "updatedAt": "2025-11-29T02:56:03.055Z" } } }, "3e5df6c1938919084ef3c24cc3aa0a9f834e4dc5475270adb64943fc1f2c818e": { "a27fbee07ebfb6548a8a222874fceb3def1e176c740f36e8bb3fa452c9d32b53": { "jp": { - "updatedAt": "2025-11-26T07:24:18.927Z" + "updatedAt": "2025-11-29T02:56:03.091Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.928Z" + "updatedAt": "2025-11-29T02:56:03.094Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.927Z" + "updatedAt": "2025-11-29T02:56:03.092Z" } } }, "44b3f5422fc4c4f447ece76e0f8066bb34f3affc30e7419ca74089bfa8055925": { "b2e193e55be108c5582fcb93204b7255923583e86eda8e23c2ec5a7fb530f958": { "jp": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.082Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.086Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.082Z" } } }, "4e56f5a34b33c4d6df45c30f812200b60d80663863d11d65cf1450dcca806457": { "4705c821297fd380138640ab626f9d4f597a2b1853b0c84c3688cc33f5d4dd5e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.068Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.046Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.067Z" } } }, "80d3d6543dd83a7957930d9045025b4815c1307c41a15c290f7acf0eae734cda": { "41c8219de2e81a989c9aa442e0f7b45929280d651e3c0f00f28c5e946e5b9487": { "jp": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.045Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.922Z" + "updatedAt": "2025-11-29T02:56:03.034Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.050Z" } } }, "92105bab40be708ce10315bc6e1bb96fe7701142a5cccef12ac85e9bd6c2ad0a": { "f2e5adfccb04fbdb23894f4f9466bac4d65302edaa3ab747b455eca21fec899a": { "jp": { - "updatedAt": "2025-11-26T07:24:18.928Z" + "updatedAt": "2025-11-29T02:56:03.096Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.922Z" + "updatedAt": "2025-11-29T02:56:03.077Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.089Z" } } }, "98c24f1533f177815a78f76de8765482cd98558271c182e9ea70175821ff82db": { "59cffa3acd22af2478ea31099f73412223d91eb1301172207a61ac51e8cba72d": { "jp": { - "updatedAt": "2025-11-26T07:24:18.922Z" + "updatedAt": "2025-11-29T02:56:03.033Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.037Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:56:03.003Z" } } }, "99393522afef2d07d814a10cdd78d55ffbbf63cbc84caf67a25cbbb6702d7b29": { "df2e38e726ad5701168a107a3233f7e582b27aaddc17196034ab06c247a2cbb1": { "zh": { - "updatedAt": "2025-11-26T07:24:18.927Z" + "updatedAt": "2025-11-29T02:56:03.090Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.079Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.927Z" + "updatedAt": "2025-11-29T02:56:03.093Z" } } }, "9c36f42318908cee7394ac7bdffe1f0b4dc78d18dafbeff49083e3a25b9a0c0d": { "e03b65e2958329c1310e8961f72be96a59122375e8ea0f5d7d4a488588e62cf4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.087Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.749Z" + "updatedAt": "2025-11-29T02:56:03.098Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.927Z" + "updatedAt": "2025-11-29T02:56:03.093Z" } } }, "a017ed6c9e204f49a926704a46e850a434a064d54ab74c5196dcbbbbf095a5f5": { "a2adde35cfc427e42fa09ac65d97536a831e1059c7400f85820e2263a1b87c36": { "jp": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:56:03.033Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.081Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.927Z" + "updatedAt": "2025-11-29T02:56:03.091Z" } } }, "a02c9804673e90df5f360bc1d48dc4d9b7a2120b7b838de45da8f0bd5dcc7bfb": { "6dba5895ccf72ae7b5a8b301d42e25be067755be6a3b1a5bcb26acdc5cb58138": { "jp": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.042Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.042Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.043Z" } } }, "ae924afae0c519cbcd8b9677316f11c74c707cb0d60447e3f16db759e6be95d7": { "10c1fb6d0471791e0662f2e4888a314601486dae17ed953b398d3ded8b18d82c": { "jp": { - "updatedAt": "2025-11-26T07:24:02.749Z" + "updatedAt": "2025-11-29T02:56:03.067Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.928Z" + "updatedAt": "2025-11-29T02:56:03.059Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.928Z" + "updatedAt": "2025-11-29T02:56:03.057Z" } } }, "bdf6a99d4e97b12fb653dbfa5271fb1f3f759447def3b014fa132fc4a51905e8": { "70ae38ea604bbab68a53eb544cbd0f2cdbeea7e09ac7cd839c84eef1978dec29": { "jp": { - "updatedAt": "2025-11-26T07:24:02.748Z" + "updatedAt": "2025-11-29T02:56:03.097Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.088Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.749Z" + "updatedAt": "2025-11-29T02:56:03.097Z" } } }, "d85329459d2d377bcf713c7d13c7c96bd1fdcdcc09d41a049d07f84aa752713e": { "92a31f97c45363963ebd5c9ef1e90cde5e6438c8474d31a5257818a31f192d43": { "jp": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:03.057Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.916Z" + "updatedAt": "2025-11-29T02:56:03.056Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:56:03.051Z" } } }, "e0a0f58749dbc99214f8d73d23e3e103bb972d6cb973f80440fb3b9b4b81c305": { "0f27725ca1d515bacca9b8aa1e23bb35c69b895c1d9563452e075aee634e4939": { "jp": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.039Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.053Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.049Z" } } }, "e1027f068c086d68bcd19c94e1c760c747883dda4912d769a49634e99a298bf2": { "327dfaab66de7353575183e0fe7d40b596436f7254ab77cbe35383223ad4ff3a": { "jp": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.084Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.926Z" + "updatedAt": "2025-11-29T02:56:03.087Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.922Z" + "updatedAt": "2025-11-29T02:56:03.077Z" } } }, "ea52d1bf57d6eca260482d6e9db0b3e4ba187ca46f787a3ec41ccbabccdafc29": { "7792c45b9f12363c758a86312cea564fda8789130772fc2a238a348aa77232bb": { "jp": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:56:03.032Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:56:03.004Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.097Z" + "updatedAt": "2025-11-29T02:56:03.044Z" } } }, "f2dd481c53ba67e19f970889ce242cd474c9da5ed1571b9d4f5878551ed45889": { "70876690558307749f06728cb6ac14fce7075dc54a6e8cf0695beae2917c50cb": { "jp": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.040Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:56:03.002Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.048Z" } } }, "f4deb9d37929966d7a5d1040cf9c1132679840850e80dd91a4e56e059568b817": { "e1dc787a6d679d3f64b0e02ce3b61001ea2f9d7a3aab736ee5ae17d2bc4a4c63": { "jp": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.041Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.040Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.036Z" } } }, "046cf4465fa1fb7186678766ac47cbd78704f28064400523e5b59a245d53c970": { "b13281a5fbb00f880845872b5516d8f9e9039198c4bf031942d0ceec737def68": { "jp": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.109Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.112Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.104Z" } } }, "0cdb3f54f81ff077472e66fb0a57247ee5bf3d2a93abeb493538e948840b724c": { "2beff12ea84429b1b15d3cd9ba939104aa74a91c9770800974ecc16582d6d010": { "jp": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.107Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.106Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.112Z" } } }, "1ac7bdd9222c1e2ffa17fc544f1241b28da0cad7f185b619d29ac27e0aa8c077": { "3f8afe531fdd885aba914642b81b85afea758c6f849a7250bfeebc09887cc894": { "jp": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.085Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.927Z" + "updatedAt": "2025-11-29T02:56:03.089Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.925Z" + "updatedAt": "2025-11-29T02:56:03.085Z" } } }, "2a7b92dadf95743e702b18a30f74eb67e67fef5ea4124220e608f258c6950c9e": { "c66b9e2d0f4d5e382ea43aee7020fd1c7ff170725159ddc185d674bc64b0d24b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.099Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.100Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.101Z" } } }, "2f0873b2704cad58fd2172ec86c842a8262cb2a7c1e6cfbf1e9851fa843f4357": { "d4282945578d91a5ae49277f6ca146ca130e3b3df3c0341a5de3414625c2c903": { "jp": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.113Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.110Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.108Z" } } }, "583a274e308afe89671f40f27b3be757e2c9e98eeb513765c802185f5ec14e29": { "17f1e539b1b6e7759a4aa628833db4667a7e74444abb42880111b4568a28ffe6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.921Z" + "updatedAt": "2025-11-29T02:56:03.032Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.921Z" + "updatedAt": "2025-11-29T02:56:03.031Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.101Z" } } }, "60a5d6b5624fc995f6807d15e66c5a5b6bc86dc212e1745ef8bef3f5dc15c3df": { "c3d809b05c72707e6bb1947b6db7f23f641f83155cd0f83a5e6deedee8d07adc": { "jp": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.130Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.125Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.125Z" } } }, "65c3d5357d49f1617e6e959d8e29071102eaf8d0d9e4d1c2fb7cad70b6173a35": { "4cc1991c7b87b22d25ccb176e3b79b021cdde65ce0a2f2e4414efe519cc65f89": { "jp": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.083Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.078Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.922Z" + "updatedAt": "2025-11-29T02:56:03.076Z" } } }, "6e5e66ee5bbbba58fcfeffbe0603dfd55d38dd278fbff14d70aa5595ee971bd7": { "c4a33214adceb28be9e704611bd58cf7f2b17ce705ec29ba0ffd552d82a3d73f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.104Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.102Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.099Z" } } }, "823e98e23e42535697ba133dc5c2d8b57c41a87124d772a59a7bbf545ac0dd84": { "d6ac975393106fe00f3edd51a065ab64a5e99a9aad622632a08705ff68ad4b36": { "ru": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.145Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.145Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.149Z" } } }, "907c6e7bab21d938402f694e7407939915297c82eafd1730100c830df4918778": { "c3a2fac6bf16acdaf76f1ef65dc3317e37696c35df4e8526e1bb887fa5cfdeb2": { "jp": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.124Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.123Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.126Z" } } }, "9840f3c84ffc8a8f881de9eca8454a7e8de6c5bd5c30b6a27784816805453183": { "491cb45d3cfae94c2b0cdeaaaf82b4ad9d2198ed681060717d4f79378fc92714": { "jp": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.128Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.131Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.122Z" } } }, "acee1d54d44425817e527bc2a3215f623d6ebd68804cdb7f18541efb76fb830f": { "53b8019634b145bda892aa14cca4d68066dd9ed1223e68c1450a60c3d6af3368": { "jp": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.100Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.114Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.111Z" } } }, "b66cad86246e7e672bea77de5487ab3238a0cbd0d829ebb54fd0e68f3cbcee09": { "9cf089c5df430ee74bddf608da84394fafc963e1bd03cd0e94fe2c6c179ecce7": { "jp": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.102Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.105Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.112Z" } } }, "bc72b7a9222edd97db763cb5ebbf3a678bd9d11ef3bc3a2c28fd6797dd845434": { "ab1bcc3128e7fca61edfa8cb48cc7969450a097b52da47b30b191820f3c2d949": { "jp": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.115Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.115Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.749Z" + "updatedAt": "2025-11-29T02:56:03.114Z" } } }, "cbf8d771d3e60af84970fcb0a9a3b216e9fa9d6604d8b59222876988a0f9a23c": { "05073dfddb68903600de4505e9ef4203c4b4f5979a1ad1001059a7e6a6c36293": { "jp": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.134Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.122Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.127Z" } } }, "d259b209c3435b62d81021240a05134c0eea6d95e4ac914c175f7122e5bcdbb9": { "2336e34b998efec4cc83f0643bbd8fc97a4fb0afa00c3343a22139925e777a12": { "jp": { - "updatedAt": "2025-11-26T07:24:18.921Z" + "updatedAt": "2025-11-29T02:56:03.076Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.151Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.148Z" } } }, "e01a6937e1ad5b11af43515d1a1e66db9e6168b75b5528ca1b7b9d7f3c195868": { "2c6fc2afd47aebe8d703b5147ab0245326aebcd6663db747fdeae29badcd7caa": { "jp": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.147Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.147Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.144Z" } } }, "eac642db564baa4ce1f75ca03dc5a23f44db2e588ad4390c7c3cb746e81f695a": { "4bcedeede08560e01db76c1f8f3c871bd8e8aebd281853aeef86bbc3841fd68e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.752Z" + "updatedAt": "2025-11-29T02:56:03.107Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.109Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.103Z" } } }, "f5ec5f1c0bd0776f9a2a7bff868a443e7cbb090161004e7da40277d9999a5e0f": { "1d3bbb34461ec824f8f745ff89fbbe7930bf3ca75ffcf25386fa8e097845e074": { "jp": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.121Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.127Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.111Z" } } }, "faf7c1208ac6cebd805f74b867ef0352238bb675f4e78c25744706e43a0bbf35": { "067bee4f308eb8fb0ee42187bb88647c1df461930299cda269dae6be1e92e2b2": { "jp": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.079Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.923Z" + "updatedAt": "2025-11-29T02:56:03.080Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.924Z" + "updatedAt": "2025-11-29T02:56:03.083Z" } } }, "010f8d66bb60666d0d358628411eeb2b1df5cd86161855532ace6b686750bb2f": { "0feb62388a935eebc64bf1d2d0c742a3b9d17f4ae18ff4e0ed9f4fe6e68ce776": { "jp": { - "updatedAt": "2025-11-26T07:24:02.751Z" + "updatedAt": "2025-11-29T02:56:03.121Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.750Z" + "updatedAt": "2025-11-29T02:56:03.119Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.750Z" + "updatedAt": "2025-11-29T02:56:03.120Z" } } }, "050352a11ca817f5bab4911101cd95e7ae7dc5d8954cd551028380c728411a57": { "6cc2916b976989ba2663dd50f541fbe9751c56f179ac300fc3381ca3479e452b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.134Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.132Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.753Z" + "updatedAt": "2025-11-29T02:56:03.129Z" } } }, "09a42960aa106a95a5cbe49be7b12f9120aefe3ef067ddb1c1b026342239f3be": { "eb1dc019fb90478f30509956caa9e4f342a6e2b031332733edb6a6b927bc71e8": { "jp": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.129Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.128Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.130Z" } } }, "12be1e0f0e04bb9eee1f814b983cb24150e4b9b4f2e86f8c6cf33f7dd28edf16": { "25966e125c5b0d0e09bfbe0bb6c4eced38f8afae86050666be245c00bb7f240c": { "jp": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.157Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.117Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.157Z" } } }, "130f0cbb1d6c82f8ae457bc5d3dfde8dafaeebcec17cebf6c1ec40eb99cd1392": { "4b5db766a70f9027101f584180002e5dd6f63ed99aa3d036eafd61435ddb4812": { "jp": { - "updatedAt": "2025-11-26T07:24:02.762Z" + "updatedAt": "2025-11-29T02:56:03.186Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.761Z" + "updatedAt": "2025-11-29T02:56:03.181Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.117Z" } } }, "30c2729724c6bee568ae40c9d3da452323fc101c8c757841c99647d3bf63f057": { "4eb3058a8a2fa3f5f9687fb24c64b384670b5101c5582da6a348ce515411116b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.763Z" + "updatedAt": "2025-11-29T02:56:03.190Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.763Z" + "updatedAt": "2025-11-29T02:56:03.154Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.763Z" + "updatedAt": "2025-11-29T02:56:03.151Z" } } }, "377591bbd1fd99159d49074a1492a22294d47fb29e338af9ccb456a44f4a181c": { "79d09c5dbf435fb10ca29153a98d5b635aee732c2aa61594fcc2f065989ce327": { "jp": { - "updatedAt": "2025-11-26T07:24:02.761Z" + "updatedAt": "2025-11-29T02:56:03.141Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.137Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.749Z" + "updatedAt": "2025-11-29T02:56:03.074Z" } } }, "40a262fc5e1c5d47aaac955e5d56710c58b184834fced0236175665ec187d93f": { "d9751428d997f059562f26e9bd7ac68c276f0bbf0c513551408f0513601e3d16": { "jp": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.177Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.181Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.176Z" } } }, "46dbee6938843b18fe050245cf7379885770dc6f9f8ed8013ccf5222d1c306d9": { "1c26addde8215daf58446cd375e5e150c2d5ceeefaa8b2acfdb9c9c8afb9953d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.166Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.169Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.170Z" } } }, "4c1ad3942b4184430a7d30de866388373d48c1a27718ee8712e351668b5b2c7b": { "7f0ff3de1f2f3ef36f7c5bcbadc179455a3ae55c4a9e388b8148b18a4dfe6b7b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.133Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.136Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.754Z" + "updatedAt": "2025-11-29T02:56:03.139Z" } } }, "8d0001685270931055d17a8eb50155f983dcec73c892d71e3bffe9004c1cacd4": { "c26606f99e8098f4ed8f1e29ccce89dec0e9cca96fa2536b375d31a3b9fb8036": { "jp": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.140Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.132Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.141Z" } } }, "ac35f8f55935d4ecd0e3d7d6c02b398d04b18c830570d65f6551b9b4ff45bb74": { "09c8a0f7de8fedbc086a20b8603b6ad2439fbb800e29c34ecc840908cfa41148": { "jp": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.161Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.166Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.170Z" } } }, "b949b99783c59002d6d1611f53562639a71143cfb90e027a848ef13b70877e4d": { "65ed1ef87fa32188d6b83d9345586ca7be9701ab437946eec188e8d638e56014": { "jp": { - "updatedAt": "2025-11-26T07:24:02.762Z" + "updatedAt": "2025-11-29T02:56:03.143Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.763Z" + "updatedAt": "2025-11-29T02:56:03.150Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.761Z" + "updatedAt": "2025-11-29T02:56:03.142Z" } } }, "cba0abc4ab65e9d030139163304a053ef5b1fe651a26215e77c9e551fe3b8191": { "62328876676efd5312772f4062f7342ab3fbcced0fec39177d7de554d93c9005": { "jp": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.123Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.124Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.126Z" } } }, "cbf50a3e7f149ed504ecfb70077f07ab9e2fed847c539a9e27d5aa88c015e5f3": { "2db80f4884390b5613f02ed18bdd9194f0f0ca4c9123aaf5b1a68e1c52e263f2": { "jp": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.149Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.153Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.755Z" + "updatedAt": "2025-11-29T02:56:03.152Z" } } }, "cc4204c3e95911221d74a7265dd2e67515e9b01a1b9394863f065398c955594d": { "9538d72bcd29de25ee9a900cfa42747f8ab0f5767963a08a3028ab7f3b189a13": { "jp": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.179Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.761Z" + "updatedAt": "2025-11-29T02:56:03.184Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.762Z" + "updatedAt": "2025-11-29T02:56:03.185Z" } } }, "e15247f6690c752be9eb052c65d6188bf83aa3aa12e45c3969ebd294c52787ad": { "e8049a4edea61ad5f86939e7938566c1c4db909e94409eedf5fec35ac6d46e8c": { "jp": { - "updatedAt": "2025-11-26T07:24:02.761Z" + "updatedAt": "2025-11-29T02:56:03.183Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.750Z" + "updatedAt": "2025-11-29T02:56:03.116Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.762Z" + "updatedAt": "2025-11-29T02:56:03.186Z" } } }, "e979381df042f92438f9f485ef68a9901f7ebe9aae3e09ec14dd65b67c2d842d": { "67bbc03e619fab0b6f99efec8b0f2fb38df1395be3d50b3ed225f0da4b3f4452": { "jp": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.138Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.137Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.133Z" } } }, "edbc39ef9c56e581bb84c8896ac7b1374e3d19f83b554328b6e8d3d38fe01125": { "1f975f6dea1c15645a72a9eac157d5d94cb767124fa4ad2e367bc8233d6b225f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.135Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.750Z" + "updatedAt": "2025-11-29T02:56:03.075Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.138Z" } } }, "fbe0f20b7a71a4be3f802731a84f0eda5afbf565f744180f030a4474dd0b950a": { "acb4ae581b304b32468cac562d7016a47f6ce4fe713075ab12bd276f5d04a0cc": { "jp": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.135Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.131Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.127Z" } } }, "fee41c1b851550b4068c1cdd9e5a18a829a2d27697fe22a9678a8c0d0e87836f": { "5d6d7dab6e54977464b77d2be0fe3967209334b0d1e2cf141000a53098cdb64e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.138Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.763Z" + "updatedAt": "2025-11-29T02:56:03.146Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.140Z" } } }, "00f878a9534e344ca38d2f13a2d0b58a40257c9f7c696adfbc337ee5148c5894": { "d7ae2149e8a1eca5c76f2e499f9ddf19c90a2c840a153acd2e820b96f79c4e3d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.772Z" + "updatedAt": "2025-11-29T02:56:03.191Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.772Z" + "updatedAt": "2025-11-29T02:56:03.192Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.772Z" + "updatedAt": "2025-11-29T02:56:03.192Z" } } }, "262ef21ffee6eb3348b7484a2cb16afdc22c4c02ce86edaa851cad0979d13067": { "5e4f687928ed10c1ab9ee1e070abf78ab7adc2bce9345de9158ca65c8a403093": { "zh": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.223Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.221Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.222Z" } } }, "42014f03b2e5e17b4e9d8b4cd80cfebbf2e3bca570177e4a0f46c977d992d00b": { "1713044e3cccefd79213a1fea6cb08cc00fcb5a3cdf023fa1b265af8ff27f097": { "jp": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.214Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.213Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.219Z" } } }, "4c05567fa33cc5dc9787df23810bac6451ac3a0fea9f57dbfe51135476f2af9a": { "539aa35729dd5eb9f1172afd319421d880ea5ac2efe1aac243083236a1389aa5": { "jp": { - "updatedAt": "2025-11-26T07:24:02.772Z" + "updatedAt": "2025-11-29T02:56:03.225Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.224Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.224Z" } } }, "4ec20679bc9c3514801ed7e21c4718d82ab75932df1a07eb0572f662a5730d98": { "86d2c497abf25c94fa112b01bc6df68914ef1bdec7669aac57b740da912b33d9": { "jp": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.172Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.158Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.172Z" } } }, "5a79d1e559ea1ad9f3ddadfdb2a43b047724a8158973368a06de949a009e4a82": { "f10bce44ecc97a7f7fbb9e4dd3135a3443539faf27799c8357608d1f78f0ea0d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.180Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.173Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.173Z" } } }, "5ea715da4571fccc329fc033348aeecf183417b55c28bbdac60956aa1debf704": { "2a8b05277ff4a9cbe8def769d30fe9965fd38e380148a45171afc696a707de97": { "jp": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.215Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.209Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.217Z" } } }, "6577565180fdc2dd6b58e525087f761a4a641e5fcccec17b8d198f112e8867a2": { "457a7fd8ab504d03ed723c9475bd87417db7fa6b8d538f336eab293e7c2db492": { "jp": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.212Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.210Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.765Z" + "updatedAt": "2025-11-29T02:56:03.206Z" } } }, "65f86c7c3a06da5be6ca7c02d2ebc67707b92772d464e19a9f17a4ed1f5068e0": { "816a9dda53486f2f740142aa953a0c567c672d1d673898a9ad9493dd248c9c0b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.160Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.164Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.163Z" } } }, "69e3ba4ff50b5b7c3475f46f967bf675b4e5a81f02e3546d810018e6a3fe12c7": { "d64fa7ded50ab81c30dff31ff460cf6ba0811be8f95127b0bbec04487a124039": { "jp": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.176Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.766Z" + "updatedAt": "2025-11-29T02:56:03.169Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.182Z" } } }, "741985413cbcc54cd08f4f04379dfece525dc97edf44e2f8df78b544f7dd91e9": { "2bd4eecf6148d08318f581143d8ed2830a034f2bd9d72c70252b27c1cf3654bc": { "jp": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.174Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.167Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.175Z" } } }, "8679a4ec12ab69d4d68a5bb2c5cea4b7f0881bbdd39e33ed0dbce1f7a96a02b2": { "6dafd0d4cd13c07a59291f74e30693ff78bc11afb76dbd58ffb368da7e83a065": { "jp": { - "updatedAt": "2025-11-26T07:24:02.764Z" + "updatedAt": "2025-11-29T02:56:03.162Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.767Z" + "updatedAt": "2025-11-29T02:56:03.171Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.158Z" } } }, "8a737109d61aff4ff62c3cea1b972f0a7863c8fef9c1f3658e42f4cb31df1392": { "132aab96d1afacf12308b65ac1af9345cb2b097664b24dcf5c773ca74a90c659": { "jp": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.215Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.767Z" + "updatedAt": "2025-11-29T02:56:03.208Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.210Z" } } }, "8b22e50ae696d72046531764b190a2ea3daa28284aebf2f2f2721e1db7b9a752": { "a3ec1a8f31c388fb6d343bd343994dbc83607b4c1aa74c136db042c2472a32d0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.766Z" + "updatedAt": "2025-11-29T02:56:03.170Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.764Z" + "updatedAt": "2025-11-29T02:56:03.159Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.766Z" + "updatedAt": "2025-11-29T02:56:03.168Z" } } }, "8cf48a0bc486c9b8e497ecc604e48b940db90a9be71802444fc6568bc64fd85a": { "2204d84ab0794f79cb34e93c0671da7bbce325d19d8d5bbb80030251d39917ee": { "jp": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.220Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.222Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.223Z" } } }, "8f767913276b5f3417959156454a31c70c834a5c7093a2081510ef83903f4795": { "bce52080edbc2ef28e9154b8f007ec28a5e436114ad9041d55ab9bd299d603f2": { "jp": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.185Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.180Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.183Z" } } }, "961e4fd08064e39aa2526ab854951754ce9cab815f42e5e159992babeeaa5b0f": { "cf7f511889edff19a30680bf294dfbeedaefa3ea56faf9de40db511b5d58efdd": { "jp": { - "updatedAt": "2025-11-26T07:24:02.772Z" + "updatedAt": "2025-11-29T02:56:03.190Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.189Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.772Z" + "updatedAt": "2025-11-29T02:56:03.189Z" } } }, "c237b65e74a71bfcdfb33228aa085209a607cb0227f57e434c617a7ced16d975": { "cab8ecccbc0fcc08ad057ca251274b94773a36f8f2f5c0968c4007592472503d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.188Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.771Z" + "updatedAt": "2025-11-29T02:56:03.187Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.187Z" } } }, "c3bbfaf5ba432f3383f9213e2c564cedcf64baf52ca43663bcd031fc79f65fad": { "46c4379cf36fa439d614c84a7b1f2a6e319d2f3a5e352e7f3079aa72e1634e3c": { "jp": { - "updatedAt": "2025-11-26T07:24:02.765Z" + "updatedAt": "2025-11-29T02:56:03.165Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.764Z" + "updatedAt": "2025-11-29T02:56:03.163Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.765Z" + "updatedAt": "2025-11-29T02:56:03.165Z" } } }, "ca7eb037869880c9ebb1a34c0000cdbfc8fdc9225de1f230ad67b8fceeb858de": { "fb2d804909b58e74a6d190031cfb86ce2cfa560d0444d3bb3d0a0af94da23268": { "jp": { - "updatedAt": "2025-11-26T07:24:02.765Z" + "updatedAt": "2025-11-29T02:56:03.206Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.765Z" + "updatedAt": "2025-11-29T02:56:03.206Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.765Z" + "updatedAt": "2025-11-29T02:56:03.204Z" } } }, "d6a2aef23a40b1f742ecc4bbf44e21b915daaca32e6106a813cece2855459b4a": { "c2bbc1291a1d9794a9a8424dacda644c27086e3d431d4f0bb25b88182d583c5f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.175Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.758Z" + "updatedAt": "2025-11-29T02:56:03.173Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.757Z" + "updatedAt": "2025-11-29T02:56:03.167Z" } } }, "ddcf8dfb6b1a4d5a1ed98c2017cdd7ae1fe774db2009725b2bf3d5ca4a50b322": { "4f4dfdc7521283f8c0348d0878aa061e186e3e3aad4e92d55841f1902f00e3d3": { "jp": { - "updatedAt": "2025-11-26T07:24:02.760Z" + "updatedAt": "2025-11-29T02:56:03.179Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.178Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.759Z" + "updatedAt": "2025-11-29T02:56:03.177Z" } } }, "059de09a546e5fd7f343688a18f5ae23fe63e31ccd72bd1d8e0ef1ccff248e9e": { "e0133670b30030462807054fabd8948f4d58d68bda6f5fc806435ba96fdc2531": { "jp": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.259Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.261Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.932Z" + "updatedAt": "2025-11-29T02:56:03.249Z" } } }, "0e59ff691e81e6bb5df727b7bb1a30005ab315602d293b41cb391ed4b5409e8e": { "ab3c2315a32f46dcd77506c38fcb11173ad15a3ad7597e20a3af0f8b3c8e1c02": { "jp": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:56:03.199Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:56:03.195Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:56:03.196Z" } } }, "1be2e6251cf6bfefceeb9a1d2a2cdfcbca4f3dc24d4303c2a666b520ce7dbc5e": { "79ae2db2ede93c3db9f3aa10741077dfe47e966f67fbb578af090bc05ef54683": { "jp": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.207Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.212Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.764Z" + "updatedAt": "2025-11-29T02:56:03.154Z" } } }, "240885d8a55bf641313a779462f9d5afe9dc23030aa7263fae65179e8d79b9cf": { "0f3c6f532be1ff66173a6f491090bc401c5f5ad396a065d669cf8be23b790fbd": { "jp": { - "updatedAt": "2025-11-26T07:24:18.932Z" + "updatedAt": "2025-11-29T02:56:03.203Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.208Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.932Z" + "updatedAt": "2025-11-29T02:56:03.203Z" } } }, "327d9de85dcf4e9908ef639e81f0b4c26211261cdc7427d31c00d57a68f9ea57": { "defbbc0826e47d88fbafb696aa0613a205a13036670b5b16d9f7262852215ad4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:56:03.193Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:56:03.201Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:56:03.200Z" } } }, "34fc130494be0d69639ef51384f698c85712275c82f72ea0884fc912c61fdf98": { "92c9764efaeac8ae2150358dd44c1bb27f41eb7fecfcbaeaa5223b274ca6abf2": { "jp": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:56:03.198Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.764Z" + "updatedAt": "2025-11-29T02:56:03.156Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:56:03.197Z" } } }, "3d292af39191f27d31948c49e58c34422323914d2d835dd3b8be63d271aafaeb": { "6c24a188e7d85e8dc525f5000fb2f41b08e17a821ce60ddfa9341db9802fcdb2": { "jp": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.218Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.211Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.212Z" } } }, "4b025a8d2616c548c48183c20f38fd63b3419b7d2754a037d1a3a71de57c5a3b": { "ff303dcd7cec8ced40bda437d563bc42f245742fe9f5d04eda4a24a951b0a458": { "jp": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.257Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.932Z" + "updatedAt": "2025-11-29T02:56:03.252Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.205Z" } } }, "4be2dfff7ee7eb8ba7e00bea4338d4b73e59739bd67763683573c2c8a87c9e3d": { "37c83798ddd19c1e72b3674657a3635ca49e5d5bf74e74f2fa7bab5c89d58316": { "jp": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.248Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.260Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.256Z" } } }, "508c2be06359376eba3e09eb266a71fd1a64aba5ea5c127642c386bdcf720d00": { "32a1e97aa76cb271770dca75fd904e715623cf504f26d889bcb51a382ae083e8": { "jp": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.263Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.255Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.261Z" } } }, "6547aef5926a6b2487f43dbec05e0957fe924c3749b2e7aeeb9c8724921310c6": { "d72d4d5d1769fb68537cb2b0120c647b9e45e7282fdf4303b4b3b3ba33eb151f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.764Z" + "updatedAt": "2025-11-29T02:56:03.155Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.205Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.218Z" } } }, "742de82015fab9560f32bc67cc0f07a9ca9e1ed3e7aeb11eb4303fa8a580185f": { "e8e388627f1d46545b74abb196d0b01e87cea3cc02063cec9c7cf6835a4f7d7b": { "jp": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:56:03.194Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:56:03.195Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:56:03.194Z" } } }, "77a9c51767cd665f3dd2df3d7ddefaa1effd2f1271cde0211ccbb68de9869a6c": { "1c1de24396b6e6f16f0f9b41c9ee154414738e50d2c294ceeedb57d2b780396f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.219Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.215Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.219Z" } } }, "90aeecc84affbe1a94ebd79e7e3236a66f9c627e327fbaeb50f05aa43d716a7a": { "a7b61a1bd22ae77b9b4f8fe2bc248f5fb8a900c9c853a0f4b28e2114edba6edb": { "jp": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.214Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.209Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.221Z" } } }, "9815f463df07221f4071a1a1bca594afe93b27adf83236c69b1a77b1ebe508a0": { "007c21ba67676302542c1fff75925930501f8226edd684ec93ea8a9d480c18c1": { "jp": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.288Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.291Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.293Z" } } }, @@ -3880,520 +3924,520 @@ }, "471cf465239242ec9f9d784205ced7fc1640f6da4c8228d46163e7757979aa8a": { "ru": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:56:03.198Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.756Z" + "updatedAt": "2025-11-29T02:56:03.197Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:56:03.196Z" } } }, "af79bbae5029e0964764673ad906f12ea5d0cbd9f6358c69ef5ef5e1e2abf9c8": { "2ac53c6a243d501aa141cc7a46939a9b6d8d89958a13b73f7e3def4acf386114": { "jp": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.283Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:56:03.286Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.263Z" } } }, "c26d90fc85acd6879286c1468a93acb164acd86eea2a927516015902a9a832be": { "7cecd0f5d3861eb201c695566fbb8efba35f90080e6ff53cfb99227a455a7433": { "jp": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.254Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.933Z" + "updatedAt": "2025-11-29T02:56:03.258Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.934Z" + "updatedAt": "2025-11-29T02:56:03.262Z" } } }, "c8e894dbaf5047cc3cabc950a4a8ff475057f2bc769f6e66960185717ec18b52": { "53f949f10b8d348067c1f595ef08a9cee2ae03679b3e38fbfe1a67bd2cf12eef": { "jp": { - "updatedAt": "2025-11-26T07:24:02.770Z" + "updatedAt": "2025-11-29T02:56:03.220Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.213Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.217Z" } } }, "d6b97ab54d7597109de2eeed733aaedaf2f8744ebeed7ec1031b8460e9c545c2": { "60328591af08fa91508ef8597f7a9b54e083806e1906b2740d4ec5802abe7ecd": { "ru": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:56:03.288Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:56:03.289Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:56:03.291Z" } } }, "dc33a2eb5786282387491dfbb49c8ff622ea41f11b3278436c7f82ab857f0228": { "6d34c7aa55a8fa5def4e3f2bff389c666852c48291ebab26dbe11069e1977d67": { "jp": { - "updatedAt": "2025-11-26T07:24:02.769Z" + "updatedAt": "2025-11-29T02:56:03.216Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.766Z" + "updatedAt": "2025-11-29T02:56:03.207Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.768Z" + "updatedAt": "2025-11-29T02:56:03.211Z" } } }, "0b6d9c8bcd38a3dcf622f85a9b9f97289107d754955596db63086c5a1f0de013": { "62bc03adcac1853c2ff1d41eab5ec55613571c9634311e2e305ff20b78db334b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.130Z" + "updatedAt": "2025-11-29T02:56:03.324Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.130Z" + "updatedAt": "2025-11-29T02:56:03.324Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.325Z" } } }, "13e624cf649963b0430c85b33066c42e9a463e53696049fdef557841854d666d": { "81c2903aa8b7c3295234e5c1b7fdf2be7dbc55fdc9edac19c3d4675fd1215205": { "jp": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.328Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.329Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.330Z" } } }, "2ed1c4bf7fd0d1e9a3aa0e5f13e3c86bcaa77e12c79c9d2fd35be9b8cb485fdb": { "042d7dbf05f1c54ecb628a3aec1b03eb4e2b6e21cb8aa57b9ada88ffcae4f8df": { "jp": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.295Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:56:03.300Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:56:03.298Z" } } }, "3d2059239ad6af1a2ddfd59349dac15c70518ae11885267fd488f16281699791": { "bb8598cd736f9055ff9d8ee57cfbaf381f8b9b7dd5b8bedf4b973dba8c441a2a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.135Z" + "updatedAt": "2025-11-29T02:56:03.362Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.357Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.356Z" } } }, "3ea83a8ef84ec6bbe25f2090619db1abe347ff2b73bca590d6c93d68a42e4e64": { "d03f731b06fef8fcaf928f6e3faf509894d47eaf5b4921a111e9884783dfaf7d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.234Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.243Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.241Z" } } }, "4ac2aa31459a0a92af805200fec9ac7d528d83083a8813c71176539ce30a55d5": { "47965995534ac0fbc4b623464960445019f4dbe230323078f5ba06347fc0188f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.354Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.361Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.350Z" } } }, "4ada93142f1fa23e960fcf0c89e6d17aa2696229485742f034de4ee6593c2071": { "2f19a7e891dd293775fe6638aa903e735c6029210bbf3a17860c69e6f1f6bb6b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.130Z" + "updatedAt": "2025-11-29T02:56:03.323Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.322Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.130Z" + "updatedAt": "2025-11-29T02:56:03.323Z" } } }, "5e4520555f04067ffa7eb5af85e61960bb9ef0b5e53db65b7b0471c0eb67e3ca": { "7bb096151a00169df14ef9af359bf6d8949aae217704606f9a6b10a44d8ed7c0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.202Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.235Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.236Z" } } }, "736bf0149d53b024ca3bd9e7977f0bc63d265b1f25ebfb6dfdefeb025d67a838": { "dea965238a83d73269b02031548818dad6e76024fdd545d4ebfad71b6ea7f2f6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.202Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.235Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.245Z" } } }, "78374142cbe93e8f6c7c78c21fae25fb7304d36492b6bf841f120cb0b757622b": { "8c65e21fe9e7b63afe26dee2f144ad334fde661179f2df54cde98ef19f746770": { "jp": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.285Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.284Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.281Z" } } }, "7d77ec1ad6a5f022e0b46f5c3c3ce2c3fea37ff042d1b5dc03023407e067e3da": { "a014826091cc7de6ffe26de700b6870df49479656119a1c4582ab3ba9f32f66c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.290Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.287Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.292Z" } } }, "8c7d4f3fdba3bb4edd06686b726948493ddc13a3c70be44e45a5101013e47060": { "e1a3f32eec379181f97de3483a7955652a71670ed2c2d3ea34c65b17fdc5961d": { "jp": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.296Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.294Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:56:03.299Z" } } }, "98ee65248863652e985d674cf1372dd020bd6094b7f3998ae6f4a646d94892b6": { "1bd995b679039ca6bce9ee0b09736ef8f967620b8b89d51a62c70a4d312caa42": { "jp": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.301Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.300Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.294Z" } } }, "995a2e3a8b7d9f74a6263555c02ac239faad9cd474831a38bb8fbe02a8eb4930": { "9cf1d6f4f93a189585be6125df675ba7e1d73f8db3dbffd354c683519bf24dc5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.246Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.246Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:56:03.242Z" } } }, "a0768d64d8480213582b5d2b019ac82a6fe9572e3115c707079ccd2a6665834f": { "f53e89f4c4f5f43c018862a8bcb2458cf38a59a2eed7d3a2bac21d2ed57cd772": { "jp": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.283Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.285Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.286Z" } } }, "b5acaeeec7ee7e0b3d8c363ae84792dfc90953fe82cb345bd9a76003f6857008": { "becf724869353de9ac0fbdf72d34274bf02c4477ca8efc26bf383f25cab477b9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:56:03.301Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.296Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.293Z" } } }, "b6cd16941758ca4a1cd018e80e59496c19b7711675f9eec3946a989810da8301": { "def5f58d34f9e59ee3bc906fda67f3a9ea90982c852224c86d9d02f3eb4daa81": { "jp": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.330Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.201Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.244Z" } } }, "c5c9fb1e01e8fd89820000126b65de13c1b1aa7723a21af8dd6a22b0c6ce61ab": { "f0bcc513afa858c10cd2907f4b418305889e8287702cf9cdb050972831c885a7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.132Z" + "updatedAt": "2025-11-29T02:56:03.329Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.327Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.331Z" } } }, "ced886ccae611b5ba4d14770da1f424b55ef56a32ab309f10b5ba3de061a0cbe": { "4c6f8e2e7974ca1e44a92dea680f0fe4823cb3dbd478d406583065fef1965c83": { "jp": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.297Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.978Z" + "updatedAt": "2025-11-29T02:56:03.297Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:56:03.298Z" } } }, "f3dfcb7d93e8daf7246f1d7b55aef72c87092941f169ec834a03a5094039d22f": { "30c8a47e6bcddf07ce86164218209c750f1bf6a65eaa190202477bb3b35f8686": { "jp": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.250Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.247Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.105Z" + "updatedAt": "2025-11-29T02:56:03.251Z" } } }, "f84c373cff7dbac798db4f00e0218085b87659f099e72d499856efa42972f195": { "4b9492d3cf50402946edb0019de92a07ebf67ee41426a0a31d7cd82149581a9e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.327Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.326Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.131Z" + "updatedAt": "2025-11-29T02:56:03.325Z" } } }, "018a46e784f4216bc572797ae4cfd925900c11b01082ddf5a2c9b5ed08891d85": { "0d31eaa79270bc25ade146c9f275b342537708966bfbae7622a921d0c569a2ee": { "jp": { - "updatedAt": "2025-11-26T07:24:12.136Z" + "updatedAt": "2025-11-29T02:56:03.371Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.135Z" + "updatedAt": "2025-11-29T02:56:03.365Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.140Z" + "updatedAt": "2025-11-29T02:56:03.390Z" } } }, "171b148b39ffa6bfa68154f7f794bc9828036c905ec6ea0ed3ab52ea0ab68098": { "9b71315bfc1a5504ea574514ec21f8d0b8c75e646482a4fa10456513e23ec3be": { "jp": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.454Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.155Z" + "updatedAt": "2025-11-29T02:56:03.458Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.154Z" + "updatedAt": "2025-11-29T02:56:03.457Z" } } }, "24ff6950696e941c133754804fa0f7502ed10e3f273f7828f34d0ec98cc69169": { "9ffff4baa30bb8aedc5b7c4bed60c32432037227f50854a8cf0a554ca74b6742": { "jp": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.447Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.436Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.436Z" } } }, "2de6c7cb85bc8ce6037011a7cb84ceda700e54852ad5f8048c1b021e9505cfe2": { "cffde22dd20a99321b2469fa4c5f889ab0623f7597c7318cb5c82cc569be15bf": { "zh": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.444Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.446Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.446Z" } } }, "34539b13bc46ae1ff86399ed0b4beced83470a47c23ade3688d97729e239c69b": { "1227956927c2e159479174df3466808d9bd9a1f2cdd1dba3233e8d80391d27c2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.447Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.445Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.437Z" } } }, "397adfde7a860a0707618fd95e8f1f4db83c3ecc2e6141f24b64af0162bec70a": { "fa85899ec41f9998773c9e4dcae84709a75245ca0e0e75850cdc76516b7fd66b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.141Z" + "updatedAt": "2025-11-29T02:56:03.394Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.147Z" + "updatedAt": "2025-11-29T02:56:03.400Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.138Z" + "updatedAt": "2025-11-29T02:56:03.383Z" } } }, "439776d4466dd70e3c5608271d0bffbce0782915faaf2fea75fff7b8e7835bee": { "eb302a76d12c1319056a47c6302ef68febf3a0648e4ce4f94b2b9cfe7bec8c8e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.154Z" + "updatedAt": "2025-11-29T02:56:03.456Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.453Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.154Z" + "updatedAt": "2025-11-29T02:56:03.456Z" } } }, "5efbb4c7ed17158323437048f6f32b54a1665e8008c3b499bc27160f7cbf02df": { "06c63df1edaffeb10cb0def08a755d71c765dda9e99144cb3ca1eda2e783c187": { "jp": { - "updatedAt": "2025-11-26T07:24:12.135Z" + "updatedAt": "2025-11-29T02:56:03.365Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.135Z" + "updatedAt": "2025-11-29T02:56:03.366Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.135Z" + "updatedAt": "2025-11-29T02:56:03.367Z" } } }, "61b82c455342cbc02f4a1d8651204017609b443fce1a7cb57a4831730d7fc050": { "1d27a882dcff09d3f22870a4f6707da298747c547d36d3db2d61ebb22253f91e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.155Z" + "updatedAt": "2025-11-29T02:56:03.380Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.156Z" + "updatedAt": "2025-11-29T02:56:03.417Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.154Z" + "updatedAt": "2025-11-29T02:56:03.373Z" } } }, "65514e61688950cbfdfadc40744ab73dd695de039206e57d83d48b00a2982161": { "c8edcf2ff1eff165beb006860951dfee61d76b4197857f2fbc085e60726d3e38": { "jp": { - "updatedAt": "2025-11-26T07:24:12.156Z" + "updatedAt": "2025-11-29T02:56:03.413Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.139Z" + "updatedAt": "2025-11-29T02:56:03.389Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.147Z" + "updatedAt": "2025-11-29T02:56:03.402Z" } } }, "745a92a844b6497c0310ad16eb03df90d655cde8d7482e58f32d1af9a9c6e68c": { "ed4640fd150472b99b01119068e79ab5dce8af8145d98d8e1f847e482439180c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.135Z" + "updatedAt": "2025-11-29T02:56:03.363Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.352Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.353Z" } } }, "7ca5e1494be65fba41fe95ee7a3461cd0844038fb74f44098aa4e3f88607c562": { "ac68f255dfedba5a9d7fc4021983a5c3dfb83430f46eefe29bc3204cdf2720ec": { "jp": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.350Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.352Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.353Z" } } }, "8bd7dd424981003d655b71b52a223cd72ca57102e28da0b8baca6e8ed3256122": { "8c69f1a1f0d38fc584fc63dfbf0111f2d94d9ce8ad28c47314863119988ad693": { "jp": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.320Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.137Z" + "updatedAt": "2025-11-29T02:56:03.378Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.148Z" + "updatedAt": "2025-11-29T02:56:03.410Z" } } }, @@ -4419,343 +4463,354 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.158Z" } + }, + "32f79342fda1521b32c3cbd5194d1c9682d16a53ade8cb05571f8a298e7705d3": { + "zh": { + "updatedAt": "2025-11-29T02:56:03.334Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:03.339Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:03.348Z" + } } }, "9b90a0dfa5536d6059d87dc8f5e817097c8b7bb53db517bff51a83c3e4c282ee": { "3e080983011ca5e98fc432fd4170067d4807f3aaa1e1114b8ec36d58af28fa38": { "jp": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.432Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.433Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.430Z" } } }, "9fe1ae047d397e67707e74c6e97afdec367a2fb4cf27a1ade86e3e2bebd7c4a1": { "9bf44240bd8b0398201f8cc05ed363d4bfa70d08d267473203007c092efe5287": { "jp": { - "updatedAt": "2025-11-26T07:24:12.130Z" + "updatedAt": "2025-11-29T02:56:03.232Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.129Z" + "updatedAt": "2025-11-29T02:56:03.229Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.360Z" } } }, "b12e51a32d37bb2fb10917322e67f8c70cee8f595c143cd1b629cbf918f6b7b1": { "5014ad055f5a140206335e375c472557e174c690fe089774a9aa8c6d57d28567": { "jp": { - "updatedAt": "2025-11-26T07:24:19.014Z" + "updatedAt": "2025-11-29T02:56:03.234Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.136Z" + "updatedAt": "2025-11-29T02:56:03.369Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.141Z" + "updatedAt": "2025-11-29T02:56:03.396Z" } } }, "bb0a1d7136d43d7b6bb4fa9a54f344ca0e81896a5eaf9cc6ef57b8c3aa682779": { "399cd03c18db8759846f978c253d288ef4caab87adb1838ee5aed970412744bb": { "jp": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.432Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.435Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.445Z" } } }, "c9bb01545754a986ab5cb4d637d8745f995e8c5243183cf90e72563584cc924f": { "efe17e7594347ac3238decf2b1daf336a87a883f6d30bf4a916bc5ae75b80dc6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.354Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.349Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.357Z" } } }, "e814a9ccad02d86ef7c915fb695045529731c882788157b39795b3d624875c39": { "e078c263c4a0f84949c189cd1b90be6b54b0117004a43d0171ca1e7dbbab8fa6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.361Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.135Z" + "updatedAt": "2025-11-29T02:56:03.363Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.356Z" } } }, "f4614a808acf58ed3907dbc80a1d159bc107dde839623cbee9705514996e1fc7": { "ad253066ead1dba2ae292160fbbd6c6d76963231fdc98e27296a51ffab627b05": { "jp": { - "updatedAt": "2025-11-26T07:24:12.134Z" + "updatedAt": "2025-11-29T02:56:03.355Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.351Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.133Z" + "updatedAt": "2025-11-29T02:56:03.351Z" } } }, "fb63ffa66c1f033c420fc44f068aac3712f16d06effcb9b76446564d05a24f47": { "1f15e6976c3b57e0c74fc54faa9674d3ad5afb9a87efa0a5368573923ad33611": { "jp": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.443Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.434Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.443Z" } } }, "168f630aa6a5caf3759f0040f89a49b660bf997cba3f9bb07f93ceae7eaaf55a": { "3b9ccf775a7eb6ed27d87bbe61d94bd4d43913c00f26010a4b8706daf4a6a956": { "jp": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.429Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.130Z" + "updatedAt": "2025-11-29T02:56:03.321Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.434Z" } } }, "23e27d61b6423512c41b26e6c3b22921e93b5b301057fe1f453a2c0d3c1d15fa": { "7a7f792ff342a20689f60f0f265171128a171dee6f6e5a078ebb83a2cdf6ed03": { "jp": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.426Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.427Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.423Z" } } }, "296596880e307a8996c1b3d2f22b414f048332caf4d2083980ef5b77a8a5fdba": { "8891345d058983824a4006d332ff1e3d458871da85894bef04abd4b4a563fce5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.492Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.491Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.492Z" } } }, "3147fdc69c8941ecf865e47d9d8db4472067857ced28a4db9f1732ab44a9e898": { "89c5c15673bafb792cce9d30449c0c07581ad4fc443060edb182f1287d36112c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.449Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.420Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.442Z" } } }, "400e0d7d9471a5d2f998a13e2c607bb42e5b9c72e742d7aeb05f4ee1b2071baf": { "04b93a38ca385c15ca8270dcfa15d68a6941678bdcd2f76c2ad4f06bef8c33c4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.453Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.148Z" + "updatedAt": "2025-11-29T02:56:03.418Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.154Z" + "updatedAt": "2025-11-29T02:56:03.458Z" } } }, "4088be7256afa16e0829b465fbe851d2600d3bbb21c2610210c4075f713ee668": { "5263f7887931f9fbf63f2e9b15b7ccdd2c7157a7fd13cb67ba7bb5a4724f5c9f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.483Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.478Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.482Z" } } }, "434c8c6575a1c96da70aa7b25b8f2386d3813854c5fc71c4731982bf93c5b551": { "33868413cbf230f1914b6622c0fa2f639a7ea45c3142a4368aa173e8a03fc411": { "jp": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.478Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.485Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.487Z" } } }, "5199e54b28e8b206af31f52654ebdf21657caebae6cfe9e8a655ac120217243a": { "cce5c749f00809c0ebd64bf0b902ba923e07ffe3f6cf94b3e416613a539be455": { "jp": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.422Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.424Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.423Z" } } }, "53036f27fabf8d446bbd29d9cc70a86efca0166f01d8c0a80c2e5887bae5dcc7": { "4af9345e8b4d38c273b70d4810c616586320dd68b576345f37b88d764fc3b31a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.488Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.491Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.490Z" } } }, "7e14895b92e515a566c49df3e172fa8ef0794a3911f227fc4a71c6dba5f490d7": { "99b76fc928beec586c17a5cc43f58eacac997ef5729cc011bbfca37d37c70a79": { "jp": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.430Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.429Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.430Z" } } }, "818f1c114e04624a9ce346e723231683afc9efb77f488e698cfae3f76123798c": { "7802fce1dd531f1d9274394e1014f26f608015405f1fca427d28159a91303ceb": { "jp": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.431Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.444Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.148Z" + "updatedAt": "2025-11-29T02:56:03.302Z" } } }, "89be4ef20c9e5fe95e7e9565ff5aa903eef3eacf9ef5bbff1fa371c4ce7dca62": { "a6c4756c4f81974e9497aa328cf4f067d2e218a364817e6b3353285d9d897dbf": { "ru": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.473Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.484Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.471Z" } } }, "92e7d4855f47bd7172f2143c5bf24c013dcd99fd681ef3d53e75a588365ef40f": { "4aba2abdc8ba16a13f0e130fc8a1c260887158a147901de0d5f87498741d53f4": { "jp": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.483Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.486Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.484Z" } } }, "b82ca3ae71e7ca0bff5a8a1a958e415791b51606240790fabac0a24e99e5a8e5": { "4ed62ba9027cfba50a02993f949860b2fbf583b0d2272c93d49202621bd1c2b9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.448Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.148Z" + "updatedAt": "2025-11-29T02:56:03.419Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.450Z" } } }, "bfa678e1e376ec015ac9221d88b1803ce7811869f141b22241c78abacbd547fe": { "8a6e9f00b55f3b0576f01c6ef20c5163ebaa186d9ca2ba3a241ee00d1040de72": { "jp": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.451Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.452Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.154Z" + "updatedAt": "2025-11-29T02:56:03.455Z" } } }, "c0113692c1b839bd1d0b553b8a746fd8e901fea18a0365874a7d57b5c47410d1": { "fba4fb769bf604e65c2e862ea128a3429d4692c33e0b8ca43bea57e16c6781c6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.428Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.428Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.149Z" + "updatedAt": "2025-11-29T02:56:03.425Z" } } }, "c2fb7179016e62efedb581c777d5b3e618da9208a31a2d9a164ea0308a1143c8": { "795fa89dca9c3b26ee3aeaa8be7c8410b0abd1d329f364f1777a29c3bf6ae7de": { "jp": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.455Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.153Z" + "updatedAt": "2025-11-29T02:56:03.450Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.152Z" + "updatedAt": "2025-11-29T02:56:03.449Z" } } }, "d853a1e0bc487c020a87d920028e6165d0cb3cc395e7fffd09047dee78720588": { "adec2ea632fca207a13f7608230126d9fa9e97108c03848018e30859a7144104": { "jp": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.435Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.150Z" + "updatedAt": "2025-11-29T02:56:03.433Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.151Z" + "updatedAt": "2025-11-29T02:56:03.442Z" } } }, @@ -4770,70 +4825,81 @@ "zh": { "updatedAt": "2025-11-26T07:24:19.018Z" } + }, + "2e9fd2d3c490bc28c36a5d0ec21cb93e844dfdd34f2eb187c7f84f44c2e7cfbe": { + "ru": { + "updatedAt": "2025-11-29T02:56:03.462Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:56:03.464Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:03.462Z" + } } }, "ed8b9299efe36240a44450f98875fb20ad838d0c4a97a4d6b56749d87a6c69aa": { "64421077253a2367928552f8ecfca1500ab1a3aa6470e26d805f6aae81b107b2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.148Z" + "updatedAt": "2025-11-29T02:56:03.303Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.431Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.421Z" } } }, "f2a1cb5fbab7a29d73cb9cda36a728e39c8c151cbbf17216e1d17db9fa27ca46": { "476a6d57ad70a1da9a30da84cb37903d939c7a7a7081a3cf8af22e8a9146c1d3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.425Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.461Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.424Z" } } }, "072403da5aaa82666ec2ac55aba2660e421b6711c6cb70c42b4eb6038b58554a": { "aa38bbbb12b1ed94ca667358f90437e09046357f71a6d1e0f8a508d57a4b5568": { "jp": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.479Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.481Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.472Z" } } }, "242c81539a7d39347e31852ff01c14ca7481b428f62ec2a9a8ef8923e319fd70": { "ff718abf7b9337cb72f9728d2ee59f8366fc732135cec35be718b34d911ff036": { "jp": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.529Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:56:03.504Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.534Z" } } }, "2ca1f06020b55585ef361cf2b43c9aa9e23ed32e9d0a80f58141cb6b357e2508": { "e8f70f164f2c79a05e20f2ea7598ea71abec4dd9a196fd990cb3b9f5f5250252": { "jp": { - "updatedAt": "2025-11-26T07:24:19.017Z" + "updatedAt": "2025-11-29T02:56:03.482Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.474Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.476Z" } } }, @@ -4851,117 +4917,117 @@ }, "6e3e04cc7119c0602d04810abb60bd15340766476b6dd90c89c802891040b74f": { "ru": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:56:03.500Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.019Z" + "updatedAt": "2025-11-29T02:56:03.500Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.019Z" + "updatedAt": "2025-11-29T02:56:03.496Z" } } }, "516b68aad0c74f76c3c12fe30d1f7258569a0b66643da4924fd24d791f072074": { "55acd998caff6e952b47ceb372ae02d24533c50e2c2a2d341e32d84c2b4a01b1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.475Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.485Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:56:03.471Z" } } }, "52d9303d908cc54e70744ee1b1e2e09e4cf8cb226c9925cebd341f9cac387001": { "71eaa12db00dcad81d12c60186209b5ab377404a70d4a18ee7d26b6ece5ff741": { "jp": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:56:03.490Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:56:03.480Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:56:03.488Z" } } }, "576d725e93d552fa1d974e38954e0acf96bd1d7bdb7ce394aea881a846161589": { "5d83a7ec0232591623da4893b116014b1e37aa25bdbbedda273544d85805f34d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.019Z" + "updatedAt": "2025-11-29T02:56:03.494Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.019Z" + "updatedAt": "2025-11-29T02:56:03.494Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.018Z" + "updatedAt": "2025-11-29T02:56:03.493Z" } } }, "59eee6beba7ef7f4b2b1ab657b188c2ad938982b20b45febf1c21c4c7b23d916": { "379215258832c5b1b0beefd2f0012d327e4907cdb0e2564650bdb42214e2e265": { "jp": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.516Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.541Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.538Z" } } }, "671c3c038f46cc2a350b67ff548f3064f3440f0912e1cada9cdbe60cb9c2971b": { "35a6b4b0da582ffce53ec6d62ecfa840b3fd54894bd3063441a0fb637cfcebb0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.464Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.468Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.468Z" } } }, "6baf2f9dc91a3aafdaf603aa070b6d303e0ca43f60c45975bd126c795f51bf6c": { "21159c4739b98c5874cd3f6e95850d863ba6be6c3a8978b327a9bef2d0bbda5b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.515Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:56:03.461Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.521Z" } } }, "85b69398b5611cad0ed97b26cf9ee7ab54989a0ec7615bc3aaabc2e0ae3c33ba": { "3069fe2c05efa1690a8fd9f6e9519528b8d09fe75d6fe914e613400f223a3e0c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.532Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.512Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.533Z" } } }, "8d4d7b2200cef950ad1bc09f8c982ee5def76cb7de03b7265ce2ab6d4a48fc07": { "782ddff0f1b9ecab869f6fba2c946f9fc98a65b12620a1eeeb09e7adfbdef623": { "jp": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.467Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.475Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.474Z" } } }, @@ -4979,1950 +5045,1950 @@ }, "f82d62c4dc19a5c31661c04d7a069bfa0d236fd3870382dd08d9cdbb13e02b93": { "ru": { - "updatedAt": "2025-11-26T07:24:19.019Z" + "updatedAt": "2025-11-29T02:56:03.499Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.019Z" + "updatedAt": "2025-11-29T02:56:03.497Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.019Z" + "updatedAt": "2025-11-29T02:56:03.496Z" } } }, "b326d89975e77fc4fe5e09c43f7d7dd72353ad2de4c76604cfa709d60f39cee1": { "41f6f44d6560ff4b7b4a8919ea06169035e1ab5f00669a7875013466734ef23e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.514Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.506Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.511Z" } } }, "c0388925c5cbd757f80d526185840b27148d3d9f44442adba2d651d360e9f8f2": { "fe663d93e8ac7ca2bac8f4753fad3eb0d0150631ba2d2c4e3a85eb5fdd27dcf5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:56:03.481Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:56:03.479Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.470Z" } } }, "c8f7fa8f88301edf51171572623222cac00927836c2b38e0b936dc6808969163": { "0bdde8ad92c2b56e1260138b52e278dda8cd06b984643902593d0d0cd7fb1ef3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:56:03.422Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.477Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.477Z" } } }, "cafe8a479283375a185399d18cc4d2444fa4afed320fccd79e4b21ccc00756f3": { "9b037a637113b68681c5e24a1691633df3e7e4ab645c3430fdfbded768ba8392": { "jp": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:56:03.487Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:56:03.472Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:56:03.421Z" } } }, "d66c9f0b5bf68d56ccdb239450a2def7e044ee7dbb38a6df724002e0578ee93a": { "b17e684424dd7e3c1032466ae89d5b4b0753b2b11488a3c5480069b467bdfcd1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:56:03.469Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.467Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.016Z" + "updatedAt": "2025-11-29T02:56:03.473Z" } } }, "dfb826f61e2d3065b29aed9473793d5e9482ca0064907298ee886dcc849a2f30": { "095ffff652d364d8d2d207b5c2495c8f89b149222bdc9348bc26c7785dc49095": { "jp": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.528Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.540Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.526Z" } } }, "f7ee1a75569ad87e689d0ebfbbc64afa80e4517625c27676aefe4a63952637ab": { "62283411a070bd19b48c75ef32990fea3d01df15e6ce74c1ef8474a50f977cdc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.543Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.489Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.489Z" } } }, "fbf74a86f665ee9aea4f220700429c38da217030a00f7a905ec8171cb63a5f49": { "379c9b448d13ae5617010e62fc925030e206c603b76eb2ab7ab83dddade8d46a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.526Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.508Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.509Z" } } }, "1204bfc3bd6e857b87b1b5a9dd1156c45498c5d9e64e68cdce6f8dfe4987ecfd": { "373f45a715a82081f8e2a3779cc63f874936a6ff999e1d2ee5daf6d9f720ace1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.564Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.567Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.562Z" } } }, "24ceb06f47cf82806e35ac32dfe18ca24087b06cffbe5021739286a56c793b1d": { "4ace68b0458a094405f4c0fd1dc60a5ef026a1a8639846623e86fdff84ae8507": { "zh": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.567Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.560Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.553Z" } } }, "28e0a4a4c7b2f5abc28938acf55ed73d8388d95376bfa8dd13fdecd6bd439e52": { "7b5571b023d676e2979970ede929e965221ec27898362e89cfb8519c41cf3898": { "jp": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.542Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.540Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.539Z" } } }, "4a932aa16f4947c7ef17e42150e4a316f1ffcde90dd8415e4c6bf929ba835846": { "49a5dd5634212d8130c73ae1cd817b3917e322d14b3c96754d53df3d228cd836": { "jp": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.523Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.525Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.537Z" } } }, "4ca74029aba5db691ad0ec824ca43ed7d92a4d5b9aa1573bc7116ad308b92cde": { "f97238d94d5bdc95a6129e0715198e8a6b955a58fbaa7da4e12e9dfa1348f135": { "jp": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.558Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.559Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.562Z" } } }, "4dec7d00a7f493694d866154c843363d42ed6db4abc5dfbd010fdd90bfcaf67d": { "97c6b3e272815f6b0861c69df01e35d4daeb9dd3a1b81af896dc36740a178f9c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.538Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.506Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.515Z" } } }, "51e35897aeb6c746cdd097c39d7d3d876e62dfc0623f6a3c97974b88226b3a00": { "07eab7fc4983c7ac1da23e4f9c0e0aaefbcbbf2c5cf96b5e1af6a93d9eab9a6e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.563Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.570Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.566Z" } } }, "6faa2072fc3d3a3770d528540726e0fbdb421fa84e62c668a817741883d26440": { "579c8415475bba272d86e61362d88b8f1304de7a7411591652572d7da45590c2": { "jp": { - "updatedAt": "2025-11-26T07:24:19.049Z" + "updatedAt": "2025-11-29T02:56:03.543Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.049Z" + "updatedAt": "2025-11-29T02:56:03.542Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:56:03.460Z" } } }, "765183c2f979cd15300174a6cbeab761c53e4a2b979f9c1c628c55c69015ae5b": { "aaedfcb72829b8339998ff9e62eb6e54a69755858854804557b9efc3496e73f9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.528Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.507Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.524Z" } } }, "9bd2367031f4ad3ccaa40d2eab23421bb90a176c87631c89d0565908c1c8129d": { "a3d661f00c76cbebde5bfa666feb5af47a4620862c09e2ad2d7ea88d84d8c98d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.513Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.520Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.512Z" } } }, "a61623fa5c7f672b85c730754446bc1a65a53fbfc1fa7eb64e0779690ac3049a": { "e82d7f23954deebeb66e19daaed4363f0e28569d3a42d1de12ffdce2ad3976fb": { "jp": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.541Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.536Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.521Z" } } }, "b0c4a6145c3f1c781d51adb03f8e4996331d1159cb14cba9c81b851b728253ee": { "d161896a6a88f3dc7f188f95f5ef37b65e50579afa43c7f21b1656e07c5010a7": { "jp": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.568Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.571Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.049Z" + "updatedAt": "2025-11-29T02:56:03.575Z" } } }, "b6071010708dd9f91932364b3060488201176aeb008d6ba6dceaee25a82a0a2d": { "2007a45c3bc14f5333a4866ed3de37e1c4ce663c0e2b1fd31fbf2030fed127e0": { "jp": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.535Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.522Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.516Z" } } }, "bf4425dd6cb86116b19753768a5420c28985c1fcb442ecd1b5e1d37e6ca2f98f": { "e1eae6052323b0cc1ddca82febd2af06bef603d4809bc06fe09b3e2b0880ed2e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.534Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.533Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.513Z" } } }, "cdab7bf0d8c24f10d2d5dc375305c22f728e0f36fa1e29fdd04c99781fbc6cd5": { "083150d2c3def0d0736d5dbb6a695b7ea5c691ce94fcb5f5e84487727895f4ff": { "jp": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.508Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.527Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.531Z" } } }, "e93967fcdbac2bba7b89b4164ea987452cd09d1070238a59a238036fd94e8618": { "94a465a749cb716926a6ad2a66382c7591719aa2f9d792d5910f48efdc1e20e5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.505Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.518Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.511Z" } } }, "f0e219e3fb45c878fc0c3bc00fdeef1c5dd9c6ab75d1a093efffa9a0a6f002d6": { "f70bbeacf6050f44afacc1a4872c5eb1d3c4e9df491f0c452fdbd869057adb57": { "jp": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.536Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.517Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.040Z" + "updatedAt": "2025-11-29T02:56:03.517Z" } } }, "f39b12efbc001a35d87891fb78f7cc37fe27f3e15abe1f7329d97a2afc1e55dc": { "abf20812398c31c2895cbc7f3902a957857e45b0abdb831d7765f7268fac0928": { "jp": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.561Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.565Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.557Z" } } }, "f44395a43048118c7fe3d4525c225cb5397a7fe3c98ed8d8b8fcfa08e86d5620": { "9d5c04c8e9de527ab629ee91b9ebf0d572f7863c4f88f5651c671a5fff9df8fe": { "jp": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.569Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.566Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.546Z" } } }, "f646fb33e6fccf32e79c0ff130a3e33907e8822e1555b98aa42e7679988ce2ef": { "9c48604413e046bab5cde9bba416d6f9bcc6a7ded493b091e329a27c18ad8b0a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.554Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.565Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.556Z" } } }, "fb8e6138536700f07eca78b5f157d45b6036f77f52782711c91ba183897b4c9a": { "85d1f9adecaf2dd9004cd1e79d1ecdd61c68f65285973b86e6e2ba31e2eadf2f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.041Z" + "updatedAt": "2025-11-29T02:56:03.523Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.529Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.042Z" + "updatedAt": "2025-11-29T02:56:03.535Z" } } }, "fd9477b10ed7d16ef2358b8d1e49ae2377cc94b7a2aa1d03cbf8e6ee55954611": { "36f5cb32c3341f1b52d0987870b8e971b48d9b4ccb72422d895a8e8de42aa565": { "jp": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:56:03.459Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.039Z" + "updatedAt": "2025-11-29T02:56:03.510Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:56:03.505Z" } } }, "0a48452290eff051d5083217a35dc08044c6070e028523f7cac12162494649d9": { "007d16df56ba8d29945ba611a8ebd52c915dfd07a9959101cb56729201855baa": { "jp": { - "updatedAt": "2025-11-26T07:24:19.049Z" + "updatedAt": "2025-11-29T02:56:03.579Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:56:03.502Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.571Z" } } }, "1166fa0e4a8285a06447a2c810faea5954a70f41dac027f9312ad41f58d7980c": { "b55b582f39fbb6b1a9a83d90ec6685c4218c3e70536c2a445ad09c9e3380e0e1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.614Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.601Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.583Z" } } }, "1cc5dc60c755c1b33090726793f332fef7bb57174bac81be1fd840360abec0a9": { "0b2d9a2f1a1de345b24bb2aed0e200731bba362c09de9a98ae9041f3e9312321": { "jp": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.555Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.551Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.553Z" } } }, "1fa73f7fb3f17cb73adf9d2fd3672fb7b1bcea959cdfa4cc1cebebf9783e8493": { "68781891b0d87b8b7fc619dd4fa0e041668116f49851eeb31c8f510173e044b5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.560Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.561Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.559Z" } } }, "277327bc5d1f24036dfcf5127459029b84745c17df9cdbee699b92b7fa8c244a": { "edea05c97af2e9b00969299f942cd800726b3f980c4ecc738e093ae93dac3c2f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.164Z" + "updatedAt": "2025-11-29T02:56:03.618Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.607Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.164Z" + "updatedAt": "2025-11-29T02:56:03.619Z" } } }, "2fa7a8042be873e4594c45fc4aa944580ac9957f07dba893bd079f9bd6831739": { "d53dbb06ce9443dcb0eff1d6d827440cd3f32c6995b1495a014f731eb03474e6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.569Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:56:03.501Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.570Z" } } }, "3856af0947d30d11556c7934bf86f94916259da90023fd46b0e7c63d1c3a264d": { "13a6600b110e578ff344da3c1257c68c9f1c85b521d7074402b84a2a07f09dee": { "jp": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.572Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.573Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.547Z" } } }, "3cbdf684e4132d36432757c5b2479a68267eb108858510d7f118f4f80e1fe430": { "02a6cbb43f399b26f891350cfb238c12040d0543f4f79b9119f782c965160d27": { "jp": { - "updatedAt": "2025-11-26T07:24:19.049Z" + "updatedAt": "2025-11-29T02:56:03.580Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.581Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.049Z" + "updatedAt": "2025-11-29T02:56:03.577Z" } } }, "4efac6c6f465c7a572c85feacf0f06b43a4e0c32c6c920019621529593011d4a": { "90716f5cd329825964992e1323d48a1be73c0b4afe6438deb2f5faa6947cb686": { "jp": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.553Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.552Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.552Z" } } }, "593efc50139609f8ecd70340a6cf0d42b4647499a51d8026ed014bda5df9c3be": { "d22863b43cc42cb50748f21dbf3ca52aa023402a9fd5fe4d478b8ad89b656234": { "jp": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.596Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.595Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.599Z" } } }, "64b5024b5182bfc45a505634c61271260ae40641e132a126b98fdb77fb6a7c95": { "4407c0820a47caebe5b1dfe9eff3d5de80d013db89f0925feb173cff9741369f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.164Z" + "updatedAt": "2025-11-29T02:56:03.618Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.164Z" + "updatedAt": "2025-11-29T02:56:03.620Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.164Z" + "updatedAt": "2025-11-29T02:56:03.619Z" } } }, "803a744763b2e971d43427be40f1173beef9290f8152a79e7047ef5f514f42d2": { "bc19380cbc2e01ee6357dbd1150e6424d9856ad286e39cddde352bb68470ab78": { "jp": { - "updatedAt": "2025-11-26T07:24:19.046Z" + "updatedAt": "2025-11-29T02:56:03.563Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.567Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.556Z" } } }, "81b00d2254d3e49a8edabeaf9d9461d8fb19914c8abfef93d05c71270dbf3786": { "96a507a0b8ed5c5846b4d8f6ffced106a8f7d73ccb668fa851fed8b3be3dbee2": { "jp": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.551Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.045Z" + "updatedAt": "2025-11-29T02:56:03.555Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.550Z" } } }, "81cc4a22f5345ef537b81bda612b5e1b5de5d2fb5b7d6563d33ccac4c53d47c0": { "2264f2a7ed8ccbf74a72e2d8d69d0a56cc35d7bce6b065e30464315bdeee546d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.546Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.591Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.545Z" } } }, "9229ae8ebb059ce61a183f4129a3e0da801e0d4717a314a296909aa6035f7d9e": { "fea4e84293c545f2207f795fa4b98c049df1c2de4dd7351a04e3cfb8dc162c2a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.576Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.577Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.164Z" + "updatedAt": "2025-11-29T02:56:03.579Z" } } }, "a9c6646ed9b12fe5c1578c74e0f8408353fc82448e8041b1c1d96f9c46e78dea": { "9cf8633b74ca4ae563d8b6514b6ee95e035b912752b8937b25e1ea6d00d6332e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.595Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.594Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.616Z" } } }, "b464890125efe481177f12e2f3c00a28cae107b65627ec59bb17ef93cf157e35": { "4a59992606ccfde9022f21ac63edbdf9bc3e1e8100eaeef04c372952f8c27195": { "jp": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.548Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.549Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.549Z" } } }, "b676683ed68be73eb9635273495e9731122ee184bb63d7293df2bdf22ebad7d0": { "81117b826442551d1cf5856c822f3d1c75ce597cd1faec68ca4ca0233ff5b395": { "jp": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.602Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.600Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.594Z" } } }, "ca8c63318081185dadfc8f0c999b2cbe8002743aa40d511bc0efe186e20e334d": { "d058a230016b4adc22efb36e3b3ae2fb018e4b84cf33b6862fd4f520d9e7d3c1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.047Z" + "updatedAt": "2025-11-29T02:56:03.564Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.044Z" + "updatedAt": "2025-11-29T02:56:03.503Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.574Z" } } }, "eb036cf7d16bf188b666a24b079c499f0e91022203931f813a7708c77c75046a": { "d269d0ef9030cc0accc4626f57a4a0fc9fa917b10cf282d13fa57388c6603e4e": { "ru": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.583Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.588Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.592Z" } } }, "f63b4898f4bc0778b3cf11bb85aa91a674b602d4005b001e2977ffa70c3be27a": { "dd2ba17bbdc49a7afba06862b9e2f43e39bf834aefeb4fadb52775d8db69d988": { "jp": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.573Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.048Z" + "updatedAt": "2025-11-29T02:56:03.574Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.049Z" + "updatedAt": "2025-11-29T02:56:03.578Z" } } }, "0850d83ea9ff1a00088e3d64a210fcd073b48986df51234fb69582c6b7fb76d6": { "9a43156c05a1578fda8031ad1f1e9faf8e97b4816647d44bffd71e1f15c3647d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.651Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.653Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.170Z" + "updatedAt": "2025-11-29T02:56:03.645Z" } } }, "1bb238eff17ee95c127a21dd293881a980bb8f3b0aff1bdd7ecd004fafe3764b": { "d005d0fdfdc2a2469851a9a7d27374e5fcf68c97518463c6aec7498e165ace83": { "jp": { - "updatedAt": "2025-11-26T07:24:12.170Z" + "updatedAt": "2025-11-29T02:56:03.610Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.544Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.043Z" + "updatedAt": "2025-11-29T02:56:03.545Z" } } }, "23d2246026762ae3494ced9af104cea91f1482d8c7dae1149b7bfa3441618283": { "0e016f2ab261e197b48540cb3d3091ab6d3af62d1c883dcd3281cb2e578a1bfa": { "jp": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.606Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.615Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.610Z" } } }, "29f7d7e079a392736f8e8414574847d7fc12094c29074c197529b77eafd97a46": { "ee468e104feb8b3c7b0aa6d6f466b62ccd0c40d76c88efce2ee623e95b1737ef": { "jp": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.605Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.600Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.601Z" } } }, "3096aa4bb7832bb2f54010d3c5b6a248f9ebf6a366fb879f82c0eab244f815ae": { "fa532e7e71ef2e3585f03d9f864f4c524338db82a3098d4d46e1abc74f06c4fa": { "jp": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.617Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.614Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.606Z" } } }, "3f380b9290fe7c7d901aac0cb526ca3d522c42c21bc64b85c2e00fbdc953e794": { "e0c1c8cc04e2a4ba817680c61c7923693919ed48ab52a53f3ddf5094909767fb": { "jp": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.609Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.161Z" + "updatedAt": "2025-11-29T02:56:03.604Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.608Z" } } }, "492356529ca75008f683673b06635e91f3cb2d7f1097826262a7957c6cd78136": { "ea6eed1ae135ae1362375bc54a6abf4d9bda82f9cd56e95b97e329d6dfceb889": { "jp": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.590Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.588Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.597Z" } } }, "576c74bc00a8723ea19c093ffe6b3a472b9236e8f3bfcb0b95955083f9cadb86": { "351824c23a3d30665651f9a8eb9f4b521f17129ca1d202c38cbde960046a5d97": { "jp": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.589Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.595Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.593Z" } } }, "57e03de44d901875fb5eb2401640aba105efc70cc184f0f23ff04489b548b151": { "3f8e85fe2d0ca94113aa748a9047c9553cec059c087362ec30bf90a68567a495": { "jp": { - "updatedAt": "2025-11-26T07:24:12.165Z" + "updatedAt": "2025-11-29T02:56:03.622Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.634Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.632Z" } } }, "82d75c46385806468ea3f9bb89ec325a34f8717e9925511cf3f746c6793c4178": { "56b23f6722a4743f7d9412ba74c3c4701d0fd1018ab3474c5dceb16bef9ca1c1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.639Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.633Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.636Z" } } }, "835fedb5cc4f200a51753e009ebccb9c5c2703128ecfce3dc53168f68570dd22": { "24e239e6ee1d39ee0ec39c0ebaf4dff703bef48fabe9d4ad32d9fcb51008866a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.584Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.635Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.637Z" } } }, "a218ff0160f1afb6fd940e4797a2159d55a8dbac410f179f5727b567999eaebf": { "aad6f9838da5dc15d37d5f9d16b53754eb0d3ff68a7cf73064f05eaa3669c05b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.592Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.603Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.161Z" + "updatedAt": "2025-11-29T02:56:03.603Z" } } }, "a47af53023e5932aef2db5b77a0ef7cd04c45474a2fe93ea211914667b44e5ec": { "4ff7d90419a50527c3757c649b6725b0da711648246268bc520c1dae8ad9ef97": { "jp": { - "updatedAt": "2025-11-26T07:24:12.170Z" + "updatedAt": "2025-11-29T02:56:03.644Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.605Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.597Z" } } }, "ab35a5ab8729c47c7175e9c6cc67e42aba43c58b1e1f2c291dcda4c3977b06bd": { "02d5a608d6ee630f001b827a8fa1c5cad477766220949ac58c83c9ea965c69c2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.644Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.170Z" + "updatedAt": "2025-11-29T02:56:03.645Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.642Z" } } }, "cd604eef1633b62d027e3e7d70856d9553f233ca6e0180381c2120985643a86d": { "e37d6318a1605b8e2ec28a6a7b49ca74444391f022f98dec4ac9cf1024c821ed": { "jp": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.613Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.163Z" + "updatedAt": "2025-11-29T02:56:03.617Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.162Z" + "updatedAt": "2025-11-29T02:56:03.609Z" } } }, "cfd6efb64f516235ee2ecb43e9da90a4a4f49b69cd47dbfe06c9e1586fb606bd": { "dc206b93eb4f37283d194fc3cd04163bee67e631f232560183ec516accced4b0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.655Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.165Z" + "updatedAt": "2025-11-29T02:56:03.585Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.652Z" } } }, "daf8b3e4dde89158cbc831962f60de0ec14cecabcbd44a418f78eb071c12b0c4": { "436bd3437c6e83fc88999652218e47ef4afe3bd262aa9052fd9fbf8900aa176f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.598Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.590Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.589Z" } } }, "df45da7290d6edcd7b6391995f5058013634a6732cc0faaa6bd01d42b9804678": { "b184369e5f189b858945955301721885510add73fe070525f5c066569add5a01": { "jp": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.596Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.598Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.051Z" + "updatedAt": "2025-11-29T02:56:03.593Z" } } }, "e303e41ebcb2d5160248ecceb8943f82399ebc3323390c33a1d6a724c28354fd": { "28a231f853bc9e6425c97ca1c14dcd50898db661a90b51a9e9ef2aaf5c7c2f43": { "jp": { - "updatedAt": "2025-11-26T07:24:12.161Z" + "updatedAt": "2025-11-29T02:56:03.604Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.160Z" + "updatedAt": "2025-11-29T02:56:03.602Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.052Z" + "updatedAt": "2025-11-29T02:56:03.599Z" } } }, "f1754d0c92d25ed65027ccc750febdcca2e7101c72a0eece6697b959d9971621": { "d2cbc57bddda71b0ca36a00fdc52702ffaecf753190fb6095d4a92fca38701f1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.582Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.170Z" + "updatedAt": "2025-11-29T02:56:03.646Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.655Z" } } }, "ff2e4c3baefa9017265684effd06b1ae64d9d7d79efa83110c92a11de95d2c62": { "7e68dd457179debb6b3b8c9690002e92f3cfcc5539913ccfbd1d0632617d6548": { "jp": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.586Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.586Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.050Z" + "updatedAt": "2025-11-29T02:56:03.587Z" } } }, "10b704f16a650f1802b52736d2c823bd454d8b3dabb76ac91bdcc408b62420cb": { "2d4e7acb59df283f228e25658e527a973db16f341efce41e1ce84944cffa1fae": { "jp": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.676Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.685Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.677Z" } } }, "1e8eecebd2a4e411fc3037074c79ba054debc70b7a76bf53100577ec14359aee": { "5e448cd743d25dd9d490161805e048c3c2f4696c9f46b52a466a1bba220a5eae": { "jp": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.678Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.667Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.662Z" } } }, "3e8e050e4d3fc2dc532df4dd8556aae0bea35f5ab73c2aade8efe957930a412a": { "e8f4b7568afc6590d5203c133ee8873acbea759acf50b34794af4e2cd6b43ad1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.671Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.672Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.668Z" } } }, "47bec243b816f1aff8d7f27262d59edcdc28cb3ec78a655071e9178290bb0578": { "880617a38544a545b4906c62f9009009c13a7ff3ccc2a60fe2e475bb26b6f55c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.634Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.628Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.626Z" } } }, "48ff5e21581a18794244e74d86a13a93c0401d4d23c46f267ead336c36e91cce": { "42db135883af584da69bdb891c2f149df97603eb1cabc3853355aeccb9eef199": { "zh": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.683Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.682Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.687Z" } } }, "4b0ee48c4cbb9020c49cc55e309e9d7f69e89a9ed3a55e9c47bc013ae4ef6d56": { "2ed3bcd79fd5d4e72d74ac905059dc5e77bee95124595bde24fabd5f207ff65d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.669Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.675Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.660Z" } } }, "58026ac4a257b8fe268cb77f7d9da3eab8cee812a5e1d5152bab8b3250885ea9": { "75ab9ab8699432a23f95f427a4d59951ffca9690508f2d181e017be2846fba14": { "jp": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.634Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.630Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.635Z" } } }, "5879b7ee9c3de048a317f9526d9961edba8038230a7d5244320ca051c3377577": { "0a90ec2dd8b2f3498aaafcb347dfa3cda2f9f6da12d64b79f5d5404b53325b70": { "jp": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.654Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.170Z" + "updatedAt": "2025-11-29T02:56:03.647Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.170Z" + "updatedAt": "2025-11-29T02:56:03.647Z" } } }, "6381d5f736372e0e12418c5b0941665dfa5912b8121475ef968a4b5174f7afda": { "ca830a516bc4a6a4064bd19e68294d34a903114ae0c72112077306844ab37161": { "jp": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.627Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.625Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.165Z" + "updatedAt": "2025-11-29T02:56:03.624Z" } } }, "6391f6957c5f75a61373810ad0f0c8f36e0c6ab5b4e5a0f3c373ec2ec25c7f10": { "70a6df8beb04de853a1e2f9d42065e9eafda493219744deb6b08634115f9a498": { "jp": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.629Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.636Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.632Z" } } }, "65aa83e28c6b450bc0daadd14828a7677fb27a998ea9f59faacc7187462718e2": { "3c0cab0fe63f1d762905d3d204e44dff7666b23009b55e1447c9939e7032e82c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.654Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.649Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.165Z" + "updatedAt": "2025-11-29T02:56:03.621Z" } } }, "70c04f43190f497d5a2f8677cdc4ca3f609afb464cf98a219e9b600b7d989cf6": { "59c021fe8605f9f4ff5a62d7b51c4f5a7a05acc380d02368ad906c909dd5fa17": { "jp": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.642Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.643Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.643Z" } } }, "7ce6270ebd8e598a5ae3c7e63c99571a865d9289e493233222d36600b8ce255b": { "56a7fab051640f56124193c10c43bab0f0b30eb6b3b43860f813e4335dc69d61": { "jp": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.650Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.171Z" + "updatedAt": "2025-11-29T02:56:03.648Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.640Z" } } }, "9c1e3cb41e28946be991ff74f6b0fea3622f21ccd94c4e6553aa990de1a4f6b3": { "8fec74d1546ec055cc9bbebd756641fa7e4a28ffd600d29eaf8d88dcf521d25a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.628Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.637Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.165Z" + "updatedAt": "2025-11-29T02:56:03.624Z" } } }, "a82c339e6ec19dbf4bf88470d923d48a3cc71cf65c7bae8180edcebcbdffedf7": { "82e1205914218a950a532221e194e1c9da469a4477d36097b83d2a9c2fab0a25": { "jp": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.630Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.631Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.167Z" + "updatedAt": "2025-11-29T02:56:03.633Z" } } }, "ab7133a925d3667ab21eedcaa7493b04d2a7453fa0b3dd6c1545ec18333f6c93": { "3cd87edf3b014d3bf39e15bb926affe5a7484f6efe0143fd80de32aa3bf31d8a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.627Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.629Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.628Z" } } }, "abe38b651cd9f44a9de790429c92f0c07d5d279e5dae34af1329f362738d3a6a": { "0700f00685f173628dfa175ef2fa960a245c5094b60de40155456bae0cf0bece": { "jp": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.681Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.677Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.669Z" } } }, "b0af6145fc6e254fe1ec86adc9d2e005a2c78ca57a92cfbbcb204f22d2b0b206": { "ae6b07939de76cbcba1cb55d37c6d5d3944edcd60cd443a0ae6aad40a42ce5ae": { "jp": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.625Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.638Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.639Z" } } }, "ced28404e4ce6c34312f58e0fa21dc44dc32726f8881c1adb6ed189087c1b289": { "946529a7ef15a484b25d74b9a9f179b04a186b82780a2ea1059020ee8785a2e4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.641Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.640Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.169Z" + "updatedAt": "2025-11-29T02:56:03.641Z" } } }, "dd5f0d309844443578b1e477b78c685d87f106d689eab41fab33f12709affeef": { "d85b73cbceb154602514bc5dd5ccb07827a65d84bacf59d65c5ddc95c14947c5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.692Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.688Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.692Z" } } }, "e03641b78328c61b637195e74814fe2a13a4f8b55b01fc7b32ac725dd77f1098": { "d7e329d38854c95abf0c4ec667157d6c9e812a6ee76245d01dba66336ccd0ee2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.168Z" + "updatedAt": "2025-11-29T02:56:03.638Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.626Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.166Z" + "updatedAt": "2025-11-29T02:56:03.631Z" } } }, "e1f66fca49c6ff453d4e8a35fdefe650bc1596acc41c176c3c186db3c6b32dcf": { "a953eb312c126bbe30b57606749cd07b7c2b0214177b48b7f6c98c70a8a245ab": { "jp": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.679Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.674Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.685Z" } } }, "028aa3b50c80d12c1dff7886165e9713acd5da0e4c292ec8d74a396e6acb2825": { "1ba8e423cea5af1505e244428a4e315c1ec5b32bcf1289058189844c5da6dc2c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.675Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.676Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.673Z" } } }, "0ae49380ec7f5d307e31d7b631f7f0bf275d679b03f17eb67c5359b37b5242f5": { "f8739620d7524e796b898c8c185a92bf25c2ecbf9cc3893754ede05bce45736b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.660Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.658Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.165Z" + "updatedAt": "2025-11-29T02:56:03.623Z" } } }, "15fced5932ede7e35f56539b143eb9b8d0d01a97412450e147ef43084abe420c": { "ec90df838c140604af32f15594fffcd4af40335ecac6a833f13e0158156b0cbc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.684Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.670Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.671Z" } } }, "16db9b76d16ef49e77f68158117027a4829a5968943ae93a509257b7c447f23b": { "04685109a89dab0b5bb34aa000e61426caa176d6790eefce0141144402762ae5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:56:03.679Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.174Z" + "updatedAt": "2025-11-29T02:56:03.663Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:56:03.686Z" } } }, "23eb3656e923d758ff491460d9d1bbec7009131392de09276848be0db41fd269": { "3625b1be463613c8fb56424fd4d91f2d85ae950ebd8adce02c7683e4fd11be26": { "jp": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.692Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.693Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.691Z" } } }, "2f2ef25f504a5d8ae76cc6b6b38d72e25aa06fb601145bf8c4555defd3b22c9c": { "3045e21be62572632384525c8e68ac94c74ae489c9d3787b9b86c295740ce2e0": { "jp": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.717Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:56:03.707Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:56:03.708Z" } } }, "30adceead0e8f58341843c20ba7a1cfc58638b613d0457a74d610123f740dbae": { "e6bcf77b5129d316d4e7eeba39c108e94d974c9844395d380a2ef4f6b5f57283": { "jp": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:56:03.743Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:56:03.745Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:56:03.690Z" } } }, "32d271131b76c30bee10004cc36afd1cc48e48b098944d731a875840a3e1520b": { "483a6ba5cfe7e35e8bd7361dfddd53f126ccf034f9f7e6b101dfc108419b0192": { "jp": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.712Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:56:03.705Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.711Z" } } }, "384bbc8a5c6f8f4fd3947610412c719d2877f712b2afbd35874807dc5bf37b5d": { "56a53674a355d521b64bc7d05698ba4051acdbeaca6a3c46a2fda8b450c719e9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.165Z" + "updatedAt": "2025-11-29T02:56:03.622Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.659Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.659Z" } } }, "50e45c22e7e591fcbe4d61812d7d7a9d9626a7f94961516e9f2b08e27d3c36ca": { "4159f227f4e6ff08833e89755d03d3cec73f09d3e9171623e581edcd063d2833": { "jp": { - "updatedAt": "2025-11-26T07:24:12.164Z" + "updatedAt": "2025-11-29T02:56:03.620Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.682Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.687Z" } } }, "8b151a1a26b18205c264eb291e0e0442ddc0a8d5f8b81948e11a1cdd09758259": { "10f61a5bfa1bfc18d47b09dfd27319b441a25e084aea415d11bbbcb64e2a6c0c": { "ru": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:56:03.708Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.701Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.710Z" } } }, "b2f66c32f59c426c83078d6b24b7186f54172727a996adce08872051de770134": { "0c794fe311b38eedc683c36f0c611835c85822c536fff3e7f51e45a39493a848": { "jp": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.695Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.696Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.694Z" } } }, "b3581e0b617b1029663a70e779bab6aabd1b97807b23afe26b42a5bb82a2618a": { "38f348198e164923854caf2d5fb911a3b03dff8e5f682f59a476694465af9bd5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.726Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.713Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.718Z" } } }, "b54c21849674b2f133d9a7587a54bf895f7b1a8384d344c53348c14c442b2644": { "ddce74d3907de04d0a9af32787564ecd6b5cba8d6c36159e1e227746999b1540": { "jp": { - "updatedAt": "2025-11-26T07:24:19.053Z" + "updatedAt": "2025-11-29T02:56:03.661Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.681Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.678Z" } } }, "bf6da61b91d435b98dbe4fcfd84c30e4661211a55093b7bd5294d05df5d9018f": { "8df18a3ed0cebffed7ef2a16c2c1feed24d08b38743943e1639bf2e1e83ad9cd": { "jp": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.698Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.694Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.691Z" } } }, "c600219b9f55bdfcea82201926bfe9e4cabf53497d2110e11a6a97d3a6de16d1": { "879e570e6a755b5436d4b4e3e5ee02f6ef2f2b1b56d5e30a0d8ad6d11079deec": { "jp": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.714Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.713Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:56:03.704Z" } } }, "d20c2004eff27206aa611fa47101376ca27b19c79a7c22fef935d90c8c7ee0b7": { "31528a8c4089ac02ac4c5cae45bfcf8375faba7dbb39d635e3082a39955f5a65": { "jp": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.689Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.057Z" + "updatedAt": "2025-11-29T02:56:03.689Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.056Z" + "updatedAt": "2025-11-29T02:56:03.683Z" } } }, "d42c8393402232b95f473bddaaa33ac9663e18e070bfb5225b9240cded76bd36": { "469a531fc6c1dbbcdaf79cbc24df46624ad5a44a7c52da48e4665690d6de2002": { "jp": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.703Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.716Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:56:03.706Z" } } }, "d55ab4d59e8e430728299d153babb7440fdf1524f75ae30ac017602a393f72f2": { "e946a51dbbf49a6bb72dfb7320ddc89e75e9bca19562498770b9375217a83d34": { "jp": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.701Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.709Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:56:03.707Z" } } }, "e9e6900149061b39fd6dd6fa53d0c99f28ffac38d503ec961dd94dce5ebac808": { "aef65ce3391d03e363f980b73f3fa71276203fc5f77a1d75edec615250031f8e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.055Z" + "updatedAt": "2025-11-29T02:56:03.680Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.672Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.054Z" + "updatedAt": "2025-11-29T02:56:03.674Z" } } }, "f5e923aaae110b8d3ec030f52c1731f515c0ed1b9a0e41490e863bb6395bd23b": { "c81f4b30001e6233066eddc0f7a5c166b4369eee24cb505fee91004bc16f3b48": { "jp": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.697Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.697Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.695Z" } } }, "1d0e04973f4a7a2726ce086465182e22cfc8de26b7036f67bf3246dcdcab5c87": { "31f058ab67c32c0251f087188700872a277440d4f0ff0bd41cdc2a390207f441": { "jp": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.731Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.736Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.735Z" } } }, "1d411ae967753b5d27acfdc77c2f68fa873d228cea6cf769ee2c85f10b38628f": { "8c9d1bbb63ac91b1a18b930594b6d354536b4a42a4cefa28e167390053f64f41": { "jp": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.742Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.744Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.739Z" } } }, "32a2dfa24b35817a5fedbfc4895185da11ba73834f024a8c145cb60b3ee324a3": { "8f13f0e888bb91b30f7b56131bf3728f2950f55c2375b05eab6a6c9cabcab037": { "jp": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:56:03.656Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:56:03.746Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.745Z" } } }, "34fe9aa819ffc70ef68be0505c66c5cb60f94370bfce6edd29d0ef846b1eb245": { "7ef9c6e569280d6e03a986898ccf237a939f4581319206934f40b7e910987b98": { "jp": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:56:03.781Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:56:03.782Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:56:03.782Z" } } }, "5a1049606d2ddeb908a3f87e08c53c766115a2d5315cd4e891c852fa240471ed": { "4340b6e9c5ca9bb508ff61e1f7de601fd3ee092842be32670cf541dd9fe5b76c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.776Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.778Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.776Z" } } }, "6c930d7e263cee0da201aeb82b5afa15d7a0492edd3f17b70d744502c7da16c8": { "2c78d1148a39342c324f60ab8fd48891049dd3af4b2e04e98d60136cac22dac8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.733Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.732Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:56:03.733Z" } } }, "7997000584a74b3a4893e2d952e3e74901f5c48d13d2477040f08510ce7fb94a": { "f3a543f784ce343388875d80bf6932364452e41d5c499c0fcdb6193cbc18d2ac": { "jp": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.711Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.657Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.727Z" } } }, "7aeb5a3c848c3ac6401e3621b9731a411c3ffe53b1ec386f511089c819780c4c": { "1f0a4b693ba5e0ec268fafbbe5f0a583b29cfd716f04abb61d43c5813b6ad612": { "jp": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.775Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.773Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.774Z" } } }, "7af81b34b1f80a6579a084fc3f8d1ecb9f0315e228a3b01eca34abc4e963fda6": { "c20825094b802738f9e5eb45bd5ac1dadaadc926f348ad24d8c06cc4e5157994": { "jp": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.770Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.768Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.768Z" } } }, "83eab82a7ad67622f732d278303fd5a55d015c462467d35a81a97662bdec853e": { "2d649e303741fd66ea1aa56354d590ebd300f6ec9c2b2ef22c28c636be7a29cc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.717Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.058Z" + "updatedAt": "2025-11-29T02:56:03.702Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:56:03.709Z" } } }, "8aef57a5d0702946541ef4bc66a35386c47ef94c0fbc0f60abf1cf7cff964601": { "1de18ab03988e32b892f506405ca6a01d5a611302a852d3f5e7de174a37be78b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.715Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.172Z" + "updatedAt": "2025-11-29T02:56:03.657Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:56:03.727Z" } } }, "a2ec760009faa1e1eff2c135a3d4deb7afa6a079dda0c6d9f99db627647062d5": { "4f03a97491bdbb54d341d453335aff270c60976e7c3ad96cb719e9003ee5ad0c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.778Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.773Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.775Z" } } }, "a81ad531cd4308314f95a3bc7ee7518076cb8b225330a76bdebb309de6c07d84": { "eb1a10c317b4f12f9023e3b4899a6403eac245683d867b105338963ab1df00ca": { "jp": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.738Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.734Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.736Z" } } }, "a8b3a4c7be16228ce7b50cb870cc58cfe39f8c34bd28a3aca5822b90b0f42830": { "f2435d45557de24d303d66a742aeff55e64e2f4b580432c1d1d9f8eaeb1f5d17": { "jp": { - "updatedAt": "2025-11-26T07:24:12.174Z" + "updatedAt": "2025-11-29T02:56:03.730Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.174Z" + "updatedAt": "2025-11-29T02:56:03.732Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.174Z" + "updatedAt": "2025-11-29T02:56:03.728Z" } } }, "b2dcbd4e41cb07eefcbc269f5df931324f8744a9483f6b145243bbc5673c42c1": { "5890daa9787c7983a0d917f5622f02d272e85c52daeee1444ef64b42ce8108d7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.737Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.734Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.731Z" } } }, "db411e0514092e58a10e4b885faa2126f95d2bd39dace283d1e44cbc9831e3dd": { "527580835a672b74a709bacb51a246aba1c88246216cdba2db279817225f4044": { "jp": { - "updatedAt": "2025-11-26T07:24:12.184Z" + "updatedAt": "2025-11-29T02:56:03.729Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.185Z" + "updatedAt": "2025-11-29T02:56:03.739Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.184Z" + "updatedAt": "2025-11-29T02:56:03.729Z" } } }, "dc3682d31d860920c0027dc94b51e1f197c5a38ca754f403922910b9b8ba3903": { "668b968f7ffa7b6faf894697548c553b64afd08c5b62258b0eb445aab83c7d88": { "jp": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.777Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:56:03.779Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.777Z" } } }, "e72fb86764359e026d92c8940ee6175f5febdbd710006033850bb2ad8aa43023": { "10e1df69f27be8e1de4c2159ec11f7a83395eb9a20a7b729e0fbe4c2bc8bb473": { "jp": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.774Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.737Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.741Z" } } }, "ea7e5e311ec73e96e57ec3343b5c4d7cd8d2c758deae9104dffeb15243a22097": { "a6b1a10073ba1bedb61ae0ed5088f394cf79fd30feddaa919ee25e9e0f4c991c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:56:03.780Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.779Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:56:03.781Z" } } }, "f46404d0d2b932ed24233530122a903e98fd0ad2e866b50bb50ad16e35006e6f": { "ce6bd20ee80f6f7df45c614920f103f5eb64699dca884aa2e9a55c8adbfcc913": { "jp": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.743Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.741Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.740Z" } } }, "f6103a7698b24fef604602086936cf148c11df516f6f84bf99b48971614c717b": { "2934cd253b5a2e39a317ce455fc2c1d9f94f60e9c0af926ce756c8e2261a0354": { "jp": { - "updatedAt": "2025-11-26T07:24:12.235Z" + "updatedAt": "2025-11-29T02:56:03.744Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.735Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.234Z" + "updatedAt": "2025-11-29T02:56:03.738Z" } } }, "05f8d1acdb9d8a92c6735e4d5dcf8080fa8ee6512cc13dbf3b840c999a094c71": { "97638cef9fdf5d6328f466c856175463ac017bac4780f1d817b5d4729a88aa08": { "jp": { - "updatedAt": "2025-11-26T07:24:12.231Z" + "updatedAt": "2025-11-29T02:56:03.759Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.231Z" + "updatedAt": "2025-11-29T02:56:03.754Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.232Z" + "updatedAt": "2025-11-29T02:56:03.761Z" } } }, "0c936deece1cfa87a5970fb553569967ce05687698de65a98ef0315477967bbd": { "a922d6b0d8e112391f7d053fc7058eb1d5659b44c4a9dfa835485d17fbead31d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.750Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:56:03.747Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:56:03.748Z" } } }, "1582ff8ea3fdbeb1dad986160d1b0999795a555f6d89e98dd145b6f49dfb08eb": { "5e343ab5ab03d0e1fa46bf003992f1eb136b9a12bfad77828128edf71d3afe32": { "jp": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.786Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:56:03.746Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.785Z" } } }, "179dbf5bb80545989b2913aca22d0861999dba14106d2380864014877de3c93b": { "114ef0735c99933d93e4c6a570fccf1ca3ef45aed471b8a4eccb902e87cb5043": { "jp": { - "updatedAt": "2025-11-26T07:24:12.232Z" + "updatedAt": "2025-11-29T02:56:03.760Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:56:03.750Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.231Z" + "updatedAt": "2025-11-29T02:56:03.754Z" } } }, "1dccccf586631074a6cd966272c09df3578cce225321b7df5ebc807acd0dcdfb": { "b435aec19ff6ecbb9d88c6d1f945636177e245c9c227442437f370098f0f3e09": { "jp": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.816Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.810Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.815Z" } } }, "2a3e385a0edab430e986558c8176d5e5093f020848f61371fce764ff9195f165": { "b8228ee3face15f90f6ed1245de3feab742bd22410c8360b5dcc4e855e71c22d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:56:03.747Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:56:03.699Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.749Z" } } }, "2bb9b38a8d5dfd619ee7e2a01589dd2c06c59b11f82f178133c39690b45125c5": { "21f979e19600cd98d3791382f305b11aed31990ab9b8c6cfdaf57719effc558d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.766Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.761Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.752Z" } } }, "32b3dc73599ca183244dc71ff36bc88e62757e5face12c31b14ce042f684120c": { "1bb063448241263bf2f6dc2f55489a21d5cd06be00886e0e9e91d6bceacc47ba": { "jp": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.791Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.794Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.791Z" } } }, "51c48794a66e183ba70935eac117d954a1401f40572a0afc11169b24fcd14820": { "dc661924dc7cd06d16b7ed5abfda37c2ece415c277427ada79d811eff748ebda": { "jp": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.766Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.232Z" + "updatedAt": "2025-11-29T02:56:03.764Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:56:03.753Z" } } }, "5565bc89634d0648d7fb44f41fcd9352657cc2b36d57392f0a6561a32e66eb28": { "d223905451f4d931e0e856ce3fd5f35c1c3c25396ff43780337894e768a7242b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.231Z" + "updatedAt": "2025-11-29T02:56:03.756Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.233Z" + "updatedAt": "2025-11-29T02:56:03.767Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.231Z" + "updatedAt": "2025-11-29T02:56:03.755Z" } } }, "705e7aed31578540442c080a6cafebaeba2bf1ddb38ec739dd014aec5b25502b": { "29a6c789509cb2e9a587186b93902ad76eec1850c4f01f91eb5c2a4c186d557d": { "zh": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.797Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.794Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.792Z" } } }, "7e47d90d43125cfd56ce110d9bfe1a08ac0c8cecbad7095afeda215f8ebaff80": { "6aa7a3b849b9da4b7d84bb26a3754ab6d9c56ee35825fa788436cb306b81fc00": { "jp": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:56:03.698Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:56:03.700Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.231Z" + "updatedAt": "2025-11-29T02:56:03.757Z" } } }, "9368e9ef7da2d3545fdcad02056a63f297099ae569a58d6445ec4175f477bcf7": { "5294da061b84e38e7a5c72fa3738434b348d3c948072b63438f6f8e9041f8d45": { "jp": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.790Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.749Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.787Z" } } }, @@ -6937,18 +7003,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.232Z" } + }, + "038b14ac5c1893d1111af35826b4c74e0b753cba46c799f2102d96ef3edb9d42": { + "zh": { + "updatedAt": "2025-11-29T02:56:03.771Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:03.773Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:03.772Z" + } } }, "9d935527c3051f00d3c44516b5c5b43d9ec31ba4d1ca19553b784a772963e4d6": { "b415e1612fa4c875f71cf858dcdd92606355f03dd3c13b5aef37f79f279ada0c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.790Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.788Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:56:03.749Z" } } }, @@ -6966,429 +7043,429 @@ }, "e607066649cfbd50b16b74b56125f76fc7dae7885df303cc620af28c763ce899": { "ru": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.764Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.755Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.760Z" } } }, "ca84649ef742e7064e2d857290ef9d942fcc1d6b9bdfff1813fcdfdbefec62ff": { "555cc07d313afdfd168b7ad11d02f0ab80d39cc85a07b294b44c7401c7ce9620": { "jp": { - "updatedAt": "2025-11-26T07:24:12.240Z" + "updatedAt": "2025-11-29T02:56:03.762Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.751Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.752Z" } } }, "d8908fc8af7a3068c0cc48f8107adaf5bf331be7388208aa9a40ca7f00432b7f": { "561bda26e259939457123ba760b1c473d1ffa5cabb632bd41b00a30024d8ae4e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.232Z" + "updatedAt": "2025-11-29T02:56:03.763Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.231Z" + "updatedAt": "2025-11-29T02:56:03.758Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.232Z" + "updatedAt": "2025-11-29T02:56:03.765Z" } } }, "dbd0d5161d0bd3efeb5fcda68e773df51262f2852a70440882d847c3e8ed79ff": { "558ea55eedb29b8236de463bdebed17358b2ffd17236ba1c7d0c9758543b7b74": { "jp": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.804Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.793Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.800Z" } } }, "df35030ac136ab8f4825db977a911e1874670c6ba73d0e658e95b28fa50c1d70": { "4cebcab8322a8aae73bf90996e95a2e65bb56b941371c8819373abaf169e92db": { "jp": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.758Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.751Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.759Z" } } }, "ee20bc66651b66977783ce3a17b9d4f38b09b4a0774e0791bb9fb26a7f930500": { "e7338142de8dacc4a6fc04e51a78c9dd1fb3bbef6534057d60f8de1db6ed3aab": { "jp": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.789Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.786Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.788Z" } } }, "fe7e045fa5f538d00f569d58a48e0a9285abe27807a38b3ce253116b4cc22e74": { "c2d3019dfd5c9e95d0bc93db0189ffd3ae5bb907d47f6a727f23a3e435164059": { "jp": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.787Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.238Z" + "updatedAt": "2025-11-29T02:56:03.784Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.239Z" + "updatedAt": "2025-11-29T02:56:03.789Z" } } }, "26480489190477329712e0e890231f9ee67f7bae2ec93f1adc5e49bd8705dd0b": { "ca234a63cfee1038a0b6bb5b7e10d7ef8307e9e5239cd0706669420fd2cb62a3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.812Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.811Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.815Z" } } }, "356c6ff78cff0c4de1af14bfafe2c9bd10139292cd3f3c3553d242bfb277d994": { "cf5d9fa224a574f45a3c02cbc85a2617672d37fcaddc77e5adcfc9fa74e326b1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.825Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.825Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.836Z" } } }, "372be1b1091279b14a64c301dd32f570d8ae7c28ebc2b0e65c8d600412c8a6b2": { "24a1775ccfe9d94dbe6ee2e71f12bbcddd22da3de1dd49f2d8ce8e542b33728c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.815Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.805Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.809Z" } } }, "3b4bb74db846ca0f012ad71dfdb33334fa8118040393487ad35fea48bd2470ea": { "3120f1e4d4f08a6ba69af7daa70ffa13d27c3a4aef713d36140278c033dcf2bc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.820Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.823Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.829Z" } } }, "42ae3a5b453abe44edf7cc0c8fb18a3559a3043e9828ca9eecf69cbab0362ecd": { "fb18df11b1efd0c29cdbcd9a0fef8f8e09542882ba6ccb09e3e42d9f3b8aa419": { "jp": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.832Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.822Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.802Z" } } }, "501db638650e5304a9dba8ff4612de47b5da82aaad0a722bd89c11c68a35eb5d": { "f925e25aa54c252061995e84db9939551b2e2035ef3360d06582d778617a054f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.799Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.808Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.796Z" } } }, "5391d9361d8de859f55fc623438785f034d27921eaf51522b1cfec0b8ae6d057": { "4c5301e6bd068db1c39c7442930c97eb64fc020a710f75519ea91e088c153887": { "jp": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.824Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.827Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.828Z" } } }, "64565318cadde7f90ba96c3e29513ba020adf44fe66a9bf3e5482d23d0dd47dc": { "63452898bc1a5638b696f345c28ff8083c41b2223f3638a2c64f25800a2a5647": { "jp": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.813Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.814Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.809Z" } } }, "68ba9608dff675f309e6f07ee6d6f770a417b027a738a79f138c8d70e2106dbc": { "9dc2946bda2aea97fa9b18c311317369a59c2adf656d6ce6d76316a813616fc1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.841Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.844Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.832Z" } } }, "78fe6d3b89afce471181d779a6a8b475696095ab4ef58d29771279afa02b2997": { "79d3b0b826a742e9b7895789e7402d878b568cd9e4df76a133dc77a70f03c8c0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.795Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.792Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.800Z" } } }, "81915656e6d382d86e051a8fa78d36209f8322f00df9d519bd2aba85055926e2": { "4bc52b2d49860b621c0c2e9203206add44f60ae74179555c48eff9366de95cc3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.804Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.801Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.803Z" } } }, "89db72da570e81ebcb6f667a907e2f846f64923d46a9947f6788299488af58fc": { "bc1f7fd0c55c3e925412c0e368a4ffa88b8fe5c39a7aa535303e0d54e76f2b9c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.796Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.803Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.806Z" } } }, "938d56b6044b6cebcfe8b337190fa6dea927660551790620ca8c19fb31cd39ba": { "2aefd9ad0393f63b7e1ec0b002323afaa8b544c1011e8f3c91b77ac1f84ef487": { "jp": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.839Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.837Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.839Z" } } }, "96e31c277d43b145242840ad838f44b908ce963c352dad86b59211265e87b591": { "482a21b0c27c50eedb13f76a309205d6a1f064bddbb03002a77af2aa8fd7cc3c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.808Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.812Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.814Z" } } }, "99ff98bca369584f25c59d8f96acd6c1788719989416cfe1d5d478919758fd86": { "139a2b803dd22a097a0fb93f4bf76cd3187b48224be1271d561ce8d6d3b0bdfd": { "jp": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.833Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.830Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.834Z" } } }, "b2aff55ca5954a6970b9f52ac23fc39fc004e51a346a6cd693caccb1417c6519": { "1010abd84c38f96762ed3b8cb461a3bb4e5e229304c1c500e26dc7c6e9d01318": { "jp": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.798Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.241Z" + "updatedAt": "2025-11-29T02:56:03.793Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.806Z" } } }, "b8c212ea80c9bdcc2ba8434c82489b4cd25a84157ab8881924465e669bf2bf1d": { "aad4076142416380448496fbac36524304c81991e5c00dade2ad95e55a087c94": { "ru": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:56:03.784Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.843Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:56:03.817Z" } } }, "cb227df00b6e64305168553956c1928afd33de9cb76c9d330e9c9eca9290c33e": { "268a8df1fdc77541fc0a6bc99e66097367ea72724a49b591b16c19e00e6685fe": { "jp": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.795Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.798Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.807Z" } } }, "d1c3b4df71214a3e88455cadb9dda32802eabf8a18de9dd12b4636f3a20001bb": { "407735ce33f5163b7e6c2875f0e2414993e84109f0556ba297b7f1762f038a8a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.833Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.831Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.822Z" } } }, "e9a7a6821acf2148d5fdf59dfb02c842dbeccfe3db8ed78b13af93341b542d82": { "45af94df7fb72c57f3c3954a12bae535b5025b01d4824ae9e4f23b2ab156e1ec": { "jp": { - "updatedAt": "2025-11-26T07:24:12.243Z" + "updatedAt": "2025-11-29T02:56:03.811Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.801Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.242Z" + "updatedAt": "2025-11-29T02:56:03.802Z" } } }, "fee5d5e407a8306e3abcff87b3f147641c908588b209b7c9e107759067db235d": { "35cee660251b87c86ad32e1c0bdaaefadc8dc8d26b278a55c87e87e3de226353": { "jp": { - "updatedAt": "2025-11-26T07:24:12.247Z" + "updatedAt": "2025-11-29T02:56:03.799Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.807Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.810Z" } } }, "16f8cdbdb2db2ec0c442adb2d731ad72ac56b9c830104c642c7d2a3b0353bb51": { "81890c8843157d3e93683e2432db1962f9cd9f3a81498ad22050145df32d70f2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.840Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.835Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.838Z" } } }, "22107d57f939a679e2605620f4964bd50775a98cf0a725bb73b27f34f48bb6a8": { "8bee2f4f365485c8773bece43ccdc523ab14c91e5b4d3f38ac552aa09ea55c97": { "jp": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.885Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.882Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.883Z" } } }, "23af5cac91f252ffe2e42d1e7b5a0bcabe7dc844aed8ebeffba1570964d40b4d": { "897a5b0e6ee3fe28e1f105bc25b952d48f233f747b27270188a83040b9b40f90": { "jp": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.828Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.819Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.824Z" } } }, "256b6f8980e5b71a4462fde393b7342ea3301cc72724522761120a29f082680b": { "479ac94cfa44c4916c5e0c53e04c1c5a735ae40232807e8ee57eb3c72f5a8bcd": { "jp": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.875Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.873Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.873Z" } } }, "2a50f26ed5a74514a1bb5535e77a1e4295586acbc14137eeb91bebd950369fe9": { "77daddd248c06a3945d845d9935148cb7d185c9ace0f5a7e2b8d9a52649050c4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.884Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.892Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.893Z" } } }, @@ -7403,96 +7480,107 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.253Z" } + }, + "adee3628812a2e0169c7c436f7c41012c6b0b856ab91c598890be0b181284e63": { + "ru": { + "updatedAt": "2025-11-29T02:56:03.863Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:56:03.866Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:03.865Z" + } } }, "55c4dba0327f61353da1e2bb79f11bd89ee95b926dd1a86a38c82a8837d28c4b": { "45ee568fd070f4841a6bc4d3d5720231ff8e0b6b95e3b6558e9f606b852b17aa": { "jp": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.854Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.854Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.853Z" } } }, "6e73db155b7c6964fced099cd2a329a54c570e4567c1e741e45991462993ff89": { "d1aadc2b06df5561a41ec6294f8ba38c60368402b06032d12e12420507c14384": { "jp": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.846Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.844Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.831Z" } } }, "854411037d5e91dafe4510e3bb749eb29c1405966f5c747972f003bea369b464": { "2f5dd362e6719f95a9f300225eac5ed8491245ba11f15bda272d36325d991c01": { "jp": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.821Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.821Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.245Z" + "updatedAt": "2025-11-29T02:56:03.823Z" } } }, "906c5c00462e8461e0b7aa1cffaec1f44d3cc275066f474f9ab70cccbf9e9d8d": { "661e85a9d5e8d39ed88218a74a7029ed28519c2e3ed3213707133a5bb6e243c6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.876Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.886Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.880Z" } } }, "9acecbbe697d2e6d2e334b3b54c514cdcf0ed3d6c83e6748104f8f3b983abbd2": { "4b6046e5cde03661005f0be0ef3f23e778a948c6c005456f94af71b6ea2e484b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.890Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.882Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.879Z" } } }, "9e489d6bd5311c686f9d5b9d6362b8dc0665508e0aee22c424f6d5045646470b": { "3428be07ec229b0c8189ab88dcf64befbe6259ed64195b3646ffba1c30f4f99c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.845Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.842Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.845Z" } } }, "9ea307eb644dfcb063c696ac334d7efc3c4116379021488a8c90f62910a0ada4": { "fbffc80f20e5309f443ac78918570ef083994e1d627e7abc163966be69f97bbc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.848Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.849Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.837Z" } } }, @@ -7510,104 +7598,104 @@ }, "23da89ecb9cb7533ec667d1796578f33ffa62f9e868634d354c4e0fc15e995c0": { "zh": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.818Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.251Z" + "updatedAt": "2025-11-29T02:56:03.860Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.251Z" + "updatedAt": "2025-11-29T02:56:03.862Z" } } }, "b9b9941c05a9402833caf9876a84c15fb7e08ee5f6ebf347c9f6516a00134c17": { "c8b48a439aa45e1012fed359c6c51f552f6e1298e6483f894f01fb76cfeb566a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.257Z" + "updatedAt": "2025-11-29T02:56:03.895Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.827Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.848Z" } } }, "caf9155f2ad3c6bb6165f0c5a837f80ca0f324d7821ee36716d6a44981b32432": { "c9a20f8ca6d2167945584243cb48aae584ce849963b883da031cb1fa3b57b9d3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.892Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.889Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.889Z" } } }, "cbb612322707858e39d9de4d0c9cc540429b50cdf2909447e753d421fc3212d0": { "4a7d4ef89d791edabbdff46a2878745843ca285c2985ee018c727274960745d4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.249Z" + "updatedAt": "2025-11-29T02:56:03.846Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.843Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.248Z" + "updatedAt": "2025-11-29T02:56:03.836Z" } } }, "cee825351a39183c37f3496b305a2ca1f4323197e9abbe5c4516b74419ab1ae5": { "a0695d4dcbda273aa6429b9ac871a434d4a137ecabd11538b66c6a141105e98c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.848Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.783Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.835Z" } } }, "dd2163ae2a4256a6c45cea7405483741ac924731427ca35e048e40dbacd4926b": { "1344db208f73dc76c68bb5a882fbdde264c6a27beb40c33d6d5d97679b2e075e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.257Z" + "updatedAt": "2025-11-29T02:56:03.850Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.257Z" + "updatedAt": "2025-11-29T02:56:03.851Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.257Z" + "updatedAt": "2025-11-29T02:56:03.852Z" } } }, "eedd808236db61e2b28ca3ea587227703d2be3b1ced3ffbe6e92ba89ef707e94": { "20f04dac4a93b0fdb3374aba9dc0994fdc280c6ebad124568bf3fd2f999185f8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.829Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:56:03.783Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.246Z" + "updatedAt": "2025-11-29T02:56:03.830Z" } } }, "f2d5e46cdcc837e8872864afe7d6050b24a75248c1c3196bb56ddb850f613f07": { "cddb29e069eb3f550f6f7bfa2961bf6e582620eb41b7307ae5bd3772e689f84e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.257Z" + "updatedAt": "2025-11-29T02:56:03.852Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.254Z" + "updatedAt": "2025-11-29T02:56:03.841Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.257Z" + "updatedAt": "2025-11-29T02:56:03.850Z" } } }, @@ -7622,1214 +7710,1225 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.259Z" } + }, + "be7f4e3331c3fd409e0646bffe9b6357649ebe66e4221085977b0cbfb8bd4a24": { + "zh": { + "updatedAt": "2025-11-29T02:56:03.863Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:03.865Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:03.864Z" + } } }, "115c23898dca6a5bd85fc79980e071e10196e3e3295527809805baad03df1e8e": { "cc5d85e7940e700fd5d3f8fd7641a3e19d24a033b3c45b51595134cdc91659d3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.927Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.914Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.924Z" } } }, "25fa138ccb807e454af6642c2ed448968e7de55919fd0d0a4ecb3f6e490a397c": { "ab68507bc825afafe53c6d1d0d6f08c53621f3a95a39deec3a4dad7ef103b2c6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.888Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.256Z" + "updatedAt": "2025-11-29T02:56:03.893Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.891Z" } } }, "29098b8e3f1e1a679a5ddc94379ef95f05ce5d74ad32854eb1f4dbf472997cd8": { "a2fdefeb5c115c0929ae0f70cb0135e6ff4857188e411761888474889ae1edda": { "jp": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.920Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.923Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.916Z" } } }, "2e279d80c8ba84fded6bc29580d38a57165294e3bb9ec5ac3177d8fa43594ce7": { "c32887dbd37129abcf60580789e56e42295b227409b866e8d6f639ccb4436f91": { "jp": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.925Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.926Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.924Z" } } }, "509f6ede51ab34e339503f91928010a06f04655f9ae29650958c5b6768752931": { "b15b0f51d35014ff5faa6f96548eae990708c240d294f1b231da328da35a7588": { "jp": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.874Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.251Z" + "updatedAt": "2025-11-29T02:56:03.868Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.251Z" + "updatedAt": "2025-11-29T02:56:03.868Z" } } }, "521e12e9546adbbc16980431e680a5ef21ea7b5b3b9b36afb8a2521aa6b377b6": { "6e547ac81c7773f9acb16ff8e8b7c7388a98727bfc4319c29909249791e4ec09": { "jp": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.902Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.910Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.904Z" } } }, "543fafeba882f7e65ffa713c52cc503e06a45708cf5d17f53ac0462449accbf7": { "10b537976cc0e91e97a168611992f05f85e4ed7084a47e4cb1a2f920f41380ac": { "jp": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.907Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.899Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.906Z" } } }, "700af028231b046bfc9ddd5cfa321b3be5e023aaaee235d4d7d86453223b3fdc": { "5feb43870c53151fcd38f8407b9a14613518ef335101c53aa526f6a23caac7ed": { "jp": { - "updatedAt": "2025-11-26T07:24:12.251Z" + "updatedAt": "2025-11-29T02:56:03.867Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.874Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.870Z" } } }, "7d89286b9deca9673424f7ef6646b56ff094fc99d83fea068c7a5b42f3b41f58": { "0cbe2538e6234e4c37b13a2b8892c989968a97ca42dd985663e6d7efb804eeb9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.886Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.896Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.890Z" } } }, "7eb439b32a67cfb0aa3624c9184253dc089e7da15d7e10a23f668083dcbbdb63": { "d75745d1b46f0de5b2028a881660f2bd2ddadc7ddc0b54286beaca30e215e44f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.816Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.892Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.896Z" } } }, "8cd1456e58e9b0f32764599fe1b3c08b4549cd901e4ebe5d8ff994983ffb18dd": { "be2df94d3de1df0b087713bb38516d1a78f6b4313e8daf18309af45c6beb735b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.877Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.872Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.877Z" } } }, "8dbad11f22f37a8dfbe5928d8a4733fffad030ebf6032dcfecd084e9101dba52": { "f92ca8e97f1895ba9a62cdd9bd09b067b16fb3472cb748d5ec26c6d2830bdcc3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.875Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.876Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.872Z" } } }, "9606738dfb47e926dbb72401f97fb8dcdca15e8e7e4c7c8e0b1de1923f128ebd": { "f38bca2728a4ec18acf3801a37e29bd6ce1663c505004c92a4ef0fb8bcfab83d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.870Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.251Z" + "updatedAt": "2025-11-29T02:56:03.867Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.252Z" + "updatedAt": "2025-11-29T02:56:03.871Z" } } }, "9879a8ecb21ed941282ca62ac8cd46ca90a2e07bea45df3014931af580b18b1c": { "1cee6eed8b351ab527a9d9c859764f01e20c33109d8796baaf74d0bfe5e7498a": { "zh": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.910Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.913Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.913Z" } } }, "9c64eb3f63ed2f4471f8cc3e3a16b5d6f44f4c39e15dce1c2c911d1a94e1a018": { "4af09e0c2db5842c3ba3437a58d8012e6ed6971aac46840180567463da4f8ce8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.244Z" + "updatedAt": "2025-11-29T02:56:03.817Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.878Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.257Z" + "updatedAt": "2025-11-29T02:56:03.895Z" } } }, "a2fd395ad42270710df1127e0482607ea48ccfe81a62976bedb63b46c8ceb860": { "67cbbbbf1e4f7f85554eebfe9fb09a5afe145f060eefe6aed1c811dfc5891361": { "jp": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.911Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.914Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.907Z" } } }, "aff3738ef426bb03f782516f0c962dc0d4f1e8b1e75422276233e8a61abcbbf9": { "62fbdd6dddf79ab74c534883a022557ea5c732ed713d1fc244291ba771204269": { "jp": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.880Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.878Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.253Z" + "updatedAt": "2025-11-29T02:56:03.879Z" } } }, "c61ff854a1d65abf94d196412aea9f3db52e099f903e0aec1c8dbda684f0ee4c": { "6725d42405abcd2763e59c5af20b80e294c49a24e5dfded57358991054e676ae": { "jp": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.909Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.866Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.855Z" } } }, "c85b0e977e47a5de069cf6bc2a4c3c7c368f637081c6c7a74c2b3f09f541da76": { "6a1875203c3c11a5ddaeaf844592c8aa66c906a5f10d8118af659f3188166f2b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.871Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.869Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.870Z" } } }, "cfcb155375b8c7dce0cd7951038c468106245eabdd22e87ceb685a86ad5787b1": { "4f1c6f9f3c784ede710c284000e57bbb2570ca34ccf377e55bb0aa62d9575fb3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.926Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.919Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.915Z" } } }, "e771f00ee03a6b8ac3a2fe4466ecae0a0ef5fa4a1c06261040efd4c71c7df8ca": { "afaf81983280a59e7aa1584371969108a9f08bbf39abdc8489d3da2cc68c29c7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.884Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.888Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.255Z" + "updatedAt": "2025-11-29T02:56:03.887Z" } } }, "003cc65643f9d9786893e0bde4fee0fde5fc25de83cb44c9b184c9f67f682330": { "7bfbb7c49650987bfda71358fcdb6c75e10f3775e57dd80dfa998cd9df1e42b1": { "ru": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.954Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.961Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.933Z" } } }, "0bf287012c3e4a1823f4a6d9af97b4ff2ebf50382b88f6e446f2d2462ceff028": { "6fc59c979e71f5ef7d01dffb85d9c0d52f0f7d9af3f0d2364ea573c821dfb4a9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.945Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.953Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.946Z" } } }, "12e31ec44b3dcf65828805450d562ba22004284c24e16fe91cc2a8306183626b": { "9894639ef964614d3ef8027f22a7deb78a5ccec89d41e007f288e7db21591494": { "jp": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.953Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.958Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.947Z" } } }, "1a8c3dc523efbedd8ceca5a1bf0b315be2ac1dcf90f08530d461bd213eef4f7c": { "da9e17112c0ec79d1fa82ab5f0ca3db1c53729e70e3fd6a2c4370c03691b292c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.956Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.957Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.952Z" } } }, "227d51f47fc957dea766831ea43b73c58c9e450c7aadba923fb55f27b830acd0": { "88ce0d6c08629f221dcfe109d7e8a09898443472a62411ee8e84cd0cd4e77851": { "jp": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.948Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.943Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:56:03.947Z" } } }, "2788d1737d33b8bd86e0aa8f0dbd2c1bed226411e50160a1554ab9361f7532d2": { "d0cbc85c85d4d71c67952d11b3d238be8fc75b6ea16860b09935bd9f96add653": { "jp": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.906Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.900Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.906Z" } } }, "3b065a4f3fc6b25a5184da43b7b0221b5aeccf7b81e1255bd8a6d2a6b86a8ae7": { "c88ae622109bfb3777e96a49c9bfa5f9889a8187d65d687676ef5de1bf070514": { "jp": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.918Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.923Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.261Z" + "updatedAt": "2025-11-29T02:56:03.916Z" } } }, "3ffea18e4142d273a23435211934d60695e426723e88ea42a887c753673da12c": { "9135666001d3b0d949ff7db424b18a4b655d4b8eebcafa75a9e472d040fbb808": { "jp": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.917Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.921Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.917Z" } } }, "6ae9dde7cd947f044ac422d9819b807221ad5825d4f6859ff2c72f3c22d7331f": { "f17b1d4769177c8b7b3260aff487e581de4450f37dd2fbeff3e0a899b7559706": { "jp": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.905Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.908Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.909Z" } } }, "95219024ef9522a55be4e6513f75defbb49883b4a5e32a05d187bbbcc9f53c16": { "069a5c20a99f64397b1d13060b06470148c26b5072a36b8e1b16d746b0e4ad7f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.950Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.932Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.940Z" } } }, "9829e6d504f03f89cf3f9782f9238f3dec6efd6d3810dd672ec15bd67e65f810": { "e59e26adb9705f2e6456ed1518f0aefb7d0cf0e3b13b040fa78b4a590a1181c2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.902Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.903Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.905Z" } } }, "9f51461ed5499a8b1f450f23f773f55200d3922c76578fac080589c6d4bdb7c9": { "eaded5b9cc370f7c0893d58a270227dd93fe67bc1568a6b674bdee429e92ac10": { "jp": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.950Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.946Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.954Z" } } }, "a4186d2152fae14c248c1297810d8ae84b17536d8f68513f586c1e2d378d79fa": { "da62d5ba1b9b52d86fdf52ef9a5a5fce77010670db44844630fe457d0a64dfda": { "jp": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.945Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.944Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.952Z" } } }, "a98f06f78a3ec0f29bb4f078dbb0c37f77d01618cebf2733ff11b32c497f7b24": { "a9a69fd4a89753f57c102accc6affd4752db865e189ae4cc4e551815c20e9964": { "jp": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.901Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.903Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.900Z" } } }, "b0f8d850504855a8481784c04ab4b0c0a35453e0ccfb3fd1251528b4f77a8b8f": { "0dbab51aa36f5b479c39c4f615a8a9b4493aeae6b1e482a4ccbb9064901d7f3b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.263Z" + "updatedAt": "2025-11-29T02:56:03.925Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.918Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.912Z" } } }, "b7f8c2c6c3c0d8cae21834a515d86c9ba6864e0aa9c968e945adf28aff1bd428": { "bbcd7ca2f8d136d5cdb1c28f0c53253dd6f2040d23646bfbb062d85161da4e08": { "jp": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.927Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.922Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.919Z" } } }, "bc18991124499a7f66617eb5b243033498a2376e769bee9084fac4cef0b7c045": { "d62f4767bf6ec9661415c60e24e41a90ba047d383b9bfbb29a327253f604da58": { "jp": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.937Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.939Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.898Z" } } }, "c23421b71aced0ac75a1f6d4e5a8b8ae239e457c02367e880b6d1a4ff7277e3a": { "4719e0b0aa1afb513dbea43054775d5c3e22f6638707c72a91d88a4237b487bb": { "jp": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.928Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.928Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.262Z" + "updatedAt": "2025-11-29T02:56:03.922Z" } } }, "c621962c4e9a6c1f2dcb4ec8f98b33faa0d771e9aac97195014471b0f353099e": { "8e462b2a96c9f45baf5c523e8a97e3ffac3676c40724d42a9c5109d5413a54bd": { "jp": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.916Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.911Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.915Z" } } }, "c6addfcf4c2f183d0885f78b6bee455eb175ed28099b76df7d58a87ff79c231e": { "0bdad070e3c15637e1941843f067e2a8ab54f34932a6197c4b57662a1ab08586": { "jp": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.904Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.259Z" + "updatedAt": "2025-11-29T02:56:03.908Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.901Z" } } }, "d0a117042cd54d2d897e9ff128bb30722802674d738351bc727ad6a48d97c13a": { "ef198e4984503045b3061df3df5083cc081e20ea251352bf6175ea0983742b28": { "jp": { - "updatedAt": "2025-11-26T07:24:12.250Z" + "updatedAt": "2025-11-29T02:56:03.856Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.910Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.260Z" + "updatedAt": "2025-11-29T02:56:03.912Z" } } }, "216d22e459b5339d73b5e5f5efd10ba0d324035b56ffd8c09aca8ff6053e5be7": { "4347cf6fe8d3643c0bc778bc6d6e1a2d7728b22b55e566913fa8326c720d6e54": { "jp": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.951Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.898Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.897Z" } } }, "2f2c64962247267011454aad885684dd07f5230293d18c996004e9a086a48a9e": { "de25513083b27abcf3a1ed0793d26139ab348f9ddbadba05a87914373d86d034": { "jp": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.942Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.938Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.944Z" } } }, "3b502bb7173f6131431ad8322b576ef99ef5e91d3612beb68e0f4ce3b6053bf9": { "c7797285e4835ab50d34203593f5308bddaddec5d13f14f4f6d7be4be2239eb6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.941Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.265Z" + "updatedAt": "2025-11-29T02:56:03.941Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.951Z" } } }, "3c55f6319b00bb5e571612e6f740d049975d5c3de127e0de80d0f34889dd8b12": { "08f719dba95186bb05f8277899abf3443e7cc9fca51a32ba8727dadf82c77879": { "jp": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.972Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.973Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.972Z" } } }, "40ddf7122cbd5708445d09282a9aaaa01b51f15847138bd583939c6bee63c5a8": { "1efde3a11aa977a804768bd9d231b648a793e9638453375585e0f62486abe9f9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.935Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.937Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.945Z" } } }, "44e6428941aba89bd0fd45e401717504047bf2582288d528651664c68b5860ef": { "3dfaa8d64c4eec1438f9e2fdcdf95885e290daa7a1d6f9280e7587fbde343224": { "jp": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.955Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.958Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.959Z" } } }, "5034a9cab8d174bbba4fcce036fa29d5dc6bfa365274ed3cc44a0e5ff13c4738": { "c73720aff6e3013b19ca923ea6650c5399c7cce59157340fcac3ecb68f255f4b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.950Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.897Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:03.956Z" } } }, "541698242c872ea29127fc2dfe64cbea8b6e3ad3471aea2ac19011a37d71e754": { "08b7c30758e175cbf2a1d09a301193f88562d6e7ab18b078ab6c4b805b81620d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.962Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.961Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.960Z" } } }, "67199cb0b07db7b73e9d48c3856e7a80fa64a401ac9356f38dd56f0ef6af4f87": { "2a193532f966a6fea5015f9758bc034a7cbdfaf8b91c7431fdbc29b0d020b9e8": { "jp": { - "updatedAt": "2025-11-26T07:24:19.081Z" + "updatedAt": "2025-11-29T02:56:03.949Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.082Z" + "updatedAt": "2025-11-29T02:56:03.955Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.959Z" } } }, "74f8cb35854e4cf151ab34a6587a3b0c76868a99d06b7a1b7eb88bfdd101dcc2": { "9431057902d3a29dbfbbd44c8cc88c4dd2b703331d32f31fe7eab5675d5d047c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.942Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.940Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.940Z" } } }, "7e0dc4543c81b33bb19b9b0222c533c95884214b5877d7ed6c08d6101f73935f": { "4d2ea53c6c8b773cda0b23778f9e67b35379e9de8b35e7412e470060aa209fbe": { "jp": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.975Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:56:03.963Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.978Z" } } }, "885b5d789ebf32a2edb92bc498ab9f2e881afed86ef284b4892ee15109bb1321": { "b7053e1130cf6901ba2d93962cfe71528955b54a3427effb3f8dd0cb63a10854": { "jp": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.936Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.938Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.936Z" } } }, "8c4025d67d4f83f1787b2935a24ca235fcca456bc7505ac9ac478e5351ad8297": { "3cdb2c61028a51f468d7e958cbdb00bd91b81a31123aacd0a6e4c0f676f159fc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.975Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.930Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.949Z" } } }, "9f2ad018997a5b2a59f6bb176b61937bfa9cd7e81143b53306fe58e2c41400f8": { "79e16644830172d488a3acf805a5b9fe0f8b79fdbba1afe39d5495d561479ee9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:04.000Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.989Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:56:03.964Z" } } }, "b2c15bf0de452ad7ec7d6015900f40d41f66f8080e473ae5d92a9e398fdedca0": { "a7e5cb05a26913f4d5d6b8e23e33097010b909a91fbc9015096bd23deb3ef019": { "jp": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.995Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.989Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.987Z" } } }, "bda6feaa2f751d257d0e9bb7488f846a2998fca7dedddf3b4830683849ba2b58": { "2afea7889acf8ea5044a0d33842f100ab65c6cb7f1df295cd1f21f7e129776fe": { "jp": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.979Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.978Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:56:03.968Z" } } }, "d032d67a58a6623fab2b1b66938ad265d806211c7e670b710006fa88c0fa60d9": { "4c0a1b6590854c3a88fa162f08d4611049c85780870affbf3d49f61a3e412fae": { "jp": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.934Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.935Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.934Z" } } }, "db88afafa5d929b34cdf925862a67b324309a0e6c76686a5ccfde2ba82d5226c": { "e4a92a198d90a6cd53c04928fa4fb9c381359603f0c986e9d59a15fa39407592": { "jp": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:03.996Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.994Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.991Z" } } }, "e18abf4c56dbe146fa998f9070622acba484b5011490469cab0c1e16bc156647": { "58bb991322769280e6d10291b76e02c6a2e7231dc177a9f01f4c729dbe75cc7e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:04.003Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:03.998Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.986Z" } } }, "e5455b8e71ca0240dbae9ace48f312b2859517718c9b5597790152f5c5e4c55e": { "70f5e4c518ecfa04a597a86630bfa6b7c13859702dbefa84f43a08c628bb9c6e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.974Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.930Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.984Z" } } }, "f0b04860378a97e43a484e7cfff527be98a82a04b75ec9ff8b95b88bfe017c21": { "4d6e6128d8cb69272312bc10969428b2d7ec14e93843e97641bd6ee1b539f104": { "jp": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.962Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.258Z" + "updatedAt": "2025-11-29T02:56:03.933Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.083Z" + "updatedAt": "2025-11-29T02:56:03.957Z" } } }, "0f826dda16a017686da9cd258a7b36a8a0fa9bf0906faf288ac5dc07e8293c8b": { "7e91c488285e13a646cf4e0be8efc95cc3461d1b565495878e5ce6df5241454f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.025Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.022Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.032Z" } } }, "19d39d202840e88cd6155f2716118be469f38e1c294287f77b535f73052a335f": { "b04b8c8d1915a6a483b4461dc1983e8dc5b3c4131b3c513c2098e3306d1cf01d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:03.985Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:03.988Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:03.983Z" } } }, "20547e4692854c30843291c8c4b85cbaaa2473154a503ada089b47a286e119c6": { "add80eef63fea1cd539d2ca896319743cd0debee7952a9062ff15a5bac9cc978": { "jp": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:04.003Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:04.000Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.267Z" + "updatedAt": "2025-11-29T02:56:03.967Z" } } }, "3f80767faa69da876f277f16dd9152d0f1e8aba3db884130fa4c7ea029eb17e1": { "c8ca096e88fcce6dd3218a70cf039d6d7d8ebfe91be1b6c3b85f141fdc1feac1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.020Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.029Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.024Z" } } }, "4d30111f145343ad89c67951b74bc9c73865620ef3245a428535e3f9bbef259c": { "db4eae957950b7ac6455d1dc6679f4c64802f86d27f4184e0393be153c8bd7a0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.264Z" + "updatedAt": "2025-11-29T02:56:03.929Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.996Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.983Z" } } }, "4f944066028f36b0a6f28232fe75a6ebde995b969ebfd8a3c379cd645f0ff366": { "8ded3d0fa9f33ae122022672fd02b631471b5177e76c368607b554bbb3efce22": { "jp": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.992Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:56:03.971Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:04.001Z" } } }, "74dcbdc993f03875931c0ef548e27e0ecdd4c39c4c084edc6eaf3237a562817e": { "a9ecf8d346bd106208732038ad37c4f2b9861186a25aead51cc7057a47bf2cd5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:04.033Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.031Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.042Z" } } }, "7ab7a6fd8e115253049873f3b8e272c6c530d1d56d469dbf4d074ab0bc3ae8c5": { "c86ec8922020d2cf9ee2017859793ec04fb19507a65cfb98dd21a9cd2dc99ca5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.963Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:03.997Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:03.999Z" } } }, "7ecc3a4ce272f64e4527753ebb952d46d33a160afd6add3fc9a4a9b08d7fae1c": { "ffe09564c5075a69993bd16153054a5cfba44517a2680e60b50e4b87f0a5b83e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.039Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.041Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.267Z" + "updatedAt": "2025-11-29T02:56:04.005Z" } } }, "7ef33beb95b850b8400aad8ded966f28fd1eb3b61c5de7974983f2270d2b4f7c": { "501d9df3106342436670302f74dd2270b110ee24da435123cc0a1b51633a2284": { "zh": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:56:04.010Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.019Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.012Z" } } }, "81154bce9be97a0fc523001b189f4c093458747ff4e9b7f5cdecde64d9163d22": { "126e1bba0f10751cf028401cc1a0f3a944780e4a87fe9b63fb850c58b7d7510d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.040Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.038Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.965Z" } } }, "88d029b112f5fca5e4ba3d06b8c35a6d55e5b557663ed600c6f1b98f59f8ae20": { "1393aaf825d4dab45a6acc1ac4db09d138970e7008f8c78dc434242141a483ba": { "jp": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.026Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.021Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.027Z" } } }, "9831e429c5ccebdd733e3a8b6a49aa6100e584ba3fd39122b79e1a3df27a2feb": { "bde8f222c01ce8541efa7b5346611e02d7e5b13f92c827e80068ede72769e0c5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:56:03.931Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:56:03.968Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:04.002Z" } } }, "9b041aa508f2046ee0a4f84858531b8c2507bb6a6989db886c2dd4ea0c11a002": { "23dc86ecd0cc50924f5ea02d06b16b4e395c8e0f2fd73bd76d547ac864d42f36": { "jp": { - "updatedAt": "2025-11-26T07:24:12.270Z" + "updatedAt": "2025-11-29T02:56:04.023Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.040Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.021Z" } } }, "9fdb709a96f96fb011d844ca13cda88bb361212284a327821501551223a4aa9c": { "064e508fcc9e28910cd94c862392084ac9bfbb28d99941ea8a6c7bf60aa11b79": { "jp": { - "updatedAt": "2025-11-26T07:24:12.267Z" + "updatedAt": "2025-11-29T02:56:03.969Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:03.982Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:03.980Z" } } }, "a08c904ab61d1c76fa622a160e0956711547c3a01e8aa50f73e5c58504c9110b": { "65bcd1c2b5d5887e042c81d6e5c21fc2a0db88c65574a53d172b1f40ae25058e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.976Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.086Z" + "updatedAt": "2025-11-29T02:56:03.974Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.977Z" } } }, "acceced538fb290e4499cdbefd4179c4f4d347c0ccfd60840e8eedd522602b6b": { "124022bd2cc51265ce8f1c49ed73363724b1580a4bbe5d35e3c5d6d9b2bb7c01": { "jp": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:04.004Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:04.005Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:03.998Z" } } }, "aeecbc80fabcf65b76af1cc65dd769022e4856381588c8501d1a59b206c10326": { "0ce14d2631d2a24f63a66e4f8b06f82fee405f818a0bcf369ea6485c8ba72681": { "jp": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:56:03.965Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:03.999Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.267Z" + "updatedAt": "2025-11-29T02:56:03.969Z" } } }, "b5543674ee59dc5d80ec783390644aa03c6a1b7c91bbff001eda92fd5198a064": { "dce1dfac5e498639b6f080315eaf0ea6f42c51bef46d3fb13e621234a36cb996": { "jp": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.038Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:04.037Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:04.037Z" } } }, "e6ce65cbfbbe441fc30cf64ab1c1d1dbe1699d91ca18dfbe615e4a83da7007bb": { "366a43842989bf6846e76c26bbf2e87e00bcb25564dfb7941a416bb6c279a332": { "jp": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:03.986Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:03.981Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.271Z" + "updatedAt": "2025-11-29T02:56:03.980Z" } } }, "e8bf7b4871a3b921003161fbe9fb3b3e0df205638abb6aa707688886621c9715": { "15aca606b9aecbf11a3de4acfdee9f33ff548522f3411df807128a214f52bae1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:56:03.970Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.990Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.089Z" + "updatedAt": "2025-11-29T02:56:03.990Z" } } }, "e90559dea9545d48d4ab67dc41647c74245d5af3f7450472a6a52017b58aaa6e": { "a15b882337784575046360aea947e55fbbbf97d76e32f32fb9e275a833afb47f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.979Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.088Z" + "updatedAt": "2025-11-29T02:56:03.988Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.087Z" + "updatedAt": "2025-11-29T02:56:03.977Z" } } }, "0b209462f1ec411886fda57e810cd3eea5efebe202ca2b4f5dc9f1fb3787ccfb": { "5ecfaa73c3cc92aee3ee2825b0bb89bc857721cc0ed52b56af3b10a539b65498": { "jp": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.013Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.014Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.015Z" } } }, "1d14e004d487902f18fc6c1de04f1ef911152e4d8c2d76455e4956d9cccd132b": { "435800632f77c2f3a43f62396007c869bf0e3310b946c504cec9c7661f101c78": { "jp": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:04.043Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.966Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:56:03.966Z" } } }, "30cf7268ead1225c4a5df7a64fa02d87949b29677780ab8bce4abfe82c42f29a": { "279eb946f79782ab2e8f6e23256ddd3224d1fa15de3a0be112ac3c94bc4312e6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.008Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.008Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.009Z" } } }, "3429435d33feb194cd2815db45da2e05b63eefb419c7039d15215e40384643ba": { "918e8abb0c6066b88bb4b0bdf464c3907f836aae0d601ee87bc91ad879720c8f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.076Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.070Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.062Z" } } }, "3fdff0c8c92ebbc95447e7244075da88510e0c3d4966e3b72af95a6e4c3d8e8f": { "1e45c8cfbc59d4c2fd364a34eb2e7afffd36ea4f0b127f873065e2b176a0133c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.036Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.033Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.036Z" } } }, "4ff60f576a90647ac6859ba05f56e594f54029ca4beea54b1e07f27ee5acfc94": { "b991af90c327a458792ab1640e608a8704cbde6a6f1373636c3d4a5c3445b766": { "jp": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.018Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:56:04.010Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.269Z" + "updatedAt": "2025-11-29T02:56:04.013Z" } } }, "5063b2b4bc9b2899fab5998a2b281df0229add76ce268451423a1dfd2ffa5f2c": { "d2af9085fbf80701266de277a6a67f2400d823b5ac0d2ee3f5ffb2eb0b4f0294": { "jp": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.016Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.012Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.016Z" } } }, "53e5bb2209c16605d7273edd1079563619f7fd4e6e5bdfdb95988af1a4694755": { "19b750db7b91f72b4f9666d5cd502557bfaf69581d6fb96105e239e437635657": { "jp": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.023Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.034Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.028Z" } } }, @@ -8849,130 +8948,130 @@ "611b2b0d02709490f3fe4e3331bd31828428e661cdc38d633fd487daabd3cc1c": { "cb8d66eeaa9869bc4e4a0832238beb5e4b8cc2ffa0e3483678d79606c472c326": { "jp": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.066Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.069Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.068Z" } } }, "633a4ffa471ca2244e6ef5a3022d6a46f51861f23239b9b4594d8cac210cc0b0": { "011445c96b51faadcc04ca2af74b4a9de574446918a704bcb7648036f25d38a7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.031Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.030Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.035Z" } } }, "675843b51c582122de910ed4f222f211176c97af172b7f849c0b8ecd0dd2b190": { "a27dbf65b4c9c2e9891bbf450b7163614f6940254a6ad1c1db78fd18c3795fe7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.082Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.054Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.067Z" } } }, "798d0e3eca2e56d6aa7658d85b9a41657e3aacf854913976ea97d89d8865966a": { "767118d90c94b77855b18cc08229cfbb4dd47ceb560ee656c0882c9192c24418": { "jp": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.011Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.017Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.017Z" } } }, "858c3c5ed9eef8bbc65ab6bd6d04421cdd9d8ffdc620d1e8becc8e78f8cc2970": { "272ee010337aa027090ddbeff208e3a6d597280101959048ceb7f7a899d361b9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.048Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.057Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:56:04.007Z" } } }, "991e27fab22b52bb4b08b4ae04fdec89d5e6553dc7110f7d24b73408fff315c1": { "a03618c42cb58f95e7e03a4057880d077e66e088f5502749a604eaca3e70f464": { "jp": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.018Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.014Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.019Z" } } }, "a6b9d4c5cae0464959192ad659ed2100cebdeb8bc49e4c041d80a9c6a804808b": { "e888d9f5660cbc8a94390f0efc75e38b61355c7aed5b560ba7c55138aa191993": { "jp": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:56:04.044Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:56:04.006Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:56:04.007Z" } } }, "b7a5608a851a55f00f22ae8d517987b946c9c3eb543370562dc786dab3594714": { "88a876337f46351c9ccac93457f33dc4fb23d9aab3760cae91e020811ac6f19e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.030Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.027Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.272Z" + "updatedAt": "2025-11-29T02:56:04.043Z" } } }, "d9b29cc47744c8dbd75014c191b2d1b6a6cbd834e8f58800d7ab54ee3b380193": { "790a9a7598eac524933e6837e62602bb54c548d8cae162ec8f67203a8285580a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.073Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.058Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.057Z" } } }, "ec3ea94f6a821f3d66e7dc9993bc4fc2b65580f3ce729e89dc7d1d6e9711078e": { "078157aa36205afa5c6e11fa8f7457d8696fb79062fc79c709121c33ed2a7d52": { "jp": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.035Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.042Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.279Z" + "updatedAt": "2025-11-29T02:56:04.034Z" } } }, @@ -8990,1339 +9089,1339 @@ }, "97e44c5927e52bd9073aef11610c839f64450b48880fbf9a450f43177e163506": { "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.058Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.009Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.051Z" } } }, "f62c32cc2359a74d04c720f97feb4119997308d7027c0a473d0878ff90a711e1": { "8bc8554c77b98b4cb1507facebf9be6cda0cbb901ca29360d32136bfd62407a6": { "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.052Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.045Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.044Z" } } }, "0788f71f3701d95084837950d519aaf717087552402cd82dfcf4236628f15af7": { "1840d9cc80dd9c8c8cc0209074557de0b8c1bf9c2ca33bff6ab6effea03e9a16": { "jp": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.051Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.049Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.047Z" } } }, "0a5e03fdd60d6da9d1347b2bf3d6f54bfc297dac14108de9809e6b2bf3665be6": { "21ae110d91d8fdefc2b7d4393674825fad68899404deb0a78de5c902d700b719": { "jp": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.087Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.090Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.086Z" } } }, "178c705b2c62c01727a80327a809f6535d583c870ad39995375a10a363a1d727": { "1589f225c754084b804cb1b7c426921b7979e160c01fe65dd00c2a0a3e3ae3f9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.053Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.046Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.063Z" } } }, "28de08e6f00a1c0b51895715997e43dbe463c1c4cff9b002dd9014edc5579dcb": { "46a435b4ba73651faf0dfb756e1f9ac1d59de7e580a40c74411bfb41b7c958d9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.066Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.048Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.046Z" } } }, "2b86670a1b384ba80cf06cda553945f2f2ae1c3d4a369cf46e8551544379716c": { "4169ee416284b3a8de7ef404d0519465870ec5b969e0dbb0dbb883cd456ef93c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.088Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.091Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.086Z" } } }, "349400436c332178133e694bcd47dc9ccdf4d729cfc274f1f99bf82b54fde8d1": { "312b11780c641636863655dd7b1fd8b57e6cba8bebf6946857812ca2c3afe479": { "jp": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.059Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.056Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.050Z" } } }, "3798000812ded299b4f0b685fe4df133730a45cf67c87419cd05a769b727f03e": { "1810bd73113c23ab353e5810beb46fbccbee2f443e979883aaf33e93c1afa116": { "jp": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.050Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.055Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.060Z" } } }, "4047bbbf1b204976cd120655b4d3e85ae62f7963b1cd9eb60447ba1c7a58d925": { "0250b8f7933c3640e2d5931945a7588921cbebcd1ad9f8227d1301fc00ccdc41": { "jp": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.062Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.075Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.072Z" } } }, "560a771a88f358751a343c140ad56fb357e898496988479f8f38d70c5e6abd73": { "9d206180b799fb716602163eae19d67a30abf8a23c3361889197d04fc78bad52": { "jp": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.061Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.071Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.053Z" } } }, "5c678b3a4246706bfc999afc97cec53d8c982fb87363f87665082241361a5d73": { "3bc705589b64c0ed96008afa97074822fc2196c075b74f42358b16d267c7160a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.054Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.063Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.074Z" } } }, "6021378296fe97cd32f847567e8226b5b01ff3e70c1eaaf35a828c9d29135ea8": { "a116f2580c016c233d50250b989b32bbe09ddafa83b8dc9dddec1dfc676909e5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.065Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.059Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.073Z" } } }, "773e022e6828901db117df504dcb5f22c010a9943c580fc510044d9585197e57": { "b629f3340f4e22116ec115e53eedd044eb499d902c10c1c5d836dbbd184e23b7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.068Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.067Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.064Z" } } }, "8e7b5fa5ffe7d88c028b17edd689a831fdd41f6a2fc82ff78123493c674623d0": { "ede9c0bcd24a013660cd4a3b395c94ffbe54ec3e8cb4f5607bf18d77ba8eca33": { "jp": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.077Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.070Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.076Z" } } }, "9011c5f16cd48892d19d1f38ab22564d7b0466e5517619ebecc2bc7e71bcaed8": { "28412c34a30c1203bcca0cbcea84a0b53297cedb3c9afd82adb465da3b94442f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.081Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.278Z" + "updatedAt": "2025-11-29T02:56:04.083Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.078Z" } } }, "93c3b152cbce0393c9c6f97cf591c3711cbf3f81789b2925cea760c4c5cff676": { "a411bf07df5d4b27d21c51466694fc824b2f2422d09fd22f63570974bf2e2f9b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.276Z" + "updatedAt": "2025-11-29T02:56:04.064Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.275Z" + "updatedAt": "2025-11-29T02:56:04.056Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.277Z" + "updatedAt": "2025-11-29T02:56:04.077Z" } } }, "bbd2cfba8a3c3afd64babc88292f440871b9379ed0c722270cbaee5b28989f92": { "c2ff068859047c7491ef0445b9b895d4133fbbdf15a64d444483ba2ed4225407": { "jp": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.089Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.072Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.082Z" } } }, "be8dc1cd18e614d45a58deaf1024b50c63f3b407079c8195f643d25501e18a86": { "835ca542a441c446925af17c0332381d8c4950cb2f458181ca206b84a34091ae": { "jp": { - "updatedAt": "2025-11-26T07:24:12.282Z" + "updatedAt": "2025-11-29T02:56:04.060Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.074Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.274Z" + "updatedAt": "2025-11-29T02:56:04.047Z" } } }, "bfd7f9d45ae0b09ed83b9f435d6a0720b54f9af64528eea7b98d70d76a9a29ba": { "db0cfeae11a772453aa791ef8a6aad69ed5ff266472101082ba0c8d64ee078c8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.283Z" + "updatedAt": "2025-11-29T02:56:04.088Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.281Z" + "updatedAt": "2025-11-29T02:56:04.085Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.089Z" } } }, "c3760dc390d98e6e5ed5a4a74c5c609915d05a7a63963656f7715607d65ae092": { "2904d7fb4addff8bf173ca68df5b540945453ef8fa9eec76a35d8f9b92ab8b87": { "jp": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.098Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.097Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.098Z" } } }, "e7312c644964f4d389a9171edabe14341e5e6fdd852101cf9f16a264088857b7": { "2904b07971746b903763bbcc8b60c7bc05a984fd6692a24f60eeae21856cf64a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.096Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.095Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.095Z" } } }, "f5e8eec3fa4fdf1b4c16b4b71f35b278d41db6e5586c66a42fe590521942f347": { "f9704f3dd2bb395a82abdb0dd1b7b09ea97a4499075e9bc8ecfcb0ead44a1d69": { "jp": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.115Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.112Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.113Z" } } }, "0c9700318afe07f773f3675286dbd1308302fb5c993fc403ead5ee2c2c311f85": { "26bbf167b8a8bdd6e415d3cf429c935f63ed38563bdb8697297248361bdeffad": { "jp": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.109Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.099Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.103Z" } } }, "1205bf7e48133304fe346efa0309af05787e80fd6f83623b178426d0d89e43ab": { "7a4af08a1b17f2a86db198129d22bf1a71494ef3425bd28e8251e46075a27288": { "jp": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.091Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.093Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.284Z" + "updatedAt": "2025-11-29T02:56:04.093Z" } } }, "3c59f44959e6e9ca6acdb43ffec9355d9485257cc402a212ce1759a0064bb981": { "1ec8c112466533ed9f452783ba3194be3a2def5e0e028ac74fb3913e56cc2f4d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.112Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.117Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.111Z" } } }, "401161c2a7c478b5179bcce758b06f32dba0fdbf9bc64188f2d7f79dac72dfa0": { "f590407909c6eb71eb806ee84a3e8ff079ef373b53b7e0b97152b2c9ea18f318": { "jp": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.117Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.114Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.107Z" } } }, "48ca9336c96e6bf5d7264d6ae62d5ee29644e6c214dc339d83a610716c484ff0": { "6e9ef6dfd8e741fb723339409fd3ec6e0e74d8c83d08b37cb60190c4e83a6762": { "jp": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.094Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.094Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.097Z" } } }, "51b2a652cdf591979b38ae330c8306c66fd1186f911c915e5aa9e108a6876603": { "a570b7d389235335a4604eebb1f1ee2a84cfb547848012a3f76c135f5a18e3f9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.163Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.162Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.161Z" } } }, "5272155dbd5220decd129a5e4b559edddbdf6ce43e7a6b8b33c93f39ff269597": { "976786fd43e7ab3db7efe0f5493c2e4b732add2abc4ca3639e54d6dba7ea3e9c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.144Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.144Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.143Z" } } }, "548de96f50ceaca8e5445f140674be40c17b5c6efd12a9ec257c21dcf7ff409c": { "5b113a68ce6ddc11290d264ed87c01b3577af499c83519374e7d367764d8035d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.084Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.133Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.128Z" } } }, "65a720c2ea0a8158d89758ca90889e7cfba036082ddc99c1900ceb31830b3cd3": { "38abb8321a70b767befbe0fce1b421459ce68d0c40703530c81bd00bb0fe53a2": { "zh": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.140Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.090Z" + "updatedAt": "2025-11-29T02:56:04.129Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.084Z" } } }, "693961a5d1fa6bea79f69b1d2a739db59c41797c8d322ac4dea99c908e8abe46": { "b20f75da8b934d12c4230b89c1dd8cd4bb4b57708832dd5f413fd6ddf12d4434": { "jp": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.158Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.159Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.158Z" } } }, "822e90a8485f6ba254a1b6b4f89bbeea67771bd3cb9f9d6241558e4b9f59e8ca": { "3442662c930110d3e163429ea57e15d27f6132307f6bdd86dd62fc64d01d1c48": { "jp": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.155Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.145Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.145Z" } } }, "8fafd060efa9d7570d6665629f29f511b108ca76567a0f8ab9320536cf4824a3": { "95dc2ad2c072c0167726cf92eb31cd7af87b0eb4785b0fb839363d03a88ae8a5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.120Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.114Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.108Z" } } }, "910c09772c30498ccd96c4a7059798706b5861119f5ae8e46d899e9a4da807d5": { "419e68f0fe31b19a72d7bfd6b1b28c27298c6d38904baf049d3466be88aac0ea": { "jp": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.101Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.103Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.101Z" } } }, "9d303cf2c426cf20096b5dc4321074d62704d00520545ee1bc5184cdba1e2bc6": { "ee164e4761915f7bccd76758188f979de64e4ab9239556b390ffac31d42aaf2a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.116Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.119Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.115Z" } } }, "a0c24fe635a0e43acb3d80e4a7fc854ecdfc143306eb5b0b77baccd6c4ef9468": { "e71bd647b55a5bb2a691655582237e95f9ff246c5f45f2f2f663e74b62968fa9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.109Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.118Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.110Z" } } }, "b60ebbddf877960af38c601bbdbf000beb3124a60fee1f8c23fed49149d1c527": { "a5cf8d2eccddd9b6214fa12aac2b98dd4e514d569be5e26938ee9a3b11a0b411": { "jp": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.107Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.105Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.102Z" } } }, "c11fd5cd4c0e0c76b50b836fc0585b7d897d5c6e619c8530f61e70fb13e7d1cc": { "1fc6d064882a931f2ccd7ae4239ad068568c65a8bef153bd6264d39d45bdf340": { "jp": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.092Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.092Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.096Z" } } }, "d2f8552b7911ad6c378a02252cb789aff8287601b71f6571a0f6e1b7a8e78d04": { "94efb582e11f5b80d588c2052e90bfd70b816f556e6039e851019c86956b10da": { "jp": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.119Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.120Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.110Z" } } }, "eb48ea9cc55a5f79da9d6053e1ddc3e175fac421ecfbf7cdd1fba7409a5937c6": { "4bc78345ed8b814098932537f3fc29577489a1bf65318ccf523d0e7979227a78": { "jp": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.104Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.105Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.285Z" + "updatedAt": "2025-11-29T02:56:04.106Z" } } }, "ec7b68e24b7e06a320d9daf21b92c0a61d2d196ada1c8350b443b492c228b245": { "f255bcf4104dcca52f9807566387c0fcfe6d06f436994fee4179bc40d148cf94": { "jp": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.159Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.160Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.160Z" } } }, "eefff94e72ae2ff41e6e3bdfd308882739e2e719c94cb06245a0ddf4866a91d0": { "1a4e25f6cb4dbccbb5205a184e3f9417ca1d8398e86e5433534abb2f3af17825": { "jp": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.100Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.099Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.093Z" + "updatedAt": "2025-11-29T02:56:04.100Z" } } }, "fe9dca2c6fd3af40bc21440a38de1acbeedfae1588e58844d14185b01797ace9": { "ebf565ec610bd53ba3ec0980a72ee44fcc9e259c89089c7d524937e46cc0037f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.164Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.095Z" + "updatedAt": "2025-11-29T02:56:04.163Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.094Z" + "updatedAt": "2025-11-29T02:56:04.161Z" } } }, "0488cc4c783adb013176b8dd5553d28bd7e7ce03785fd0038e3b2b17e6bdf549": { "718aa60f3c8b05491fd8687c867ff950c98134aa648057ef2a403f78f1807100": { "jp": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.143Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.123Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.132Z" } } }, "1310e9bab89510f4aedd870fa23492b42460b27cc53beb62388b8527a75b4abe": { "5d36c63b3cd649e6c42f53a7e1722d9058261e3c5703e736f85a4081ed299d22": { "jp": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.139Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.142Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.154Z" } } }, "313f2f3a2287ee9166540ad792489898b8322355b28ee91e96ba66cf781aac35": { "813cd15c21bab5b5ae060ddf42a770163642046d3681ff5dd1dd8a48b6578a17": { "jp": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.136Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.195Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.198Z" } } }, "38d86ec85c1c8aaad845db190de05e50994d1a3c494195da910589c64b052751": { "3cff21a72fb101c7dc507cfac07bb03d9d16b6445213a5a7553e646f024ba71f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.092Z" + "updatedAt": "2025-11-29T02:56:04.155Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.133Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.125Z" } } }, "47aae18e89fdc913969ad0dd021c6affb6a825d67862170fab9bf412e150d04a": { "7845706578879f0d6235708b243856e2005db4e602dca78be25078cff83676ac": { "jp": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.199Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.197Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.138Z" } } }, "4a1e810e51a719b0c246d3a43e6419bd4b987b2e7623567a865586ec6ed3fddb": { "ed63b452ccdcc51644ab26c7e164fd9c06b4fb9dd0f29123b7c142d640dfd731": { "jp": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.142Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.135Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.137Z" } } }, "50a5598ee25c450c5fb03f18bc79c9f33c4b2d45dd82d93378770a029449765f": { "d681b2d70ad9048fc005dfbd39784bf38bc368cbb6e601d7be30a81c02aa66d1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.121Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.130Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.134Z" } } }, "58592583285bade083e9bb2abfe89113954c980d6a63fd9134c60920badad2d7": { "8b688b902eb485da1cd904c9a534e7c30138ddc8fe157648544914cd332f7701": { "jp": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.165Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.138Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.156Z" } } }, "5adf48b603a73cafc111898833bb810f6f9d985906f5a28a6b5510c4ad5ed9df": { "ded6c22af292aa253dbdb1b8bcdd3dfedbd38430db398f57c83b96b8b42647f8": { "jp": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.131Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.124Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.286Z" + "updatedAt": "2025-11-29T02:56:04.122Z" } } }, "7d16493aea7d06c09ef802117a0be5f6d628751d0a5c7a7b03ce8eb9dc409bf2": { "5c7a7e89cebe18dd07de910c107fbcee8795947ad29a2d17a6d6024a235a658a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.132Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.141Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.125Z" } } }, "948b9dc936c07fa8b4472138f98721317baa561958a48a6445780ecfc6a1c485": { "2f113bab1b3e6819aa420803e0868837c5a60eed370a5c0708d29084e14f6cdc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.128Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.127Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.137Z" } } }, "94df9a623cfec05c2c5b489fbed533e510d65ccbf937bed27f852c60f3a24b6b": { "4d71c012d9187781ca8fcfad6d17272ce0479d7a403fdf6f4e13744b2054c414": { "jp": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.195Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.196Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.192Z" } } }, "abde8721a04c3899ef6606633f77be77e9d032a8fa7f37d834ba01a23fe119b9": { "580c03f819a51524be5321c5af5b976bf750d39a4e3a64a3dd28f32805924089": { "jp": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.131Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.126Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.135Z" } } }, "ae86875e3a4deeec5b623e90f58d3191bc8e79167da17320095d45b7aefc2243": { "8e8b9e7eee69658acfb5be5d7837a6c6af0457a30ff7676b0d57099a5399ff0e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.140Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.096Z" + "updatedAt": "2025-11-29T02:56:04.130Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.126Z" } } }, "b5d0eacaaf66596432fd2e0164bb5f867e3cac16623e968148a4d757d106c3f9": { "dd01468833f830dab589b0b46480f9b998ba99103d12ff19ec3c342a9f0a9138": { "jp": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.157Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.141Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.157Z" } } }, "bc185d41a81a462e3988685f733423500e79d9186808359cf876254dfc1df6b9": { "873f51e584f0fef0ed5ce12f52eacab370768a902dd8b25575c46c3ea3925c19": { "jp": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.195Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.164Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.194Z" } } }, "bdf609022e3136bdae1def5400ec2932bb8f17ea8d7d49a273b0293defd3affb": { "f21711f3b2d080fbcd8a0d170f14659f54ad538d7c534cc91bee92cd96943824": { "jp": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.165Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.193Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.165Z" } } }, "c5084a09df628aa86f5f8693b10a55f9e8af3ba5b6e50ed69ff474a580871673": { "639b5a2d990e67de3c2c8aab1480380f68b5cffc8cb43a13b0da74c601a38749": { "ru": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.168Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.183Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.179Z" } } }, "c6970f5399e645bf58a1525ef6209242f22690e314c9ec2676aa0f609e60850f": { "857e9c3ca17f16a6e7331b2d62e9f15ea308a426462699ae488f7fd808b8bedf": { "jp": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.156Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.097Z" + "updatedAt": "2025-11-29T02:56:04.139Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.146Z" } } }, "f4e806b4f6f3414588a99250928aefb88bd97521c5fb9f755d133116d676e98f": { "b47d5c0bb52bcb18d0784610fd2a2faa24c97495fc26370a6b4024b1a998b212": { "jp": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.134Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.280Z" + "updatedAt": "2025-11-29T02:56:04.085Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.091Z" + "updatedAt": "2025-11-29T02:56:04.129Z" } } }, "fe52a1835874eff99646b2ecbf9812aaa4ad459489ce76c856750b021e1969fb": { "44b9e40b3ed21a0eb1effa1387bbd83dc88cf7259bae3bbf2af2a134b07516e5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.198Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.287Z" + "updatedAt": "2025-11-29T02:56:04.193Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.288Z" + "updatedAt": "2025-11-29T02:56:04.194Z" } } }, "077683f76fe06aef19e3361bceab4bc549399e0723b4d9d14415d78c7b29cdfb": { "fe9570de03d2029f3efd3701f8a9844fa8bb91810ea7c58923ee8d0766854adc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.211Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.212Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.213Z" } } }, "1d4d6e77bcbd23d001d1913843fc6c9748753173b9770ce333d87441932130ec": { "30da2cbfe92790be7c2f95f485c2ea63c4ff423ade0453d52e65f78a6fe652c0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.210Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.214Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.205Z" } } }, "37b9937d3f28ea06521af2789937cb6974b4bb1da71a4e0e38cd433452943f4b": { "ff41c613f12a073c7cfef1f537c5bef8fc0820fa48eaa7f6ad0cb887283d047d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.207Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.201Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.207Z" } } }, "4503f45c726f639e1a6502e2fa738700aac770245105ecbbc3d6006506fa8e7e": { "b3e6deff1b1839f01fe2fdfb7c34b1a485c8bd5be58b682ad09b971716acc42c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.208Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.200Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.209Z" } } }, "45c696d22175381569602ddc4401df16a7d32249c5f9994c4b98bf2548350315": { "65644f5b55fd61d8fdbe8a764e605ff7e00f6ec53fcdfa43f484a5638a58d2aa": { "jp": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.214Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.216Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.219Z" } } }, "4d6593bbb881e0a74e7a089539eeba4aca7019f581c7caeadeee04c001000773": { "d16ded5082885b0eeb5b28bcee5bf878c87a2cc092934fcfc328a1e535effa1f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.187Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.178Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.172Z" } } }, "5c12094be2a10a85a875ce129adf37c46bdae04160dbb85b3eb63b9c69e7f6ac": { "bf9cdc73e3b5ca0e62d14af59e1854dd6d45176f362f34533c815c278385d1ec": { "jp": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.204Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.200Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.213Z" } } }, "62508936e6b3e7a6b965ed3df755188b154e45270320ca734cb0df2e29a942a9": { "9a4adbb5e86533b1fab803147ed4539c344e121c9526ce249b8e3c49744c7702": { "jp": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.210Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.202Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.206Z" } } }, "7a1451fe8363988c04d1df2125cc6a560940a7c034905f5e75da236ab427774e": { "7f9fa8dfaab48853ecedafd465b380359704ea83aed218c677074831e1cc0932": { "jp": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.203Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.177Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.179Z" } } }, "83523c78b37179282ea3d0f8a98cd8c0e917e50caaf74f38e237b1b1f1fd7dc1": { "7f172e3eb258a3b4cd3c132303859997ffb354f24a60481f04ae0f80fefe2147": { "jp": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.178Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.185Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.191Z" } } }, "89a6cf75614ffde882ea0e38b857ec20bc3415e924373b586ee53a84d81b8dac": { "212ef1dfe191daf73ed51386731e37ce6d4ca49f4472b7e471586979e69a9a9d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.208Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.212Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.203Z" } } }, "8e4e3758c244f276a3f91f720f08400f7d3280b2729ed2535fe4b0a244bc1eb7": { "a3356389fc2d7537a8464f2e1646f8f51af66a2d715df1807a2fd4184083a70f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.170Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.171Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.190Z" } } }, "92c4e15d1b1edd5a34f950168fa129302400e9f6ef4fa378e3c7af3ed6ec8227": { "3c3fcd6c5352af3e3f90c0a4d954793388177b9bbb34b975eff1c8f384d445ac": { "jp": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.184Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.170Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.191Z" } } }, "a14794c89d955458a9f5af44d7aaca8d68a05b6880e98e008a7c081604143ab7": { "671b0a57421a638325cbf9c110626a9d5b734267bb8f974814c03393141cf7b8": { "jp": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.167Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.202Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.204Z" } } }, "ae39080b133df67d8884d7a8d76cf775ef202d9bf2efb43947344e07462aec23": { "4c42c112034c378e6000b6c987744ecc184d4c90582c11dc33f577b3f2ee44cd": { "jp": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.184Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.176Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.186Z" } } }, "b3e8c57a2ac90416a86e93c4fc87cc9fc69b9ee772adbd854463142bcf0ad103": { "78a6c5fa33437b43f2619fdc05ba1a3ff266f89bafbeb1b78bc71a0ed76a0496": { "jp": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.218Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.217Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.211Z" } } }, "bfa5f357797593cffea8aa625d31e79d5f58effffe1213f1bbb7b709e0c951e9": { "9dbe571f5b98f8fb6c1fe7c120e80cf8fe72a659f77f22e8b74282600d4e9325": { "jp": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.176Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.172Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.175Z" } } }, "c593a21ae24f2adf1116e2099fe2cac24733672a1fdacfbb7d9be523e674a070": { "3888654c7ba7da0474c2c33ac3100faa58509581ecb5ff97147be80f6c3ddc7f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.098Z" + "updatedAt": "2025-11-29T02:56:04.168Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.187Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.183Z" } } }, "d2d56d1eccd2d86a90004069292a4cfc31251986d8bb238fa00ba3a4aab4a56d": { "dc92ad8afa44196810e06c60223ea9ca5b982c40325ac54b37fd95a9f450fdda": { "jp": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.182Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.290Z" + "updatedAt": "2025-11-29T02:56:04.171Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.175Z" } } }, "d36f1827c010ce2e2dcab5998b4c489e963acbe4c2d8322885eae6daf7d3e446": { "2d4e379a75efd761f80eb533b3cf33859ee34ab855d930fab99c5091b13fa5a3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.215Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.199Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.291Z" + "updatedAt": "2025-11-29T02:56:04.205Z" } } }, "f27af8909a343bda58696e815f4b50b00101d0dcd66b99619aa579b381a444cf": { "929021d21964c8a27df287754f3bf673b1e9e43e5b78df9447405b8197530ab2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.190Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.185Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.293Z" + "updatedAt": "2025-11-29T02:56:04.186Z" } } }, "1d24065c2e7fca3ac3f26d0a2b7ccd04f7ff1ae4faa321c7335a8e84eb0ac0de": { "e323f890710302432f3ba708412993f1d391acfb58bf585c82e91d8c3c5b823a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.226Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.224Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.223Z" } } }, "34f6accb938658c99a83aa179d1dfe75fe3f844b0e815b1a8d42a512eb830f06": { "c43e5de4e7fa4afd53423adaa427167edd9077fd3af0bcd8e16a72269e83116f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.227Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.225Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.227Z" } } }, "45e2237668cc8f027e43e52ef4443b8a53d2c07dde3b858205c9c43057f4cb8b": { "66380f0ef83c18a16b8296671ad4697deea2b60436ad4259cd3c3df09895bbfc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.167Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.222Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.221Z" } } }, "4e39f1cc2912db452edc06d93f7f0bfcc091c2888f064a3281bd99e46645f722": { "48a7640cd750631e03fa4c3747cd09af737c4ed39ad0a40e22ebcfdbc24b9872": { "jp": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.218Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.292Z" + "updatedAt": "2025-11-29T02:56:04.209Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.294Z" + "updatedAt": "2025-11-29T02:56:04.216Z" } } }, "990553ca9f9ae4591aaae11318ecec98a52d743479ad68505f33d7437ebdcfe5": { "6706062fa424eac816c221cf4a0ecb23afeca8ecbe3f4830da0cee49f3af5b55": { "jp": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.219Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.222Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.289Z" + "updatedAt": "2025-11-29T02:56:04.166Z" } } }, "9b3d838535466c0adcbcf2c1821542686b5932d55c219ecd4c54a8d3d723b617": { "b968225991ebd30f1600f3ad485919d0badeecf3a3e60c5cb52b71a85c5611c6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.225Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.221Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.220Z" } } }, "f8fa9a1c93f8857620e1d2d6052e2a540a9827ab07e015947b84e6fc066cf05a": { "27bc228b35212b29d55733663b0d676059fdafc2d49a527814889b3aa40f6e10": { "jp": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.223Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.295Z" + "updatedAt": "2025-11-29T02:56:04.220Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.296Z" + "updatedAt": "2025-11-29T02:56:04.226Z" } } }, "11aa99a1bdc8390230a974032f545ad7fc914b9d7d7512e6f3d523c3c3315925": { "25ab99f304def64235d114ed61495f4a871f63a473b431f04505d22d84acd92b": { "ru": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.182Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.173Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.188Z" } } }, "15a59bf1722e4b12c28df70766e0baab4b9d5a6f0a0473fcdaa0c562dee3986b": { "38c435040eaac3147a4b165e8f2e2eea100525b71769ee62c7de7604c2c7decd": { "ru": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.180Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.169Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.173Z" } } }, "a840f2497ddf7c24e3414728a66fe927662c74a0473293e11a93429df3ef7e1d": { "14417b042f80b8359063dc1571b796f4f9775e28a90c36436b10c493b04268af": { "ru": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.188Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.189Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.100Z" + "updatedAt": "2025-11-29T02:56:04.181Z" } } }, "e843b874a573838613448a25478fe1be3cfe8e1a5c23c7d816af626567769147": { "8cb205aa323de3c2fa63f58b08365d61b559f9ba1b8554ec982b293d9a83f80b": { "ru": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.174Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.180Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.099Z" + "updatedAt": "2025-11-29T02:56:04.180Z" } } }, "3177435d774099d4ba686628bc971ccc42a54d0a0a211c8a4424bbc544e08540": { "f15d74887e89dbc77f9957e1568c4842460915108734894efa6e2f081275d68b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:44:55.077Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:44:55.074Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:44:55.077Z" } } }, "3caedd95aefa51553be1069772560367e021728814e3e4cb4e732e19460e0502": { "c808220f60eb5bb176af1e26539836830b9934b93a9bc1e1e62fd9b90ce36bc8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.081Z" + "updatedAt": "2025-11-29T02:44:55.469Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.081Z" + "updatedAt": "2025-11-29T02:44:55.469Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.081Z" + "updatedAt": "2025-11-29T02:44:55.468Z" } } }, "853246cca55f655f764269048050edb509e178c1ed6b34530b7a3aae600ec2b8": { "0a1abce96f2027f1611f7096e0422a02de923c3698460cb2c242ae3092e25c81": { "zh": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:44:55.436Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:44:55.460Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:44:55.461Z" } } }, "a030bf426b6662b4674be21ff621cb7fabbfd26f971ddb89ac770557065aa0cc": { "f732d015e8ca7a50761bad6c4404360438b7df18567a96df59faad98662b6017": { "jp": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:44:55.461Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:44:55.436Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.714Z" + "updatedAt": "2025-11-29T02:44:55.435Z" } } }, "06c88066bda47d4a934bcdcd6f121c4c1e22b06d73242fdfb1ab310a2564cf7a": { "f10ca14dce06ec46cdd4e21bcf3783e50fb8f8e2c7873cc6b828db0e89c91024": { "jp": { - "updatedAt": "2025-11-26T07:24:12.079Z" + "updatedAt": "2025-11-29T02:44:55.464Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.081Z" + "updatedAt": "2025-11-29T02:44:55.466Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.080Z" + "updatedAt": "2025-11-29T02:44:55.466Z" } } }, @@ -10337,83 +10436,94 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.080Z" } + }, + "fd960e0ad4a4e719414c642095987287a615859dcdfe78dc5e4ade0ad15a3dc3": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.441Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.441Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.442Z" + } } }, "48bd4337b75cd02afdef9e5066ef37aa097bb2376a0997cda1862ec2672e0bb6": { "c01428e3868677f56a7361089108618d1aa1b3f64f9d078f8a9dd079aeceadf1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.500Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.499Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.501Z" } } }, "4a871b3501c8910734e45bfd046fb170eead507a557e7fc029a9720169d74f60": { "a1bfd48d5bf528dd7d49ff5929721a27fac3e265e20a187bfe5603465299248f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:44:55.462Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.079Z" + "updatedAt": "2025-11-29T02:44:55.463Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:44:55.460Z" } } }, "50f0ba5685aaf3e9d2d05dffeeaa45f47b7ed622dc20465bd6aa71e7192a1a6f": { "430792450e0e247081db5645bfe27bcdf7c5efb4c46fb798c742aecf01bea55d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.486Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.494Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.490Z" } } }, "5929e4805377229948887e5ba720274840b70d5c8448deadfee3a33803c24777": { "4923fea66c23915a7ee88662e5a25bc88b6e63399b5f8007edd0a604f6ff29e9": { "jp": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:44:55.456Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:44:55.455Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:44:55.458Z" } } }, "7f4f10424fd5d15211a9b2e7f5376cd61876478ca1e288c42f77a9d27815ed3b": { "49a85cf8c399228a66495a6ff70df4eb90e968fc2a6386b6d0c3a47d1c6934c0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.502Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.501Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.081Z" + "updatedAt": "2025-11-29T02:44:55.468Z" } } }, "8fac3eeff35b863ef1c1a857ec5cc7ec6c5e04a3ba1b53c0613d799e0ab40033": { "cff3cef9c9971227c006470a36ab779082e9292add9a0d6480da3c2873a882cb": { "jp": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:44:55.458Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:44:55.457Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.079Z" + "updatedAt": "2025-11-29T02:44:55.464Z" } } }, @@ -10428,31 +10538,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.079Z" } + }, + "ffc6e2c25867e91947ebe1d8e03113d4066168fa2d6eeb0262027942d80e056b": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.442Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.444Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.444Z" + } } }, "d15bbab335414d4d8b8963bf84d8e6840415a3fc839c797f41e13afb347c0e66": { "7eff53190c5a3759339978f7f7f8df28a9281bca9df3218c5f48b98aefdb5e9b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:44:55.459Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:44:55.457Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:44:55.458Z" } } }, "e524f82a69f9ba0c9ca77d93ce6f9a713d13f108480d3945dba1962f5772ee46": { "fbd98a73453eb2fe0d0b40e9e69f2c6435180be06375fe9f19e1bb909573407f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.717Z" + "updatedAt": "2025-11-29T02:44:55.459Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:44:55.455Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.716Z" + "updatedAt": "2025-11-29T02:44:55.456Z" } } }, @@ -10467,135 +10588,146 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.078Z" } - } - }, - "e9001fe7adae3ee521c4e8d3e207693d2c40ab3153b629428457ad95a126e11f": { - "c925c5d3c0431c9ee3487e60721536bea2826b1bda255f0e4e9add7b81f2f4d6": { + }, + "0d09d70848bc3db09e2e67fdd516909f6d48129455d42ae148932d9d2a956682": { "jp": { - "updatedAt": "2025-11-26T07:24:12.081Z" + "updatedAt": "2025-11-29T02:44:55.443Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.080Z" + "updatedAt": "2025-11-29T02:44:55.443Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.080Z" + "updatedAt": "2025-11-29T02:44:55.445Z" + } + } + }, + "e9001fe7adae3ee521c4e8d3e207693d2c40ab3153b629428457ad95a126e11f": { + "c925c5d3c0431c9ee3487e60721536bea2826b1bda255f0e4e9add7b81f2f4d6": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.467Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.465Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.465Z" } } }, "fda80bc8aec70f334713b34cf3411a9095abb45fdde35b4e250c9120d32dc223": { "9447f95299ab26e2dc058db4d4939aabd60236798a21696a52feac53fd714475": { "jp": { - "updatedAt": "2025-11-26T07:24:12.080Z" + "updatedAt": "2025-11-29T02:44:55.465Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.079Z" + "updatedAt": "2025-11-29T02:44:55.463Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.079Z" + "updatedAt": "2025-11-29T02:44:55.462Z" } } }, "14ced74ae89aced82700fb3f104dd8a0694c5c0ea94167d31d43f1c1be2fb09b": { "cb8ca75fddc3df71a3d63cbd9d7f7fe682786749238844ed9083730bc07d7cec": { "jp": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.533Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.538Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.530Z" } } }, "1e26f8437fd2a7483c1f29a2f11a909ff981448ebd08fd7cdce54aaa31e8a511": { "1c028977ab28be717baea644e55afe62584b4eec751926769c92c424bedadeac": { "jp": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.497Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.498Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.496Z" } } }, "1f59d80250965bf621c38a8cbddf5b2e006f67743e1775da704d9729e6c40a23": { "e842588d4a31eebd61f2d17142402ac96b93d20ff0258eb94f82f5209a3ad2a1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.084Z" + "updatedAt": "2025-11-29T02:44:55.483Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.493Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.495Z" } } }, "2024dccfa8cbc20dfede60ca15d6ac2b721789dba97415066cafa133d075bc71": { "ed44ffe66e8c1a1ecf0ca6bc07d18f43272ec161a9e95d0e798e64dfe432b703": { "jp": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.489Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.487Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.491Z" } } }, "44c5128a3edb936a9926b4b513a202ff12d0f2f99f0c07bcfd8be1cc4723be33": { "ae80526735bffb74b999220357c744c052668c14fe1ac555f4b49132850620f3": { "jp": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.520Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.089Z" + "updatedAt": "2025-11-29T02:44:55.471Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.518Z" } } }, "46ae531d604a943d4340ae2e6288c87ed68270217d4e05122a7521d428519ef3": { "fe9a9e2137d1cae06dba9ff8e83ecaa3649ff47e77c5892e5e7eb1529b298c64": { "jp": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.519Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.524Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.519Z" } } }, "54e53c16ab3f42ddf8578d9835bb9d7b843c7a55b19f498defcfab1724ec045c": { "35a38f29e12929f2b225b703480bed8e37445662a61cc1d374ec38bd2400c7f2": { "jp": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.529Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.522Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.525Z" } } }, "687b783276b703fe2b34bfa19c6e6eaaf919ae2edb3b092772cfd3710319c962": { "355157027a1047c82f7755ab15b218d98a8e5232865d69edf8a51337a364b541": { "jp": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.484Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.489Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.494Z" } } }, @@ -10610,148 +10742,159 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.082Z" } + }, + "744f86f0af840c394271f9f85293e3266bb9cf9887e2f173377f48cf9eb8cc0c": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.438Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.439Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.440Z" + } } }, "afabce4e754c0f29b7593d81718787eebb8e7a9f5199eff6f15750cdc8d874f1": { "b814da04f0b9e71448b22e3ba39231b2c53371ce962656e59fcc8215b53d94b5": { "jp": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.520Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.494Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.486Z" } } }, "b27a2ee952ba7dd3cf6b2ca009a0cd8b86282ef4f43897856e759dafd88540fe": { "32217bcd37f2a7cf5746ec775356d9800b981082b7b912e76343ed0600518f76": { "jp": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.493Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.485Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.485Z" } } }, "d1dee74d727375041e64ceadd78df956b10784ab7e1b4ac16460115a7e9d4ef8": { "469305bed4de1b5eb391960ebef6f0f5096cd86b537e42c0f37ee9f35e087a4c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.490Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.487Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.488Z" } } }, "d536aa9054b9ba72e39103f4f8845be09447ae23a9e70d3baf478d3d2c2b8737": { "74f18e7520467c6186fd7fa39a49176648617574146477b17ce7062d7698f2df": { "jp": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.498Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.088Z" + "updatedAt": "2025-11-29T02:44:55.500Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.087Z" + "updatedAt": "2025-11-29T02:44:55.495Z" } } }, "e56710647bd4bc05384aa8d37b2b94c4c5fe719ebbc36c598369a813b3fab06f": { "7fdb5ba5a1e64258c7ea2522a25a1d7238e73b82d6eb92fdda33bd598193863c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.492Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.492Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.491Z" } } }, "e631f7491be262a58a274692876ad3b89d0729e8d0294ce9b3dfa4ed45f95788": { "f3609e7b117bdfa85ee3d950a8fd8f7afee96311aea43d1a833a253a135d50ab": { "jp": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.521Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.518Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.517Z" } } }, "ec626ca92c333df76f0e8018ae7bd3a25ac79ecb449e8db31702fb29bb04506d": { "ec424602c359c5773d3bb1eb5b167bdedb80fb98f907e5848b487a5b40325f67": { "jp": { - "updatedAt": "2025-11-26T07:24:12.085Z" + "updatedAt": "2025-11-29T02:44:55.486Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.488Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.086Z" + "updatedAt": "2025-11-29T02:44:55.489Z" } } }, "fc2a90cf202e8e1844cfa26c61201f10a6c234df6585fc1c8aff86d125238563": { "5680229b7edd18b624f3a4822177aadd2e3930de72a0edd50a0d2924b785a146": { "jp": { - "updatedAt": "2025-11-26T07:24:02.723Z" + "updatedAt": "2025-11-29T02:44:55.537Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.723Z" + "updatedAt": "2025-11-29T02:44:55.535Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.723Z" + "updatedAt": "2025-11-29T02:44:55.538Z" } } }, "1646d3380fb5c92ec41482a9d98b525c37462130d6b01f32e1855b0e5f91c39e": { "ee6d9f1af26926d6377c040c2405ae576469664c532845e1d506079f9a027314": { "jp": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.560Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.558Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.562Z" } } }, "1ca8dfc5de116b6a2aecfd00677ce016075dee9e46cc6f57c85776d3ea9b3bd5": { "e84e0b80c498c3151e15f60e104f2cb38c6e40319081435e228dbfd13acf010e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.529Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.524Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.531Z" } } }, "1d1e36aa27a61854f94b1f60418f1a1d666d53319de3e83255d9388fcdfb4069": { "a0e30e85a93f908ea864b663f52f1dfce2a0d6a87372b01c7bf971316d114876": { "jp": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.568Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.565Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.556Z" } } }, @@ -10769,195 +10912,195 @@ }, "dbf76c8c4d494516e235aa48fe905a94dc6f8466afb98397c14a38f6ae43f681": { "ru": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.503Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.503Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.504Z" } } }, "4d9f585a978f327ccfb66e8db78fa87ec8754d231c098b1a8929e4f912be5651": { "f0713cc147455f15a45af300160f8c01445b53f171e027819d998a3df1dc3b17": { "jp": { - "updatedAt": "2025-11-26T07:24:02.723Z" + "updatedAt": "2025-11-29T02:44:55.534Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.530Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.531Z" } } }, "509c73a63f9d009e86d97956ae4e1701003ed2be70dd32b5c56c66bd65c22609": { "c01d58d811ef80a75a56846d05c7b54259075a78eb6a2deb665f4405f861a7e2": { "jp": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.558Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.564Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.559Z" } } }, "5bd267d7d3d49be2e95b491604023a269bf78bee49b4a83eefa9352690913107": { "9e71d3c2fa185cdf2d0231b06c410ed213fa00b972cdbfefe21a9aa8916bf03a": { "jp": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.562Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.561Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.566Z" } } }, "66dafb9b646deaa517a7b992eec446570c152c02802db14e18047fc0fba7a0b1": { "f246fb415a6d823d2e1229aaf83e9eb73611213283605b91a0a23a1dbad24f50": { "jp": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.561Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.560Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.555Z" } } }, "7d4c81a663e077a5e75150c0e14d27c4ec51b540adb7aed379113d299f3c76bf": { "9a1b6a07af2168ede1ef0940be49f9f7462ec53241267251f36458e33a1bd688": { "zh": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.552Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.553Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:44:55.549Z" } } }, "8b2242e50cc879742f4d4efca957625a1106cb09f45a18de469646abc82467e7": { "343ceb09449e64360e7e7fca397cfc927ac8e348304b9893b3946e0ca65d8fae": { "jp": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.528Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.527Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.532Z" } } }, "c02bec6d7a15ddb4727d64f0c82f001b4a6994e6095794f3b35c713c1c69cd75": { "f05e5879650490f810241a7e1f46402021938daaf4688d3368c183eeb6dd5b65": { "jp": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.554Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.551Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.556Z" } } }, "c35a4c218452080886d36470ffc05c5a0554e095f00432e0d7735900c7ad9435": { "9e5d4bd1e5379d30156d61671b947abb64b0c0e6ce551d838d6da2c7907d2ff3": { "jp": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.557Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:44:55.548Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.555Z" } } }, "c97fb19d4fbdf784a9e8916b6965cc8a3ea8fe90f09cfb7c399b3b59efc788a6": { "7b99574846f0eeee45a44964ff5ba57e7c06ca117dc6786a3b1b13201c58cc4b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.523Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.723Z" + "updatedAt": "2025-11-29T02:44:55.535Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.722Z" + "updatedAt": "2025-11-29T02:44:55.528Z" } } }, "cfcb90141d0b37458f1c2f25a8e506c7c2ceb4cb4e4c27f996e474f6e8c5b159": { "2e2c5497230ef2998811f833ae91e6403540c85762a127d81135370dfbdb4e46": { "jp": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.564Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.559Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.563Z" } } }, "d5c4d2aff5bcd49a39c5a8969a66d9058ea8a6641de98e1f49a707b2a5eb6a06": { "c0bd7005e30dbceab4454c02004199f159d34c9dec509a5c13f2a23d8b720cff": { "jp": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.523Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.522Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.720Z" + "updatedAt": "2025-11-29T02:44:55.521Z" } } }, "eac3b18e7887fa005afb72b037867082f68f247bb61d91f3260e28d28cb1e85a": { "d2aa320a8841951470c1da7b5a35b1b69bf507d11d9b795481a4e587ec4b7bdd": { "jp": { - "updatedAt": "2025-11-26T07:24:02.723Z" + "updatedAt": "2025-11-29T02:44:55.533Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.526Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.721Z" + "updatedAt": "2025-11-29T02:44:55.526Z" } } }, "211a9e255fdac9865968252978823dbe623bf314b09a28779424fb52243ba37e": { "267373ee71eb85826ed3e41dfc0938bb71fbd6c83484df63fbdce933b1a28d1e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.570Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.569Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:44:55.572Z" } } }, "4ba1eac8610621c18306898ccbcb9d4eaf5521b4b230d99cc774ec22219c9a28": { "1aafbee1019940fc3e073990ae3817e08af6f7e2ec670ece7d26a194827351bb": { "jp": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.553Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.552Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.552Z" } } }, @@ -10975,676 +11118,676 @@ }, "6b408329e73e771ef16b20b1ea0ca91a113a919ef9db09031d4181b038bc38ec": { "ru": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.505Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.505Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.506Z" } } }, "67ea1760ac764890c103f9795d76f618a583b0bbbe0d32ad38a77c020d119d40": { "9a32d6666fc830213628b9c378f0039bc1280491f729f8bb75dd81bd764f13e5": { "jp": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:44:55.573Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:44:55.571Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.730Z" + "updatedAt": "2025-11-29T02:44:55.571Z" } } }, "71b7871a9e60b8462bb9bc1ee2ff376b1641403aad826100b88e087426e5841f": { "3ad40142a5980106f0b667308b9b61cd075b9a565aa267c085988df32d9f9d20": { "jp": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.566Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.567Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.728Z" + "updatedAt": "2025-11-29T02:44:55.563Z" } } }, "a9dd86f5f7da605aa9337f714a106fa513a631fcf9a168aa7b4e9a3b7ccaa531": { "ea6fc6dcc9635bc1877901795f75089be17712230ae183401a7e6eeaa9cfcf78": { "jp": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.568Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.567Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.729Z" + "updatedAt": "2025-11-29T02:44:55.565Z" } } }, "b4b5cab881a02e5c4333f93e3149c6242284e0666d745952f3ccdc86593f7b52": { "112d13bcf3046cf70aa9ad7b11bd473fb40eb530504362a77d2a53dd8f9adac1": { "jp": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.549Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.551Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.554Z" } } }, "e21164b6c8802133bb1a3d2aafc3fd517ab74e6f8d293b7d293ae968782a8bd6": { "04d3d33fa3cda8a0df74a6fb806ee0f2d01d7cd25cf9f21c9e07d1830f9a9a6c": { "jp": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:44:55.540Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.724Z" + "updatedAt": "2025-11-29T02:44:55.539Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.725Z" + "updatedAt": "2025-11-29T02:44:55.540Z" } } }, "f9aa45e8fc85d0cb2d4c76b0e287f8743a40e6d92257f98ad0691dbde7bc3a9e": { "4866f2bf5a753196ff65a8b94a288fa39116ec9e4deeb7ae77c0598af8d582d9": { "jp": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.557Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.727Z" + "updatedAt": "2025-11-29T02:44:55.557Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.726Z" + "updatedAt": "2025-11-29T02:44:55.550Z" } } }, "3e29eb5aca75381e4ec8ade4e6a0cf7d26b53d4a25cb26660ec2c44647941a73": { "c0bfc76e21aac5582f52b976b44aa4baf44b8f76caa3d562ec73e6e4ef161a92": { "jp": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:44:55.673Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:44:55.649Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:44:55.653Z" } } }, "4b875d4cf08501af46c9a0dc4af0b755918205b50ba44a03d48aab3f7f49ac54": { "658a06aa55917c46e77861ee9b9b9643be0049c255c7052d4f6ae6166e655b01": { "jp": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.678Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:44:55.704Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.680Z" } } }, "50ddd976e3ab8042db7b5db277b40561a4de66f66d7343d572a7ddd20ad31bd7": { "0aacc185d8105f7e3ea27585dc11ab225da3bb6c1db23c8daa11af166d8e972a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.677Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.677Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:44:55.674Z" } } }, "54e7a0d28f060089af44ed7367d75f254a6d1b252f6ea6274e58dbe249470b30": { "4ced947fe881a2f40e14c2be1395d6c2cc3e15fe93e42e71df52ec929c2dcea4": { "ru": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.678Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.682Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:44:55.703Z" } } }, "7a97c0a8a1d7a2b7124253b37f3cdff0f274d654965381e7ee3aeb4db3323631": { "ed2621c01542cd6c73825e5fe7639beff16cce375577d0d908b8b02c4bc1371b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:44:55.649Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:44:55.642Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:44:55.641Z" } } }, "893f6ba96a900463e4a20bfebef45d262bc3a3e1452bbe2f889f333b52e5fee5": { "b3a0a7a9c4f2e4c526bb71ba0bc5e6dac553aa232350b1910ad7fbf035734c06": { "jp": { - "updatedAt": "2025-11-26T07:24:02.745Z" + "updatedAt": "2025-11-29T02:44:55.646Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.744Z" + "updatedAt": "2025-11-29T02:44:55.609Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:44:55.652Z" } } }, "95a73804027437518f6cb49fd17638db0b1d6b9361ef329c1d59b49231f45112": { "e13f5fe9c753ab5e1cd5c3b9ef8db4c7e56caa299572d07d0368d8af887e99a3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.681Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:44:55.702Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.680Z" } } }, "b624c3e0df3b6286b5d61538607b9030a6cd27129246f0485ab94c5f1b0efd7c": { "b4c584ccbf84daf8b7fe6aae9e1c393e8220224a9cecec6d5d2024e0cb7aa654": { "jp": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:44:55.684Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:44:55.684Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.092Z" + "updatedAt": "2025-11-29T02:44:55.675Z" } } }, "e210bad99f1e8a957566f3f34d0853651d4ef532d83ae50fc1fb032d24e2dd28": { "0b6791886d00299fd2b8b71cf58d276a85916e6880c408cdbef78333d00f1d3a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:44:55.649Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.093Z" + "updatedAt": "2025-11-29T02:44:55.683Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.096Z" + "updatedAt": "2025-11-29T02:44:55.702Z" } } }, "e77458d405603be885e941ab39a2c03ea7c893b38a1ed1b1c4a5beb9a703c04f": { "f78ef201b8464bb62128fd17fb1bcf8d3f42f167e5b4f4c8547866c5ecfbc7a9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:44:55.650Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:44:55.674Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.091Z" + "updatedAt": "2025-11-29T02:44:55.643Z" } } }, "f38d701b9050913191927978c4e261dec48019c2bef4c6a3139c4059c71afaf8": { "0e1ad7c4e88f314e2b810b6f27ec43ba78bfe09eca3eec7d023374756f07bc64": { "jp": { - "updatedAt": "2025-11-26T07:24:02.746Z" + "updatedAt": "2025-11-29T02:44:55.653Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.745Z" + "updatedAt": "2025-11-29T02:44:55.646Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.090Z" + "updatedAt": "2025-11-29T02:44:55.673Z" } } }, "06b6f9b31956eb6e3cebe7421e22abac9ad0de32434585b3bedb572ca22fe779": { "ac6f44e72647bc384df3ba5b105e8bc37e9ce25a9c1c104570232ed738108026": { "jp": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.920Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.926Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.878Z" } } }, "088f126360fc7b556a09516cc41a4880d4599464d2cb1ff9f6ea02417c6df429": { "04f510d66c9b376ce9989e4858fb9d1204bb45b666002f527435e252cc2dc4f8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.108Z" + "updatedAt": "2025-11-29T02:44:55.978Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.108Z" + "updatedAt": "2025-11-29T02:44:55.978Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.910Z" } } }, "13195f1c973faf9aadf39f45b6a4df596efad0f6e4df019051e13dc77eb9fdfa": { "948846a8743f4a90ac77c6ba53e93f5386df8d5310a4b8182265798313dc6dc9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.879Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.932Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.936Z" } } }, "2505693dc142fd4f445b3882dc548fa0cc38adca662a63dbfdb437b0f67776ba": { "f86b0dd8e53eca99c2eba408e02d7d92a906e77aee88846c9e24a2d79f1d998e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.882Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.918Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.931Z" } } }, "266e0dc9c395c310374563d981fa2685a69b11a4eb800352e56423b5bd7e2901": { "d344c46f769e848e76522e3e0e64f31e4c4cd999a3de3ea3cc10400f0b2826ae": { "jp": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.937Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.938Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.940Z" } } }, "3c3cdb595236de7ad8f9d05838ec2b8bf3f90caa6bca9eb1dbb703fe9b2c5f67": { "22c4567427f06c4ff596058d0963e1977f619d426a1cb0b04f22ad1721307091": { "jp": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.914Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.930Z" + "updatedAt": "2025-11-29T02:44:55.886Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.887Z" } } }, "3cb2ac954c25f39475156759f2f4f8c8714328c659aaba596322bf83f3e3ecf3": { "da8c2bbfc6c34aa9551b3e0a532d71ec831fc09659ffc38734155072f907743e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.922Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.928Z" + "updatedAt": "2025-11-29T02:44:55.876Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.917Z" } } }, "3f5009534c38cb29edcc48a3b2c5b50aa0363797569ad9ed3c962e075be3d711": { "e52f05211d11daf47cbab45322de5fb579805427116030493d255d74a6de33e6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.890Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.891Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:44:55.846Z" } } }, "51d439a5ad94546b36a253aeeb85868911bfe6475f4fefb30756a75f43e01dc0": { "c9a05803f13e75801b4f09b8c52974299028da9cd5533d505c572edbdd11b9f8": { "jp": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.888Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.887Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.888Z" } } }, "5227584ef900ca7684b844bf9b013a21d6faf12f8833191ac40e941a5fa9878f": { "5405382560ae38c848c605acfb1a4ec134912ef6bcad95aab5381530689e735b": { "jp": { - "updatedAt": "2025-11-26T07:24:18.932Z" + "updatedAt": "2025-11-29T02:44:55.892Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.932Z" + "updatedAt": "2025-11-29T02:44:55.893Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.889Z" } } }, "a5397922ad119e6b298a6b4b378a68f864ea43c8323107a35954165809de0589": { "488ca0a5b4cba0af7cf4ca440e3733d6860db7e0e1beb8403ae74e4cfd8e7753": { "jp": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:44:55.877Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.920Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.918Z" } } }, "c6e56f828d1b34579ba790f93abaa05b29fb89f9585497258413971007a3a246": { "c2f203731c8694cfaf84b37109a789c0a0167657339f75db8fc7b685f948d2ea": { "jp": { - "updatedAt": "2025-11-26T07:24:18.932Z" + "updatedAt": "2025-11-29T02:44:55.892Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.929Z" + "updatedAt": "2025-11-29T02:44:55.847Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.889Z" } } }, "c8b0b34a39a4f363d421259bdd17b9dd8d0d01f815eda9607f0d9ef245895275": { "1126bfe846bb5fcdc4b0c7c2bfd10807cc64d6e12d190d2c824329258baf5efb": { "jp": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.886Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.890Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.931Z" + "updatedAt": "2025-11-29T02:44:55.891Z" } } }, "ce10e9c3dd234b8bf0fa7265cc3f51606b9f80563a4be89f36f9805412c6a452": { "f80ac33db9f2499ec8763473f9aaab8f92e4f89d4fbb898fbee33da6e7d210d4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.921Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.937Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.934Z" } } }, "e8941cfe3ebe51cf895d37bfced51319951864655bb65ed34110cfbbd542b577": { "1724335ae6c5171c92d1126311524dbb7f3ba7d451a7907320b5c0cbe7ebb3aa": { "jp": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.938Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.919Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.932Z" } } }, "ee1d174b1119575726aa2ce11719dc7482af9a58eb1e4c20075010bcc5bc200a": { "85b1114daba44b005630b9c50a7b4b79dec7d53f4ef54586f1ecd92f3f5c5d72": { "jp": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.916Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.878Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.930Z" } } }, "0cb711998b74fbafee6f9dbe1cf42999cd6bf81fb67aba52da75f9d6e7820916": { "1b31920ed434089b5c438486640b5af358c740bf6e33cef31bc59a7a8cf7708b": { "jp": { - "updatedAt": "2025-11-26T07:24:18.946Z" + "updatedAt": "2025-11-29T02:44:56.008Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.945Z" + "updatedAt": "2025-11-29T02:44:56.007Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.974Z" } } }, "0de197a09c02a6e7de6b2120720f01b2f26dd69cc09e57640234c52fe619cbe1": { "a3b2b2da1705264e477035d4c4f93d27e7c159e13c8fefc67fdbac404fa1df2f": { "jp": { - "updatedAt": "2025-11-26T07:24:18.945Z" + "updatedAt": "2025-11-29T02:44:56.007Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.945Z" + "updatedAt": "2025-11-29T02:44:56.008Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.942Z" + "updatedAt": "2025-11-29T02:44:56.002Z" } } }, "39f0108c94bbc9ceec29295e4a5c4a30bc3ed66e79dcf055c93bcb5e07df95b4": { "f14661437615304886b90084f8db1b8e50ccb8718cce1d8bb57271192cb3f924": { "jp": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.942Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.941Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.942Z" } } }, "4511c24ad879085d0713bffa28b8695c1a87d24872ce30015bb857f43c961627": { "f33dc7dd4c81c9ff62d672ddd22da52fe2b3790feef29653e27d7dbf105dacdc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.933Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.922Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.921Z" } } }, "7209b7ddab6e5d0aa0edb6dd2a9d28893ced1fa4a5e84eca66e18a12cbc9a471": { "b55f055c6ea298013d180b87459ca4cbef2d564e3a47054885bf85eca5781ed7": { "jp": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.880Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.931Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.930Z" } } }, "8d5ac58622d05dc878c50a9901e001b81276e5c37349076f70389f7ec8731cb4": { "2a5bbf839d622f7ef15b7a5b8575e42dcbd0d1ab16bf6f98ab233f94cdbd68b3": { "jp": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.919Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.935Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.926Z" } } }, "9da34b15afe0cf84a2c73d8d1acfc85dae89be8c90605898caceecbc4626da99": { "ce873407eda99feac5ab7638cb9c330da28e87de5b88e7f7e35b3b8dba2c1ffc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.934Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.916Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.916Z" } } }, "b1eb4813b41c7ccc174d13cca2cec0592da899961dd7a66e59673fce738d90ed": { "d63a4009d7fadde4213a7f160c8741c105b3a63db320d984e375579df904dfc5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.939Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.926Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.940Z" } } }, "bc635d7f6a9111bbbc3d31c625fcda3adb9eadc78253335799d1b3a12a509df7": { "b7a3734788840b662f127af66b64815bd7c85bf39dd4cf42306c85eb6f392d01": { "zh": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.974Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.975Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.976Z" } } }, "bdf357b395b129f57e836477b2fc57675705bcf48e1acda08c190ab17a75951e": { "3a0381755f449a5032606d2fdab638ca733950978814b42e1aceb74203a2235b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.913Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.971Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.913Z" } } }, "c54fab4cf7043c79b8ce701279e089e154ad852ea3c4248cb2c8da671cbc17db": { "b6e7b7146868d159e85bc698be8dd009a8755c7a8c993e4406163a4d71a408a9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.920Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.930Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.923Z" } } }, "c571247fa3e091098d027771a55d5ebe774d6d531b2c5384736de73837552959": { "e5aeca6ca592dd8ef3c7bcf54b278d64dd04a95cd012f8594105429290303c21": { "jp": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.879Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.938Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.927Z" } } }, "cc311a7d9ae7be3e04c62efd5c5b7aa8cb9d6075749b29e99939d01baa76e3fe": { "3de10984a294ee3ab3e7105d5ba6c42208236c0f01721e7189efb0af99ca2490": { "jp": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.880Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.928Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.100Z" + "updatedAt": "2025-11-29T02:44:55.935Z" } } }, "d49e422d3649c455dff8cb00cabeffadfc176bab2340583e83d8416f5fbb799a": { "551eaa35224112c0edb3f9e68292a528790f07b1ea2fe15b67e97ec37689af33": { "jp": { - "updatedAt": "2025-11-26T07:24:18.937Z" + "updatedAt": "2025-11-29T02:44:55.917Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.929Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.938Z" + "updatedAt": "2025-11-29T02:44:55.927Z" } } }, "ee343f5a3bf00722c8dacdf2e096fa970da83e5102fcb1446bbc99a4b089a390": { "72f38826fa27979a73a67e5413b3854cc5f5f2bfca9f1efe2890e20dc90a5020": { "jp": { - "updatedAt": "2025-11-26T07:24:12.098Z" + "updatedAt": "2025-11-29T02:44:55.929Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.099Z" + "updatedAt": "2025-11-29T02:44:55.933Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.928Z" + "updatedAt": "2025-11-29T02:44:55.877Z" } } }, "fc30da7ebddc5996d940ca4f9540cee6fa6b79f9c37ee5aa6cd56665488a65e6": { "20ab3ac2e587dcfbf842ef0e2dde364c4fac02225d76cf6a5a4b6a646b77e4d6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.881Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.939Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.881Z" } } }, "fc92ad70da88c48808fdb53f68400c73f6f900eca6a95d544909915d2b22d9f0": { "16c47449f52759987429555de611585f7f1f6d6770d4c1ced0d74ae244ab45df": { "jp": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.970Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.968Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.935Z" + "updatedAt": "2025-11-29T02:44:55.909Z" } } }, "fd2a3635e203221890fdb75fdb12cad083607f12a05af6e46565b58b28626a3f": { "69e391ff6463d09b09730e7e4366b4c486d3bb1759441114546febf2e97601a2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.914Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.103Z" + "updatedAt": "2025-11-29T02:44:55.946Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.103Z" + "updatedAt": "2025-11-29T02:44:55.953Z" } } }, @@ -11659,18 +11802,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.953Z" } + }, + "99dd663f4b6f1f7c866a09ecc4aa890f3ab244afe08834a22596edafef952ca4": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.984Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.033Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.033Z" + } } }, "0f88f2bd27c6a3bc5b20ffd358c1599368da4a7821aed81420035a719675f40a": { "947a7d558e471c72cf79437a217f341c9e6e2083cef8d20956a3839b9c085fa3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.972Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.962Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.969Z" } } }, @@ -11685,83 +11839,94 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.953Z" } + }, + "634a6e8cc715dfe8bb5f0ed37757b192d5e78bbd3d002d9e758fc5e3428bf252": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.991Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.021Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.031Z" + } } }, "24f89815412a9281c45be003f0d9b1edaffe253b9fb6e44d0b69114de2a8bb5c": { "856a0875860cb4e9fdc7fca531785d1b4ba67b93fdace5421889ea8cc500ef1f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.103Z" + "updatedAt": "2025-11-29T02:44:55.915Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.103Z" + "updatedAt": "2025-11-29T02:44:55.946Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.103Z" + "updatedAt": "2025-11-29T02:44:55.951Z" } } }, "309ede6dc77ce6e13f59939faf3901841606c221b6288c941fde4d97ebdb53a0": { "6f8a294f73c0c480fd655b8e9629eea0f71262b277a7a5e6748a17b7458ba88c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.949Z" + "updatedAt": "2025-11-29T02:44:56.013Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.948Z" + "updatedAt": "2025-11-29T02:44:56.012Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.947Z" + "updatedAt": "2025-11-29T02:44:56.010Z" } } }, "417572f3f0c0dee81daaaf436d03f842c9160631b01f165595d06d9e99f3c6c0": { "bedae71b49b3c79b70e3ad0767d167ca7bf7f0cf3792f2786f3be6e243ac41f5": { "ru": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.944Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.945Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.943Z" + "updatedAt": "2025-11-29T02:44:56.005Z" } } }, "453e82594457c450e00def5b4a049c6817c1f11b3242ecdc0c113a4fe824bda1": { "3e341e3a84064fbb72d1f07486692fcc58eba4c23ed96700a8697e160736a689": { "jp": { - "updatedAt": "2025-11-26T07:24:18.940Z" + "updatedAt": "2025-11-29T02:44:55.998Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.941Z" + "updatedAt": "2025-11-29T02:44:56.000Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.941Z" + "updatedAt": "2025-11-29T02:44:56.001Z" } } }, "4f6f1a6da73f8d186f0a18ad4c69138ec62d12a6b38064449c0eaf1293c82145": { "19880790e9525db190f5e72d85ffc766a344cde65183576c30c03ab560c76bad": { "jp": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.911Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.108Z" + "updatedAt": "2025-11-29T02:44:55.977Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.108Z" + "updatedAt": "2025-11-29T02:44:55.977Z" } } }, "544e14c8df8e9aeba587c7a01debdb6de7b8d0dc480e2a471b321fe3cd637687": { "56a8436026a55bc58795064c90dcf48eb1783d7c4aeb6e25f3c6be910d52bfb0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.912Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.973Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.969Z" } } }, @@ -11798,44 +11963,55 @@ "jp": { "updatedAt": "2025-11-26T07:24:18.940Z" } + }, + "ab2df52995cf3997a3baecd856f3989b8f29d5c7696a2ee4616a5675d7e62391": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.955Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.992Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.992Z" + } } }, "596b0a954cde794b5e64f8babd89a81c1359843a6046215dd00cba539357857d": { "af24567e7b2b1b9a842510afc1c41e6a4f7a9634fdd16e4176a76bc4b3c3e091": { "jp": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.970Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.973Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.101Z" + "updatedAt": "2025-11-29T02:44:55.910Z" } } }, "65351c23daaa6ae3579c1740e82b1f56ce6eb541ff65d23ed1f890694f6ea440": { "b999ab8a06deee210039a2eaf91d71da758c776e64c8fc322d876e73e8db2861": { "jp": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.913Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.968Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.971Z" } } }, "942eceae58e0a094962eb7383ca418c7a0fb355bbdf35ed09b1fb271b8ef0622": { "a06cd352188c57c4dc80e07b3511cf0c55b644a5eac9806b52fee16a901321cc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.911Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.972Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.106Z" + "updatedAt": "2025-11-29T02:44:55.969Z" } } }, @@ -11850,6 +12026,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.948Z" } + }, + "d74811a43a5692033b0db3a2c94f0a673f6dee42d90914ef696df7c4ddbac655": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.955Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.986Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.988Z" + } } }, "a4265198145ae0d412153c5abd0417df656a57368c80042916957e2c00936a91": { @@ -11874,57 +12061,68 @@ "ru": { "updatedAt": "2025-11-26T07:24:12.104Z" } + }, + "2d62d69aec7a3be320c6934254cbe83967fa5402dfeafb0dbed6ee9c6bb6dd7e": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.954Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.960Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.961Z" + } } }, "acaee03135e8e96bcdcf34c15546b735f613d1e5ae560184c16e47ce55501204": { "8a07567dde3044656ee0f3a1ecdd3437e3653bc1dbd011b4bab9edb2c0e04c95": { "jp": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.975Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.936Z" + "updatedAt": "2025-11-29T02:44:55.909Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.107Z" + "updatedAt": "2025-11-29T02:44:55.976Z" } } }, "ae900fe149a5b14ee7a25d9f850a7fed9bbb24da3497c1861285d73a625852e6": { "178aea88d150360011d964d55863a4f9f7585cb6ddc5b56d142898d29ed03414": { "jp": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.952Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.953Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.952Z" } } }, "cc14be3df8410373edcf3ea623a34273b7005b0668dcb8d261ee3fbada8f972a": { "029f36173935f1b92553f610da6f3be5d9b0976fea74e17265186d40a9f8f8b7": { "jp": { - "updatedAt": "2025-11-26T07:24:18.947Z" + "updatedAt": "2025-11-29T02:44:56.010Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.948Z" + "updatedAt": "2025-11-29T02:44:56.011Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.948Z" + "updatedAt": "2025-11-29T02:44:56.011Z" } } }, "d8cbf85de396e8d762bfdc573d415e4482bb687b9017d25d153c264728283316": { "62c5c6e1debf8e9f65330683895c791394dfa2b8f1cab9a3413558667b58ec1c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.944Z" + "updatedAt": "2025-11-29T02:44:56.006Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.944Z" + "updatedAt": "2025-11-29T02:44:56.005Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.947Z" + "updatedAt": "2025-11-29T02:44:56.009Z" } } }, @@ -11950,18 +12148,29 @@ "jp": { "updatedAt": "2025-11-26T07:24:12.105Z" } + }, + "9833a13f1be1707f9e1e0c52ffe0e9c26df1dca4c21c0968e308a62a79da3578": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.956Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.959Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.959Z" + } } }, "f6c796e2a223d7f3109d7a0e087b02b576111cee44e1affe20a492544e19a35d": { "5c1b2453bc509571ef5a9c5a79343853e690b58e16dd273eb4fedb719f0aabd8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.981Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.980Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.108Z" + "updatedAt": "2025-11-29T02:44:55.979Z" } } }, @@ -11976,6 +12185,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.954Z" } + }, + "3cf60c4c63f78ca99a909e11fdd7b9ea46873225acbb7444b8eb966b6e9c4838": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.985Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.990Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.022Z" + } } }, "134051a83cd4931696ccf591823f46126c6e7feed4971511434916eff09ce79f": { @@ -11992,13 +12212,13 @@ }, "7676a41c6d1e719ba8b13b8d322ace741b11f0fe672d3b38397d5e1d23081fd0": { "zh": { - "updatedAt": "2025-11-26T07:24:18.955Z" + "updatedAt": "2025-11-29T02:44:56.014Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.955Z" + "updatedAt": "2025-11-29T02:44:56.016Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.955Z" + "updatedAt": "2025-11-29T02:44:56.016Z" } } }, @@ -12013,6 +12233,17 @@ "ru": { "updatedAt": "2025-11-26T07:24:18.956Z" } + }, + "4e4923ee24e6317511ddbea23c7b6f8e03c0277f9d6ac0d56eb56dd0caae3746": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.017Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.019Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.050Z" + } } }, "1c4c51a336d1e6dee310539258abd450be7834df46548255e22fae5d3686a247": { @@ -12026,44 +12257,55 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.954Z" } + }, + "5c602e02407de45f557f89046cb7b30682c56eaedacab7a3bfc0f1d208a1813f": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.982Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.024Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.028Z" + } } }, "39df2af9870d3b0cc9ef00711b97902ed3b5f6df0419aadf0841770290785d7b": { "a18203de1411607a70e1437450eccbf17a073e8daa45c5c42ee8e0cba812d5f3": { "jp": { - "updatedAt": "2025-11-26T07:24:18.942Z" + "updatedAt": "2025-11-29T02:44:56.003Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.941Z" + "updatedAt": "2025-11-29T02:44:55.999Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.944Z" } } }, "40220941c00a4eef0a2069b02906e525beca179d4a354e0a2e5a911c363640b5": { "989d53822380f38745d79c1b84562bfb045e678799d0f7110947e9bf5d599700": { "jp": { - "updatedAt": "2025-11-26T07:24:18.943Z" + "updatedAt": "2025-11-29T02:44:56.004Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.940Z" + "updatedAt": "2025-11-29T02:44:55.998Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.941Z" + "updatedAt": "2025-11-29T02:44:56.001Z" } } }, "505cd1f1060fe51777563a177f877b84419bab382656d36901ea1615cd4c5f44": { "0a35a92e535e80b3a150fd73abbc1751ae0fa2688543577feac7ce7f4de53ae8": { "jp": { - "updatedAt": "2025-11-26T07:24:18.953Z" + "updatedAt": "2025-11-29T02:44:56.043Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.950Z" + "updatedAt": "2025-11-29T02:44:56.037Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.041Z" } } }, @@ -12078,6 +12320,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.949Z" } + }, + "4b25da1f59890cfa5a986a65cb021896d1be71d0919069a68ca0edb32d4bcb78": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.993Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.996Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.997Z" + } } }, "6d56ddb9a5b3ccdf4eae29f57959e9374f0ff177ac9800e0d460527344dc64a0": { @@ -12091,6 +12344,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.945Z" } + }, + "eed3064741cb620f55aca288e3255646f75384bcfd7a8d5d63104f69d26df546": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.957Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.993Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.995Z" + } } }, "839030474f427a460a6acfb9a8caa7662e1cd0c337e35995054bd2c956ad05d2": { @@ -12104,6 +12368,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.944Z" } + }, + "06b19ed602eff6e0f4c0b38b69d416263621f402f6591d9f78725c9fb8213249": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.957Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.958Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.995Z" + } } }, "90511d719daa226bb864d0d2bb0fb993971dffcc30b3fda0d86ebc7ff7157a9f": { @@ -12117,18 +12392,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.952Z" } + }, + "1921b13e0a9667a216009da681a38ff65bb6e8e5e69fad4427f31e0dec85b1b7": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.983Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.030Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.031Z" + } } }, "a0e5cd4bbd52095f645996d5a20cc34d462aed2b014ca882138e4ede52f7b410": { "b82f6c4650551ebe5f3c0e03e15ad59d0e9d79edf78e121c65d4de264d1e000e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.941Z" + "updatedAt": "2025-11-29T02:44:56.000Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.941Z" + "updatedAt": "2025-11-29T02:44:56.002Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.944Z" } } }, @@ -12143,6 +12429,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.945Z" } + }, + "5dd603d0ea09ab4c18610adfac733616566b9465cbd159ab38037b65cf3ef036": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.958Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:55.990Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.996Z" + } } }, "b52e68b0fa137214aee6134202f0428952a2f49c83cef796e483c36598106cd9": { @@ -12156,18 +12453,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.950Z" } + }, + "6a2d3b6f6eef53b77da900c4d9383e4c650a1b67df3b4bffcf8c1c982c61e7b0": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.986Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.022Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.024Z" + } } }, "bbbf8ab907626ae0bd4c2e7f8f1e1a30e187356616b813a7f2bafdcb968b16e9": { "64de149ea6c99450b1d0a61247789522cc099815c912ed33f53b378aaf837bbb": { "jp": { - "updatedAt": "2025-11-26T07:24:18.944Z" + "updatedAt": "2025-11-29T02:44:56.006Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.942Z" + "updatedAt": "2025-11-29T02:44:56.003Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.943Z" + "updatedAt": "2025-11-29T02:44:56.004Z" } } }, @@ -12182,6 +12490,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.951Z" } + }, + "805a3c63750885bfc49f7e57abe2e015684ddc6eb6b23a0704a589da9585ba31": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.029Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.030Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.031Z" + } } }, "be5a795a34e525ece1f0651b8ec65280cd3f71026a239b44cb087800474d6992": { @@ -12195,6 +12514,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.953Z" } + }, + "ab85b9c6ab0099af15f4a6be42857b06c4aac25bf43a4a5260304fb4ff3e6f6e": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.027Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.029Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.032Z" + } } }, "c3c4a5cfc613b8b144029f13d913022c2d41ebc3c333e2fa61ed8d2f0df5a81b": { @@ -12208,6 +12538,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.948Z" } + }, + "f9910c6a76a99ff49c7ffee4a3987ae9207e8d7db851b61ec2efe4f6c5c50886": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.989Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.994Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.026Z" + } } }, "d559f4bb7e0e75b052f6989f63565615397e09d8f05bc7535ae634a02281b78a": { @@ -12221,31 +12562,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.948Z" } + }, + "fdd897a9063250be652162e225953c203c05911a364b1cf87f47fa2b3ad6b297": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.991Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.994Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.995Z" + } } }, "e54eba7f7c2e2d6d452b2d73f4934f9ba018e180585b2bbdb2f9f14bb9b5510d": { "d88ed4dda50a3c9ee265b067c0abda94e3cba629d2d6c9a695d77d254c4cd372": { "jp": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.943Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.941Z" + "updatedAt": "2025-11-29T02:44:55.999Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.102Z" + "updatedAt": "2025-11-29T02:44:55.997Z" } } }, "f871545252cead274f81eec090f4a37c79aad733b302ff49eedc5242ba29b1cb": { "5ee24061522cb5a7ed68e5bfa59c658c0cb620eff70e3736f5e3800597533e77": { "jp": { - "updatedAt": "2025-11-26T07:24:12.109Z" + "updatedAt": "2025-11-29T02:44:55.982Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.950Z" + "updatedAt": "2025-11-29T02:44:56.036Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.950Z" + "updatedAt": "2025-11-29T02:44:56.036Z" } } }, @@ -12260,44 +12612,55 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.941Z" } + }, + "295554629ad06cadfbea57e08411547a44046d88bbc5cb20b34c13534fca808f": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.954Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.987Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:55.993Z" + } } }, "00f0f8e4c4cba686bdd32c7eb510c5ff9cf2847654153d708f69ef3d1fae55b2": { "4cdabdb9af849dd79c526565751107e9b1abf0b12889130ad0f45424328feb65": { "jp": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.090Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.095Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.093Z" } } }, "0819a7d3c5f71c0454ca26bc207870bf57571e75b815f9e6048c755eba88da5b": { "7c183351205668c7bd2a340b5ce1c7a91fbae1b7555a939a4d8e6611fda87e09": { "jp": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.100Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.096Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.088Z" } } }, "0e624ceaf217ed28aa49746f8a0d8e6f11f50144de84c79c5bfc3cee61b7f1a3": { "2c646c9eed127c879e1e79d90542ee56c28b87e87984ce2e15248bed89ca7aa7": { "jp": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.091Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.092Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.097Z" } } }, @@ -12312,18 +12675,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.957Z" } + }, + "ee5e9f3162a1197524aca6e97cf739a11ca65612be1b597e70bf103f7727993c": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.063Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.065Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.068Z" + } } }, "2395cf7e448505fe5dff52c83b83b0eb98f08d6b30b33dff50d6380fa7e5932f": { "773ced00aebc468e3a46c4cc78b523aab8880ec08d2fdf077d970783ea2663cf": { "jp": { - "updatedAt": "2025-11-26T07:24:18.958Z" + "updatedAt": "2025-11-29T02:44:56.075Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.069Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.071Z" } } }, @@ -12338,9 +12712,20 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.954Z" } - } - }, - "56433df9b9399e37671c12717a7e397ab2aec3e086e226fcf8bb3a338e336f38": { + }, + "b0b56f3e8d31dcc0efeac6d2feb5c7674647f73163b6e6bc288532a7e63ee696": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.988Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:55.989Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.028Z" + } + } + }, + "56433df9b9399e37671c12717a7e397ab2aec3e086e226fcf8bb3a338e336f38": { "899571967dfce1a8941dff3771b1f23612d934928bb1aef923cfe5bf35044d6d": { "jp": { "updatedAt": "2025-11-26T07:24:18.957Z" @@ -12351,6 +12736,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.956Z" } + }, + "01b3c2c46b1f5b875a5d0c20393042830caf8d92a7c7820943fa80463f760cdd": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.018Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.054Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.062Z" + } } }, "7b92c9515ab243345c2edd443a9f36e432abeb01df31d0d197db37f7733b65f1": { @@ -12364,6 +12760,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.954Z" } + }, + "d2a0556b2ff529a2a6bc6f0f1474e276bb5cf693229f1efb4d5f047dca2bba21": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.987Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.021Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.032Z" + } } }, "8150184b8463d89e5a92277a564104c399220d435ffb6ec7e6d2560672bb49d6": { @@ -12377,6 +12784,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.953Z" } + }, + "6156562270e5d113b2b835c17a4908c76e95978956ef4a57eaa61e1eed78520e": { + "ru": { + "updatedAt": "2025-11-29T02:44:55.983Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.023Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.025Z" + } } }, "8af19e1098601767cbf89d205cfc0d3cd2c79ba5ae84fa11d9cea6cc91850951": { @@ -12390,18 +12808,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.958Z" } + }, + "53c40fa63ea8e3ce50b35d7c9ab69f8ef252980df0deba29ae32d97edd799b2e": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.018Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.019Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.066Z" + } } }, "8fad6511e155deebc0c7b7055ddf993b7213668bd651d77b46f4fef11c363990": { "00a2be5a931770b44b5dabd0013f35d169228fbee45d460fc63c58245bf78264": { "jp": { - "updatedAt": "2025-11-26T07:24:18.952Z" + "updatedAt": "2025-11-29T02:44:56.042Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.040Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.037Z" } } }, @@ -12416,18 +12845,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.952Z" } + }, + "3076a78d7676e145757a5c63a2dae4d7c0c748942ad74b8e147613b5ae9c6a2f": { + "zh": { + "updatedAt": "2025-11-29T02:44:55.985Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.027Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.029Z" + } } }, "9fd477532adc3dadf2dfed8071d354140eb7b667bd012aceca5476a9b5aeb7f1": { "cc0409c62d9e4b650b3ab8a4a2c2ea56b508c8a34ed0235cccc67f60cb557c17": { "jp": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.038Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.952Z" + "updatedAt": "2025-11-29T02:44:56.041Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.952Z" + "updatedAt": "2025-11-29T02:44:56.043Z" } } }, @@ -12442,31 +12882,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.953Z" } + }, + "c338f65f8d100cd47e3a31d6f9e78ba015c1346b791cfa3ff6677795952a0807": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.984Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.023Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.034Z" + } } }, "b24da7e78415a317d4fd792bce74b8acf47ca7b376eb80c5d2a81e9b874b5ec9": { "1b40db05914f87442600e04da552a114b9d6566703fff238531bf2dce4b3fb81": { "jp": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.071Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.072Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.070Z" } } }, "bd066e14efb9c286ea6f6324b04ea5e37363afb94dde1cda3efc2008e77fe6c2": { "ac1b069ca0882ed4666acf6095038e0b7cb288b8596cbf3b1ce1e54a9df05e43": { "jp": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.039Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.039Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.954Z" + "updatedAt": "2025-11-29T02:44:56.044Z" } } }, @@ -12481,31 +12932,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.952Z" } + }, + "c648cd50d62fa017bf9f75cb6b83f2c181571125b4792b76c86198da57d6b234": { + "jp": { + "updatedAt": "2025-11-29T02:44:55.986Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.025Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.026Z" + } } }, "ccb6f7b23e140ff82e19fc0391ef805c0f15507170cf5f60a78b0ea7f7bcf295": { "7b7eb66a4c1f465cbb23aa2d3f377abddba9aaa6d13866786810216306d2eb6e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.040Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.950Z" + "updatedAt": "2025-11-29T02:44:56.035Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.951Z" + "updatedAt": "2025-11-29T02:44:56.038Z" } } }, "d79bc535529875a738bd248165a718dae8d93446b748ae71439f9b822c83972c": { "1a78ff0ba0c6860dc7ce6357e1df29d3b791afd1f3ea81e2713f99d9dd8d0199": { "jp": { - "updatedAt": "2025-11-26T07:24:18.940Z" + "updatedAt": "2025-11-29T02:44:56.034Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.952Z" + "updatedAt": "2025-11-29T02:44:56.042Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.950Z" + "updatedAt": "2025-11-29T02:44:56.035Z" } } }, @@ -12520,6 +12982,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.957Z" } + }, + "703c345dcb09b3d9c115ac6d960bc44df5ebbd21bde9ddaeb3fae08a63b1749a": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.053Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.053Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.054Z" + } } }, "f181f03d87970ee159e60beef4cf41dfdb497fd8d950cab4164f13908b4a893c": { @@ -12533,6 +13006,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.958Z" } + }, + "01426a0b27a8046b6721227a23a347197804e15d2e71c528d46080c264354921": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.050Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.064Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.064Z" + } } }, "0d57e95520df30873578c0c59ade72141faf51c3e622951bb9026968b4b2a96f": { @@ -12546,18 +13030,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.963Z" } + }, + "5f3840a29e61dbec4841a38be6722a8b6d3bc7281cc7d9139a2e112a47d2f251": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.049Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.052Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.056Z" + } } }, "0f2ea76e0db5a6d5b78533ea69f6bf742d59e3c92cd69159341e1c7049a2aa97": { "9da14b2a7b04a5c4ff51174e32fb113e58f6e2c9b60265a9616f729614a2c9ba": { "jp": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.102Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.097Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.087Z" } } }, @@ -12572,6 +13067,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.971Z" } + }, + "b92611dd6a3b9c353cc2b1383d42601917df331aae94df51cb078400430f456b": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.080Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.081Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.114Z" + } } }, "11f2e3a49b018a860171016a699fa740752c02bc0aa8f5f79a0c57498338ec5e": { @@ -12585,6 +13091,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.966Z" } + }, + "e5c755dea01abaf11bf73c6cfd13729ae4bfa33d43a0a52ea3e0173460d3b39d": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.049Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.050Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.060Z" + } } }, "259e682225d9b71ca3ea983216e57cd82c14b1caf25f00ea510ceadd3a70a0a7": { @@ -12598,31 +13115,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.959Z" } + }, + "e91d3b791b454b1a0ef05b57d40abdbf146ab1474ff1aeb70caabf9e4d32b816": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.051Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.058Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.058Z" + } } }, "3b9d54215d217a013fc4c62df11f26627fb8449a0489b74cc0f54e6b67f41ecc": { "f789cb25007915b6d83be12f4ecf35805e8a487063a7a59b47c497602ae41559": { "jp": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.093Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.960Z" + "updatedAt": "2025-11-29T02:44:56.044Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.069Z" } } }, "45c1b7f8bb110c2b37f34cc31252826058699640eef30ff8486c08761af44c43": { "605cfdad7a54e1e2f7b6a9998f6bfa8f8ff7b6a25aaa39281d58591fed0758e5": { "jp": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.068Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.071Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.070Z" } } }, @@ -12637,18 +13165,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.960Z" } + }, + "2885a781a007a7ada8f0db66ad248161e6af984d5a6d09191834d6a2543db968": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.063Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.065Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.067Z" + } } }, "57f74a21cf2fbbfbe54dc4c14d4c397429d32d51ea09651cbcba81a78f831e03": { "9aff12963c1e1db4b1b461b751a4d72394a3a26138c1713efd31eb628aa3b7c1": { "jp": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.099Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.965Z" + "updatedAt": "2025-11-29T02:44:56.107Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.965Z" + "updatedAt": "2025-11-29T02:44:56.106Z" } } }, @@ -12663,31 +13202,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.957Z" } + }, + "4576bd6efc4271a9bbfd7ff64a67e6a5cd8120b9608e1f0f96745079351d1a69": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.020Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.052Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.062Z" + } } }, "5e82ab99152b96f656e8dbc01527a2124dec1e8c721a629d4ba5aeccc219db56": { "4fe49458ceaccad1ac8e3af48d763a09070b1428ec46ac6e0a3b4c19aa2aff54": { "jp": { - "updatedAt": "2025-11-26T07:24:18.956Z" + "updatedAt": "2025-11-29T02:44:56.072Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.957Z" + "updatedAt": "2025-11-29T02:44:56.073Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.958Z" + "updatedAt": "2025-11-29T02:44:56.075Z" } } }, "61901cc301281214293209e58b53b0298e1dcffad02805348907ec14f5a36253": { "9b549c4be17898687f84e0ef17ef02ef8a374450b44096f17620746288db980c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.091Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.960Z" + "updatedAt": "2025-11-29T02:44:56.045Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.089Z" } } }, @@ -12702,18 +13252,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.960Z" } + }, + "ecb585ec1fef87ae16a59e4392cad2214397ab76b4c1f98f967c69dae8f1c139": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.055Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.066Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.067Z" + } } }, "8232385318fcb8ae5ab151696b217b22f9436e7402f061c4116986347a039995": { "d6b3588b7d8f126d5702902b6c9d58f3929c5d5c37ec39e19523d2d8bfcab2e9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.094Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.046Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.095Z" } } }, @@ -12728,6 +13289,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.957Z" } + }, + "9f3903e67cba6261cb9be580a31bdd170498cc260e9c5d03c285d123770043ec": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.017Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.018Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.020Z" + } } }, "a4b6a047b28cc22275775b0dd79539a2be86c95aa7ced10a1b187f12caf79320": { @@ -12741,6 +13313,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.956Z" } + }, + "af460729a46f510430df896945c2d1083b7a1cba8c13e697cbe6e79e39464dfe": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.051Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.057Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.060Z" + } } }, "bab8d56663945997ddb532be83b22cfbee4c23f88c78951638579d4d2d0d0dc1": { @@ -12754,18 +13337,29 @@ "jp": { "updatedAt": "2025-11-26T07:24:18.966Z" } + }, + "8e64108c88e2501340620384ddf14dd58507b8e1c81219be6f6e610fe3d9c772": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.084Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.085Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.086Z" + } } }, "bb10891887cb78110e7cb4ceb74ff22432d01fac9a3bff7cdeeb1886f79b1a65": { "caa3bae4c975b756d6c9bef7d4ca4f1118fd3ff3418d4538a30aa4c9e33515f9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.096Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.104Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.094Z" } } }, @@ -12783,13 +13377,13 @@ }, "f874e3ae6b9b2413ff9c4415bbd53d217ecc53aa9c8754f7d8b43a840a56a1dd": { "zh": { - "updatedAt": "2025-11-26T07:24:18.955Z" + "updatedAt": "2025-11-29T02:44:56.014Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.955Z" + "updatedAt": "2025-11-29T02:44:56.015Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.955Z" + "updatedAt": "2025-11-29T02:44:56.015Z" } } }, @@ -12804,18 +13398,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.959Z" } + }, + "1487bdd2fa2f3944d2af9ce3c81c0bc560bc49e8a960f88b3b1bd574854de890": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.057Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.059Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.061Z" + } } }, "e39ace6f98adf22617bf02b8e1b5e543cc789b8aca34a357f850131c862245ee": { "18eb1c50ac74effbf464a4c046b94e4cb6fa9eb96d70864437ccfb525503aa01": { "jp": { - "updatedAt": "2025-11-26T07:24:18.958Z" + "updatedAt": "2025-11-29T02:44:56.074Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.957Z" + "updatedAt": "2025-11-29T02:44:56.073Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.957Z" + "updatedAt": "2025-11-29T02:44:56.074Z" } } }, @@ -12830,57 +13435,68 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.969Z" } + }, + "ece9e5e8b9ede092044e89a8f22b5f4f8ad893ecb0b80c8ee957c1d036b8e7eb": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.078Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.079Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.118Z" + } } }, "188f9a9bc3bec2ce321905c8a56a28198b42bc1f90b417b6ac00a4d9cf3c147b": { "8e6933142a9b80421dd489117c3233c45a2645cae67fe6bbf99c75fdf827c9ba": { "jp": { - "updatedAt": "2025-11-26T07:24:18.970Z" + "updatedAt": "2025-11-29T02:44:56.138Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.969Z" + "updatedAt": "2025-11-29T02:44:56.136Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.969Z" + "updatedAt": "2025-11-29T02:44:56.135Z" } } }, "1c00ec1111d4c97040f8a6b4705c820bc0afe08ce75657d4021750534563cc33": { "b2e299e5c648bc6c75f661d7ddb0d415bf3f4d2d15b1b81f676f8d781e4ab3d6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.129Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.098Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.101Z" } } }, "251dd0b5213f0a3e9974d1b830a96625f3edc7164c0ea7373201dbcf17869d8f": { "420a595531db98470670f1f677ed2a055a31cba9f965d100ebd8b1fd45bd0c88": { "jp": { - "updatedAt": "2025-11-26T07:24:18.969Z" + "updatedAt": "2025-11-29T02:44:56.136Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.129Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.968Z" + "updatedAt": "2025-11-29T02:44:56.132Z" } } }, "2fe98a07a0771f0c918a105339c7465f1d1800b749a6786ae052b4f5792f8146": { "bc9d4d641f5b9a05f88360a2ee33515689607102fb6c336b63a7598960ba63de": { "jp": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.128Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.969Z" + "updatedAt": "2025-11-29T02:44:56.135Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.127Z" } } }, @@ -12895,18 +13511,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.970Z" } + }, + "75703e9986b34937934165925fc58e72a3afca84531a9442ab6247ddcf89893e": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.117Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.120Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.123Z" + } } }, "513fe6bad8509823ffdccf71f911e6632a1d6c62bc3828d6880a93c15b106872": { "8b0b91827d9a7c004ba4a826838ebb29f76a0224d429a5d945acb7d900b732fd": { "jp": { - "updatedAt": "2025-11-26T07:24:18.968Z" + "updatedAt": "2025-11-29T02:44:56.133Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.969Z" + "updatedAt": "2025-11-29T02:44:56.134Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.968Z" + "updatedAt": "2025-11-29T02:44:56.131Z" } } }, @@ -12921,6 +13548,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.970Z" } + }, + "30c6212c47a3a967e11aed7b52fa64caa3358560d58e4a0931019d75506f6232": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.079Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.082Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.122Z" + } } }, "67b2cf74cdaca50f8911af9d708d0de9b1f69f0efeab9993911fd47c8fe2f59a": { @@ -12934,18 +13572,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.955Z" } + }, + "47b31a12063a879f2beddb3373c4c72ffa7b8dc29a27e09156d7cf03a46cf52b": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.047Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.057Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.085Z" + } } }, "721c2734aaae37ab2cfa24011429e694a791b3fb975c20c543e63c974c336cde": { "9ecec8ec535a5264bf7ad03315791abb102815a602f895880c47fb817859cf24": { "jp": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.101Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.047Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.092Z" } } }, @@ -12960,31 +13609,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.968Z" } + }, + "28b09452901cdc50d62751f8c7e48dda24bcdeceee8080b1e1efa2058fe428d1": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.120Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.122Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.123Z" + } } }, "8315916bdb3d69fc26c0b36f0b4378146ed63f736e03228e62d22efe01d9dfd4": { "5856087df98f6740b4472f367157e174efdc961ef37e3c1247d0ced2db5782d4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.089Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.963Z" + "updatedAt": "2025-11-29T02:44:56.098Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.961Z" + "updatedAt": "2025-11-29T02:44:56.088Z" } } }, "989eb966fc80a9e76f90dfcbc66e0dea7d1236c5a18dcfc3951a22c271c46183": { "501b56f9eae0cac02eb27cad28e73a3ea80b0a3e66d207d53190032406e903ec": { "jp": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.103Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.960Z" + "updatedAt": "2025-11-29T02:44:56.046Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.102Z" } } }, @@ -12999,6 +13659,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.955Z" } + }, + "a85beb07457a8cd583ab4626e4a1665d17654cc132cfa7622752e519095ab48d": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.048Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.056Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.086Z" + } } }, "c3e128b68f1271e67f658e6a27e710c60881f8641ac2288d555daa3208c005f9": { @@ -13012,6 +13683,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.961Z" } + }, + "4626508269ebe6c1920ad10ad096b8dba568bff0279bfb0356204ebd6e971f08": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.048Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.059Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.087Z" + } } }, "c484fc5a7f3148583c4468ad2af97f94fd9cc073f7098786a953f31855eb484e": { @@ -13025,6 +13707,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.965Z" } + }, + "8e44081ae47c2cc39c56f929606d16db2e836b56a354be7dc6b701f4b95b4017": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.061Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.085Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.086Z" + } } }, "cb12578467473a3c801b153c6cf4d13a10cf518318fd5f17155acd1793145e1b": { @@ -13036,111 +13729,122 @@ "updatedAt": "2025-11-26T07:24:18.969Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-26T07:24:18.962Z" + } + }, + "0db5aa15e3dbe18b1c681a26cee8856fc9b32345cfacb7a3bf81dc6e5ea5df3b": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.076Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.083Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.124Z" } } }, "d7f86ec094d4fd68c7ec3902e09e9c8d6f32e759b1104bbeace470bd65c6ae68": { "aa75faa94f785331aff5bdbe2cbf5c4d6e4d398591d7ba48c786aa44ef7c17d8": { "jp": { - "updatedAt": "2025-11-26T07:24:18.968Z" + "updatedAt": "2025-11-29T02:44:56.131Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.962Z" + "updatedAt": "2025-11-29T02:44:56.124Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.966Z" + "updatedAt": "2025-11-29T02:44:56.125Z" } } }, "dae06bb227a02c2e0c6a941ce0fc26005199e52c806d58d5e67386d3ec46f9d2": { "7b4e58d24764fbe8ed14bec5a6c802f2f143b902c16c654c45567175ea3ba639": { "jp": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.100Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.965Z" + "updatedAt": "2025-11-29T02:44:56.106Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.965Z" + "updatedAt": "2025-11-29T02:44:56.105Z" } } }, "dbffe2a957cf5e50f0d77de216e876face0751f13e47da2a20400d54d5665054": { "de205edb219286909fddbd177c0ceefb00f1d4bfa1753f3d37b2539c40ccb3b4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.970Z" + "updatedAt": "2025-11-29T02:44:56.137Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.970Z" + "updatedAt": "2025-11-29T02:44:56.138Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.970Z" + "updatedAt": "2025-11-29T02:44:56.137Z" } } }, "e05629c59a8527d19506d4c60937f73b19f3d5ee1a52750f68b76b2d39b9d9ea": { "746136ea09bf1fea642a7fffc300c1227b17aefa177ec7ad998a0d64c56bbef6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.104Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.099Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.964Z" + "updatedAt": "2025-11-29T02:44:56.103Z" } } }, "125f424723e0504386a4a184da1e7119c6a2785f018e32a19cce5e8d2b7e5836": { "b707bc414a14120fcb5707df2de39c191647cd3b486308a8a5dafb116a49cb6c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.193Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.194Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:44:56.184Z" } } }, "19dc76f171fdf3b0cc1a3933538a1ce4395d12a9b9640597e4903ce3f6b18874": { "de4790564f72c39fe581e10e8ac3237721217d6c3c4ea4ad3cd07779bcc8dcf9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.154Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.156Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.160Z" } } }, "1ce6daa0ad295dac3a93f320fa28494beb73c39ee95608595b498a15a3e40ffa": { "85d971b7567c96e52bcd05d9d21b9c8edef12dd133c8c50e8b309d2d5aa75dc9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.196Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.981Z" + "updatedAt": "2025-11-29T02:44:56.198Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.195Z" } } }, "232c5ecb0f7a4603625517e022985cf3f01e1ead564c3eb970640640aaae8e12": { "3cf3a4419ef85aa0f20d163b55039c8180a0e1cb6acaf80999e00570756a5e6b": { "jp": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.162Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.153Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.163Z" } } }, @@ -13155,18 +13859,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.974Z" } + }, + "86f5cb11e91525fe84a6d7ac02cc19c807d8d6cce44b69717c9bbcefc375cc31": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.110Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.117Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.121Z" + } } }, "70cf97c8fc949e8db59f1ad657a9a53e576e424eaa88498f6a60d5b2e6729885": { "338d9d04b8e82dfebeacc09a54a398e5b4290b074e597a101394bc9922a1ee1c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.130Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.126Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.126Z" } } }, @@ -13181,18 +13896,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.968Z" } + }, + "b37dc6bf582ff09f935ab13559b16785003bbc859edbc25cb5250cf6ed36730e": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.077Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.080Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.123Z" + } } }, "9453ae6e6128bf52ca32a6699d5950c384605875acc28c886ac70d540ffb5753": { "ad123d6a5a72a60f6d9c309147475eb38bbb468cf9e3ff3d8588b1cabffc4b51": { "jp": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.171Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.160Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.158Z" } } }, @@ -13207,6 +13933,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.970Z" } + }, + "8da324568d7b8b5274356df80d91630b941a46f186301011fca9d984a25b20f1": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.080Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.118Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.119Z" + } } }, "9b57ca46e862eddb44a226a1ea028a1678344782bb5bedd683e47de11237eb37": { @@ -13220,6 +13957,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.974Z" } + }, + "68a496a4ec4c57830ab397ac2a3d04f92f17c400130928c2a18b7b319b353710": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.112Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.113Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.114Z" + } } }, "a725d7aefcb81ca44df79432f1da90c48ccc1821c943c4aea64ec662f97fc340": { @@ -13233,6 +13981,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.969Z" } + }, + "1828935083cf996cff81aea1667dc9a5bb681eabb1001a486dc7de9c3d17be77": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.081Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.084Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.116Z" + } } }, "aff518be70e64a7690e4ccddb5d480073f10c95e3ea3c17ad5f290330ba897bf": { @@ -13246,6 +14005,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.976Z" } + }, + "afced390065bbace06e3ad3e7d262d22da585d3d52fc35e6d2659ce9d6f1de55": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.110Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.111Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.115Z" + } } }, "b02ce70d6dcff3632894b67e171d3cc1146833fe54d4b06011bbaa8c85a0884d": { @@ -13259,18 +14029,29 @@ "ru": { "updatedAt": "2025-11-26T07:24:18.977Z" } + }, + "16d290c771287aeaa511447cff48ba3f26790d6964ff9ef4e8d1df0086f94e4c": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.109Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.113Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.144Z" + } } }, "b0eb0aa22feb0a0e87aa525beba888ab6c811439fb42a8629b3439c190197487": { "f0d582626df8dfbb7340a088943ebaa56822080b63fa866b42e18086e898b317": { "jp": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.153Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.157Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.163Z" } } }, @@ -13285,6 +14066,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.974Z" } + }, + "9643b5165e89def525dc375e71c872c60a8f7dd711c239056b81159bc679dcbe": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.116Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.119Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.145Z" + } } }, "d865d8906bab480f2412b8134877a2a96913a3533480602839cb1425678255d8": { @@ -13298,70 +14090,81 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.968Z" } + }, + "9d65695564bebf9c14e110dfe0a95ba918be4e978cdc05a279d1f5d41bd4ee32": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.076Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.077Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.078Z" + } } }, "db1f6b413c1b5c95a7fe86857804d32fa0bf64bd126d0d1bb0a19d36642d1ff9": { "2a09e7a09ae046fb1bc7a86b262a2891822048befffff23b62cc68c9e7e58324": { "jp": { - "updatedAt": "2025-11-26T07:24:18.968Z" + "updatedAt": "2025-11-29T02:44:56.134Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.966Z" + "updatedAt": "2025-11-29T02:44:56.125Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.128Z" } } }, "deaf9da7af41c9dbd196870e7d946c2d92a2b4098eacc1d9d67ca6e552d438a5": { "fdf52ca20d97fc34fd94ada024eedfd00d77d9abbb0aed5df8411acf741dbddf": { "jp": { - "updatedAt": "2025-11-26T07:24:18.971Z" + "updatedAt": "2025-11-29T02:44:56.139Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.971Z" + "updatedAt": "2025-11-29T02:44:56.140Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.971Z" + "updatedAt": "2025-11-29T02:44:56.139Z" } } }, "ed51dd17995f6639353bb7c4089fa97d4f8dc7203bca3e26312cb31005fd949d": { "a382bedb279fccc3ac9fd5b4fe0ce9a876319b2d0652651cf74622f32f475762": { "jp": { - "updatedAt": "2025-11-26T07:24:18.968Z" + "updatedAt": "2025-11-29T02:44:56.132Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.967Z" + "updatedAt": "2025-11-29T02:44:56.130Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.968Z" + "updatedAt": "2025-11-29T02:44:56.133Z" } } }, "ef55ad557299e30ca7d8ccbe3f701f3efcfb9407e677358fda64040c88c2a0e3": { "b7534a46cfb2aba578904a3ead55b3a917dd6ea809c434df147c1f98e5defeeb": { "jp": { - "updatedAt": "2025-11-26T07:24:18.975Z" + "updatedAt": "2025-11-29T02:44:56.165Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.975Z" + "updatedAt": "2025-11-29T02:44:56.166Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.157Z" } } }, "f4e514c65ad19dadd6e36981ced2004e96119143057123e6f8343003c976414b": { "f9be206d9401669361ef8b3907f74e41604e01c3da770a270a3b262d0cf9e0b7": { "jp": { - "updatedAt": "2025-11-26T07:24:18.966Z" + "updatedAt": "2025-11-29T02:44:56.108Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.155Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.155Z" } } }, @@ -13376,83 +14179,94 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.971Z" } + }, + "0325309625a326b35142132e72492d62272031ba36d1a42a0998e56b1719cc40": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.082Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.083Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.115Z" + } } }, "025fd49fff3f320d5bf6441808dc379cdaa73f78cddd66059a1f1d989a1102a9": { "5cb5606bdf1fcec7d40bb07c9211307f195d39d691aa2cabd78b397dd79771c5": { "jp": { - "updatedAt": "2025-11-26T07:24:18.977Z" + "updatedAt": "2025-11-29T02:44:56.174Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.226Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.986Z" + "updatedAt": "2025-11-29T02:44:56.178Z" } } }, "1e4b57e276f3147467bca9c9b34ef7237444bbb31a33e9319c88df9db588b8ef": { "781ade8017e15eb182d04e5802e03ea4655dd91aa963a8d3d6d5e111348f2ef9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.205Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.981Z" + "updatedAt": "2025-11-29T02:44:56.199Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.194Z" } } }, "243d4d43037034f08f1c4e2b8b9dad2508192f28c9087e19fdb7e02cb828ad52": { "8945c696900efad4645c2f95b6f862201f4275bbed3998caa867b1ac37deb350": { "jp": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.232Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.225Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.222Z" } } }, "2d5ce469cb4fcd9ac57756723325805176514ce512b8039ab05e3fde56bb12a1": { "37840663d4e6d0f5bd1b9b294c2b0feff352bd6bdd003b973cd9e9e03ef04b2a": { "jp": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.229Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.230Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.230Z" } } }, "344aa60f54b872aa215951fce76265aad2f3f1d6ff8bacd50188b941ce5098c8": { "7a8f03b82b278bf1a01cbbd7ff1923941fcfc7239248c640ae1b2eec075f2bd0": { "jp": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.172Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.169Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.171Z" } } }, "53d65ec30475ca0007e7da32916549bd02696879f561f268e8e3a58c0dfe9de5": { "e1d20246377ea7703705aeea779bd04141833d80b87084862959aeb3e9a08c2e": { "jp": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.159Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.164Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.156Z" } } }, @@ -13467,135 +14281,146 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.975Z" } + }, + "aea269c29122c965661a61ed9e0de26050201cfa241ccd1b34c694f29cebaf67": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.111Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.112Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.121Z" + } } }, "5c4dcedff3da1da80fb63b9461c1c89223beee53c37a3b5a538edc528453f0b2": { "620bb0c22df1a23b2a8df3eb395373d44296904b0332797c29514f90a31606b2": { "jp": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.160Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.158Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.975Z" + "updatedAt": "2025-11-29T02:44:56.167Z" } } }, "719a6d655a54f957cec2c65e95d6651040b93a639ad6aa44861b85ae09c1c5c5": { "fafe4a083f40e8f75644ffb779bcedb7065ad373f06a042ecf2238313aeef393": { "jp": { - "updatedAt": "2025-11-26T07:24:18.966Z" + "updatedAt": "2025-11-29T02:44:56.151Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.975Z" + "updatedAt": "2025-11-29T02:44:56.165Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.168Z" } } }, "82b281d3017bb8cc4db38036df8fbbba3430846e468a784c1b2e6d4d8e43b6d7": { "617961c999f1bf6eb48c03b5f56f99b3a7309dba7bcdb74914b6a76f36a56413": { "jp": { - "updatedAt": "2025-11-26T07:24:18.966Z" + "updatedAt": "2025-11-29T02:44:56.109Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.977Z" + "updatedAt": "2025-11-29T02:44:56.173Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.977Z" + "updatedAt": "2025-11-29T02:44:56.173Z" } } }, "8cbea57ac40a6d6358183da1d28c1a09304c1b4a5edf96e2c4a808dc6773ba41": { "39a62a98184d3c0536249ba36e562c954047436e58e929927516fea5318e895b": { "jp": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.170Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.975Z" + "updatedAt": "2025-11-29T02:44:56.166Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.975Z" + "updatedAt": "2025-11-29T02:44:56.167Z" } } }, "940796a1aae864d0eda15bb34a302626f3ad6a2c1d3af60ba921316d95e81a13": { "301a0a16ec26f11dd9fb52328307087f8c2528fea166cdea553309d6e58106d4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.162Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.161Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.152Z" } } }, "ab91d27df4d8b8148381ccfd51e2bc9b99a1625ef08e73f1d9a0eb197e5397a2": { "a1465aea8fd40bd2a71567dcd05c6ce53e13c60e2ac21919e271ebe1b6782f74": { "jp": { - "updatedAt": "2025-11-26T07:24:18.983Z" + "updatedAt": "2025-11-29T02:44:56.206Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:44:56.191Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.168Z" } } }, "b7c59a245d47fd54f7c7477cbd498ba2937399586e98674be51c6a7c40b2ae70": { "410fd44fe625de2b185ba9098597ace5e062b1884403c90912660d14d188d9bc": { "jp": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.170Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.976Z" + "updatedAt": "2025-11-29T02:44:56.169Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.977Z" + "updatedAt": "2025-11-29T02:44:56.172Z" } } }, "d03338e91e1f725469cbc573d2b5a49c055fe39e67ab09e92b408e3e6dce3361": { "fee22f53b36f6d80c05058f7c0b07e16a2dbb531dbf640d90efae0a82972bd4c": { "ru": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.204Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.205Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.981Z" + "updatedAt": "2025-11-29T02:44:56.201Z" } } }, "e6adf4028e4ac7e7c24f84c4aa34ae7d43b6f397a67523ba3f4d24de317db247": { "93b602e423297a4fe948c7f19b73130ce3fb146f09d980aa1450c55a9055f392": { "jp": { - "updatedAt": "2025-11-26T07:24:18.973Z" + "updatedAt": "2025-11-29T02:44:56.159Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.153Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.974Z" + "updatedAt": "2025-11-29T02:44:56.164Z" } } }, "07567d62aae7f94a29e9f4d850ede3f6eec697596681ec8f0be305090388b473": { "781c617b76b44e877e7e119770ca6ecc45863cb3bae1a444fe8807d6ebada97d": { "jp": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.233Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.993Z" + "updatedAt": "2025-11-29T02:44:56.220Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.235Z" } } }, @@ -13610,6 +14435,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.116Z" } + }, + "3a8f100e338d722f8c4dbb2e623e5c4dc5a4d6f3bb6f2d5ba48737830cec8fbf": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.262Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.270Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.271Z" + } } }, "153ff0c08aecf20c420ae5dfa80993225532cf87b7d9c41e419a23934521c9a0": { @@ -13623,31 +14459,42 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.114Z" } + }, + "9d361fb3775a562cb507335e776089308bf758ae2747ae0957bd649d98faedc0": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.255Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.267Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.272Z" + } } }, "24d0c9c911ed73221e135198269c3368d046b7994b57b0fb624351b888e71a8d": { "547964d07a357f1d9316aadc7016d3943cece91207d0037cea7d08bb8914f5fd": { "jp": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.227Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.226Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.984Z" + "updatedAt": "2025-11-29T02:44:56.176Z" } } }, "32982205f1155c2c2e05fe89e04c9cd20828fb0a653c7c72c7da8d61c3253607": { "641d2a22f3cbbdbb5877f4694e0f7a70c2d4d0ea47aafe7ac478509d2f4bda90": { "jp": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.241Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.110Z" + "updatedAt": "2025-11-29T02:44:56.242Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.110Z" + "updatedAt": "2025-11-29T02:44:56.242Z" } } }, @@ -13662,83 +14509,94 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.981Z" } + }, + "86296003488064b48670c7fa1dea340b94da850eefa6ecaf62711f1d83875b93": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.143Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.145Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.146Z" + } } }, "38b350a818493921c30933efc9a00f13c8de2b1d444f825141d01c27a7c0dd78": { "5c8a7b7c41cedb9f12aa1dfb4a692603fdc40391fd020d73e7415f0890b583d6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.234Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.988Z" + "updatedAt": "2025-11-29T02:44:56.185Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.223Z" } } }, "769f4a7a3d111208fa74381508655c4dc5d7dcae5fe2808879e68d3cdc7b3382": { "489e0fb1db1004ec357920c6836eb4613ef37b11126cdd9c08bcfd3ba4aff449": { "jp": { - "updatedAt": "2025-11-26T07:24:18.981Z" + "updatedAt": "2025-11-29T02:44:56.200Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.202Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.141Z" } } }, "79e713eaf2edf1bc512ae5d02a7d5d250a9659ca697b83603287e03063cf76ed": { "4ae0bd2c9234eb6b17182e97f10042bb3a03df6b39a2c2156858ba7f8c5537c8": { "jp": { - "updatedAt": "2025-11-26T07:24:18.981Z" + "updatedAt": "2025-11-29T02:44:56.198Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.201Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.196Z" } } }, "85ba3aaa892ebfeca0dd4e9f91647080ae86a451c4f6a00a9725e2f2d8687ecd": { "b2beddd5e719b038a7b64dcbb0affae7ddf832501e2aa7fafd227bbe1cb45855": { "jp": { - "updatedAt": "2025-11-26T07:24:18.983Z" + "updatedAt": "2025-11-29T02:44:56.208Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.984Z" + "updatedAt": "2025-11-29T02:44:56.210Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.983Z" + "updatedAt": "2025-11-29T02:44:56.209Z" } } }, "8f1cbe44d3d43c4cea34fea884586e29908abcb748f98fa025ccc41b62e45d3e": { "8e89cf7d6f4105f746591f40378eb84bf4bf9932ed4187023e334efc47a4b281": { "jp": { - "updatedAt": "2025-11-26T07:24:18.983Z" + "updatedAt": "2025-11-29T02:44:56.207Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.195Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.203Z" } } }, "a094ce3a28e694708179862da79fbac7d2795b1716246328a6d1d45989e4d89f": { "01511979759628779536c4426b3446323cd0ba908ba9e69ed46eef6c4e519583": { "jp": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.233Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.231Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.993Z" + "updatedAt": "2025-11-29T02:44:56.221Z" } } }, @@ -13753,109 +14611,120 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.982Z" } + }, + "52272796a3ff10b33a617542859f14d9522e98d92a2f558892a1b3822e8ba86e": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.142Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.143Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.144Z" + } } }, "b28fb4d49a614d643a46b4d31f46daf5e9fe6cda08176cd2f5e078a055407bab": { "4108560a1744ad0710588b9cd75e007435917814d8b73b2316426c9d931d44c6": { "jp": { - "updatedAt": "2025-11-26T07:24:18.988Z" + "updatedAt": "2025-11-29T02:44:56.184Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.988Z" + "updatedAt": "2025-11-29T02:44:56.189Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.988Z" + "updatedAt": "2025-11-29T02:44:56.189Z" } } }, "b626ba6a5d5d3ea8fc4f8b1fbab4067c3c422e1f441d82656ea4e1576b013f77": { "d39e1a92c96f946e67f7b31e6fa41e119a9a923698dbf319033ccb86b70446c3": { "jp": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.140Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:44:56.190Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:44:56.183Z" } } }, "bfdad58f0ce19b8378572771619d14adf32b34da41695f420ad03ed4496197bf": { "c5d8b4488de9c51f7fa4c711f9885ca220f45c37ba8c7062bb02813316daa7be": { "jp": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:44:56.192Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.192Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:44:56.185Z" } } }, "cb1ba7289dde002c321160e758dcebe6637312272f6a21430a36ca8d2bd0457e": { "6d2f41b7dfc6a91c7ad657ff5eb668944436fee3888a6396625bc67d1726719c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.237Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.231Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.993Z" + "updatedAt": "2025-11-29T02:44:56.221Z" } } }, "cdbd4e3a0fcbd1a9915e133e9c7749b9e313633614596b23aedac6d6da31105d": { "184622e2d0685a2859808cd7eb92c85650ed8abc39d7a38af056d81ff2c94654": { "jp": { - "updatedAt": "2025-11-26T07:24:18.972Z" + "updatedAt": "2025-11-29T02:44:56.141Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.197Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.979Z" + "updatedAt": "2025-11-29T02:44:56.191Z" } } }, "dedecc80a24539ab5ef48968c83b54eb08fdd06c15720daadff55822ec0b257c": { "5da52f81a0a0c35a9810a8ba27a1945c10ef4931f047eff638a1e08016f6bd12": { "jp": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.204Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.983Z" + "updatedAt": "2025-11-29T02:44:56.209Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.980Z" + "updatedAt": "2025-11-29T02:44:56.193Z" } } }, "e7ff4d7fd0bd848202048d33c9e285c0b7eaa06b86b242461c43fe7e001d1b39": { "574ff1d32ed4fa6964c51389dc9f9d35f7a76cff9623137d2922ce0856a65215": { "jp": { - "updatedAt": "2025-11-26T07:24:18.982Z" + "updatedAt": "2025-11-29T02:44:56.203Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.981Z" + "updatedAt": "2025-11-29T02:44:56.199Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.981Z" + "updatedAt": "2025-11-29T02:44:56.200Z" } } }, "e83fb55099e0c1e7efe462a3fc836fad5d3f3480534f4512599d1bb0307a952a": { "00125ab6f5435064f526a97e752f345080fe710b1445d06711d4011db26a78f3": { "jp": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.241Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.983Z" + "updatedAt": "2025-11-29T02:44:56.206Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.983Z" + "updatedAt": "2025-11-29T02:44:56.207Z" } } }, @@ -13870,6 +14739,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.119Z" } + }, + "86d2b49dce63d0030956d9394380f458d82580fccf11182038c47ae25941e202": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.248Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.291Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.293Z" + } } }, "027f426455e0e6842638722daa037b778ebc144d4ad338fe61f0710ec20e99b4": { @@ -13883,6 +14763,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.112Z" } + }, + "c1078383e79ac339256601f181a193ab1979b13400901d0b702e398f5163d3ca": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.257Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.257Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.265Z" + } } }, "0819d9360d80872f0e20752e84412951fa413fcd532b41e457c8b552f0613288": { @@ -13896,6 +14787,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.119Z" } + }, + "d83c42928fec524182b7980ee07946e52ffe8f524b8943b83d109bf0a5e6b9b4": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.289Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.298Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.298Z" + } } }, "24d804d8ac3ccf43c75fb8b0dabf735d89f27625497f0d7acaf06933ccacda4e": { @@ -13909,18 +14811,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.113Z" } + }, + "9ae107eff975761568ef37cb2d50a6120d87504b7eba954b3c75987d6acfcb56": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.219Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.253Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.268Z" + } } }, "2e14d7ea42f23a61da8855e77c500092cd204a036888c976b84a9a6bf71b8eaf": { "1e988897ad46c538e51b835cd9cd1cf89a4e7059611c53ec91e71868db50124f": { "jp": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.239Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.240Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.238Z" } } }, @@ -13935,57 +14848,68 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.116Z" } + }, + "7557e28163d56959272cc839ee4219d9744ff724198372cda0479d4869f1c55b": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.217Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.219Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.259Z" + } } }, "52ccd94aa1e934784ca02ff91c16f3972d775ebf46b09dc38022536e439186ff": { "c395705e691a1be5ddcfb6d1b262f9a0dfd9470788de834bcb6fbc5d0d8f0c8c": { "jp": { - "updatedAt": "2025-11-26T07:24:18.987Z" + "updatedAt": "2025-11-29T02:44:56.182Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.977Z" + "updatedAt": "2025-11-29T02:44:56.174Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.225Z" } } }, "5564c05bb16d853324ac6b1bc9b36248c158160a7e1fbac14ae9b86cf5514569": { "ea348755a3baf8bbcd34194da4c4529bb44c7a9a402faf39e87b9d75135b0b81": { "jp": { - "updatedAt": "2025-11-26T07:24:12.117Z" + "updatedAt": "2025-11-29T02:44:56.278Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.117Z" + "updatedAt": "2025-11-29T02:44:56.279Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.118Z" + "updatedAt": "2025-11-29T02:44:56.280Z" } } }, "592a7f7d3a8dbeda07da824c065c0da9b3e247906e6dbf77674f6a63df3136da": { "2293abaeae3fe16820f6c7c9a37b91841e60a17efff63af19cb7a8d4a0eb2456": { "jp": { - "updatedAt": "2025-11-26T07:24:18.984Z" + "updatedAt": "2025-11-29T02:44:56.177Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.238Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.232Z" } } }, "59e3664663d669e021fbd29e32b23a365ecc37fceaccac1e3c9e74f070873d03": { "664e682e3d269a460d26982803f72d705695f346f7f43cd3b62de24703236061": { "jp": { - "updatedAt": "2025-11-26T07:24:18.984Z" + "updatedAt": "2025-11-29T02:44:56.175Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.237Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.236Z" } } }, @@ -14000,70 +14924,81 @@ "ru": { "updatedAt": "2025-11-26T07:24:12.113Z" } + }, + "7312a2f89d65b933514be67491fbd4c987461524ae097172ff5410ff3b41a21e": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.261Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.262Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.263Z" + } } }, "650407ab32a2947c9874bd0fc813344a1675577ba430ba4ddefb9497ceec4df4": { "ad334487bb9276e08638e9be4af54b1205755e694d6c1911d00059d8415fae44": { "jp": { - "updatedAt": "2025-11-26T07:24:18.987Z" + "updatedAt": "2025-11-29T02:44:56.183Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.977Z" + "updatedAt": "2025-11-29T02:44:56.175Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.227Z" } } }, "77307f3a7d1b826bb6622b0f3ffa4c1f7706494839393590234d7206bbf2be8f": { "017f574127f909641a3e7c014420c6954edb618ef3d438854515fd0f5dd1e298": { "jp": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.228Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.993Z" + "updatedAt": "2025-11-29T02:44:56.220Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.986Z" + "updatedAt": "2025-11-29T02:44:56.181Z" } } }, "914120dcc6c64903cecac105d4df906767aa83b440456a677f5192431cc83d6e": { "4af035b51000a041cbfd0989fe3c52f7370aaeec63d4f8ae146a2776b899fae3": { "jp": { - "updatedAt": "2025-11-26T07:24:18.984Z" + "updatedAt": "2025-11-29T02:44:56.176Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.987Z" + "updatedAt": "2025-11-29T02:44:56.182Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.224Z" } } }, "9c50ae2540822f01de38fd832846c44e0815140836bcf8df45e61a172e36831a": { "48e37702889833007771c8e75d0ebddc5a93b178a5f5ae6c2512d72beca89b15": { "jp": { - "updatedAt": "2025-11-26T07:24:12.116Z" + "updatedAt": "2025-11-29T02:44:56.275Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.115Z" + "updatedAt": "2025-11-29T02:44:56.274Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.116Z" + "updatedAt": "2025-11-29T02:44:56.275Z" } } }, "a1a93279f18aea8b2a8afde127dc919f6b9381d84fdb78e820af9fa87a4f85d7": { "8ef32573cad40bd5922dd07f6e65cb11c503497f1996866bd36c8bd70fdbb4a4": { "jp": { - "updatedAt": "2025-11-26T07:24:18.984Z" + "updatedAt": "2025-11-29T02:44:56.177Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.236Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.224Z" } } }, @@ -14078,6 +15013,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.117Z" } + }, + "ea316ef388947a1bd8b8ce3b019ab9377bd0b52bbf557f4ee29826ea0406c8d6": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.215Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.260Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.269Z" + } } }, "b1eb514e8efc1da765f03844ec981e8df30e9e90bffe8f559550b33fcb148386": { @@ -14091,18 +15037,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.114Z" } + }, + "fe5653fd0a01cc377763c0dd39db11ab651632c5116e8e68e5b26336f447b84b": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.216Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.271Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.272Z" + } } }, "c35229fb2bf6081a5aa25c5273a6bc76f7fb1f8586da22277f9b09cdfe9c161e": { "96b4bbf5cd710c7028d1dcff43630fc1346305b9fc31fd06b6feaa5771a11a01": { "jp": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.235Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.995Z" + "updatedAt": "2025-11-29T02:44:56.229Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.996Z" + "updatedAt": "2025-11-29T02:44:56.234Z" } } }, @@ -14117,44 +15074,55 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.114Z" } + }, + "624184c131264cdb4084e3b3202e40b83320cab7475a7b58e74d2b6244ec0c40": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.216Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.256Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.264Z" + } } }, "d88cb52cd1ee657459479ad84c5c952fbde653226d9799e31239473fa8b0fd23": { "fb9e79efbf3a2d62721e7f715f0699a0dc1f1dbc6e75db72c520ba3026346f5b": { "jp": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.240Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.110Z" + "updatedAt": "2025-11-29T02:44:56.244Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.110Z" + "updatedAt": "2025-11-29T02:44:56.243Z" } } }, "fbb5789352a952225705586e3f21b0e7e42cd17127fe8ed8e8ca218112140a27": { "19f784e7b489f48a3d495a2e1c1d68856626b21b4cedf271ef931452b7add1ce": { "jp": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.223Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.988Z" + "updatedAt": "2025-11-29T02:44:56.190Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.994Z" + "updatedAt": "2025-11-29T02:44:56.222Z" } } }, "123aeaa56592e54f31fc778623c345f09749d4e0e65e902af7d1a93337a425bf": { "f2e0676875f34dd5520562d2cd21b217af1b44b68311b6c948988adef7f432a4": { "jp": { - "updatedAt": "2025-11-26T07:24:02.777Z" + "updatedAt": "2025-11-29T02:44:56.283Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.285Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.332Z" } } }, @@ -14169,18 +15137,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.774Z" } + }, + "0c123e0b345e289824f7799b173b1794fb0e64b2d9bca74c9615d96f2d87b4b3": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.290Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.294Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.302Z" + } } }, "1f24f51d58cccfdaab17312855078466a67ec6632bf8534638b69f8f5f3551c5": { "ac3de3782a6dcd627cb900e0e3c325463324737e43db6385a4a9edbf6ff7796b": { "jp": { - "updatedAt": "2025-11-26T07:24:02.777Z" + "updatedAt": "2025-11-29T02:44:56.282Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.342Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.325Z" } } }, @@ -14195,6 +15174,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.984Z" } + }, + "56afa0eb5a088f7a9f1763feba7e0a86e58b5f20fd0b80d4eb17728b4ebe4e4f": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.263Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.266Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.270Z" + } } }, "3a83cb18dec6067fc17dcd4bf9d92d724df7894996965a2aa6ddadaa218d8377": { @@ -14208,6 +15198,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.780Z" } + }, + "246e677fdb1037560ce0f99220806100065ce49a0a719ec84b0ef40a87caadcb": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.320Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.320Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.323Z" + } } }, "4db1e2e4946307003f6c8e7296d88d16ea1fa0a50642705d3f4a2f6130b44a03": { @@ -14221,57 +15222,68 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.111Z" } + }, + "c65bebaf1409b6811c25b61ee9e1a29774f1a9a74497375c4b00bb9357be3fa7": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.218Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.264Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.265Z" + } } }, "573d715ca8095f0e4ca44d1cba02fd75a74bbc9c173567252833684110e7eed3": { "87c69d03f3d553568b16a72f5fe7243c7fbedec0f55aa5c55695e0895009d96f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.112Z" + "updatedAt": "2025-11-29T02:44:56.213Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.111Z" + "updatedAt": "2025-11-29T02:44:56.210Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.113Z" + "updatedAt": "2025-11-29T02:44:56.214Z" } } }, "6127321ac3891bee9f802edc9f97eeefd28aa0d40a647d0fa4cda55abfce14ff": { "d3499050f8c6e7b0a1bd1cf5e8bb8e940304335d153d81d9717b6c21c16c2985": { "ru": { - "updatedAt": "2025-11-26T07:24:12.121Z" + "updatedAt": "2025-11-29T02:44:56.306Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.121Z" + "updatedAt": "2025-11-29T02:44:56.247Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.119Z" + "updatedAt": "2025-11-29T02:44:56.245Z" } } }, "650d9f2cc9a940fe5940498f6e144305c01bbf36d3ee2dc4bbd8968c9f8967c6": { "17de42c037b1a363aacffaae4c43b7e7c471839ed6cecff05326ffc1616e8599": { "jp": { - "updatedAt": "2025-11-26T07:24:12.111Z" + "updatedAt": "2025-11-29T02:44:56.212Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.112Z" + "updatedAt": "2025-11-29T02:44:56.213Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.111Z" + "updatedAt": "2025-11-29T02:44:56.211Z" } } }, "6813da4ad4c4af5afb1c7574805fe2dd8caa6c96f485a82e9c901ef475f08fee": { "b0517d0f55cd108acdbbe709883cd25fbda01a6703d9b51ff50bd2116dae6e4b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.116Z" + "updatedAt": "2025-11-29T02:44:56.276Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.116Z" + "updatedAt": "2025-11-29T02:44:56.276Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.116Z" + "updatedAt": "2025-11-29T02:44:56.277Z" } } }, @@ -14286,6 +15298,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.111Z" } + }, + "8f32e4aae111f92315bc93e0ccdf602c223cf64f5840140b6501f1f14e174cbb": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.218Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.258Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.261Z" + } } }, "6fb070f1b02c940c98234a8aaec25f6c6469691d330c72faa861b07763ae4725": { @@ -14299,6 +15322,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.773Z" } + }, + "355de205d2e66f18b00c07141db16e3eae08111fa3207ff29e5d7e2db19cc526": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.249Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.254Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.303Z" + } } }, "9d8c420729f6dd40353fd0b37376eb59e28f1b3a71685df761a9e2ad46f35ca4": { @@ -14312,18 +15346,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.774Z" } + }, + "74b3411891901f287f4f0295c14cd3b703d6197988dcd91f4e53985964af404b": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.289Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.295Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.302Z" + } } }, "9fe9b6ce42a6ad2189bab2836ba94c9f99886df803b81bdc3dec38815dad7c26": { "2a6580470ab1e345d52a27c96f69c6e94d335299083f18b83f4f16b1913c6ee0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.775Z" + "updatedAt": "2025-11-29T02:44:56.312Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.774Z" + "updatedAt": "2025-11-29T02:44:56.309Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.774Z" + "updatedAt": "2025-11-29T02:44:56.311Z" } } }, @@ -14338,6 +15383,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.112Z" } + }, + "5db4f94f0470b0bb3fb558e3b1e3766ee12f80ad603da74665b1a15b3b16c254": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.269Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.273Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.273Z" + } } }, "bca19f630581f8646ca04081842168a1d45e2ea5896cbdbab33c160594c627c3": { @@ -14351,6 +15407,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:18.984Z" } + }, + "0e3c63c854cf8f55abf51be5d8395d72aed010f11ba09ea870f1dd42d4d16794": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.260Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.267Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.268Z" + } } }, "c7f475dc465af2e8a358403f37f7d9ab77fff25bfb2185434a3988227077f61c": { @@ -14375,6 +15442,17 @@ "jp": { "updatedAt": "2025-11-26T07:24:12.121Z" } + }, + "957fef1200e01d1d2a8bc6b685146a1418c4d936418ddfe9ecb18479516293d4": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.291Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.292Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.303Z" + } } }, "cf53b09fb0c34e1e63e41a10d6bc7a6922adc30f419e11b91aa28c4b6550ff94": { @@ -14388,6 +15466,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.114Z" } + }, + "b2680ed1949ad3d0db6340dcfd927b99beee508808edbd641c4f0f3589bb32ec": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.217Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.255Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.259Z" + } } }, "d85a58d074e13f650fae5bc844462e82b569a15037cf4beb81c7fc31334227bd": { @@ -14401,18 +15490,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.115Z" } + }, + "b6d6c294393317eabba321f888c00ac842ed017623140b48620c5b77ecf9538f": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.215Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.254Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.305Z" + } } }, "e014a958a8137fc765da9797a531683aae1075024018fdd2793c345a9ea2837d": { "a3692c0caea63dccb572f30b9f84021d898cc0b99e942bba8475e5cddd746e9c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.112Z" + "updatedAt": "2025-11-29T02:44:56.212Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.113Z" + "updatedAt": "2025-11-29T02:44:56.214Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.114Z" + "updatedAt": "2025-11-29T02:44:56.274Z" } } }, @@ -14427,70 +15527,81 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.776Z" } + }, + "51115dd7a55d295b9a3eb7a76ba8a295d6fcab50c6dbe15e410efebd02969067": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.248Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.296Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.304Z" + } } }, "02fec6942d40034d750c654d9c675a575f12b3a87ec90a6e3786281d265a9b29": { "f8983bc303673b5b9632c8a2f95602dd3f90803ac3e493ee4ff7244ea4b98790": { "jp": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.338Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.339Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.335Z" } } }, "0393512198efa57d46b32a113a35375ccd26518fa34d3bbabef4214d4fb8b53a": { "8103e61160aa52995bd2806ebc1f5871330feb5a4b2c8de0e9221fa8a70d1ac3": { "jp": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.328Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.359Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.328Z" } } }, "0c5a65f577c71fbc834405efc189e3c50da0f84a64b7f1b1ba76d9fa8e7a3e9c": { "2d31634c588cb2805bebfc13a4cefde978ae8d078f32a88954c1ee076a081d1e": { "jp": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.342Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.329Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.341Z" } } }, "0c607ec56978fcf7cc9280f736b890c5fb289db3ddfbeb737f9ed97fa79e3f05": { "c01c4184a1e5108e2ecbbc865220b88f0c11caf78ba66781b92ad690c80fa8d3": { "zh": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.356Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.337Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.362Z" } } }, "16ea5fa75d5d08e032a72f3d2f70dfde100b84192a3a87d58596c7a636e73d4a": { "08b83c6534ed2ed43f2e271298926bbac6bd7c4e552372271ab8f870588ce545": { "jp": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.340Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.326Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.343Z" } } }, @@ -14505,18 +15616,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.119Z" } + }, + "bc07f19137cb6dabf76e068e43903d8f0c0d4a5fd3ef5e4c48ca713d51eae844": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.250Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.292Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.299Z" + } } }, "3e1a6a2d9604853fec0f6b9c21e1534bc36ba5880d4042f71f1d9a03ff9e0c74": { "50a43ff5465e5ed3b333a2938abb5b5a0fe5d616b29d9f1176535339c755b45f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.286Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.777Z" + "updatedAt": "2025-11-29T02:44:56.284Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.288Z" } } }, @@ -14531,6 +15653,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.773Z" } + }, + "955b894f3bdf01356a56ddde8e74375c28f36a9ddacf9f8cca1d929b82dc3c8a": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.252Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.253Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.290Z" + } } }, "5be58ce97a5c915ff2d4f6bb0a603580ec8a37cc97e4e9b54ce41df65adbfd1a": { @@ -14544,6 +15677,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.120Z" } + }, + "8c7e75be7714da47b7c687d7067a073e9ba05d82b6595b598a376227cab0ee4c": { + "jp": { + "updatedAt": "2025-11-29T02:44:56.249Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.292Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.305Z" + } } }, "5eb08e96fd1bc79722d094e6a779abcf8a842d610d831653012ca3687bc9f9d7": { @@ -14557,6 +15701,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.780Z" } + }, + "a7faed462f96219d02aa7307ac7bc7935bca6700485c60f90a7438b05da3f66e": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.293Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.295Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.323Z" + } } }, "86002a1712dd0604dc6572e5d62e8b5302340810c0d6fb2d6a5457e65c731ba1": { @@ -14570,18 +15725,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.777Z" } + }, + "ef2543418d200cf81a07878edce91cdbee829490d86129bd3c779f48958f1b32": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.297Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.322Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.324Z" + } } }, "927c8bd22c5edb0ea1387b718e08b478ba16818cd5723ac48756552d7439254c": { "11b3f30b750a5e0956357a5f57ba8e702f81cf26a32d8a0825cee915379b0137": { "jp": { - "updatedAt": "2025-11-26T07:24:02.773Z" + "updatedAt": "2025-11-29T02:44:56.308Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.774Z" + "updatedAt": "2025-11-29T02:44:56.310Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.774Z" + "updatedAt": "2025-11-29T02:44:56.309Z" } } }, @@ -14596,18 +15762,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.123Z" } + }, + "c6165f3ca7b3425b951b4a1571401725d547adf52dc6626c445215fb9218c8f1": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.251Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.294Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.300Z" + } } }, "98c18fb7bc391069017a8197ca9b4b5c5a8218b2cc79f1210a3aba08ce470c6c": { "81814115cad79ea901cacf1a4876697b9b219a7ce07476d4edac8f5cfb5017fe": { "jp": { - "updatedAt": "2025-11-26T07:24:02.776Z" + "updatedAt": "2025-11-29T02:44:56.316Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.776Z" + "updatedAt": "2025-11-29T02:44:56.314Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.120Z" + "updatedAt": "2025-11-29T02:44:56.246Z" } } }, @@ -14622,6 +15799,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.774Z" } + }, + "6b17506439ccc3610f6d989dbfd30e8ceef573be8f80fb3230ad3a6b4a276542": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.247Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.296Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.304Z" + } } }, "a5f04cc970babcbd17a73219fd4d3f1d299602d839f96c355b2d5ca53d5cee5b": { @@ -14635,6 +15823,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.773Z" } + }, + "e965cf783f03102b23d52203220a90ea4ad4eeda8ea356dc2888850e3a1ee83c": { + "ru": { + "updatedAt": "2025-11-29T02:44:56.251Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:44:56.301Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.301Z" + } } }, "a6c3bc31e00e18f2175e34ff2c0292484093e1b725e792b68d1075913aa4dcab": { @@ -14659,18 +15858,29 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.121Z" } + }, + "8b70f77a580ae511ac0bf35f88454f6df63aca38b1be27503cffe5bd9b3b0d0f": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.299Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.301Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.306Z" + } } }, "c43792a75d02793708f0f9c298dd1e81a2db715e26bb86c9a3a5e14f34e785c4": { "76526beb43a3126f9cd6e8837bdfd7a2b5b294aba899560796a163b8963fb64c": { "jp": { - "updatedAt": "2025-11-26T07:24:02.782Z" + "updatedAt": "2025-11-29T02:44:56.348Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.774Z" + "updatedAt": "2025-11-29T02:44:56.311Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.775Z" + "updatedAt": "2025-11-29T02:44:56.312Z" } } }, @@ -14685,6 +15895,17 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.124Z" } + }, + "9b5a33767927dbd5b8d2768daa909d9f65bb2a2f716af808a8f3eb55f623603a": { + "zh": { + "updatedAt": "2025-11-29T02:44:56.250Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:44:56.252Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:44:56.295Z" + } } }, "e1bc67bc420afe0f3e7e9ad857f155267b70dd99307c6a46ab1d985186a0ca42": { @@ -14701,78 +15922,78 @@ }, "520ab775b334277fd5691012ee012e3b785025e0c7722d8a9b7554a5f3a04f2d": { "jp": { - "updatedAt": "2025-11-26T07:24:02.777Z" + "updatedAt": "2025-11-29T02:44:56.284Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.287Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.288Z" } } }, "ec512023c5c9e376d6b5a73b27c72543c329f1031a88df1142e318e852a6f5e1": { "e3ddcb697170bf6b9accf7bd9484665c071ebdf44c1609b8c1f4a6ae733dd1c5": { "jp": { - "updatedAt": "2025-11-26T07:24:02.782Z" + "updatedAt": "2025-11-29T02:44:56.349Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.782Z" + "updatedAt": "2025-11-29T02:44:56.348Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.781Z" + "updatedAt": "2025-11-29T02:44:56.346Z" } } }, "f411f73869f1597bddd3a69a70dcdf627b2f48802b68eb1297c49cf998a1d590": { "6c152f17b58caad6637a04e4d427aba059026b111c90e5aa764f040e05e669bb": { "jp": { - "updatedAt": "2025-11-26T07:24:12.122Z" + "updatedAt": "2025-11-29T02:44:56.306Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.123Z" + "updatedAt": "2025-11-29T02:44:56.307Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.120Z" + "updatedAt": "2025-11-29T02:44:56.245Z" } } }, "0bba267be6ffcbb62a544c365f5d2cd85d6371c78dc289e5697b0225352a76ea": { "95f85b7c7a43494a5f08ae259de69c8952afb7851b1d9a887ad3107d5e6cbc01": { "jp": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.396Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.361Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.372Z" } } }, "12f796f4ae9f25130a8cfc11aff488171e7376f25404278d4e5c173c8bf9ed02": { "55069f671a99d799cfd16eda4312b66b5a321376cc69b52c58ba054f313fa404": { "jp": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.331Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.337Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.330Z" } } }, "16c87bceec945d0aeefa7e76d421913b507e3b04716834b3894e9fd3174d2613": { "b43921e7c1caab150d19b0823696bd909b5e9b9dd41fe7847acfc9dabaec0942": { "ru": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.413Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.412Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.411Z" } } }, @@ -14787,70 +16008,78 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.780Z" } + }, + "7ac8d25006b0218725310bb4f50d2afa2fa76b42500a9587fca779027db7c47f": { + "ru": { + "updatedAt": "2025-11-29T02:45:03.376Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:45:03.385Z" + } } }, "2644c145de6d61cff7556d3efdff355e849b2f38b5c7912fbc2eb07360771f61": { "0e301628684a655bb2d5641c57775c3259b037ac338372d82808d6c91cacbd8c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.118Z" + "updatedAt": "2025-11-29T02:44:56.280Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.287Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.286Z" } } }, "2936efa9c627e5f00c7abc38b09aacea29a31481a83c21e719db82d0ba4eed0f": { "60b3bf0f8d4b00d715fe94daf3931f6351a0e38fe807946e5d1f9eee04425171": { "jp": { - "updatedAt": "2025-11-26T07:24:02.782Z" + "updatedAt": "2025-11-29T02:44:56.349Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.783Z" + "updatedAt": "2025-11-29T02:44:56.351Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.783Z" + "updatedAt": "2025-11-29T02:44:56.350Z" } } }, "337fa5ffda5b1ce15febb15e28d78f509b83dd0442c0eecb4e5fd5ad01cee570": { "8ad0cc19f45e168f3328286b8c922f25ddb3753ff16efc3a1795161778bbea66": { "jp": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.374Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.379Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.777Z" + "updatedAt": "2025-11-29T02:44:56.316Z" } } }, "3a39c3cb40c4a84e5848358c7bcda5a305e64fba4846580eecea963760143cbd": { "1a63ea8e13a6c3989444c8189eb5c95920d36ded548a2cbb106db39f91e17f56": { "jp": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.367Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.369Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.326Z" } } }, "3b2a0db3103ecc795ff82061e46875995689dee845c28a19697c2e8b7d78fb8f": { "84bf17e2315c270d4f26795807428c5ef311a937dd6e53a4b6f3a8e26bf5e771": { "jp": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.336Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.332Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.333Z" } } }, @@ -14865,226 +16094,234 @@ "zh": { "updatedAt": "2025-11-26T07:24:02.782Z" } + }, + "ec159a684acf88c327d88432ca1c26e16cbeb3306673c56da4f7747eee906117": { + "ru": { + "updatedAt": "2025-11-29T02:45:03.383Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:45:03.393Z" + } } }, "548882c1623ad246688470b47967ff13ad16868ecad4f09349b0182efc755985": { "76fc9813a272dfbb6dda3bb0096c7a2eeb3bf0a58d344e26c115c075a8cdf7d0": { "jp": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.377Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.375Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.373Z" } } }, "7d0d5bb4af482b39457517f498efb3ea46e33dd5a7cfdef6d18b2beb02e7dc2f": { "a7f9fe4cf3ef806d2de5eb8e1f83c674deb8224319845c32faa2c509b9f0d89a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.372Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.376Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.375Z" } } }, "819fce8b1343a94dee6cf3e428f8d46ff343c43b0d83b49efe18129ccf292430": { "af1d949b76a7c871e4cdce3092a3b2e2b1ea6afca4c4788054f8ff3eddde3ea5": { "jp": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.327Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.338Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.327Z" } } }, "8756460c34802f52ffc72c46fd775666b61d2134d4e3d1de0bf4111a5a049571": { "483cc85982240fd19d9aaf9161c58f6f4b1f2cdf226fb60169450e02caea8384": { "jp": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.370Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.329Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.365Z" } } }, "99effff387a3391b66ab69348b19106aa7ae02149e5cdda15d9bd9397ddf4c41": { "635055619056b153a2e20b6a09345d76348336b24340ba32f815de9c85a7f2b0": { "jp": { - "updatedAt": "2025-11-26T07:24:02.777Z" + "updatedAt": "2025-11-29T02:44:56.282Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.781Z" + "updatedAt": "2025-11-29T02:44:56.346Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.782Z" + "updatedAt": "2025-11-29T02:44:56.347Z" } } }, "a0698fed4f549f79afea06d1dac666b108eb6f5dc2fd3c91aff7c13f9d635593": { "7bafd49c863eb3620b55c3516c62d1d11ad2c81b1333e7396261c18b3d55cf9f": { "jp": { - "updatedAt": "2025-11-26T07:24:02.781Z" + "updatedAt": "2025-11-29T02:44:56.347Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.119Z" + "updatedAt": "2025-11-29T02:44:56.281Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.781Z" + "updatedAt": "2025-11-29T02:44:56.345Z" } } }, "ad1402ffed17fc7c6fda3f600f70cf8e3bbe5384d766081c16c2c90b4a775b7f": { "623f2f8c2f6006597fa106e18afad1304117a0a599684c3050b5f92f433dadf9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.369Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.363Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.317Z" } } }, "d6127c27c939a8143d6bd93d737c445238b16aea350cd52caa535082aaed407a": { "af21361ca18f3026c0fcb3b223ce74e7a213c2e9016d2f7596b5103f9f243027": { "jp": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.362Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.374Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.378Z" } } }, "d679b331b013310d0726e18cff38795d35a48a549ce862414366ed5d37b17a5a": { "6884d15ae61a9e31fa06e9f6cb793ec44513338525d28650cffaeecfdfd55f59": { "jp": { - "updatedAt": "2025-11-26T07:24:12.119Z" + "updatedAt": "2025-11-29T02:44:56.281Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.781Z" + "updatedAt": "2025-11-29T02:44:56.345Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.781Z" + "updatedAt": "2025-11-29T02:44:56.344Z" } } }, "f23d1fdbec8862f67bc4eb334787e78bade64fa097b14c338abf676e73a1ca62": { "0206d00d56a0c7be7a356c6499d1bc4c3b24602fe48380f49f1a8be277e30ae9": { "jp": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.341Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.331Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.343Z" } } }, "f5d22ca5e2a60035bc7b1c39046c553ef2238bbf8c611bd22963a3cf3fe67663": { "9a33263baf26f23ddc1d61444b9f0bc17fe15f0d44c6aa520661947f7bc28d34": { "jp": { - "updatedAt": "2025-11-26T07:24:02.780Z" + "updatedAt": "2025-11-29T02:44:56.340Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.334Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.779Z" + "updatedAt": "2025-11-29T02:44:56.333Z" } } }, "0d3a0a09b86406c2c362ede819ee030f9d92d058939579cd1229e361973022f8": { "9fc104791c743a764dffa282d540ca4365e02a6a6590d6c336de81ff7f63da24": { "jp": { - "updatedAt": "2025-11-26T07:24:02.783Z" + "updatedAt": "2025-11-29T02:44:56.352Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.405Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.406Z" } } }, "14364235369dc388419efc9e290886ddaa202d5023e8adc55d75a61c89fc336a": { "328695ec26f7fc60b0c8aec17edefe2b5cd222a635c116a01ed4259436be44ae": { "jp": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.395Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.435Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.435Z" } } }, "14a65362c725c7a0fae1767f0bdaecab08516f4549961fb82c9b0d3889476e2e": { "4b5208315e755dbc3f295c8a58958e452a782c2f41e4965b7aaafc2ecdf93523": { "jp": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.410Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.410Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.412Z" } } }, "181aa5509e2dd7724e3095fd6c0f17cf6fedab2635b9af1d57fe9d1e2801ec31": { "bf2760368d2fc3a4c455358f8872f13eb6f6e7b8ccd6d529c68dfa016882d216": { "jp": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.434Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.402Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.368Z" } } }, "5181bec59897499f787e1b509cc19c69de2efe0e1437cc2001f2c7dbe8022440": { "54af2191cc8de0b1a73c6bfeceff12420569139b7347df0f18a111a00cfa0d1f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.355Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.363Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.357Z" } } }, "59475ce3a8014935df370b01b5266883e7814a8041f963545d8edaf3119557f2": { "53cc67b8b0dbfb95e446a4d98d10dfc35a026203fad1b1a20cb6bf733faba4e2": { "jp": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.376Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.383Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.381Z" } } }, @@ -15102,962 +16339,962 @@ }, "d6c562ca4d62646ad4de68704867016d1f98e9422a7a7b9d1dab026eb4c410ef": { "jp": { - "updatedAt": "2025-11-26T07:24:02.778Z" + "updatedAt": "2025-11-29T02:44:56.317Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.783Z" + "updatedAt": "2025-11-29T02:44:56.318Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.319Z" } } }, "6d2c1d43528de97c8dcb1e3618555c13b1ee6ca0cec9035a38fdc267403c6c3a": { "a09b919bea9302ab3ba5a119614ec1de086c78f2af22957d06a895b8b1504bc9": { "jp": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.332Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.358Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.339Z" } } }, "84d27978ad24cbc0448dc0661dc1cf62312406d39568cc877e9bee6c04e93677": { "4120b13b5f03f7c2fd4dd243edcbc718d6bd291d7358050064f6599242eeca09": { "jp": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.336Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.330Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.325Z" } } }, "993eb4cbf451025e383f5baa954ba930c6f9ae51ff01592c72b8d36662548817": { "6397e782e35c68ed2849d7a8210eb150a2820241365b2424b92b3ac99815d60d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.400Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.367Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.398Z" } } }, "bc95ac30c6163794df098cb1c5b0c612d68e460c1fee0982a9fde6ad2158ac24": { "d710ab3ea85690006a2ba44bbff81541eaffd450228382acc7544df0e34c7468": { "jp": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.366Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.373Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.001Z" + "updatedAt": "2025-11-29T02:44:56.377Z" } } }, "bdea2c6c34b1129be3efdd889576a52c92a915a41e1639ec5331bfe00948aa9e": { "d5c5bd7080a73f05e45d4b278cac9e1b97c489d95a7c80a8edeeccfbc35abb0e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.370Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.335Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.371Z" } } }, "bef9b0e0b7b38c7969e61c98c564c4f45f4514c4992c99602befb825815d3fe5": { "ecbe5e563d38c0a661a9495fe8b3be6dea6041fe9fe0a6e674428f8d203f2c76": { "jp": { - "updatedAt": "2025-11-26T07:24:19.000Z" + "updatedAt": "2025-11-29T02:44:56.371Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.359Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.361Z" } } }, "c86c73e2e1466ca9839d03145d28d089d50433e69d452f195d963042ce89ac2f": { "f65f3977310bfcdd03981a63ac5b1d00c85b04cbbc5ef4d29c352006d88c1be0": { "jp": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.411Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.405Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.404Z" } } }, "cb9c09aa37313bf52611e34b607eaa3775f6ebfd79387f2120b6b2b2ed4b46e5": { "b033c9754be40272847cfcdbce3fd43701961388f8efc8698510876cb0c0fb40": { "jp": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.397Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.368Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.353Z" } } }, "d7bfcfa62fea0cd11e8181ebab38199db1c954694d8230c3cb8be3a89f91c476": { "c1ce68737a5260a794d17040e187ca291588ef715aeba34369597a7058dc2af4": { "jp": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.364Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.409Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.407Z" } } }, "eb4daa639a63e99d988bfe1cd009befb853ba7171f88047823ca4d63e119f46c": { "db3dcac7ca205ca613bb9129a98b90f70d1edd49164206d1bacd86ccbb885f5f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.409Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.403Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.401Z" } } }, "ece18ee5cf148911a064ac3aabde31461f3fa90405c4631fe64e67bf35b3df8c": { "babc66efa89a5cb73d9a68a0dceb5ae1559780502d074014931e6370f64030af": { "jp": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.380Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.382Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.379Z" } } }, "eec5db41f767e87040d1a1e1a235ad804968c2645819039af5e1306f75ee2ba6": { "3294839c4121817eb15af16f39ea52c308ef56de049782978aa71dcc4c38777a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.366Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.357Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.358Z" } } }, "fcac219896966a54530a8593af31aa0dd688a431b44e0f3c677722d49352eb30": { "764c0b5706ee7c8505c4e4a557bdfcf617fad088da12e5302081d2d0510f71a1": { "jp": { - "updatedAt": "2025-11-26T07:24:18.999Z" + "updatedAt": "2025-11-29T02:44:56.360Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.997Z" + "updatedAt": "2025-11-29T02:44:56.319Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.998Z" + "updatedAt": "2025-11-29T02:44:56.335Z" } } }, "febea1a8af326ccd97db3bc68c3ffe9b9d02860dfb6225e2ad85613d0fd14f7a": { "96025027a22efdcf22fae68b1f8666c6d43d7197ab56d27461b40b4566ccacf3": { "jp": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.381Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.378Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.380Z" } } }, "07413031937c2e03067e44df8e3cbca1210ee434cba21c6bfa6e51fe5d2f01e5": { "1e96680d8322f2acc44b5d97b8bff6f35462189f2158321fb5f3892804e98d6a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.437Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.440Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.439Z" } } }, "08048e81a0b10f6fc876c8e10e896bba823ef23c25b37974243d3ce6241e95be": { "fa7004278db4a71dffabfc42db57fec5a575fb3dbd7222d4b9792bf19848b5d0": { "jp": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.388Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.393Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.386Z" } } }, "184cb7accedb381551a80c780323d8467fa7bd7b87d916cb1c6e2e1927c800cd": { "20fbfd2eb1f5b24eda2f90fd903779fd0847f0d888d3b04f4c7e56590eff1492": { "jp": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.442Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.443Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.441Z" } } }, "1f9e1a47c221609e49eb77fb61cad9a84a56bdb680185de6655f77145049570f": { "d2bac435d9afc706018821f07927cba0b34f6719b4e95a2c242a869d2c00be3d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.431Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.384Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.386Z" } } }, "1fd11512dba8b586ce114f0a09f748f438a3592e967e6b26fdb70d49b49b5b34": { "528c254f1d39fc4b566d364735917ebd190685375530f8192104891def887095": { "jp": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.392Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.433Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.384Z" } } }, "22dec589b8fb9f267b747bb6c4caa91619a82b138da7ac22fafdf2a4d36dbe70": { "540a7500cbfe21ee07e22edbd55ff6af883a067d691b6301d93bbec754f9da7f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.356Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.355Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.363Z" } } }, "25a566b63d1b51f62e85f3301907bb9851c8e295092c6c0cbb274855aaf2075a": { "b194d71f6380d7cf9309e9c89f192bff2723d4c46d48e2aa2b48e736c874804d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.401Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.783Z" + "updatedAt": "2025-11-29T02:44:56.353Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.402Z" } } }, "2dc1b2de19552e6b04e43bcf12a339877b5cd1caa1251210fa995f871b2381a2": { "8023c7e209034ddbc60f9efb8a61b992915d01ab6dcdc5f5a0b08c1c7a1cf28a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.437Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.428Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.438Z" } } }, "356f390220f614f7e13052b738d6bac3386bcb14e99297bc57a7c7bf37c10fd1": { "eed67b4d5e2a37a8d51c1aaf6d8810650b97bd70d00122a88ebb97c212da9ee2": { "jp": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.354Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.365Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.364Z" } } }, "35c7bfba55131ad9d6116db29b6547a45eabafbca7d547b5501ea16d51eede3f": { "6a8e1ca55281999c6130ae572325abcb150b29cfd12ebe451133060b6c502a1a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.432Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.433Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.430Z" } } }, "43b396ef0d459a925fcad74ebe7dbd673c6bb8eab1d24fb377b596b6d6850d5b": { "83184a4d72d70281ddce4c2b92b731c5b7e8f98d6d6bebeedbdc0a053adf947c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.438Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.429Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.429Z" } } }, "4d4c6c8d13e7ac14a5f189e798e199562f2150ad644328ef3e5b7e6d397aacb0": { "7c2190f84db7a1c33916eca37c2632206233059ad999d42ac355995a785c5d81": { "jp": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.406Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.403Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.353Z" } } }, "5f7094d809fbf8e07ca4e02020e14a570a112a588701724679f8375a2bfbecb1": { "d84676e935f15fc8eda0f1c0db79ad9cef52b93ee23e53f9891fe1aaaa1180ba": { "jp": { - "updatedAt": "2025-11-26T07:24:19.002Z" + "updatedAt": "2025-11-29T02:44:56.383Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.388Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.391Z" } } }, "7c4de22baba4a87ac92a5d821ddef4976b0c230d25c52c53dfeac09fad83b108": { "6f7f34ba690c91122f3ae8820b83f342061fa594ff253407eb57463d3c34c326": { "jp": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.396Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.399Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.360Z" } } }, "95b82f3948cc48386b85537e6acf7fd6313c1898cc6cfcb47de65f3d618b47b9": { "f133bde7d530ef897396fcb59df2fc8c01b400e070c72c6a25647dfdb9a15538": { "jp": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.413Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.007Z" + "updatedAt": "2025-11-29T02:44:56.414Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.415Z" } } }, "9d97fe2dc29c4e251fff04450d9d510ccf9c2e831a0489dda3f038dcc1a6a2f3": { "e5572fcb5876d8a6b1d1de543d82369a494fcc0715dd6012be5bbf426e7ac03a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.442Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.439Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.440Z" } } }, "9e660b008ccbb63b66a28b42d2ca373909f19186af16b9c41ba664f7930e07fe": { "41b27ab4937c7b922d42316551438b4ad659c0ecc6b4fa06f15edf97230d1798": { "jp": { - "updatedAt": "2025-11-26T07:24:19.003Z" + "updatedAt": "2025-11-29T02:44:56.354Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.399Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.400Z" } } }, "ac6b549d962e823e381f2519f7e5e9ff23ec0d86da8d61b9555feb375c459654": { "0f0b86bed0cbb0312f32be51c009ca122e78f92ff738c6606ff98754fca7f43c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.408Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.004Z" + "updatedAt": "2025-11-29T02:44:56.397Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.407Z" } } }, "af7eb4d69ab4cdae0eb49d2ecd090def503798009a9d8e43c2370f01f9a1219d": { "048d3372a598f7a300c38f0ddefba7da299bf7d8ba7fe1a30bbf53fd7ec3546f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.394Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.389Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.384Z" } } }, "d613460c9b562b02355db0de5e4d5e795d93c8356530d72c4e6943e450e0cd79": { "21c14d0cc95de05e66c6024e0bc731b06c4934474cc10eeacdc8bce66de73868": { "jp": { - "updatedAt": "2025-11-26T07:24:02.783Z" + "updatedAt": "2025-11-29T02:44:56.351Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.006Z" + "updatedAt": "2025-11-29T02:44:56.407Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.005Z" + "updatedAt": "2025-11-29T02:44:56.404Z" } } }, "d79d5c1626358051641a02a5df10627db3ec1f8bfe82c284ecff6fc5d29ba24d": { "4b36bae2acf0c20fa2db7f654f8bc8ca933e4db7d7940a5c9c9a26463fe1a7cd": { "jp": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.389Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.435Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.436Z" } } }, "09892c5c8c7770850dc4f12c85271ef2eb4054c5c9c132e0c016cfae2c946ba7": { "dc7fead9cdbb478c71bec3f2d3de2e7f32d848c704aedac7d98e3ecb52061139": { "jp": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.465Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.425Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.467Z" } } }, "2fcab50b97bbc9aee5c0c03f5a35d374e8c3cdd3db10dc78091477c88a2c1277": { "0a0ef87ced393ab506690dadba9b95b3965777f4f3358eb4d004ea111fe10a51": { "jp": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.390Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.385Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.391Z" } } }, "326c8895de68add9af3b55b704f3bfc1105c0f592e4c66fcf4716d6ad3d6bd4d": { "67ed218e943e01dfd5ac6127ae3673f4c5704dc7e706fa765d94c11dd7f80e59": { "jp": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.473Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.475Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.474Z" } } }, "3aef4f3512c85d4057c69557fd85794d38328c9e61205b126b37d4de45a963e9": { "06d1c97a15302255ab6d9a474e72aa8993ccc93d6749dfd1e5e94970da469d29": { "jp": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.427Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.424Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.421Z" } } }, "467b72fd8dba8502decf3c42bc9358fa8c4d3014dfcfe6b42bb8f4dce198fd62": { "a67f1de09a8a84f9d6443a0df3a49146ce63494d30ed1c458b9929b32d5a4b7b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.468Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.475Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.477Z" } } }, "4a37cce1f00cda917ca47dd0a1a69934772f9e50b5150732050d2e9f70a019cd": { "f5d8080ef6746049caf9a9d8037b9090eeef2259b54e9f42ef3e6a135b796e6b": { "zh": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.466Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.480Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.472Z" } } }, "4e436a71846d9aca6f15dc8c5445f526f911657bccffd77d51b5a4689a95bbf2": { "1ada5cacc80d636b19794a43afd3d71292a74c9e3f3fa93f182b39eb84ad7355": { "jp": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.432Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.431Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.012Z" + "updatedAt": "2025-11-29T02:44:56.436Z" } } }, "625ac60abe1e4f7ce4df8ac9bffd1f30f906501c1b636c41e7dee039c1280348": { "eaab285929dea7d9ff8f319faad61a28e866d384a56d15e9eb7a2ea10d96b567": { "jp": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.387Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.434Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.430Z" } } }, "67c93fd175b134b8986f749e1afceefc6f06a4487d9ef161d2ea74e2be618233": { "5418ed61ccd90e17c44bbf1d4246b7b4344bcf595b331971dc74df17def6dcab": { "jp": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.443Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.441Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.444Z" } } }, "8719f0b66c142c6db2cf8773ebaddac3b3d310bd046ca6effa5bb15e73d1a00f": { "9c001ffc30fb8da63ebd6c0931ef3efb9ac209edc160ae449428bb65298622c3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.426Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:44:56.420Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.467Z" } } }, "89ea779c156a999fdf17c325da1e81dd07a635d696dfd5a115e631154d3dbb2a": { "ecc1acdcb21d77d65ebcdd760265565e99254e242903d6b4483da0a6b4a59482": { "jp": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.470Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.481Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.416Z" } } }, "9b137d113f115786a055cd8fbc160635ea3e53512ae73d845fd749380bc1f381": { "0e565f9a4b2a92384daeaab520393c6426e3c190a2625839b4ead735b7a693f3": { "jp": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:44:56.420Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.469Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.470Z" } } }, "a524ef715c9704a1e92f4f92e0b9799ff822e7bf9860bf751ae2b1ff9edf0afe": { "e0f8014536b364d9d9409cff9471107e76279833faca677b2ccf2c077400b851": { "jp": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.387Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.394Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.395Z" } } }, "bc010b67445245013c815d8c8dd2a711a400f2ac89689de6a705df179ad8c706": { "58a5d26b93b4269bbcac95ceeeb1329954babd6a907538f5319432f3ac4e6b22": { "jp": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.425Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.471Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.422Z" } } }, "c0ac70d88c31f863cc7a3f822cfa525fe69266c4bf831f94c2029759cb9726db": { "b931df20b4f6c77ea8d226087a40d67fa3ecf5f9d09ed73922e7aa8f8f763fd7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.425Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.428Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.476Z" } } }, "c58c920060a64568fe6e344fe00a5ce4d720ac37a93628692770ada830c5325e": { "4a343784a2e6508b5e218dd32d01eb13fe7c9d806b2cb07a5c39a775f7b2383d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.445Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.445Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.013Z" + "updatedAt": "2025-11-29T02:44:56.444Z" } } }, "d61225a37fe0c4d963dda12e6171915748b61bb4ea252b20fee7017863e0f8cb": { "e22f186111d1f322fd63ea2a2ab6b8dabcc933c9f1a1d547efbcaa1d9f78faec": { "jp": { - "updatedAt": "2025-11-26T07:24:19.009Z" + "updatedAt": "2025-11-29T02:44:56.390Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.385Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.392Z" } } }, "e59d25e659a24273c3eef05daa226fdbfb119134fc9c360fb8f10fa1eda0bc5d": { "cea9fed32032cdfb1fc07ee3fd025b189b279642029231324022cc8c275879fa": { "jp": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.393Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.011Z" + "updatedAt": "2025-11-29T02:44:56.430Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.010Z" + "updatedAt": "2025-11-29T02:44:56.394Z" } } }, "ebcf5c14bcf3f123a8337f0e4d01711d0d5350b19f8fceb4989ba4967a454d71": { "fcbe8a223dbb47bb59f5c3e6880beb175753d21025800e5178cb322086eb6eb5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.424Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.477Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.471Z" } } }, "f8131ef0252b8ff50e0e16a5c5a263d8c4c19d0d5eed0109ad5127d0b7f1e617": { "10eec051f15e6d2b7349c390f8baebb76014741ed3b8e31aa94bf797e786189b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.468Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.479Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.473Z" } } }, "57ad9bdcde77c82a8b9abbf11d3820f549bfb779a29aa35c949fd4b27ff2f01f": { "1e38948feed7f1b2a7b35c47b430e56f07e2438c56f10e45d636ec500990a43d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.469Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.465Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.015Z" + "updatedAt": "2025-11-29T02:44:56.421Z" } } }, "7ceb6e3c9247297b0f7f32b5bcc5fdd805490fb8b1ac4cb176afdba619355e4d": { "ac6e6531f103ea9f5613e39ee61cfcddac7133be00040a3d2577c40543aa27fe": { "jp": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.467Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.426Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.474Z" } } }, "b623b9673e0f28805a4afdfc8013cc9c06d3af3bc31cc33238b2d1a449d4888f": { "141f6e9d777628dad68e29e4db62adc7411f17cbe61f3611de81835eed95ff15": { "jp": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.423Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.422Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.008Z" + "updatedAt": "2025-11-29T02:44:56.415Z" } } }, "bd529fa629c3f10310f525658df96bc82a80d75ff52d1995cafe1e4b13e747cd": { "ff7e68ef737ee5b8e75daa40f60eb811c121bece05086608bbe25c6ac85d8715": { "jp": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.483Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.481Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.482Z" } } }, "cbd3fd46a4918ee9b9919e72d00bd7ce3d00418bb1705c843c677adb3e595a3a": { "0613ad7af0509f61658a0f7a5e17e617139bdf209f37e63f862416353f1241ef": { "jp": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.478Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.127Z" + "updatedAt": "2025-11-29T02:44:56.476Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.466Z" } } }, "e1167cae2cc6ec3ff98f99cc5fdc814c1613d183ffc5a294e5002a5c76629f89": { "bdc0fd08e9185e494c67e0405a76d6b5ff3f2a66fb66986f38ad9fb1486504d8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.126Z" + "updatedAt": "2025-11-29T02:44:56.472Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.479Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.124Z" + "updatedAt": "2025-11-29T02:44:56.423Z" } } }, "fddeb9c1bb988ad91fa2ab2fd48f16446790394aee1f2ea892b74b4703663d8e": { "40a994cb1728118007e9bcec1d1e95be3ceda608e471c1a73b546b7c438f8ebe": { "jp": { - "updatedAt": "2025-11-26T07:24:12.125Z" + "updatedAt": "2025-11-29T02:44:56.427Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.479Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.128Z" + "updatedAt": "2025-11-29T02:44:56.480Z" } } }, "08bffe1dc74222857bd9847a9079d22910222fbbdc1dd9975d3beb50f284f3ee": { "6ff985dd3eb042cd0776c0981bb360df764da84db1d5f50ba4c7bc2fd4394a58": { "jp": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.571Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.554Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.572Z" } } }, "3a9bf422a9a85629cde7696a05524d19ff37ff8a14e26aa9d363708d50ca69ae": { "3106e22f04396e24e2bcfddd311b6bf015d441abff426e8f3e45320a55f20c46": { "jp": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.577Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.581Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.580Z" } } }, "0b2918c33c54636514f9106c16c6353f3c90189cb35c245462f264976b158e49": { "8b5e41f784e6af3f274d3cbab3bb71a982e9a0b2df5cd5050b3f76eca71460f7": { "jp": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.576Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.545Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.548Z" } } }, "190291cbeb8e03da636d545882454df1f5969a43233fa8547a340888416e0d7a": { "1e21922b278cc488c7ca6142a0b58330666f67ff429c778024409f871aeca347": { "jp": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:44:56.554Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.561Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:44:56.560Z" } } }, "1dbfde47d0ccaf8fabcd5ad6a4296155b1b096aae0b5f8d17a8c1b756b2695fb": { "665e7928e61709a3964eb76535bc335c1bee18c8bc09733558199e232956630c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.547Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.550Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.546Z" } } }, "1e6d8899d944f96b533c9b1689dd0f3c45d1f4d88d4d1edd3d0cd126273c28ae": { "874433a820ac2a172772ed12a2a2e43d64d72b5fa3f8c9060c2ea70f9d9969b6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.551Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.570Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.550Z" } } }, "267616b5e710386f1e95782b057051b61f78cf2ab9ab90a87b76171e1110ba0f": { "526635ff55be813366ca95dd8408fe2713af702ad3c42ee3f6df159c36d7d754": { "jp": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.568Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.565Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.568Z" } } }, "3db2189c4ab253714a8026c40657f8d09c5b44880bacd30f5d37a00af55f0af9": { "2e5559b28181e920ab535b8433f1644911413cf5aad2b7f7f2077a2124cdb9a5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.573Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.549Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.549Z" } } }, "4887a31d41443a8cec80c653b5cb1471ad7101392e2a0fd85344bf550b4479de": { "5d542d21d2aeff7420ac405c3efb0280de56bfcdabe3edfdeea55aee2ee0816f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.548Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.547Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.546Z" } } }, "5e3e9bc17b90a0989880b5acd7291677843b0466fc3c36993015c0a7331f4c86": { "50e422154e7d9340b9ae3e608a02ad691373881011458d12ee9329b251e2ee21": { "jp": { - "updatedAt": "2025-11-26T07:24:12.158Z" + "updatedAt": "2025-11-29T02:45:02.118Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.130Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.583Z" } } }, "6820315a7841bbc8c89a60ac5aa8c0fe4457e414cad746f3bed1650c3f297bc6": { "6d8963200cc850f442fe2995954f739d20436c4a7fb4b2ec7f8a636bc53779a7": { "jp": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.131Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.570Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.578Z" } } }, @@ -16075,117 +17312,117 @@ }, "3b63277eca58a6be86961cdf77d03b10bf3995740802c612a1fe8d80ea7d20ea": { "jp": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:45:02.120Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:45:02.121Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:45:02.121Z" } } }, "e0c7e0ffde8dc72698165f5f5a97336beb9082111bdd4a6c98f10c02ab69cd27": { "1bd7f94ef79ae4a259d5eb60f577fdcaa8d2926824240d88238ffb4e9d917715": { "ru": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.552Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.574Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.575Z" } } }, "09967fd0502ac05bc286aeb301c2cc87873b2a18ef14f3e2acde54345b2ce839": { "ced484d2a382f8655c9d000bcfd985aa94545bc671aae3824c264e06b17c1fb5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.283Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:44:56.555Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.280Z" } } }, "181adac272e2abd83cc757fde65fb79cacfbbfdd22c49560ad9938dc95ca360f": { "6aca92cecd7097cb7ee90b10d02efba74d48a3de1843308bf7b14b842592c336": { "jp": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.562Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:44:56.561Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.569Z" } } }, "1e8da80bc94e12875fbc8b4285abd87a9ebc00408979ef39716bb53ce4293704": { "cca901fd78a63bb4eb045aec0ee20699b9ea63520630a96e5bc254085761c479": { "jp": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.279Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.281Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.279Z" } } }, "28af1868b1ea9cdd8d1446f03dc1a91a48ed271602879f18d0d3211752aa2e0d": { "38f892b234c9e0a9d0e3e6bf087768671979427a8bbaf831e2c0cd94e5730d2a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.284Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:45:02.288Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:45:02.291Z" } } }, "352b7210abed12f4834ce3966861f5819c1b015976a552f4d8f3417367d6519c": { "aa0583b1c517ae46447bcd58d7475ba0f4350a3b5974cd1a472f07e84ea2b12b": { "zh": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.151Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:45:02.135Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.595Z" } } }, "3e04e93b41ef14736c12d8caaaae2fd7c113b2b4ab71ad84553b87b688b2ce7c": { "44da72d1f89df587a02ef24e707acb1da8350d35e7f7a73fc92e5b863e479a62": { "jp": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:45:02.290Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:45:02.289Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:45:02.276Z" } } }, "3e44364087b9660f0daf48e77e2d51e82485581dd45ba3635100c92a48f5cc81": { "32a51ef86f8ce4d5a89c21ac07056345cd0ad1dcf0c3eff8343941896b7a8a62": { "jp": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:45:02.123Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:45:02.123Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:45:02.122Z" } } }, @@ -16203,78 +17440,78 @@ }, "f1f6c6ba727fcac4034e8e533a8a14914f296de5811f8ef69aaccc190ed52c04": { "jp": { - "updatedAt": "2025-11-26T07:24:19.020Z" + "updatedAt": "2025-11-29T02:44:56.556Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:44:56.559Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:44:56.560Z" } } }, "56a2d0968dd32b192f6e6833bf129bd2a1a73e16d498c9f8a64c8e8cefcb7635": { "85317ab67c21185490c8ce6da9f40ae75c6aa792d046b52122da1555de6a0d7a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.564Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.569Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.565Z" } } }, "57fb93819b163681fc7674df87acd51d16808daf3c9a80875363e714ab6b6f0d": { "589fc5521d34b691619a0775483550005c0339c397f9c5eb2ad84a68d38fc0c5": { "jp": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.572Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.562Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.564Z" } } }, "5f7acdc3b5ad3c4b70f2e0f6421eedcef49bbf5fe1541b93de796181d282e3f8": { "c3b3c36e1615ad52f46683413733ab6deb9809b9216880d962f14d2b316e6812": { "jp": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.579Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.582Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.130Z" } } }, "720286aedee663b0895eadfbb8c855cf28e8c889a5c1e959eba2cb56410fe0ea": { "8b424c806172df3664b5a02f66fa091e75d922eace7c6d17ab06a1cd4d48ded0": { "jp": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.563Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.571Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.027Z" + "updatedAt": "2025-11-29T02:44:56.563Z" } } }, "72359f73659f510486d116f7315a779a8e182fd9217ec98122618754e8e8e523": { "b7f70662c0d64e5760316e2f601553929e92b4cd5b7d382d9d395b743c0236de": { "jp": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.133Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.159Z" + "updatedAt": "2025-11-29T02:45:02.119Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.131Z" } } }, @@ -16292,260 +17529,260 @@ }, "13a75f2e1510d071925413f0a9794c0c5df227d3f3007ca6a25a865fbf3c7afb": { "jp": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:44:56.557Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:44:56.557Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.026Z" + "updatedAt": "2025-11-29T02:44:56.558Z" } } }, "a27f8d321849f13ef579bf79bd9fb504adce87fc32377cb34f1d87d0247b62fc": { "0af225620d1128bf2b7b6df1fd290b2f9272232c08e057bbcdddcb8da980d877": { "jp": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.580Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.132Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.133Z" } } }, "bf4aa8d8478e9cbccac2af56a2392959e788a6b441ae1d334d378fe41c813431": { "03be8e55e0b7b3239928d3c046bcafe55731c78e43aa66ee2a92c237cad32296": { "jp": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.584Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.576Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.579Z" } } }, "c6f8d4ed5ef7dc56f976117869cc7a69922f064662bcdd47f24b593a903bb511": { "66256e49527646d9c1360a5db02fe360c867281e0fbebf9751bf3d0a5e4e0116": { "jp": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.566Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.553Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.023Z" + "updatedAt": "2025-11-29T02:44:56.574Z" } } }, "cf5cab052feab37e254b75324c3a852334a8eb3c58db22a1686c9494d09f443c": { "d809412f215411acf69b12810108cd424016766dd4d30a992351f8e69bf650e3": { "jp": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.553Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.583Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.158Z" + "updatedAt": "2025-11-29T02:45:02.119Z" } } }, "d9f334133320c651967d1b5b665ba9cb709fe4d09178893258245d70b28c5b25": { "ab1cd75a382114032d421c93d59ddfaae337e9528e1ac6b02cc19764422a2124": { "jp": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.285Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.032Z" + "updatedAt": "2025-11-29T02:45:02.288Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.282Z" } } }, "da0fe2e9eb4d4168fde541e5a4aa216882f11f0fe02c65758804bc42306051b7": { "460c5141199908b2fb1f8ada87d50d25899e1061548dd77278916ae9f0194eb1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.025Z" + "updatedAt": "2025-11-29T02:45:02.132Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.581Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.024Z" + "updatedAt": "2025-11-29T02:44:56.582Z" } } }, "e1c1bce938fcd121a541dda56b44194cec991a3c399320d28f68662d4f2aa155": { "ab303b424478e35d2600d95fd49a29737cadb6308b63d04e43f98d10c38b5cd3": { "jp": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.283Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.286Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.282Z" } } }, "fd5ff75cec53563913c25d3a84cb92ca6b7f928115d7912cef78a22dfc907f29": { "ba4164cf48205f79abd50e8ce1180feb106ddcdda361d67fbf580922f1a8bf3d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.552Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.021Z" + "updatedAt": "2025-11-29T02:44:56.545Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.022Z" + "updatedAt": "2025-11-29T02:44:56.551Z" } } }, "176d0068a5182e14c24f7b86a941e2993dd5d5375dda5f359181472f50bb49a6": { "3c0a49ce0175e9ffb151adc18ac51e16f2d58c189a49b071eddff19741b2773b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.595Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.593Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.598Z" } } }, "2fc9ece7b731c86425713493bf6fdb0053ccce96ffd9f63a70eea4019cdff660": { "547949490f707e9c4812b2f1acebb85c8f7858c6f4c8d030784a54ffa0f6764b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.146Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.142Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.144Z" } } }, "356a5236e325bbd80f92c622b5549c7f59c011b169fdc94f7b59ad1948f64d59": { "32a464d65d3033a6f94c395c523bdf9d52473033f37bc7b58a4c7d5a3374d78c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:45:02.140Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:45:02.140Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:45:02.141Z" } } }, "4dcf3a152974b0406b6bb68f5b1c541fe9249595ec4170e386cdf67f9e97d6c8": { "144e0319e32e38db32a1efd639ffc72bf732e5ea7b5d6a3d0883a97e4bec0cf7": { "jp": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.150Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:44:56.601Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.596Z" } } }, "512bf2a261651531d1f44db97f0e2477f9009f4f748fece66e5ca2554439601d": { "f65ce8822ff0abf42d5c376dd8120812baee55885d0c7b7b65bd770ce9d25050": { "jp": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:45:02.141Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.148Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.144Z" } } }, "65955c38f425b134d13cac38e2564b302a84b647113466a30fa84df4625f2aff": { "e5d27d0981cb097f6f8db2c3366ef654946ffdaba0ea5433e234e0200fed3d99": { "jp": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.596Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.594Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.593Z" } } }, "70760b9ea84a1492768f54f60022928ceed80c33ef8d2cbbe522324f7979123c": { "5172acba2103f95752ebbc8f74579f1012ec0e81bba84d6402deb3f9ab3b0bfa": { "jp": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:44:56.602Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.599Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.598Z" } } }, "832f10a64dee00c5573ad8927271c0f08e6912344a6142b218901f374557d6d4": { "c00fec44d98d20ecff726432315131e9d6815d1bc6d528bba1cbde655c11121f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.278Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:45:02.202Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:44:56.578Z" } } }, "85aaa20028d2fe29973bbd19c0fe7f0bbf9b2028122048baf8aa80c366fa2134": { "3e3cfccfbfc2a9aaaa5c073111f54d43e1d4a01447a2fdcb70bbf2ad0fa40c15": { "jp": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:45:02.277Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:44:56.575Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:45:02.277Z" } } }, "8edf9e4f287ceba4ca2d82f14382e035360e320bcc403a4bd0ffc3569444e7f7": { "0210849faec51fc728046caa3f03b71304bb9c646dc07169ab1c6d9e340a0aec": { "jp": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:45:02.202Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.567Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.573Z" } } }, "9c07a7cf8bf10809ed5421b224c9702d1daf802a6511bc28a61380182a3cba5a": { "4e8ed6a1feb2aa52a5a2a4588b3ecb8b8ba68dec83a27b9280790c81f51a60e4": { "jp": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.597Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:44:56.602Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.600Z" } } }, @@ -16560,31 +17797,39 @@ "zh": { "updatedAt": "2025-11-26T07:24:19.030Z" } + }, + "2f0734e7c9a31840e186f5a334fbbbc73d1d52db49e8bbda9d6d1527b330a0f4": { + "zh": { + "updatedAt": "2025-11-29T02:45:03.392Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:45:03.394Z" + } } }, "b39b9077d3c9edfb0122eda19c18f981a977ba3d4b35e87ca4e9808c93c00357": { "c4806c1db71a5a0e8cfe750303156d37b0c67170fa9901e7e2fcd40bc40df990": { "jp": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.566Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:44:56.577Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.028Z" + "updatedAt": "2025-11-29T02:44:56.566Z" } } }, "b57ac847efe3da698e4e7e930e7c66f735f45e722a25a0fa39bc6f7bfcec60cf": { "9c431dd0d8265db20267a05a0e5cddc327c798c7acfd1be5071f066d5a7aee28": { "jp": { - "updatedAt": "2025-11-26T07:24:19.030Z" + "updatedAt": "2025-11-29T02:45:02.280Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.287Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.285Z" } } }, @@ -16599,1006 +17844,1017 @@ "zh": { "updatedAt": "2025-11-26T07:24:19.038Z" } + }, + "a9aaf3d0acf90c263febea571cd562058a89cc9ae231894d698d45f35f8a8089": { + "zh": { + "updatedAt": "2025-11-29T02:45:02.135Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:45:02.136Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:45:02.136Z" + } } }, "d6df5c4a34d83a6b139258c32c70c202447dbb8bd299cdbc95f1a4df8e0183c4": { "cc987465957a6c156c8cfb8e7e1f5591232ce2a233ba2e10cdaa0502c5170fc1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.149Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.146Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:44:56.591Z" } } }, "e8326b6e3e229b53f7f7616dad224e62d5aabc8c99d1885fa0b294be36436442": { "e0c19959bdee8150958356d19999762296868f26f8c58d573bd31ee946774713": { "jp": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.150Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:44:56.590Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.147Z" } } }, "f6456b0e678701e28c6a4e322798fee754b4c6d0f806d50583a4b3bd2c244c77": { "b8b48f150dd2033fc11782fa83bfba12af99e2588c361eae29e969d7df966696": { "jp": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.144Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.145Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.143Z" } } }, "581431969901be3a99a89764a4cd843b136cf34d9c36a58c385d297bcf0b5576": { "848b4e2ed1094aeeb74cb89d7d3f155262e075c04ec6a136f164406460b1c404": { "jp": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.142Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.148Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.033Z" + "updatedAt": "2025-11-29T02:45:02.141Z" } } }, "90b8b253ec086b1363c721e07a29dbd20c3e79932831c40618a9e15eaed1259d": { "558092fa5958f7bf2b9c27c89f455619f6ca6f3513e83b59425458536609e8ef": { "jp": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.592Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:44:56.590Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:44:56.591Z" } } }, "b22d1260a64a32ed7c646aebdc8304e5522445a10e936e31715082f3976c0efb": { "0350b0c4a0edef07c101045887230f235288aae9414af376658d84671b54adbe": { "jp": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.145Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.592Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:44:56.589Z" } } }, "ba3d45a637c836f2218890eff93fee4103508fa1c470944799207121717e02a5": { "f3fd1aa8bafa81bb6a7e865a5de62823158a0afcc7ff7586bf136a8b47ee3a88": { "jp": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.147Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.035Z" + "updatedAt": "2025-11-29T02:45:02.149Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.034Z" + "updatedAt": "2025-11-29T02:45:02.143Z" } } }, "fb6facb17dc3579b44508a305bcb4895b64ecd0ac72b1f50f97559b26bc78b2c": { "ad02c360d5787e1cd581329efbb507dd02fe16448697b4344569b5bc44e930ea": { "jp": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.600Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.038Z" + "updatedAt": "2025-11-29T02:44:56.601Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.599Z" } } }, "035ee5282a6d20879fad6bfb6f79b4341721a15ea3c52c10046b1dd3709aa16c": { "58cd6998f41fdded6a804039b2debea7d2278499d73c45aac0012b7439df220c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.174Z" + "updatedAt": "2025-11-29T02:45:02.423Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.421Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.174Z" + "updatedAt": "2025-11-29T02:45:02.424Z" } } }, "26fd7d38f92eb5055170efb295d4a4f87a521a38805a47e252302040001b2050": { "6311029c9bad9285962dc8c797429aff225c5d236c038434dbd0c88cfb8a7048": { "jp": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.398Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.415Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.402Z" } } }, "3f43afba791f6baf15364b9b47e22c85a9f1b3dd6af0e12ec732f9dcec39457f": { "1dd4bcf22efaf403e36fb2a77e769a0046ad25b9ce5480ba0ffe16c707a0ef4e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.458Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.416Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.414Z" } } }, "645f7fd9f0334b6f31287f3ff16746bdf9b9befb1bef269261f6079af9ff22a2": { "4cfca9fae37346c2e6b247de1cc83bb1880d5d141f5ad266dea6ae52b8cce258": { "jp": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.413Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:45:02.395Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.454Z" } } }, "870cee0b248ecbcf72715dfd0eeb85ec9af5efaca8d3edcf0fe8c5264910fd76": { "31443088162bd3a031a32984a7f4bfd930cc979d324a47439b26f35ddd40c4c4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.456Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.463Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.448Z" } } }, "87cdbf09a8306f33d341ac3e84a3332c186b170f3eaade4500b0517c76c52c33": { "27bd6d01dce2d6441ee156267183789fdfad03cbf3cae1fe51042763a3ae5190": { "jp": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.416Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.408Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.422Z" } } }, "03d4f9de31c6bf8adc70ca8cc91ea13e8e9e9c9401061a886ff406f2ee77507e": { "31a8fa488c7303d5b196d590f58b9ffddcbbaf82dd7d661a3d06b19f60b7ddc5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:45:02.438Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.473Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.495Z" } } }, "185920906ded891a9d2e00cce1434c3336837203f6a4afa9c0afd1752f259e14": { "fb5ace8ecf41cd7a84a0650f9d96ead8a0c11e0b73eb701d4b8a50861ed41f3c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.457Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.403Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.411Z" } } }, "3b5b38cf7b3fbbf741ef360cdeaf09b58c18acb3ff66337f95d902be5f6db59c": { "b37e005c51f403fc9b37bb6c5b5edef44101e2fc840f20186238b36701cc8e6f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.455Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.460Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.409Z" } } }, "3bc42dea80614a09ae6a300caa882b3109109bbf2c1ff3e4a3cad15872847cb5": { "90eb1bd6cd2087520e2d3b6a42056c3549761f9a48d001c400844b96b08b2d5e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.455Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.456Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.452Z" } } }, "4864254e07b5f2ba04547ffdc42c9fa734db92774140cb47efb6c312ff52493e": { "6dadcbfab042a7bcad0c4076a815d1b10666957ab124f50642fb026d185c6859": { "jp": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:45:02.397Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.407Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.459Z" } } }, "4b4055e2a3996b0cc1db8bb8b7f1a428a61fcab906f4eb7fc9e8525523570823": { "fe2aceb75f41309c99fba4ee2a1fcbdba1e53d1591a97e9fee22b69867854012": { "jp": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.472Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.502Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.501Z" } } }, "4c57ae2a858123d1bbd05031233c5f830692e6ff38484e60425dc1e644619e86": { "ac07bacf3135df09429ba59c3085014c51cd2dd6322c81c9cf515a50ac42020d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.464Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.464Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.463Z" } } }, "5f4dd4a5e3b9c2038ce5d97add1c57db4cab04802675890f9a71c7e24d65298e": { "54f6ee288acad5771ea6bb244846d3f7f6f97153a3e95cef843610f79d82f51f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.412Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.402Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.448Z" } } }, "8c9ac06d9f96470f385b45eb7382ea57d23824bef86ddd9dcd04eb31af945385": { "8fd53472854410898a96195caacb583e709b2c67f304949a81fcdc9a6ab77a22": { "ru": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.454Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.452Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.461Z" } } }, "96f086ac06293e9e587823d8e326b7bdd10741ec2cca41ecf709e6dfda01a137": { "8cde4367a08c4c85a443e691e36a03de277bcadbc7b5b8042f83da242fb60262": { "jp": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.450Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.408Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.447Z" } } }, "98763ad1765b4f7ce59ab7c28c03d9f16eb7ba20340f1fd72f141425b73dfcda": { "2b4ac034aba018ed0128e4b4b5e46817e96795dc002eb687680ef694d17118a7": { "jp": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.415Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.422Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.418Z" } } }, "a1f67d04d8c6c016319715cd37f1aaa7fea045040cd960873db250061b59677d": { "c042f748c77a461dd754ffe542382a34bd504df511e412aaa671006d2a6ce920": { "jp": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.417Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.418Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.417Z" } } }, "b6e6ba59aea8d42356d10f15f3e251c9ecdf84b70f6b284cc535f8f2715be871": { "78c8f7d218a9c211659cb2bb3308ce5d14d1718fcdc5e47d42d5c5f55050e6f9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.174Z" + "updatedAt": "2025-11-29T02:45:02.423Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.420Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.419Z" } } }, "b96f31274279db19ee455ef4a211f35232718d535097413acc9e87b2c16cdee5": { "d1a30df1933d77a7366535efca514780aa4f237e66085e619643f85b025ea495": { "jp": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.406Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.449Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:45:02.397Z" } } }, "be5bae686c5d8c7787f030404d9391d2b796570ebe3949ebccadac637ae696ad": { "aa76d4c663800697eb6cffaf9162ddacf8d4a6e9e85ae8732672b1aa668497b2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.421Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.380Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.173Z" + "updatedAt": "2025-11-29T02:45:02.419Z" } } }, "c61d725ce51260e373784d5a559f17b1c985d873f35f4f40d34e5dc3c9d30214": { "164319294d8a4a2d8ae935edd6e5941fde821158fce1cb0fdc3c94aa7eba994f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.414Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:45:02.365Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.410Z" } } }, "c9a3c995b2d1f1da16df65c84fc5fcd7d61a80112b46a37925da4d4c5cdfec2c": { "fe45037d34e9b052151f9190e1da1d3bf5cd89744c552cf345b160f37129f8f8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.462Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.459Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.462Z" } } }, "e87d7bb771e6e969df1f4f17a2cea74b1703104f920ba5110ee4c2bc95819b7f": { "c626b9222d67c0a16c11e25def509ff96d4a34afadbccdcc1676284d3fb3c55c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.059Z" + "updatedAt": "2025-11-29T02:45:02.367Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.379Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.409Z" } } }, "f366eb4cbbf4ae87e0ea8145cfd5006bd57589104335fc046ede417d016c390d": { "e26bd50b67b6a44512d1f83c42aa88dd3b0ee7eea44771e913a93704b405e585": { "jp": { - "updatedAt": "2025-11-26T07:24:19.061Z" + "updatedAt": "2025-11-29T02:45:02.378Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.410Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.062Z" + "updatedAt": "2025-11-29T02:45:02.379Z" } } }, "0dec45ecddb0d4b9ff3311f5a670eaeb053be15ec02969e2e3cc776a6771ff5c": { "77a1b67ca7c88505859a9611495e54062c95a3d5051d05c9862ba6120252576d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.485Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.530Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.479Z" } } }, "1345e1194d63be447e8235ac3810d70f7853efd69e98e071d82ffea7cffd7a32": { "40371c6acad0719623ab143c6991d629d5eeef18fd54755245385719989fae91": { "jp": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.489Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.466Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.469Z" } } }, "1784873802e351d4cbfd164226e7d919a480bb1d6312139fa09de23c15d16a8b": { "8742e923d01dd09dc7d8778dca915632a84b942a268948d3212bfca23e4e87e2": { "jp": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.466Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.473Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.468Z" } } }, "1976a270e928ec95aa014d1eb571385ad93c7acfac83fd172543fcf63d413493": { "28f4800b7936b39a171e2fb6c8317b4c9829a963ca30e0d8f2cb33e3e1dba27f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.491Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.480Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.474Z" } } }, "19d053d8db1755b3bac1323b8dc5bdf881a37b3de8c55e8397cfd48c70b492c7": { "a35e75c19a0f228c55c8e74114787fa88e13457d020f241643da1e080c35d9ae": { "jp": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.502Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.465Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.441Z" } } }, "1de644041acf945417d447dae1559f7cba704ddb7f42f4989d75f53b3432bcc7": { "0d354a4bc3cf5327de48753ad84ff21b24119bc6b87f048f6f36a86e9a56461f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.470Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.469Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.467Z" } } }, "21df29d894f5394f8a93a1ff43ddfcea466286f726a703a29d7f5ad5f777ca4f": { "f9004a0faa2530c5a49f802aa2e8e063889d07b4b5779757539ed40941914621": { "jp": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.477Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.478Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.478Z" } } }, "22ff9a2316c586c12132ac52204a80c3282c99ea70504b739a00fc4e769b9090": { "9b6474c5f66a5e775df7e704ab5583bc77d7b503d80449e41bcb0fdca582d72f": { "jp": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.506Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.445Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.507Z" } } }, "642f1cdcfe6481dcca55bd2f485397c27b2cb519506bae85d0903d1022a9a534": { "d58e38a4b38f0454d5c08c7d2887270f277c732f8c21e5a62fa24568ae4fc2a9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.494Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.441Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.498Z" } } }, "76e148edd42e2339581c7f24e0a25ab51ee37d3723b355157641afd3cf2a92ac": { "96f0f82692a94d11ec4bd22df9bf9c367d91f54e7f111247f17715678d4f8a7c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.451Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.407Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.411Z" } } }, "877ff646acb9d8b60cc0a8c397ec6865271899314d2f8d8c3bc6835ea0a51d87": { "cf8035df5e02498f9892ec6d01d716e4e210be81d6a338a2a670b395f2d05b5f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.447Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.406Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.405Z" } } }, "ba2b228d4949b83493253e6cce36fa61e4aab29868007f5c4dea719bd97fe4e3": { "bb371d742e1c3d8bcdd77214bf030643a0331f8f48e7727cbd847a8a32b85ac5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.453Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.400Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.398Z" } } }, "c88c05312ecb48fece611ecb971d8437aee67aab577a01d65950c88e236c100a": { "d28f12f9ff28bee751ec769892ca255d368223c72a14abe462c9cf6ad965a8cc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.491Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.503Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.502Z" } } }, "d517690990eb5a5034e28f3526bde41c42990306742079c31f30f4ed4524ed91": { "9c79376ce670521bff71e976361e6729afb8128c48c2bd62e07e55c58efa6cbc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.400Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.179Z" + "updatedAt": "2025-11-29T02:45:02.449Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.399Z" } } }, "e226489ddbcee1a5f588fea5844e21dcac309588b3ec1f6bbc9f7bfd26b0953b": { "5792c89f06fcaed31fc80316244e3ff2495629cc4d68214bf2ad0fc8b2cafcae": { "jp": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.399Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.401Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.405Z" } } }, "e3904a052cbf5a3387388c389ae010ddc49649dbbbff19900f769f6e6cbfa1ee": { "e3e518cc255f67640d601fecd3cfb11ea7e915ddf282acc6eabba8311aae5b22": { "jp": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.451Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.450Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.453Z" } } }, "e6ad4f2ee58b9c424f0cc4e12e443aa3bb9dfb641432accc87e403a8b0597b0b": { "d64cf4716347332440eb8c9bd7192e0eae84a3f3eb49ad6ba4155f87567e3861": { "jp": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.458Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.458Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.180Z" + "updatedAt": "2025-11-29T02:45:02.460Z" } } }, "e8d810b58d2fc954739ecb8eae76ec7772a7459c01a08dd48ba208a5ab4b2b58": { "0d3df994d73dcce5dc7c4ae8f510488dca241f13863b2cb49c97f6056079afb1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.404Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.404Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.178Z" + "updatedAt": "2025-11-29T02:45:02.412Z" } } }, "ee906a548fde378c55bde17a104978853c964efcc0ac2037f2cc5f90ff301836": { "f49e9e3f91b64b3519c5cc4cdc59ffcf9a84b52eba96cc9a68e95e42dec254a2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.445Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.446Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.446Z" } } }, "f17585a5d8e2bdd6a2ebea5f856955881ef4c473fd73048cf4f26e56bdcb5db2": { "9e7753f5e285750271319abb9baa46c784486772a2b4da88514c28c5141c5c81": { "jp": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.508Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:45:02.440Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.509Z" } } }, "fdfddb9175ea6844a8f625eb6ff292798d8dda51dbc62ca44009000f3177a4c8": { "a1fbebb2555661587982370786b093295909d4be9fcca7e32ae5eff02acae18d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.177Z" + "updatedAt": "2025-11-29T02:45:02.406Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.176Z" + "updatedAt": "2025-11-29T02:45:02.403Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.060Z" + "updatedAt": "2025-11-29T02:45:02.396Z" } } }, "04fc2fc59d087b4841db1401316e4d1c9ac88f144242faabf25ec2e969a5215b": { "414e7c4dfb6cd3da8443de0d53c94c82fe3258fa5fdaf93915afe2a8ec3736d4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.540Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.541Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.481Z" } } }, "2fe2ff96c504c59daad55285eb365e9e69fcc5eddd301d8a0409670d1de5a9ac": { "79af085e05f9fd1374cba79aa1eea65a5fa7bcadf0fcbabfc3df348faf04e6e8": { "jp": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.488Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.540Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.496Z" } } }, "32c8d946bfccbad7f54bc00de27ceee1cc1719758ec7a678b9763d7236502014": { "6c958d1bfa513f4a8e0811e9c383ecdf775c2aa645e088ea7d02462f9209a69c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.487Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.482Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.482Z" } } }, "341eea9182cfeebd2c27c019d06a39d1fcf951c990bcd80fa61f11ffc6f9e196": { "aba92e4ddf93c8ac27c276aa33d276f9987cda30270a7b50881edac3ee8d0b71": { "jp": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.499Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.476Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.475Z" } } }, "3fe31c561edbb5416b22ecceae952bb5b07567cc07d75cd64ad4a2caca7689f8": { "af620cd5ed38d2654712e19961c6712bdc7c780d345e73f17ae49396a20d6df0": { "jp": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.494Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.492Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.492Z" } } }, "4afdda2989ef4d77a80eb6666ee0e5fd90ac3afbba1e33f8e39a07be3bbd203f": { "6d99a0d2cef83d17f6510958c4402246edefbb9b9d564c2e37e017791950e3bd": { "jp": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.485Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.531Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.493Z" } } }, "4ecdaa59771417d8a6341e9feb60dbd9c4d4fbb10361d6cf230a66334329d458": { "32e97893f5bdae1c411c78d8f927f38c3f5f53f548071542f0aaa587e832cecb": { "jp": { - "updatedAt": "2025-11-26T07:24:12.184Z" + "updatedAt": "2025-11-29T02:45:02.544Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.543Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.543Z" } } }, "5ed43729b9d1c584d6d2715ce2c8e0e8690a779f998a5295f954f2f562471776": { "1691e237ea64aacab998e397d87c92e5419d9695a9c24f1829f61653d169f1f3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.442Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.471Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.504Z" } } }, "6b19fbc50a3d75e95082802f1b3acf6a3fdda3ff18cd375f0468fb5136f2256d": { "3dcab33a3b2dc5934e1b739f426935f58ec2cc8e37d9a43754b1941d524c7eb7": { "ru": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.576Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.526Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.574Z" } } }, "7043bd98baa35080107f5165fe9bbec5ef39eb9956052fa0c10ef9ac22039a33": { "e6b73b30c4502fd5f9cd04636be35210ae5ea65dc8343c3daaa83eba16905924": { "jp": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.486Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.497Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.484Z" } } }, "73cc61c275b13e314a195a2bcdc4cbfb3fba91139f9fd1bffb19f48a659d4e6a": { "190e7c7b34bba92cb96c18d30898280711152aa225a02af84331070d834800de": { "jp": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.536Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.483Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.498Z" } } }, "7478bdb164a78a0066fd05a6a86be0fa7a2ddd64b6f73b9baf2265c59d70f4c4": { "e97df2367ee337a5ad2b8ce514b44485caf7b24462a66eac4a3d178503301830": { "jp": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.504Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.471Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.500Z" } } }, "789c0931dffcacd3c5e4bd954c1cc49f734d35378bd8d9f099bac0b7d7de0017": { "58519a4d43db394ea6d5c15ae1e4f7bfc823bcba6a23e04e1f1b0fc5aea36241": { "jp": { - "updatedAt": "2025-11-26T07:24:12.184Z" + "updatedAt": "2025-11-29T02:45:02.544Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.544Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.542Z" } } }, "85409384bc3d4ff1f1449d76a33ced011be9773bdbf0758e6975a6dbd1ee1dae": { "1fee80d8af00c415d442c78b9ad825b9a0656bc47f1eb00d9ac9cec8430f1454": { "jp": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.472Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.500Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.493Z" } } }, "940bcfdd1a4ad18a6a6ccd9181dfd460e21675b41985028b535c556f22904357": { "8379073d04e59c3c4b33a28508240fa2ad889504e267a63230a17f0b31b60377": { "jp": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.537Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.541Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.183Z" + "updatedAt": "2025-11-29T02:45:02.542Z" } } }, "ad44e0a653a277028da523b8bb2ede38b5fb8ae3edb129aec78609264961e45b": { "c58dfcddfe9b317538f8fc75e87174efab26fa62ab436b5d3a1921bdcdb71dcc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.442Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.472Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.490Z" } } }, "b0371f0c5ed81dd8c1a94c3d4fbb5068eda546a915ea97e900025b7967fdc506": { "1adc889763f86e0775ccdc2cb7db8ac95b53182b5f48d36f86a8daf7373c5e8a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.175Z" + "updatedAt": "2025-11-29T02:45:02.439Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.065Z" + "updatedAt": "2025-11-29T02:45:02.496Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.470Z" } } }, "c720ce0e77810fdc639cfe83c2df1fe9c3d97ef4dd59cba6540e1d9e354f6866": { "3f956529d37242046b0834f1c686e59dd0dda8c1b7de96710b47b1ab8e5544f6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.489Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.181Z" + "updatedAt": "2025-11-29T02:45:02.474Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.476Z" } } }, "dfd805b622edd8955d58dd44846aeefbda562b1c575f0740533a458f2478f495": { "c61769f8b34a280fa8e6d8215850f12fe517dd969c26c4527ce9543b9b4052d6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.467Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.064Z" + "updatedAt": "2025-11-29T02:45:02.488Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.063Z" + "updatedAt": "2025-11-29T02:45:02.468Z" } } }, "f7fa9ae5c1d4a87ba39f7e52c396a41963265a407116a9be68d7fbee6e43fa14": { "bfc41c969cf12203663097a7aab28d304963f4e8f2c4310d76f5d5efac423d0a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.506Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.507Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.066Z" + "updatedAt": "2025-11-29T02:45:02.505Z" } } }, "03b5ecbbf39334e6da0c384a22e5e44c1c2d4e7293956c81e85ebc5a1f9684da": { "a8ec8b1cfed8dd821d7646fedd89af692c1d5c39ff7e6c8263486a44277b6811": { "jp": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.524Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.529Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.578Z" } } }, "0b126951a3c780c939a55fe4567f097c8702408c235f214c5763699ad6daaca4": { "5b529866221693a79922a1408a19f5b678c1f0fe4b7ca31e7401ad0a4ce64dfa": { "jp": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.562Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.613Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.609Z" } } }, "0eafecab32cbe234424b7ea9a0db39d81bfbd85c2d891597fa1309dac8735c8a": { "94efd6e0e379a3b02b71963dbf0699cd5c5ab603e5cbabbb278630c8bc3eed6e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.577Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.579Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.578Z" } } }, @@ -17613,395 +18869,403 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.187Z" } + }, + "21ab0993ec46252ab7b40a1b418b9c04325c81c889a8af72daa16bc54b1f51e6": { + "ru": { + "updatedAt": "2025-11-29T02:45:03.376Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:45:03.382Z" + } } }, "22a6c0463fdb5f5bd56c1f342f979b7e0fbc638e39a22abae139379b580611b6": { "c126bede64139b7c6ab143d42c036651e266197fad3b70012de0b058cfc8a7b4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.607Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.563Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.605Z" } } }, "2f0ce2fe6b5d1318ca2c2c11f3ca3100561f2c3b056eac0c92885f76ad381df8": { "22f366f08d6beb4fd69cd03348a69d6ad0fa2634f22a96d663380fcc3e61900c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.521Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.527Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.558Z" } } }, "34bd47b9631a90da1872337df6289e0170c67b0cdd5f5773b7367e05d2dcfe48": { "7bea2cf57bd47e48dbaa0fb6eb99c5614d61a80b75f4b14d7d22036a5315b2a2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.612Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.573Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.522Z" } } }, "3fae7c4513dfdc82bcd5d84b957baba453f6cf9cb2c3086a653e40e66ecab9e5": { "ebb4c00f401d9fc73b63d71739322aba770f129d6784c881ec5e9cd702ebc982": { "jp": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.565Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.519Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.574Z" } } }, "8681a5dfe4cb1dc88d34f905cd6f0b880732c556d84f4c6c1a78c2a42a1e2e94": { "937c3315f8641ae220b02e6527a850efc428a4de748f9fc10c3b23118f915818": { "jp": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.524Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.528Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.525Z" } } }, "9679382c066536c0e977c5bada387315bb3174921875fc2375dab0f8ecb14a9b": { "775c06f4143e15814d67624ccd103ecbff901762e4be69292f9800d11986493a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.561Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.523Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.510Z" } } }, "9f914435087a98e271276ebb87f255c29380082ebf766e89899a246c457e4677": { "71530532e2635eadb067e7bfc1e67c37d37113e6474b6d00295249b91f5e556d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.529Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.497Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.532Z" } } }, "b5043154caba774e4d5afd58609e8705791d168d7b610c441a9f5eb0c01aebe8": { "8640bb0e91d0ce2469cf06735ac41d782b10893d26d5a5e4bdd88f4ddcf19c10": { "jp": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.534Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.539Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.538Z" } } }, "b6b46b2ddce58f83297d4fd3e22a20c0689c8846b02b00d6c901ad29353143df": { "6526c7597b3e43dfe18fbc51f8dfea10476408a65acfc8c77d19c20114264de2": { "jp": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.484Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.532Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.487Z" } } }, "b760d26fdf8b09ae16032e0dbdd66a6e812e5b85cfc1a2dce387a41c031415a5": { "2a83ac2cbaf9b2ed36fecb623007bef63f6aaaf537e37429095c3057b999a156": { "jp": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.534Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.483Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.475Z" } } }, "c94404af6396786f2d99e4b9e86fe62f37fba23be9fb0992cb4462421350617d": { "8e9c8e608b5e9c9eb4f01785fa62ca818e1a1957a5723d6cb412ed71f639a50b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.536Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.535Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.182Z" + "updatedAt": "2025-11-29T02:45:02.539Z" } } }, "cb7281a29c8577f9362237b726ab73efa4133f66aa1f532e94603029a6608325": { "e7e9ff403010f7419e6fe70d3329c7fb4d95f62d59d52fda8025ee90af8ad89c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.538Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.068Z" + "updatedAt": "2025-11-29T02:45:02.480Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.531Z" } } }, "cdf00c31e8da5ad17f2b40732cf7e7baf65150deaf7488eac143f7201d1dfb3e": { "3c8db57986756c0b913b89d2204dd19e77508a68267dc6a6d737df290161badc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.070Z" + "updatedAt": "2025-11-29T02:45:02.533Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.486Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.069Z" + "updatedAt": "2025-11-29T02:45:02.495Z" } } }, "d28f5c5276140aee0909af043384a73dc6d1e54e307092d06f03528d2b1110ec": { "c4f358e96fb5460080efb17e46f53d378939fef04b5fcad4e3e2c5a580a10128": { "jp": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.568Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.558Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.525Z" } } }, "04a08061427f75ae80f6c5be1bc33f6ed46cb17ac49c325b49ad3ed082b48721": { "8c2b821e3c5410720085eae977687f3169e4a39395d1aed6e45d331e39dc20b7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.587Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.594Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.635Z" } } }, "0f4329370fc5999889692e3e2374c65bf3f4dd5e8903e64957d654e1c712ee1e": { "87fcfd05b5f0e870d641b6800c171abf3d47bc7484fb7612f4151d70caaaee3c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.580Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.646Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.642Z" } } }, "100c02e77cc38427381d9c58741ebe9d9d8964c870d4cbb14624da2f386e6691": { "2d845a508a5f777e5f61b8dae330312410e821c6f517150d000bebfbc18e03df": { "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.641Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.601Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.582Z" } } }, "1680a9db2b149a398008cc3048b13dba799f74c5bfd3549470992ac1fdd41eea": { "2b8b81210547bd248aa80daed1df50ad236049f83eec7fed484a31e64906811f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.571Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.184Z" + "updatedAt": "2025-11-29T02:45:02.545Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.564Z" } } }, "1b89e2e1ad09ff845cbc6d24f7a759d61540214cea8a5c79bc2e68f266ebcbba": { "9d8c96f15a9c91e38b4c55448e86a206752b8e56970d31964de0de00beac4133": { "jp": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.565Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.560Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.569Z" } } }, "25332a58ba046cb340c206ff61639fed4457a1aad56ffaa7b53917205f1bb761": { "ca54f12c897481de5b60e4f4170eccc7217a2e000c56dcbfd023eac144ae760c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.550Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.570Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.606Z" } } }, "45912b7cfa3611f18ba43d31b4bf270d57e4bcee3fdf2ac5e2ff6ded3b672601": { "25bd45fdbb02d82cf7af7820d3acc7ccf1701c6afe3cfae317a6b4ac9289a67d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.648Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.647Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.644Z" } } }, "5a251aa88d6ebebbfbc12913926476ff0da32b3862d705b6ecb28ea2c559b45f": { "b32b63bf76eb2d854a947bc3926ad7d875cc3ed3eeec677de22a5a760014a32d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.572Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.604Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.605Z" } } }, "696be7be6ffadd8471bfb91d7ba6ec45956dc7e449f3fc81dbaa6fa67d66b3be": { "8aa635a63a82ddcda9a254960f313fdd8f129e472d9fe8d3e6dc10d1b38c37ad": { "jp": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.520Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.577Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.527Z" } } }, "79e7241d6edd82b0dc1989f7d3211668c2f24f997b5fb74c55c6db437b7da25e": { "be2734886fbef14228e09151309f47d77c7dc82d6b8d68b9d3f8b6dedeaa8944": { "jp": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.521Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.520Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.561Z" } } }, "7aca79eee9aaf67fab4127f69bfa7778f63bc7a7f6b384bee18e809c672f7b49": { "55febc4e35972c34cb1792867e0fc3cfea4841faadf9de0e30f4502a613b8363": { "jp": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.613Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.611Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.555Z" } } }, "92f16152dca7a77dde912f0a5b22ce16b22c2dc499873bbedb28221aa56e8739": { "f3fafaf3dde2049ce02a32a17ef225150db00d0562e505ad5431a06ed8974f2b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.553Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.547Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.607Z" } } }, "972010f567fed406e9bc7e9fa61c22b7128c4779998665424ab71c46338d1f3e": { "ae02d48d7b29f026ead3f4af508a4e2b3a97657cb5051628dcbbee9111248f7f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.567Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.564Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.580Z" } } }, "a15ab08919f6acfa97670cff9afca686c2351120dfd9d4f8deb2b45ddb99aa0a": { "d344fdb9b77fe64b9863b88b7aea7e3a8e4c7d7db3d3d7a7d7584b626a3c8054": { "jp": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.567Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.604Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.554Z" } } }, "bb1dea393979951d316dea0be45235c346fe0c28cfe6756a5876f4804290c7e3": { "d3ecf8e3f0da56d9ba8034a953040427b08dc7fa1c165a2173308415b8a6d17e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.568Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.566Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.548Z" } } }, "cdb1f009589e1e0b485965e6b6f62f110d284ec9f225d0eb9717cf9f54e381c0": { "694473bb486e1e21cb8814dc53f5204436b1e5ffbd3f851984bd46f00c011179": { "jp": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.509Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.067Z" + "updatedAt": "2025-11-29T02:45:02.511Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.560Z" } } }, @@ -18016,1435 +19280,1443 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.188Z" } + }, + "7f17768c7754fe62726af95719e525e92c0e64ec5573a51db338fa863d1513be": { + "ru": { + "updatedAt": "2025-11-29T02:45:03.375Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:45:03.385Z" + } } }, "d7c9bac812afb3a149a06c61bd4d64e33efbdacc006619f813e625307caa403f": { "bdd5ad8ff2c6c4cbf81696dcd7cf80196be279d10a61a61d0f45caee15d90df1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.570Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.610Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.608Z" } } }, "dd8bec416e1a990e1a7ef46ce2f7761b51432155f4c149641fdc484fffcbe786": { "e43ff80310727083fa06482849132d96578ddd46a8478a49dd3bf42b62882609": { "jp": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.549Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.575Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.605Z" } } }, "de693811d680fc3f30e32c9bc40614fb35f73f55847f45a16264e614a65d74cd": { "8fa72ae7500048bac519db43150657d9500e969b9167f548ec14e8f2a73052c7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.188Z" + "updatedAt": "2025-11-29T02:45:02.557Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.575Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.189Z" + "updatedAt": "2025-11-29T02:45:02.576Z" } } }, "f05e54b97f0cc26e7e6d19993081fe3b3e87410932334968bcda276a9ed28bd3": { "1d9ae46b239c5f237c2f10a2d4e4c6dbc9261c9c864accb4c80b847fe59481d8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.554Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.550Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.573Z" } } }, "fe5b39e56c19c291226f7e3197f67720f7eec98c8343fadf7b1a283589869ee7": { "afa11621c4420fe8e64e6a032e92ea848928d0c35428ff0c7a1b50f7215c04fe": { "jp": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.522Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.187Z" + "updatedAt": "2025-11-29T02:45:02.526Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.186Z" + "updatedAt": "2025-11-29T02:45:02.519Z" } } }, "010d68e65065006bb03ec5afd6da3fb00d5d932dc58d86d356a1fb32041700a1": { "097920bd8ae55b0c4c40422f164718639bf789af17784fc7d268a39285332660": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.592Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.639Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.592Z" } } }, "194312689f754af1eadafa36fb316871d927e7555a7e9237115b13fdf9c16217": { "efdd19891bd36c4b5ee32e3469c4609b62a971eec1305634c7e49ed5d594e5f0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.601Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.596Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.645Z" } } }, "1d9872faa89c7d85b9aedea5b9a72b7f79022036a883f0d76368ba0aab461711": { "70eda1446c7a201ec8f6c37abb74c39a9535a96ae3e057af6538915558876b9a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.584Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.597Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.602Z" } } }, "20fbec5fbf3b5f7168ad991d57410b2a6e132fb9884af790cd2c4a29f361d02f": { "36ab0d9536cb78b918f577f351ad01da73a11122ce416a9654035e7dd9a193bd": { "jp": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.636Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.621Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.675Z" } } }, "286853d39a677e8828ecbe663218f27fedd5bf2bf0e04f6a0845b378f6e8eb8f": { "b384e9d652969f7c44b75186494dd5743f6f7d29a2d07cdc6516f906170b8ecf": { "jp": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.632Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.586Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.583Z" } } }, "31135bad715065dcea06e31337e3a5dd947f27dc411676ba95164d339409a83d": { "763ca58dfeaadfb6457a37642666f8a6557e78cf6969b41e8b1c31735f7e55f1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.672Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.674Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.641Z" } } }, "3d5ae5ca94ad055105e113940b4e5f4f01c26351d5e0aa85b01fb3569699f7c7": { "db7ea4892aba1694aea64f46778e44e4d3a93c6f1d8d5290b4d72c844116181b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.633Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.601Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.590Z" } } }, "42c6ee1d7586b75ddf294b270cd91e6cbfc04990b03c458263060339691f65f0": { "e28070dd3b8f9c8e1de1f84e6213088ded4997089a0463fdced52aa0d7126bee": { "jp": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.634Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.638Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.672Z" } } }, "957a8d1238fb98455672f68cf73445d00c58150afae706f656904ea7f56bbef7": { "438d8f6bebdf4c4f748f67bb045a037db4fe70bfbe607e05bf05fab5e60702e8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.589Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.596Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.633Z" } } }, "bddea4d6e2b142218cf0aa18075b105f560306487a43f98ae93666cc5b0a2088": { "d82b30f533151c915ffd2fccf00cb93c7247a81a9af41c32c0b6ee0a941f1dc4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.548Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.610Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.610Z" } } }, "bf43a73f5fb45ab9aa1813ec5b3c6567e2f43085622a3981fc47bbafb9f28c10": { "e5f80b1293069b81103b1bd7abde9c4afd1e877bec64781bf8b20adfa5b92acd": { "jp": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.551Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.556Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.184Z" + "updatedAt": "2025-11-29T02:45:02.546Z" } } }, "c2092e34e0d63b8d13f5c437a2c60457a006bad8bb89baf8c2cc3dceafc6ec29": { "afa4682df8ae8c2d39481ae157b1d008ea8cf2cf75aa79ffcfdf3cacb4d9b0be": { "jp": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.563Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.552Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.557Z" } } }, "cf7f50d7a1e362e6ebac5f8205b53d0c8eb6dd0efeecc010f23b8d8f09ea8f80": { "b7f62ebe9c2d110ae4ae2cca482b48cb6a82bf22cf7a6a11933cd85ee6309d22": { "jp": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.555Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.556Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.559Z" } } }, "d1838a9b36c0c0fbc1be851ae978af65ba7e34ab07c37daf5e5c0c741129fd76": { "14af3666e0c05efc3ffcab87b38768b94b93945123edbdb09cb8537e7a7d07b0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.566Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.611Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.572Z" } } }, "d488e5566dd6bf95742db0d7525010310bd38f5971c4a87992a3ec793feba8bf": { "5ba7a81bc990b2456dc8374342d01a7253db45b5183ee93be9b51553586efb4f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.600Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.603Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.584Z" } } }, "dbd27b188ad3cd04691439c723e924796170d0bfdf59a9e9b53d90caca0178bd": { "80b5c91060724e755120c034531a62ece1e13c4c261ac38e2e448b4e2d0e61c2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.647Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.631Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.646Z" } } }, "df4069454374e8aa9593f9687f16b9e3b26d64e2b0082ac22a7123faaef82740": { "e7ed1c4a6adc17da8ad5806d7ebfbb340ba0839bd13951ceea09267bd14c0a6b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.593Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.645Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.637Z" } } }, "e1f18ff34031035a08fe64318b680c893d2d37fb3ac9d30c908d0671a1180f50": { "85e7c92ceca8e1da3949120488020e40a9d10af04a565222bb41223f27a16de2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.600Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.596Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.591Z" } } }, "e4102128c26bcb3f9ad172af76f46d964de749c24c132d5348f9ee3e3de5951e": { "9f2615fd10d6b26b0f5f878a17f58c2100fb6bca45e41b0b5783df222e6dc6e1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.191Z" + "updatedAt": "2025-11-29T02:45:02.559Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.552Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.192Z" + "updatedAt": "2025-11-29T02:45:02.562Z" } } }, "e6493689e0bffb010f12f340386981233dcc9a2f28df11fd9a6e6066d3c5ce8a": { "8de8a8317a3584199eab7b620cccbff20a6c44103452bed63f66cf645cda12ea": { "jp": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.612Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.614Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.608Z" } } }, "f1b73f2ce3c7b6d1ca6f0f28439acb8cc45586fb6f3d1fda35224a8483871689": { "84181ea71df19456b8c88cf67e1c18c054443ce40152a17b3fe3d33911ecc651": { "jp": { - "updatedAt": "2025-11-26T07:24:12.194Z" + "updatedAt": "2025-11-29T02:45:02.608Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.193Z" + "updatedAt": "2025-11-29T02:45:02.571Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.551Z" } } }, "0060f21968d741d1a0f39b19ac2622ebb5065bdb709b03e138eef82e28e31244": { "2670f637399d04628da2e0f038d37565f781605423d4d054185eb0cd33613948": { "jp": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.619Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.630Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.623Z" } } }, "1e131dfad9800937839c4d2f0e5ef58daa6a99e44ee4ff5ea4e66de6069c7c37": { "f76c1f685c5d14375dafd9a42aa84e6f31aeb5b84b0d8c24a2915f02c875d4ca": { "jp": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.652Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.668Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.210Z" + "updatedAt": "2025-11-29T02:45:02.709Z" } } }, "2149ec9c3299895bf0097e125705ba36a1e04efee5f43e59c08371caad0cfd45": { "349711e0368c3473e04141d6855c62a92897b88020143c2fd44659089f128368": { "jp": { - "updatedAt": "2025-11-26T07:24:12.210Z" + "updatedAt": "2025-11-29T02:45:02.711Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.712Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.210Z" + "updatedAt": "2025-11-29T02:45:02.711Z" } } }, "2a714f7169c51c1804757b5577385bc512ba198c41b0cd228e98a66dc148abb9": { "47388640fbbd48eba401a20cf2754eced76dbed9147e6841f469e2f4acc14075": { "jp": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.675Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.671Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.628Z" } } }, "3f24f2c556bcea3bd4a8da649d898ac0d1aa590efbf76127ecbd252c8df9b55c": { "87fc99663ddeaf7b1d38d03a534b4d0b7cbb70edc9c3b460d5735be114f9f413": { "jp": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.616Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.625Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.617Z" } } }, "42ee6b1cf2d60dae66ca7799b6e3c96a470d6fdbdff801031e35cb9e1891dfdc": { "ab655d464095f3f0a801879f7e0058f71ddf7741b59f1ac855f58f9f7d807344": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.585Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.595Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.636Z" } } }, "46e9f56a57a3931558fcf69333139681d05b4c2f69040e2cfe7a939c976963f3": { "e1fe2166283accd68531dcb58d1682b96cdfd9ca452ab7df14ceb9a7623b7419": { "jp": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.671Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.677Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.635Z" } } }, "46ff568b059cec990fbf679bc4bed642abea08d09f7bafd4747a7036515b95cc": { "714391bd24db523bc05255d05254efcc0766f0f4b43e9f23aaaa7548eef953df": { "jp": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.643Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.599Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.598Z" } } }, "4fbdb5b1520dff0a17e0429f575aa6011097f81752684475262c7ae6aa200bed": { "1ecda987c93d49e1fca1c7c93d39044137cd955db9a36fbd10169f0b85cbdbe1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.629Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.643Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.615Z" } } }, "5083281bd3b547bf9df36adfb2bfba73c9e0cc795d0090fcfa111ce30996f661": { "b09f8b5ff58806fe3abfa9da3b343ccfd7b8e980a6c46bd43dc32927ebac6ce0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.623Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.620Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.677Z" } } }, "5b010922cc17b528fce9cb609955f868e53ad71f5f8622066d24f7b3953f893a": { "83759792792ece10deacdd4a65c5c3b089a7e420df7df362574464fe94fb9408": { "jp": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.657Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.658Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.707Z" } } }, "5c4315a7496585196dea68631d46489e99dab1c8daac61b452a0c580a509d21d": { "4c3fab4892c9a5c579a3017bb4cbe36c271aad9734d4760fecd5bc4ac75d16d6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.625Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.622Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.628Z" } } }, "857a5c3ed29e79d55112d1802865f308f93fcc1035cbad65451f1392ced56b55": { "daf1366f4d86b97aac48da95d72257524192b5104b5dcfd34230427de3762a51": { "jp": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.642Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.627Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.631Z" } } }, "8677ca6f754c9510b46dc0569151e8695270e1ddc3a7791067d3b1b9e5ed0ce4": { "daef99c2eee6c12072def84a2de12f54a7398d20df2b000023b0e91f2100e934": { "ru": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.632Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.624Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.614Z" } } }, "9056916609446b5b12baca0332da8e5e8ad117eb3017488e4c5391bf09af1c65": { "5c1ac19a6dd8304196f8b5c3c4538997259c7d50017642a246b97a60197a70c3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.594Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.634Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.198Z" + "updatedAt": "2025-11-29T02:45:02.603Z" } } }, "93878162d293d38a3f960218a0ee8b1904f199878f15fb0a11f80cc5c6b78ae4": { "38c7da17603cc8d822478a774e4a0851139aaaf988b5e6ac6aebd7c75546c08b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.589Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.581Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.599Z" } } }, "9dd17b4dded970a85df00496de13a74873211a7c3eabb2bfaf1670710eaff639": { "3c77cf690b82a05ac07374c03da339b16bb18f1f69cfa9c51ba296c56cc2f48f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.622Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.675Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.618Z" } } }, "c9c4898b83cd686a39de5d1507a5f2308fdf824b67d0f19322fe25b8230ae68e": { "81003853e9247deae604d51fc5acc18e581a4e0c4f0d79dae6b9207ceefe7142": { "jp": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.676Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.676Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.673Z" } } }, "dc429afc1c845ad436d31b61fb908e473d3a84f5a8919f5d78c6cc647e6e44b7": { "f94a5951c5c6355f3214aef3392f0e31f245f1c2a14bce98a45d190388085326": { "jp": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.585Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.583Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.593Z" } } }, "e8b753d96adf0305cf90b9e579ac4cf927e2e7f187ad62582b9b9a11bab53b3c": { "d6af628ddd5106feb87f50888fafc6fb21ea322d5d658688b385daaa6e2bbc05": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.590Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.190Z" + "updatedAt": "2025-11-29T02:45:02.581Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.199Z" + "updatedAt": "2025-11-29T02:45:02.638Z" } } }, "eaa9435dae8d90063d0ef13fb0d0245e00f3c444e99fd608251e1fbdb283ad76": { "5671b5319cbc284bc1f4dff7b698d72202dcbb66b153aa004c508aa68e5dff04": { "jp": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.586Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.197Z" + "updatedAt": "2025-11-29T02:45:02.598Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.196Z" + "updatedAt": "2025-11-29T02:45:02.591Z" } } }, "0045741a471f4dac9a3db4c43669d28583bac040167b1d39d7e25215fcda5ccc": { "dab964b634db47350d340e0931ec7aea4b46dc1764c4d7c24c6cf164792b3f29": { "jp": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.687Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.693Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.694Z" } } }, "189388fe355c19cd463ff375adbd81bb8d731d323bbf7cf2cdbbc3058b2bd826": { "5ed3b23bcc3bc844b8a42267d9198f127c4ab515a87acd7da5858ed9dd6fe278": { "jp": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.666Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.661Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.705Z" } } }, "23c47eb4902870785fffe1e4baa6e41d6084e1f924e6ae197c27e7b51f843750": { "052d52be77d868d3d26620fa34155f9eb31b5090d664d799d412457b60c3f050": { "jp": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.657Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.660Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.707Z" } } }, "242658032c19f8878ea27fde8bfaf1c2d950073ef6e50d896370f00b777e974b": { "9dced94c1aa74f4a1989dad0844123eff9d336fc99be750b0bd645446ef2190c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.685Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.680Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.691Z" } } }, "302b0ecec3c1a1792dd0c359652c37057d430e76b3e96aa7c8afde8a7172dc09": { "3c7b42d588a09f60f2e03cc7401555f547ab89b4421ae45faee2a50a6b0b0401": { "zh": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.747Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.692Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.700Z" } } }, "52bc7e8ec1f25b547908a73830b6d7664f88e3007b6ea89191268490da4b6c29": { "e4376d6532a2d24e4f86f129429881de208f3ea0ab1bcb5f5e31cb841a06df0e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.210Z" + "updatedAt": "2025-11-29T02:45:02.709Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.666Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.659Z" } } }, "55d7240c880120e92dc6163e0ae953ba2e5f00fe1352161637e7b7057888a3b6": { "d8020d4cb0f5381e78c97181bfa0e7bd2ff6585f606db5db616fcb0afaff7589": { "jp": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.688Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.698Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.695Z" } } }, "59b41159dfba51bfc26167978b1127378d106b8d443bfaa28a298294319587b0": { "c8e3b18d83b85dea1ed5df57b3bcb5d76702cc3807eb0d8ccc3a2a6bcd46acfc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.685Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.684Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.689Z" } } }, "5a412fdae8fb53a15204e66324bb2d0da4e638bc75ac56e67179382d206d7374": { "02f14c2f65f281503e41f11f04ee9f6cd6ab49c4babb7d84453226444e626ce3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.650Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.651Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.664Z" } } }, "65b791b7c4a125ca183cc9f15c013f5460cca336367cbe0b2dfc01f119a90d1c": { "1a1f03cbe833217e0e2c1ae7fd100d78ebbcc8c0657e571385e72c88889a8da5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.655Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.656Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.705Z" } } }, "6fbd798e9fc4be572840b3ebe3124e7c1982606aa96d7b42be53bd6c1ee9676b": { "123889af8c3d0c2ab264480c584493f0491363fd067fa94edea8459b1555318f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.662Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.667Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.669Z" } } }, "a44ac107c2f03ea1cfc68d15bea4e84005ab3111943ebc6245e22ba05bffe8e9": { "30eb0a47b3a70c9804063775a6d033975254804002f913220b776bebe7566da8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.621Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.644Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.626Z" } } }, "b8b5935e6157dbf3000442e0ae9da10c119186446dab9b0b6ba59ecd8e081b43": { "3aec0cecfebdb1bcc89b6b5e6d7edb63838928162cbed60f94e123b0001dc3e2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.706Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.679Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.678Z" } } }, "c2b6b4b09ba9a1b69a2623b9e76c0169f2800d8215a3a24ec9aaddb566e07410": { "a509a683d08d5f5fa0027e4566599afd99d8661f1932316929ed7b7f5f1434fc": { "jp": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.616Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.619Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.670Z" } } }, "c78d724ce19757f519a89ae81413bdcf8c707c62709608c1fcd90f8f2ad2737c": { "ed98e153a80901d835f37a02ef176c4789e69c4833533e0096f7181d92ddda23": { "jp": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.652Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.662Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.654Z" } } }, "ca734035b219f4714c9e6c2cdca7a1904792cff5ed4cbd21e39a0c5b2a486565": { "73b78bfc9381e1ef4959ec2997ac7ae0499ef6be647ea0c493a48b57261785b7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.679Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.629Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.640Z" } } }, "d7e629dfded6aa789e7b13dbe976a72e204135dfeb9119292f63ce16cd39473c": { "995d171ddfcf778e23a9288af9f2f3b5372f8ce14a4ce8feb377503b79703cf2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.663Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.668Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.661Z" } } }, "da9d4e8b0bdf930b4854e634849ad3b851aaff67143620d95a9ae1e5cb3a7b9a": { "bbba21070424707e5a6f8591bd4bfaa20069a36dd6b196fdc7050d7a1ab8486f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.195Z" + "updatedAt": "2025-11-29T02:45:02.615Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.204Z" + "updatedAt": "2025-11-29T02:45:02.674Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.620Z" } } }, "e774d95a2c81c53102c61249027c7f00d0f3179aabfad8f71a51ddceb6505a11": { "e0d72b4c4c836c1bd36aac8338da95ae7abce2d57528db5e7d5f1ed3d95b6f29": { "jp": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.665Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.648Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.669Z" } } }, "eaef488a67183c3737450e1c070243954054aca5bcd96f3b4148d73f6a7399fa": { "893797365249d93ec499eaffe4b1ed5f848af3451b59dc62b1c2c0828602a016": { "jp": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.670Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.201Z" + "updatedAt": "2025-11-29T02:45:02.618Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.626Z" } } }, "ec49a0cee949d263027a7b97accd10ea82850898c06f8611df19e985e58a554b": { "33e16cb7d3af2bae2f39127844a9524539563891c9e3db379b8d508c23f9b634": { "jp": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.658Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.663Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.649Z" } } }, "ffb2e794247dc89ebed0e232b0ca7c0962e63c5651c684b4d99f74958eba032f": { "3e28ee25ce5b288bcfcc6aa247be220c6686ae678dc50aa107da3672ec9cea32": { "jp": { - "updatedAt": "2025-11-26T07:24:12.202Z" + "updatedAt": "2025-11-29T02:45:02.627Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.203Z" + "updatedAt": "2025-11-29T02:45:02.639Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.617Z" } } }, "10bf6a851bc722dc218ed84feeaf049930bd2d7b38be10d0175a4b45da4c9e3c": { "72a26e0ef3fe81a02e1eaba48c8ec2828431893b8e50ba8b3dd2152f58c16698": { "jp": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.748Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.746Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.687Z" } } }, "2ba4aedf1481fd714296b22477ae890f08dba4b0496e12c98e62fe2811b6431f": { "e6c19e03fd150258214beab57caf618b7ccc0baf4e6d85d9c67796cb3ea9fd44": { "jp": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.781Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.778Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.704Z" } } }, "2cbf8ac76941d9ddeefe32e9f176ff03397d09339a8d40eb2cfc57efa00fc1d7": { "2d3d7395ba3898aa08ea4bb981e7bffd7607a25fc091046d7a6a359bc9c589ba": { "jp": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.699Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.744Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.701Z" } } }, "2cf9993a309ce837e0def1fde3b9ec81b984bdc367d668342cfcfe3647301013": { "f44de4bedc5c963bcfdfb8f911d7420b96d114fbac92a40412a2594ce4bc5180": { "jp": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.697Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.751Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.699Z" } } }, "3682e2d45de97f6b173cd748b8b4d7583b7f1420f40557e91bf935dd09b009da": { "28eeefee37cae95ff6cae2142c3e8807b596db44875ceafb1b3e3c2b4f5b62be": { "jp": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.701Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.689Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.747Z" } } }, "49403ebf7c98c9603a561ef10166db22cbd8708cc533f76c0feedc9aabdcf4ff": { "512f607384640e8f1cbaf19b2b517930edc16a84b9a618f37f91116a4393bef7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.783Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.783Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.784Z" } } }, "4c4a469c4038db0bd30d547c74475eb77e6b3c4d4eb98a9b5406301541d45581": { "32eae8f070a25e27b3cb7b763fb46241c3e69525a2c4d2ba527136f413a778a2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.693Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.683Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.698Z" } } }, "5e529ee6f1c6b44d742cab16c2436b0f98d61cee3d67b6c243eb91fc94e5747a": { "b5eaa7df44d170d16be268ccac271b07809b8f738fe7f6bc1658432e3f8af2ad": { "ru": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.782Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.741Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.777Z" } } }, "69dc87a0a0efcdc9ce162824232e0caf45af3973a79857510730075407dab81b": { "f55102d7e2ca214c7f9f0866a2bb860df9999592d3a40c6d9b97a2ca5a47cf98": { "jp": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.745Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.702Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.751Z" } } }, "7cf646c7ec8330a693b4b1f30fc05c3ef68f7af5200b4c3d5be55f5e6c627d12": { "b392f20796bafccc3efe1e80f4e6ac3a7db083acc7209c5e540ddcfe853a6127": { "jp": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.682Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.686Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.750Z" } } }, "8b692c2ad787a446b25292433cebf4bef12b92c8e1c334682420d14be45948e3": { "59296f60723eaca7cd5a35c2a97534cb75c9c73d8715867db0a0e547de415157": { "jp": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.700Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.686Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.744Z" } } }, "92ec8f6b08ecfb56cf3d8225b5aff3170cfbbd0aa5775ef3532b3a6f5090f16a": { "24d1012de894e965ee2332b480daaca127319bc8cedb17d9ff8c5d9d4b57de00": { "jp": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.655Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.656Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.659Z" } } }, "9f34b6230075d04ee88d715b8efa4b4287ac5ef974d0bc4c4940ad96532f8fcc": { "8527ee18d786491e874ba6c6733def703ace3ed743538e924d577e8b8cf2ded0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.660Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.664Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.653Z" } } }, "9f6597744edd6252f669f69c58d2636f8aa9a6b09dbc8b995f9479c4221e22e7": { "308c3f9e814a2ad27043440f48438bae8864dd4493497ab0a517cc656aa82356": { "jp": { - "updatedAt": "2025-11-26T07:24:12.210Z" + "updatedAt": "2025-11-29T02:45:02.710Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.712Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.667Z" } } }, "ac52e240a096d2b15ce8bfe0c48a2efac10eda017b425c2339c5001cfcb72318": { "56334f7f1fa03f9b3a42096ca5749c43c65a9573954fa56e40e339606f36c1c8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.651Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.653Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.650Z" } } }, "ac7c945a9a70e136f7bf663953e5789b51065cda16bb4013fffa3f1f5633a518": { "79c8e3c46a6ede7e07368f66bfdc60525ced4d42f656a8f57a26ee701ec28b66": { "jp": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.714Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.713Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.713Z" } } }, "c36157e661a0ed678a48034a7b5806bdd2feedb466d46088c035d8bde2fd79e9": { "4b9ecaa4510afe985e77b7c0bf367ca64dcfa7463bb738f45d328855c7efc166": { "jp": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.681Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.682Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.744Z" } } }, "c3d15c85d4784a496cd8acb62a731024d5bb9915807be3522653ec7b1167d18a": { "608f13e19408e1adf4e6688ec8886b26bf677b304247727063c881c2d33f3968": { "jp": { - "updatedAt": "2025-11-26T07:24:12.210Z" + "updatedAt": "2025-11-29T02:45:02.710Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.207Z" + "updatedAt": "2025-11-29T02:45:02.660Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.706Z" } } }, "cd116d178423eaa55d4970d5d78d398dc1e5099ee13c6221d781e9ee5978b899": { "ec13b6563341c4b7d66f4d675ef48acbc1e40f169c0016ceecaeff7982621eca": { "jp": { - "updatedAt": "2025-11-26T07:24:12.210Z" + "updatedAt": "2025-11-29T02:45:02.708Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.208Z" + "updatedAt": "2025-11-29T02:45:02.665Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.209Z" + "updatedAt": "2025-11-29T02:45:02.705Z" } } }, "d0d17f6390066626b3cd9b1b5cf3bfbe37d88dad9a6142c1db99eeec90102fa3": { "f10f076ae99bcca2c49fc911b738e76676d074aa2444ae614ac526d5065f04f7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.690Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.694Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.684Z" } } }, "f12a63823b74d3b2b90d31871ee06bcf19ba66effba17bcc94c800ce464bb39c": { "5f9e4fad6300cfb262a29845e8e0aaa91d2938f09671d81c5ae2b2c69f9a6483": { "jp": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.648Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.200Z" + "updatedAt": "2025-11-29T02:45:02.649Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.206Z" + "updatedAt": "2025-11-29T02:45:02.654Z" } } }, "15e69bdeb4774e041a333e57689381522781cd859797d0c321068053bd1ac55d": { "ecfdec0409be257ba876146227e2e778ae5f272c3aa56e2fbc1cacb35dd43ca1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.739Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.738Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.740Z" } } }, "2441b704f1648bc3443c9b054ec8854f3764cbbd77801b8747d10f0c1380e055": { "8946d488f9c46e6c14fad461ca002a664b5a2d6561da01977d53a7c95d31e4bc": { "jp": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.813Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.819Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.818Z" } } }, "253c517a16655bd1af2910bca26a946ec5b5257507a84e5c1083bc68edcbaaae": { "383175d865a3e8e5eeeec2ad520a6706a7fe906490a2365a6c124bbbd35fbaea": { "jp": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.719Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.722Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.719Z" } } }, "2c3512a703d975c2b75e7502a141cd8a3e8b086796e9dd5b92d66f1f2a58358c": { "f1c375550607f160ff41977c4e39aad3343f7094f427e196bc55d8e72c22aed3": { "jp": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.767Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.729Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.736Z" } } }, "371cb4852709d9ca0ffc244925c1336472d7b3607e49eb600409ac2634d29c9d": { "2c08ba9df01012e99f6db6d87ed3274138d3991bb7ef1df26cf943bbe938c83c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.761Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.772Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.767Z" } } }, "38065e7c3b022c9edd666529a176fb393cfb28490dd15161ec6ac71c2d9529db": { "35e6467692a1dada24e738d0c85e6530cad77f3c956b13d30d9734eec88985a5": { "jp": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.727Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.731Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.729Z" } } }, "3c1dbc013406b1c31a215c47a6b9edb7f3dcaf68974dc2c38989fd26dd392af4": { "54d4adf41787f75b127c52923ea0abbe3e269714267d20e9e3f8f38afabbaf56": { "jp": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.715Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.716Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.717Z" } } }, "3d0840c01249868fda2bd1e95b3f042cdf2c618bd34004df654106ee3d7fe77b": { "abd6f88511214360a8b3d4a7acb1e68208916aae6edb5e22025418320d437381": { "jp": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.820Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.819Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.815Z" } } }, "3eb17266fde17cf983c1426830939c4712a727fd7eeca3116f2fe348d7489f01": { "d7d5ceeef5f34571ef1e4827cc0966f80aabd85dc08e22be3a3583aa8cbe8a2f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.730Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.734Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.732Z" } } }, "6bf7c7b51f6adc00dec7d08e30d4d16d28e682b5d83a2a9112cfe37d49b6b1ad": { "3faae72ad8b1f70ba0b49e66e434c0ca46525d70f145c05758337bee07817ae9": { "jp": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.690Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.703Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.212Z" + "updatedAt": "2025-11-29T02:45:02.688Z" } } }, "84bcc067be4c969ca78c33fa50f4efff4f2a2daacca3a415c5c86d0fceedd5ac": { "2eb8e19e71aa05266f701be373a387f43f2c6751db4a43fdf67169c2efcd862a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.749Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.697Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.214Z" + "updatedAt": "2025-11-29T02:45:02.696Z" } } }, "85d48d85dd722310026bcee5e22617e344f2aacd9f8e9ec67d816fdb2703a37e": { "92cdab1f6b712fe93f35828375006e26f4c9671ddb601b08780bfafa9a16e196": { "jp": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.702Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.691Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.749Z" } } }, "8d8defb12045ea6e4b617d20e5212582181c730d58236e675147eba18be53d95": { "c53f9e7ae5db8452601cd25c2b2d9ef7eb21620b4522dce992bc50fa2ca137a0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.720Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.742Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.728Z" } } }, "a5236951d982490ee0af310dad8356d6d6153f403e1ee58f4ce2f1c0eda6a81a": { "c1b636cd594663b0ead8b055a758d770ff99552ec72b5c80bc4f4e7f722236c1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.779Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.726Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.736Z" } } }, "d4c8c149a2085ffd9c567e330ccc163bc309990242e7b28d9b404761f935ba4e": { "37cd2110dc9673e6ecc3c129fd27e5e27a8e403857f4a2d17738870cab29a747": { "jp": { - "updatedAt": "2025-11-26T07:24:12.213Z" + "updatedAt": "2025-11-29T02:45:02.692Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.746Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.748Z" } } }, "d9be63b990bb973f2145b0fede5008f532e3efe16cc74b19670e7c30fb33cce3": { "6520ef784c8cb65030b31629babb751b59c90c4785704dd342ccc7196be05ee1": { "jp": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.735Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.731Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.741Z" } } }, "eb49ba497d8db0f37c1298e8ea9f8be1b244b82d159157e8ede112df8f3c919d": { "4b16adf3d0e0aeab42ce3ab01c36acb9cff5de72d7b2802148d15353f359ea9b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.737Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.737Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.735Z" } } }, "ed2113745ac93661c6152589c4303163561a52fecfcb50853a532d0c4d3c4c8c": { "91a36f6307074f27f0253a1a697372b4dbbadd48aaa0cb2381adb6ffad7ec3ee": { "jp": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.739Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.742Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.738Z" } } }, "f7ba33421a28aa3de7f23177b5e40153a4f0e0efc37a2106a3e8b5708fe45005": { "4211afcb557ca12ed79b2828ba3000b6bfc93501ef7266a7012e6f73ca63a27b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.733Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.777Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.780Z" } } }, "fae26c9194eff01a95214ca36a03f887f3e266e90a64a4b894ad55f02c179bb2": { "7386d025ae2748ca0b87ecef00be245390faaaae8fa265f80c33e3480d854a49": { "jp": { - "updatedAt": "2025-11-26T07:24:12.205Z" + "updatedAt": "2025-11-29T02:45:02.681Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.215Z" + "updatedAt": "2025-11-29T02:45:02.703Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.750Z" } } }, @@ -19459,837 +20731,845 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.213Z" } + }, + "ef588f2b6385c55726c920e57be588ac227d274976872debd444eae9c0c673b4": { + "ru": { + "updatedAt": "2025-11-29T02:45:03.383Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:45:03.387Z" + } } }, "04c615906de14bff138af4cdd85c3c07b4fc5433296761dca010e8ef60f78e93": { "91810a26e7bbbe9ffcd2f092006cc98930eec1fb41bd4802d4297bf1f45413c7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.758Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.813Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.763Z" } } }, "1580309aeb8bf89a02431ce4e3958695fd0114d89488a627aab1a37097044adc": { "a04bc210be5bcbbe776786b33eff75770784c182f110822abfb00ecf17ff032d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.817Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.771Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.812Z" } } }, "176150c0e3d077975a3bf364d1abf67e535d6c7aead2f176b61c34aca79abd59": { "844838ff96f065aabb06386cc366cf66f183135f983db2d969bbf61b47c89398": { "jp": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.760Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.757Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.755Z" } } }, "1a55a8d8cd9d21c74eaa692dca8aac6491f16ba3aee28f43616128e2d9ef200b": { "da55650acb4be1e891fe2ae5f1756740a01821cd992f3a8ca4695951fa27e52c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.763Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.760Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.768Z" } } }, "1e61b3b890446ac615cfca4d43e26692a7bc7544426233b862918b5d3fb722da": { "68327a573af2128ef9f8b75c6d3764adaef0d6d6a2518cca36e25acebd3d72ff": { "jp": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.775Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.774Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.770Z" } } }, "2365f342aa73537207eea12c5ea5e59b84982495f018fb65d762d8ced77d7432": { "303a2bb1adcbfc7e719c1aac71a6de6454f8a1ba771cf607483f97b277db1bd4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.758Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.756Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.766Z" } } }, "361b5b1d32de2ebb3e52e8460adeb4b22ec4bc8ca04ceb0e717fedc703a31195": { "10b62158d3216eb8065dd2ff7515e8754275c4c7f5c6d4eed8d2ede3b37286ee": { "zh": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.806Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.809Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.808Z" } } }, "3e3f9cdd02598c16b281b93fb32c30b1be85298c6b705aa31bfbce0e5880e103": { "e9242354e112109aceb1f980cb5bd9997a81807b4b2b9ad51d2e395d6925d743": { "jp": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.753Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.765Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.764Z" } } }, "47db68ab348b969e40c4783275dbc11e1b7c3f0d1e0f7993066d41cd80abc360": { "eb30b9830f751c6d73c63c4e71376e8e862a1b79d67ead319e3a93512cfb332c": { "jp": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.815Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.812Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.811Z" } } }, "49e360371f0bc0d697298f4470438952e521fabefd1b9e98218955be3cdbbcc0": { "974e376db0d1f6bc3a3c2778b18c785b8cbb420855a07c1b3d0cfb100fdf6562": { "jp": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.788Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.796Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.788Z" } } }, "58cd3f4391882ce670046b8d82826c3c127fcee3b6aa2afc15ff717cd3d10d71": { "5015c123581af2b4d332b12ea65e8e6ccfdf0a8a5c76d9fab3a9a30aedfe8767": { "jp": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.775Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.810Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.770Z" } } }, "5d6ff265e282770018f2a3801b1d623cdca059cd587edf9408ad75b7f0427f29": { "7bf23f00d17d99986e4f0927c2dad27c8d9b95293b0f84a3bd9420e9a2cd90c4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.733Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.730Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.721Z" } } }, "92e00a40688842f014f868586a36e069a52b6ebff0afa9668aa0116030f149f7": { "507162d0c5f858cea0fe1b5f4cfb599166143072817567489682c950f1313b5a": { "jp": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.719Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.722Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.717Z" } } }, "94305f7921348204002c5fceee250d8a329b22e97297f5de432297ca6b6ce190": { "68e6800c1c85abed9956b13cc6c1349b8178fe6cfb23ebcc8aa5475efd99f8e7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.755Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.814Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.772Z" } } }, "978146b52bf1385e45bd326ef044217c2dcdc8bb47040c12f8ac16274fa8addc": { "229b20a3b9f2e01d63cbf0aa22d459b44b4535cff9593d53b6edbfdd28847fdf": { "jp": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.760Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.763Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.768Z" } } }, "b65057e512e1d5ba2b482da61eb41e96a0451b3633379d8bfcd74a74bc5c5255": { "d590e32dca83cbf697fbc724c2b52de9f53b427e55f5e82add0e7c98c670b72f": { "jp": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.781Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.780Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.778Z" } } }, "bbc79010b259fcfbd187a6891a0f4fb7b780904c181f0266b6753f4d179bbd0b": { "9124cca07daf9271adc7984d01efad4c1a6d47441c45c6be540d3204e5502916": { "jp": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.718Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.718Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.715Z" } } }, "c04de4891f93a0ba91486fc9aaf76205c21818b034acf58a753695af7332b3ac": { "783554b75229a238156945270a3356288601a5016510ae7113ea4d4f746a89d9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.816Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.754Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.073Z" + "updatedAt": "2025-11-29T02:45:02.817Z" } } }, "c5ee15352746ad76714767dc88162427e77db4c02b35d0258b67bb1a35882ab6": { "1e07570b89f9d1753c7c6fa5c9dc7f96cd00626361968edca1ee15a898637fe7": { "jp": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.776Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.783Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.782Z" } } }, "c9f381cce8333661e63bd1e01d8c4f1774748ca4686351ffff148b88e9e703cb": { "e4a9139614a7f11d3b10e77e31631df6b358e364a358b51b7e9d35e161a62d0c": { "jp": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.765Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.773Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.764Z" } } }, "decba6568d82bbae43bf10ae33288e0bb54460fab2d76fb910a5037c036d8b31": { "b3961ee327c6fafcf4999b1abd14b74444d3905528c75bc8bb8c2bfbefbe9765": { "jp": { - "updatedAt": "2025-11-26T07:24:12.211Z" + "updatedAt": "2025-11-29T02:45:02.716Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.218Z" + "updatedAt": "2025-11-29T02:45:02.721Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.720Z" } } }, "f8499afd2bca127eb328fcbbb1d86926a4b6ed99899c57bf912940e11e81fa53": { "57d37a6031f92bd82e315b49237fe134b84352ea376fc2fb6ae7f50d8a63cb03": { "jp": { - "updatedAt": "2025-11-26T07:24:12.220Z" + "updatedAt": "2025-11-29T02:45:02.740Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.221Z" + "updatedAt": "2025-11-29T02:45:02.743Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.219Z" + "updatedAt": "2025-11-29T02:45:02.734Z" } } }, "00801f2886d2097d3f3fd23c2495271df83abfb95d59a9c9a2b4a905b8ec2d19": { "20cf324bd963db14b9a1a4346dec4811329f6ebe733b3eeeaba7616399e4d20d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.843Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.841Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.915Z" } } }, "0d7f085589a701521498ae4f2032eff79402e3efaae1bf069e42f610cc1714dc": { "65b6c024a83d6653e55cb1503b9816b66a3ad761b629019961fe3f8f698afb45": { "jp": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.822Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.826Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.836Z" } } }, "1b24b02c3b8b44ef65014e1185ac74c302c13f1cd510990f907cbfb6af75565c": { "153f09d0dc6e1710e949f8df69bcf6dddffcd2f29e7b48e271192abe56431443": { "ru": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.829Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.825Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.831Z" } } }, "1d3ae6305b61a5daa4272a2fdf5bc89befcde6b3c3cd8ac506e835ebca98d2ce": { "7cfed78448288b1e3ce81098eb348b43d832571045d5f68b5c05727141c3c15b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:45:02.921Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.917Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.918Z" } } }, "221df8cc4bd4c59f72e569ef5c6a2072eeed57f90181a227e34cf111231768d7": { "c38114543f910f77d0865008910f7e9c6395ef18ca1ffab216e250ed274cc4f4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.842Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.833Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.825Z" } } }, "2dbf7fe23f006182359a9db8a0997fc25605a170bbf502414f10a4d0445f3741": { "a3d059702798e7975e6104e13702831f09dab10cf354c44b13f40788c8b697a6": { "jp": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.835Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.911Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.912Z" } } }, "36a66d817a53f3419052a70bb1815a864c606b97c1626029b4822b58ad82c762": { "3d820438e1d508017cfc5d486b3974a03a6f0475286a479dfda2cf575d825e99": { "jp": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.804Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.804Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.806Z" } } }, "424e2c03bd385b0d797e5742bd8f37c67a6d1d9878707ee374ab10fc13b79f63": { "a39308aed08887cbbf1b7ddcfcc47a901be42991586b7b0c15366672b1a8486a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:45:02.858Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:45:02.860Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:45:02.857Z" } } }, "43e8a84fbf33b51194a80d037248d79de4e1436f50520586eff76e3d3f2af304": { "f19d15b264b03da92de17398ccc6c09d43af2b4d24b0b7c5e1a05393cd4b3fa6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.078Z" + "updatedAt": "2025-11-29T02:45:02.853Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.078Z" + "updatedAt": "2025-11-29T02:45:02.855Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.078Z" + "updatedAt": "2025-11-29T02:45:02.853Z" } } }, "519d5b1a64a00744511c1f3e47df4f483237ba323bcad90f4c2eca4ce9a37794": { "f9c93f24237acc26028d821a685b28dcc71dc3b5ef28ed3f611cd0074fd7d695": { "jp": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.757Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.759Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.071Z" + "updatedAt": "2025-11-29T02:45:02.773Z" } } }, "595165a4c673965a825c2516944ed6da341d1802ba4af0d1f8e1442aba248fa8": { "8396ae84019ca44433161f57c91a29f40404e3a589100e8cca8e8000206607f9": { "jp": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.797Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.786Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.787Z" } } }, "7e455500c000c9cf2e608bee5ea8ceda40748f754e86eb2dfa6fb808fff46087": { "bad6198b79924e96476294bbd990cd527edc29dacccf3bc3408a2a70258e5f0b": { "jp": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.810Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.846Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.809Z" } } }, "976d169b47215323ef4cab38c850345f280e34b651c35ee7a506d07e901ec587": { "91662735bc3f121c2f531adc960066dfb766691e7210f186029e52bc32f80b4a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.796Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.798Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.802Z" } } }, "a2d877584716bec8ddf5f64a0ba5fd7a0a6b67f9077bed82dda87ee72bfffb8c": { "8d6d45dafb5a931c179b3f202896d1e34592ec42eecee9e2f9c96e83bc4cc999": { "jp": { - "updatedAt": "2025-11-26T07:24:12.222Z" + "updatedAt": "2025-11-29T02:45:02.755Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.072Z" + "updatedAt": "2025-11-29T02:45:02.774Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.771Z" } } }, "a5c7b243af8ea45f4cac1779bcbf974f63ad2778759dea05635eca542de84b9b": { "d7c29ef5219d22555b84953c119240e3967ba43e9caba2c80886d14046eb7fc2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.784Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.789Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.790Z" } } }, "d20916d14ade0ee04f39675be5d395d4a057b6b2238ab20a85bf425d1e48c431": { "1ba41582c1e8ebc8a0609ed6a4c503280d425de63584ec900b123ce79c518b7b": { "jp": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.767Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.216Z" + "updatedAt": "2025-11-29T02:45:02.752Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.217Z" + "updatedAt": "2025-11-29T02:45:02.752Z" } } }, "e4ba3f71170ffd976d7ad1047d155c73155719b1d252f0fe0608a02ffa3d64ca": { "a6ee74f4a5fa3c471abd0d72cdd9151b4614ba229d109564ac3a2e5c5454bd4e": { "jp": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.789Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.786Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.078Z" + "updatedAt": "2025-11-29T02:45:02.852Z" } } }, "e7b858b48d1c9c70d32c523d9dc6357d0917ee69b16fa5c6a88fd2a2cfac0098": { "092cf9506a86a0643021a3bc1abcb0426387f5124df02aa60181da49a76114c0": { "jp": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.785Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.785Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.790Z" } } }, "eb1a1f01631b05bf1533ffd2c55c66414eb49c1741c154d4907afc8f73f7235f": { "9a41183439ccb685d921031462bb9652422322a842f20a13f989ee4825c98e54": { "jp": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.807Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.808Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.795Z" } } }, "ecc50ef743da07587f50e2e433c891d853c4145a43e14073bee65beca199ca9d": { "e3d9d895a670833c385d032550d1d2f2e8ecc66328713f84bde5f6eb645a9a70": { "jp": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.762Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.761Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.224Z" + "updatedAt": "2025-11-29T02:45:02.762Z" } } }, "f811cef1e60d3d76b1890136803c78a8a4f1f5c0702d5e269d8ea318cf5bc7b7": { "8ed2a0a54a6b4cc5249d9184642124cf15bfe670fcebd8151de225c2a95e77c4": { "jp": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.769Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.756Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.223Z" + "updatedAt": "2025-11-29T02:45:02.759Z" } } }, "037cf7beb5f9d2290c0e219686b1115e8e4b773c79f541f5c81f9a4989e58cd3": { "3f6353039db49376892bd891e326535ed8f03543ad08cc2ad5b7bbbe193ee94e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.833Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.840Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.837Z" } } }, "0a6b34520ca8168f8c366dbf6721239ffec9e0995481a49f17e32bfdf43182b3": { "d12d9428ec537b38678164b4a2d6a7eab105d1f3658778da83f05b64228fece8": { "jp": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.826Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.824Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.830Z" } } }, "391cd20c30f8013777a8a8300b0127fdc765340375b9fa4c319adee3b24ec843": { "c91f5ec1d83b0cec76d7a0b4857bf98e46315d814f9cad3887ee4296fdb30001": { "jp": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.915Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.919Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.917Z" } } }, "4fb36325d48e506203d8d75bcf6b70879d8bb4bd5ac0aef7b03cf1d784b85934": { "e592ec6dc8b770289b11562b8d28fce8a2ed7c9589b8caa85832638eef552890": { "jp": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:45:02.954Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:45:02.957Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:45:02.957Z" } } }, "54668b892baede02e5b6a5cbaf788773fafac8277e523ed65fc920f4ea6df2de": { "0163d4482566b616b6e411361068fbb4094a1c1d66cab5c5f906a2faf1fe96f8": { "jp": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:45:02.954Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.823Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.823Z" } } }, "59d8ec79d616c3429926d7db76bd740cbaafbbb1efd8c22b46480f65f400d6ed": { "a215229132a79542224dba0890d25487c4b0a3cc5a0109d4622445912b1ad347": { "jp": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.830Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.831Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.828Z" } } }, "5ad0090f8bb37d66ad4ec384fd8c183a6ce6d85bd5c293bdc484cc9f40bbfc3d": { "fa3251d9fbc086f42e5d133962432d1e0e3306745b593aa2bc755f7b16f5bfa2": { "jp": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.837Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.839Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.834Z" } } }, "67deff08df6c97036b3da071e7956e16555880aeb53c7d8ac63d1316e5f89993": { "8b19006f70430697684ec4194432408cb6d68b05965376bdeba185e83774be1d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.835Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.832Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.080Z" + "updatedAt": "2025-11-29T02:45:02.824Z" } } }, "72054126de2c0ba649ef4842d3a88e42bc8fbabd3ec579abd629308399d48364": { "f53eec1c24f726e22bbfdd53d757a2f052bbadb6e11837183028dab74cbef510": { "jp": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.799Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.801Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.794Z" } } }, "79354c33a23d98f8b63fe6e965aef5d6b18cdc962e36d20a3b148d8cf335f86c": { "a1b7db6e0aac3869ff670ca64a57cc2cb592944192a99aea022777ca4d6ae73a": { "jp": { - "updatedAt": "2025-11-26T07:24:19.078Z" + "updatedAt": "2025-11-29T02:45:02.853Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.851Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.078Z" + "updatedAt": "2025-11-29T02:45:02.854Z" } } }, "8ef8c9df9ddafcf602e81139aa8e6731772a4658d96021c4f2181a1d5e213669": { "bbc0b523bb0b92fbabe619f5570db6bf3895fcc93bc57a5e31d9f3b2110f036d": { "jp": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:45:02.859Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:45:02.859Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:45:02.857Z" } } }, "9a882460cbd2fdc9c5ff521d87a5f2d2b7ccd55f1ba81bfb3906e7ca923d1c1e": { "437e57c81c3f0872003cb47aa8df2359ae68ecc690d887ec26b6e38a740144f6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.804Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.803Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.805Z" } } }, "ad780b9bfd73ed606b7968549e04e8b3334085724088340ad05f2447559d540f": { "2bddef7ed07c45258897c9370efaa505180d67c313bb2d16ef2c830e5636aa00": { "jp": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.829Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.827Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.793Z" } } }, "ae79c700aca5153218493e8a943d16630b2f7ea345ab07e3105236857b43d93b": { "b1e073c8374abc5e997e5c6b5beb49db3202f0731072d2c28d7fbb0d58ae5e38": { "jp": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.913Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.844Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.851Z" } } }, "cad443b0bb3344ed063f7aa4c7fc2b79aced5e32830119e2376d8bc59ea14c52": { "7d224b4658e83885570c772a1a61546603db3deadf2539b9ba2ed630cb97e6a6": { "jp": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.801Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.797Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.803Z" } } }, "ceefbdcea6747301b15ae01324b1afd1ac12aa220ed2fe99add6fbe53f6c7269": { "5840e875e6ec0ff5abbf5480df1b95d85a50786763ab037f67b711d24e4e67c7": { "jp": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.800Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.793Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.077Z" + "updatedAt": "2025-11-29T02:45:02.805Z" } } }, "d4d0c35c5f0beed1c59fef3df7f5bfb3c862a52553491c973702a3bc2127649b": { "57ffcbf7d6cac66182cfea77cf8aba9e7c9e489b22f114253119e9ff7f8c1f83": { "jp": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.791Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.078Z" + "updatedAt": "2025-11-29T02:45:02.855Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.079Z" + "updatedAt": "2025-11-29T02:45:02.856Z" } } }, "e14b170922435b64e35287ad9833a81f16ff54cafad9dec0721b50d4150e5eff": { "a7e402c7578841050808aadfed7d6deea52ece0e68f8352e2e942645abf29aa1": { "jp": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.792Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.794Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.800Z" } } }, "f613caf640545aa0661fb14392a49a46e530351b4d92bd137405952d82f5b4c8": { "d8b96ae66a4502def2f78fdd03f27807df147056c6b3fc7bc330500d5a9451ba": { "jp": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.798Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.796Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.076Z" + "updatedAt": "2025-11-29T02:45:02.799Z" } } }, "648b00935dbd871b726296d698650b456ca7a653fa072fd74ce364e23a608928": { "ebc9c5357fa68d5d160cb6ddf6f938a834ac5bfc24d527684b3b9feaa9bc6a60": { "jp": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.842Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.839Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.838Z" } } }, "6d063f7195776042aa3f0a6d982cef56abab4e4b689ea926e2fc79ed09f5a2ff": { "cdca3b6d03d5aff13d620991a578cf9aae185e67396d308d55838c9401281d25": { "jp": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.844Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.845Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.841Z" } } }, @@ -20307,117 +21587,117 @@ }, "000b1489bccc8788cf74aa6329f6c98ad06511f167f46f1b934a958a5c6ce2b4": { "ru": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.820Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.074Z" + "updatedAt": "2025-11-29T02:45:02.821Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:19.075Z" + "updatedAt": "2025-11-29T02:45:02.821Z" } } }, "99b41ad75a6b23d70cb86b644a533c095785f9bb812c802ab52b650473d678ce": { "aa16d1a33d3312895cbf47d1ede82586dfb4df0a3507111d6cc8823a5446a979": { "jp": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.916Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.225Z" + "updatedAt": "2025-11-29T02:45:02.827Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.845Z" } } }, "be4a5f793e39d6e7b18691ba8685878af8c580f898c9f09efc5b93e0979b3902": { "b95eddde3a53a14028e00000ea72057696b55e352e2a30cb66fda415c9ba5d5e": { "jp": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.840Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.913Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.228Z" + "updatedAt": "2025-11-29T02:45:02.912Z" } } }, "c6fb4739e8e0ce948c34c03ed0f585498d9b45c24d566dfb8456926c4160207b": { "1d24888ce8aa77edfe5838c52a804ab3149a5d9497f036556a3e08576311a7ea": { "jp": { - "updatedAt": "2025-11-26T07:24:12.236Z" + "updatedAt": "2025-11-29T02:45:02.955Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:45:02.955Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.237Z" + "updatedAt": "2025-11-29T02:45:02.956Z" } } }, "d917e72b0a533c5af5b78c94fe1c05954dfd7ee48fb7ef7ab50f924f25fd68d2": { "b98abd6c9ba813c4b4a7cd9bc3018c8d18d3b4e71c0ec5233cf5d8da0a0f0441": { "jp": { - "updatedAt": "2025-11-26T07:24:12.229Z" + "updatedAt": "2025-11-29T02:45:02.914Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:45:02.919Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.230Z" + "updatedAt": "2025-11-29T02:45:02.920Z" } } }, "e05df611d62735d38ef4d916bb8f4ebe7a8d79a8773dcc1e94584527d5291d29": { "6ed109f9852559b92ce5667c817e8c2bc706b8ada65ecb41dd89ea0a07d5a71d": { "jp": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.836Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.227Z" + "updatedAt": "2025-11-29T02:45:02.838Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.226Z" + "updatedAt": "2025-11-29T02:45:02.832Z" } } }, "8e4cc87be65a0de0b75cdf694f1e368b68e721094e28ad05d1ab2af1aa7c97c2": { "b4c7e25600e2e0bab1150a0a7777cdce0d61b9c3e50a9c73e33bae121c92cbba": { "jp": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:45:03.096Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:45:03.095Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.268Z" + "updatedAt": "2025-11-29T02:45:03.097Z" } } }, "9dbbdc5c5acc11dc5874d8f84c2ec9210659a18cdd63bcc17e5b9addd0e11761": { "ca5dbd38b58fcc4d7a89bbb3e287de8dd7982f758f2a8e314589026ceed00758": { "jp": { - "updatedAt": "2025-11-26T07:24:12.266Z" + "updatedAt": "2025-11-29T02:45:03.090Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.273Z" + "updatedAt": "2025-11-29T02:45:03.164Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.084Z" + "updatedAt": "2025-11-29T02:45:03.088Z" } } }, "a1ae550295a483325655e321e7db058409614a56e29a23b67cbb7b001c387ca1": { "8978ba1f0ad1f751ccb53c78a3aacb61cbebe5e747e9d35fcdd7d9a45f55b790": { "jp": { - "updatedAt": "2025-11-26T07:24:19.085Z" + "updatedAt": "2025-11-29T02:45:03.089Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.267Z" + "updatedAt": "2025-11-29T02:45:03.092Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.267Z" + "updatedAt": "2025-11-29T02:45:03.093Z" } } }, @@ -20440,6 +21720,14 @@ "ru": { "updatedAt": "2025-11-26T07:24:18.960Z" } + }, + "286b947a3d644f84707e96a4a80f3a46f47bb75bf677493bf29a2c4578bc47c3": { + "zh": { + "updatedAt": "2025-11-29T02:45:03.381Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:45:03.396Z" + } } }, "757c782e8d474da0f84ccfdac904b2cece14a9ace176070652ca6e68725754d8": { @@ -20453,13 +21741,13 @@ }, "4123bf4754603cd137b2c347ddc2ecbf727880d70156ebaba4224dfc6513ccdf": { "jp": { - "updatedAt": "2025-11-26T07:24:19.029Z" + "updatedAt": "2025-11-29T02:45:02.276Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.284Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.031Z" + "updatedAt": "2025-11-29T02:45:02.287Z" } } }, @@ -20482,6 +21770,14 @@ "jp": { "updatedAt": "2025-11-26T07:24:18.936Z" } + }, + "b63564ec20730ecb181b7257817dbde4f1541c1b85a389cbe3cd4e6e203c48c5": { + "zh": { + "updatedAt": "2025-11-29T02:45:03.384Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:45:03.390Z" + } } }, "955f5f9d51c1666e2ab36912b9d7ce9512a594a94c3d4f68bbd34dc0b4b29a4e": { @@ -20495,13 +21791,13 @@ }, "2020a467b74c2031b09501bd31ebb2d005e1c3d366aa4673be3ded168b7cf3c3": { "jp": { - "updatedAt": "2025-11-26T07:24:19.036Z" + "updatedAt": "2025-11-29T02:44:56.594Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.597Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:19.037Z" + "updatedAt": "2025-11-29T02:44:56.599Z" } } }, @@ -20524,6 +21820,14 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.081Z" } + }, + "1e00e7ce8c07b67a72f3c30424ca0c2d930cacc231adf5a1336f323772ff2edc": { + "ru": { + "updatedAt": "2025-11-29T02:45:03.389Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:45:03.393Z" + } } }, "ae8f86a4950495ec40a22f13e62e97bb26b60535bf2661e78523aa5c7694d172": { @@ -20545,6 +21849,14 @@ "jp": { "updatedAt": "2025-11-26T07:24:12.093Z" } + }, + "a99976a7a738ebb33cada2f4d924528e1f6779ca2332591b2c1eaf27105ec883": { + "zh": { + "updatedAt": "2025-11-29T02:45:03.386Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:45:03.391Z" + } } }, "b56483af638a1b6f0944e0c00f0fa305176ee14ac4e45829309f7b6e538490d3": { @@ -20566,6 +21878,14 @@ "ru": { "updatedAt": "2025-11-26T07:24:19.025Z" } + }, + "82debe159b38d56f0f7e43e16823ebbfccd913c0fde77cb1d097d676eb7fedb7": { + "zh": { + "updatedAt": "2025-11-29T02:45:03.375Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:45:03.377Z" + } } }, "d77d62a6594de01ac3e3969fc055ae87ccde060e7d7acddbf4ec2e3d79a2e678": { @@ -20587,6 +21907,14 @@ "zh": { "updatedAt": "2025-11-26T07:24:12.200Z" } + }, + "18ed02e06f16dfce881d97046fffde26c9f0db28c8ce1161a1f73a89b58682a6": { + "ru": { + "updatedAt": "2025-11-29T02:45:03.379Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:45:03.395Z" + } } }, "efe7462318a21cb44aed58f2c59069ee34b55da9d484d24f8da7d81958d002e7": { @@ -20608,18 +21936,26 @@ "ru": { "updatedAt": "2025-11-26T07:24:19.008Z" } + }, + "0af616e387db07695b2962dde0bbbd92c2ccccdb78cfa45a093fafcc97b3918c": { + "zh": { + "updatedAt": "2025-11-29T02:45:03.378Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:45:03.395Z" + } } }, "466fe68cf77ba8d2f7e6b11a62dcea8f2b8466f8161a1a4fb8352442e971815f": { "0fb852baff9f99f784eb97ea0fe1e81f329d845d7e142f0cf03f1c59b7c10b6e": { "ru": { - "updatedAt": "2025-11-26T07:24:02.661Z" + "updatedAt": "2025-11-29T02:56:02.456Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.056Z" + "updatedAt": "2025-11-29T02:56:02.462Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.444Z" } }, "35ad145cf388d16f5d4a4011168a1fc7287db6205d3337996d98df0726ff1b0f": { @@ -20634,26 +21970,26 @@ "16c5698666ea7909d9e1753e9b13a5de1a08200f19d637afa8cab711a0379f73": { "38ea5377628be1984cefdabbe1181d528ddf34276864ec19a7193979c8dca03a": { "zh": { - "updatedAt": "2025-11-26T07:24:02.662Z" + "updatedAt": "2025-11-29T02:56:02.457Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.663Z" + "updatedAt": "2025-11-29T02:56:02.460Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.661Z" + "updatedAt": "2025-11-29T02:56:02.454Z" } } }, "85911f3bccb6d5539862e976203980d7d51391821089a818a002e7424e1242da": { "d7b1a435f7e4fe293383e5e8731be7cd7008caf825855a2e246a89ce3676aa9a": { "zh": { - "updatedAt": "2025-11-26T07:24:02.662Z" + "updatedAt": "2025-11-29T02:56:02.458Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.057Z" + "updatedAt": "2025-11-29T02:56:02.465Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.451Z" } }, "4ca4488b6240f0969f58775cdd28b38ea19b72d09ed672806dd6066698e103b1": { @@ -20668,13 +22004,13 @@ "237a635525e427bffb1c840b646e1b41486b8ccabc7712217a3d66d8c582f1b8": { "727edae2b97b38f4fc6c0b0dd353075d4fe831d345dda64ac9471ceaf897e490": { "zh": { - "updatedAt": "2025-11-26T07:24:02.663Z" + "updatedAt": "2025-11-29T02:56:02.459Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.661Z" + "updatedAt": "2025-11-29T02:56:02.455Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.661Z" + "updatedAt": "2025-11-29T02:56:02.453Z" } }, "b1a18bb55dc19c1ae6d59cc1d7b85fd42acff628d3ca1636bfb8236189f4e211": { @@ -20692,13 +22028,13 @@ "7f4450440bea714d4def4ce9d273c25160fbc93f8195d945039db1f03871b626": { "98ef39e86680ea8421985ec9e48a11480382a84780d7c51e21ba7c7c08ba5de3": { "zh": { - "updatedAt": "2025-11-26T07:24:02.651Z" + "updatedAt": "2025-11-29T02:44:54.975Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.651Z" + "updatedAt": "2025-11-29T02:44:54.976Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.650Z" + "updatedAt": "2025-11-29T02:44:54.970Z" } }, "046a9d5b6025a5438969893155368430145da58084c1a1cdb51b2f442bd31728": { @@ -20716,13 +22052,13 @@ "96339230d0b0662c9043872f701165e62b1dd1a9ee98448c3678014c12742331": { "f9dcd7d2195374981d74d8864cbac9660f4fe55a672e340bfa424e86bd032bd1": { "zh": { - "updatedAt": "2025-11-26T07:24:02.663Z" + "updatedAt": "2025-11-29T02:56:02.460Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.446Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.445Z" } }, "6e8878bf1b9d227317cb48a45ab9134707488c84ad6fd609253a2e8ba3d90635": { @@ -20737,13 +22073,13 @@ "7b1152a9f1bfab485338afd2d917ac4d27b6ac598d4df8c416b5d34f5f2f2dc6": { "e85d9475b25d51b62300a450688edb90649a6b929805c4c6c7dc02c5c82425fb": { "ru": { - "updatedAt": "2025-11-26T07:24:02.651Z" + "updatedAt": "2025-11-29T02:56:02.407Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.645Z" + "updatedAt": "2025-11-29T02:56:02.385Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.652Z" + "updatedAt": "2025-11-29T02:56:02.409Z" } }, "77b3f7333c54264798591573269c51eb187a6530077b8c89d00454a32b3814c7": { @@ -20758,13 +22094,13 @@ "ff3c9f598e696982267c2ce9a91a552bebc66583c1163dc1c4b27f82c5102f1d": { "128e8ba5fd3b5e0981c42ebd31c5b3e87b6845262805a4f4bff3b70534bfda44": { "ru": { - "updatedAt": "2025-11-26T07:24:02.663Z" + "updatedAt": "2025-11-29T02:56:02.460Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.397Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.658Z" + "updatedAt": "2025-11-29T02:56:02.440Z" } }, "21345561752f0d94aea8069e30373e2f370e4ba9287cafef0820ff4937dc0a05": { @@ -20779,13 +22115,13 @@ "0361e95538168e72e0cf9076b4f8a823f82bca2acba30f30499d1d7ab6a5509f": { "d46f5caa45acdc3ea0cac4ee761116eca50f70acb1faa2569b6101636d3704f8": { "zh": { - "updatedAt": "2025-11-26T07:24:02.663Z" + "updatedAt": "2025-11-29T02:56:02.461Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.056Z" + "updatedAt": "2025-11-29T02:56:02.462Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.056Z" + "updatedAt": "2025-11-29T02:56:02.464Z" } }, "7eff5614e108ffbe8fdbb7cb7a60ce43f1c34abb8dce2015fa7c6e289db7874f": { @@ -20800,13 +22136,13 @@ "4914840b74cd4cd05b93446005c1a3f9b45c7e7816eb8b20c953782a78417420": { "66ffb1d1eb8cc149ea48f7ecfeda0ca180b36051bed03928a1992c631dc4c19a": { "zh": { - "updatedAt": "2025-11-26T07:24:12.056Z" + "updatedAt": "2025-11-29T02:56:02.462Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.658Z" + "updatedAt": "2025-11-29T02:56:02.442Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.661Z" + "updatedAt": "2025-11-29T02:56:02.453Z" } }, "40abf84cb8f86fa1a58b9ec5523ea457c40aaf25e3b348ce068ffc50600529bd": { @@ -20821,13 +22157,13 @@ "7c40f4e2df36269b352d83d988edf0d606726b28f6527552e7eea3bbecafdef3": { "199bb81cde4d12c23b1adc97c7e2bce05a479079d23a4bb65c6826ef95452990": { "ru": { - "updatedAt": "2025-11-26T07:24:02.652Z" + "updatedAt": "2025-11-29T02:56:02.408Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.649Z" + "updatedAt": "2025-11-29T02:56:02.399Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.652Z" + "updatedAt": "2025-11-29T02:56:02.409Z" } }, "370a91b8533a723d2e4b1549c35c6735c837f2f50c1c4d609903126372f45d30": { @@ -20842,13 +22178,13 @@ "1eff56196650aabbed5f57974122db842d54e3093cc55755e2f4b980a957f4ac": { "598e57a0788cdc232382a72f993fe05e0d9a2ec8e815e0b23e6780d39b245171": { "zh": { - "updatedAt": "2025-11-26T07:24:12.056Z" + "updatedAt": "2025-11-29T02:56:02.463Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.445Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.452Z" } }, "4adeee00af2b7dc1689945fa1a3ea72870eb8d82635d23c24f5afacdaee2d9cc": { @@ -20863,13 +22199,13 @@ "3c95fa2e161d494b4ae0ef9bf3131f3b028f13b824f5b7ede9ad688d11b58387": { "904fe0150e0e8c168afe250519fee5a4c27e23da832c312dcab667da64fa503d": { "zh": { - "updatedAt": "2025-11-26T07:24:12.056Z" + "updatedAt": "2025-11-29T02:56:02.463Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.443Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.662Z" + "updatedAt": "2025-11-29T02:56:02.458Z" } }, "296904d83e2f05abd0d201b63756e4993fc070bdb04cab19f7310a5f4982f1f8": { @@ -20884,13 +22220,13 @@ "19260fee9e23907e67f7f4589d997bab22cbabd4ffa0aa96806703a3b19aad78": { "1352a2dbb90191a61432180810a0431b454c526d658886e1c33fdb1c71cfc2bc": { "zh": { - "updatedAt": "2025-11-26T07:24:02.658Z" + "updatedAt": "2025-11-29T02:56:02.440Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.448Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.658Z" + "updatedAt": "2025-11-29T02:56:02.441Z" } }, "7032d2644260720142d73bb5705b9bb1dd26018cb12c421cb43c6bd87452858c": { @@ -20905,13 +22241,13 @@ "c71190c424029f1f3166b0dc0c975e43b747cc77aaa7477e6c8834baafd715ec": { "40fb6fb53bc03ff95d4c2a5b88f33db598b6bbba4a8c8273a31dff8b7c9a3fcd": { "zh": { - "updatedAt": "2025-11-26T07:24:02.644Z" + "updatedAt": "2025-11-29T02:56:02.384Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.650Z" + "updatedAt": "2025-11-29T02:56:02.403Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.650Z" + "updatedAt": "2025-11-29T02:56:02.401Z" } }, "35eb622d4a1673d7a2b49ac6d4fbe5151e7dad205dad7c16e0e36879a5bbb7da": { @@ -20926,13 +22262,13 @@ "3490c72ebec2d9960e4cc311de931030fc0f1de3f2421d0d2a30876926a983e9": { "20143fdffbf6f144ae3f0a848c2c4135b1dd5359078f18a35f86e5ad0368f0bc": { "ru": { - "updatedAt": "2025-11-26T07:24:02.647Z" + "updatedAt": "2025-11-29T02:56:02.390Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.650Z" + "updatedAt": "2025-11-29T02:56:02.404Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.651Z" + "updatedAt": "2025-11-29T02:56:02.405Z" } }, "716d4abd1d53aff3d2fbee3ec30720b9388d98d71e41c650e6551e5ee79417a5": { @@ -20947,13 +22283,13 @@ "df1cbab9f5b7839553ad76ad0b3799099daaf2d5817b6bc1eea8369de5c5842a": { "3a49b42cc312e4959cc3883b924f895ba1f241473240bcbd42a5ff859048c600": { "zh": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:56:02.484Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.061Z" + "updatedAt": "2025-11-29T02:56:02.518Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.061Z" + "updatedAt": "2025-11-29T02:56:02.485Z" } }, "66576350fa60992186887698075dc59ba76bb735288c2751fa40b91ce10698f2": { @@ -20968,13 +22304,13 @@ "d133c163191364466953c00a3494895f7b213291fa7eec0a3286c15ab6588c48": { "5b79efc25b16535ce983e05832f4052257d44d2790af29323a727be1048bc054": { "ru": { - "updatedAt": "2025-11-26T07:24:02.647Z" + "updatedAt": "2025-11-29T02:56:02.392Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.647Z" + "updatedAt": "2025-11-29T02:56:02.389Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.646Z" + "updatedAt": "2025-11-29T02:56:02.388Z" } }, "de7e11301702e7f96f6fbd025a9103d0ed8c30b19a1bb2d879dbd161c1061ad6": { @@ -20989,13 +22325,13 @@ "5ae13595aec14e94efae48ed27bd30882ef99ca22e926c6eecac01f4a69b6e60": { "4c6c9c998098906955cd0a416322eaf10b8ceb9a33df69bb90b4e0206e58399d": { "ru": { - "updatedAt": "2025-11-26T07:24:02.648Z" + "updatedAt": "2025-11-29T02:56:02.393Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.649Z" + "updatedAt": "2025-11-29T02:56:02.399Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.647Z" + "updatedAt": "2025-11-29T02:56:02.391Z" } }, "832ebe1b67ef5ee07034a93035676b1d6ba9f009d34428f33f25ec2daaa43771": { @@ -21010,13 +22346,13 @@ "52f1e721b650aa5a8bb67053afa7caf447a7332e92f416526d36e8941d726d04": { "8c41257fcdc2d116e76c9a1609bc65adf58513acff260b8f2aa36d74bccf31da": { "zh": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.443Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.450Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.451Z" } }, "630e5b84780be36656bc937645ed65fb88179d11247d1e85ea1205ed29e6f931": { @@ -21031,13 +22367,13 @@ "5a0ce1710868a408e43b0c9859a80ada3b08b93b0d26cb45f2ea004556e9d2b3": { "ccdecf590d1994e9c17ae91e353b32d2f66c08e379ce1eeb73f06a674afd8375": { "ru": { - "updatedAt": "2025-11-26T07:24:02.648Z" + "updatedAt": "2025-11-29T02:56:02.394Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.648Z" + "updatedAt": "2025-11-29T02:56:02.397Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.648Z" + "updatedAt": "2025-11-29T02:56:02.396Z" } }, "a2d654d0961b9427057876a5b47403d5864939d9a0cc302f7941e73ea9093498": { @@ -21052,13 +22388,13 @@ "9b3e13e23b506d9d9ec9b2c5fbf8b9d2a62e1de7d0175c5f6330498124203aac": { "86c47ff8f3b3666e1a6b49b2c8302b448389e1e3b41ab3b1450e055082821549": { "ru": { - "updatedAt": "2025-11-26T07:24:02.646Z" + "updatedAt": "2025-11-29T02:56:02.386Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.646Z" + "updatedAt": "2025-11-29T02:56:02.389Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.651Z" + "updatedAt": "2025-11-29T02:56:02.407Z" } }, "8c1816d77d3551c7d6dd5710ccc8274f66e5809dd3cea3606629893483ebfef7": { @@ -21073,13 +22409,13 @@ "30f843a3827d19f26bae893b6a89699d15924309d3ee0d771f1309eb391c8171": { "a5eb46f97ff75367e3c2a77e86b555adee47157db34a73cbb68c4faa8e14d033": { "ru": { - "updatedAt": "2025-11-26T07:24:02.659Z" + "updatedAt": "2025-11-29T02:56:02.398Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.651Z" + "updatedAt": "2025-11-29T02:56:02.404Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.662Z" + "updatedAt": "2025-11-29T02:56:02.406Z" } }, "655ba8e4e20f3b5f89cae3033f51649118b5face2393e69b8ed2d63f7c170bed": { @@ -21094,13 +22430,13 @@ "15cacb127be1afdc884be3ff13c61ff48d4ae41e28740309f5f445002fb0fa90": { "a9c8fa4f53951ce4026e170171a0517a80777e9037e5bb2f16eab83d3ffaa9cc": { "zh": { - "updatedAt": "2025-11-26T07:24:02.649Z" + "updatedAt": "2025-11-29T02:56:02.401Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.651Z" + "updatedAt": "2025-11-29T02:56:02.405Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.648Z" + "updatedAt": "2025-11-29T02:56:02.394Z" } }, "c6b1ffeb8a927241e2108dbeb02a8cbb166d5b270f1e7cdf770147d6ef83a7d2": { @@ -21115,13 +22451,13 @@ "941b4aa0aa9dbadd0a190a16a820e2bcff3884350dd172d2d70c5e4bc21490d1": { "429135ca177730d77f47327bd61c6aecd212a21d1a4625d711d13a6e0c6886bd": { "ru": { - "updatedAt": "2025-11-26T07:24:12.061Z" + "updatedAt": "2025-11-29T02:56:02.447Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.061Z" + "updatedAt": "2025-11-29T02:56:02.449Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.061Z" + "updatedAt": "2025-11-29T02:56:02.485Z" } }, "d744ea0501987d0d0496e17c8100a30396b41d2cb02d4b4937b9c75678cffd0f": { @@ -21136,13 +22472,13 @@ "43aa5066af84a8c935f0fb2dab57ea37c855c50a8c4bf2fe5da1196726ec9767": { "8102f53c258449f037fd5c8bfbe1d4547d061cf4c8af817be8f9e6c45a4504b0": { "ru": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.448Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.450Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.447Z" } }, "bc18044844f416597eef2c300fc30d72ea362c8100b916b3cde37fd6397a9e41": { @@ -21157,13 +22493,13 @@ "a3a2fbdc5aafe02b0407589bc3e1a8e94202c17584b7025219f1bfd6b9bf4a39": { "4874e6e4325e8473fce83ceca9411bf266bf400e8eb78d3c9e8eec128469d820": { "zh": { - "updatedAt": "2025-11-26T07:24:02.660Z" + "updatedAt": "2025-11-29T02:56:02.449Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.661Z" + "updatedAt": "2025-11-29T02:56:02.455Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.061Z" + "updatedAt": "2025-11-29T02:56:02.456Z" } }, "1b128db269c12be2125d03f195c663118806c04caea0bed54648c79f2879ccee": { @@ -21178,13 +22514,13 @@ "4877e91053b08c2c45734e5085ccf9117e8354554dd8460e2ec3e3afe7aa0ab7": { "1e4f5fb2eb3f3d09c80229402157ba0cccbf2f37d7521185e9cbb71109edeb84": { "ru": { - "updatedAt": "2025-11-26T07:24:02.650Z" + "updatedAt": "2025-11-29T02:56:02.402Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.650Z" + "updatedAt": "2025-11-29T02:56:02.403Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.649Z" + "updatedAt": "2025-11-29T02:56:02.400Z" } }, "ff50c271592348dfa10d95b4d2fa83784b90178a9865e6dcf8c7996829ea7358": { @@ -21199,858 +22535,858 @@ "a444951bd73cb75b037df1739eb17fc3c4057630058e2cd15b863d55feb1e497": { "be2b70c111bb68681c2eb58d9d87da824e86dac80806aaf1af31eb7e683ee46c": { "zh": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.675Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.692Z" + "updatedAt": "2025-11-29T02:56:02.692Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.694Z" + "updatedAt": "2025-11-29T02:56:02.698Z" } } }, "b61feee503868b9ae36d297816fda3d2e834c0f1ae6f4deeefcdd9b66b895886": { "4ef342336cc701c4e8d32cd01c1302bec119023fab8a7c695a4baae3e097696f": { "zh": { - "updatedAt": "2025-11-26T07:24:12.057Z" + "updatedAt": "2025-11-29T02:56:02.466Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.477Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.480Z" } } }, "b2e9e9045947db36c00975d8bf16f27ba366df3f4c68a977779fbf5a78b77948": { "046cb0e8076cf8c0b6c68469e0acc454e928a24cf0dfeb0b83292ecb2957f821": { "zh": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.676Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.692Z" + "updatedAt": "2025-11-29T02:56:02.692Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.691Z" + "updatedAt": "2025-11-29T02:56:02.689Z" } } }, "a8580441e057aef43ff213b00764e321caa0062300adad449c1147c6a00554d7": { "803165c43e8eb2cc396419bba2e85a710e5a34fa1c1f8c024a4ef0cd296866fa": { "ru": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.710Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.732Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.713Z" } } }, "581f0a6e4c0d192c8606c68934251365ad7ea4136bd5acf7058f58a76f6d5710": { "ee59cd484bdaa73a60bc061cc701d580ffd417f73fdcd689e3fdd983d9f475d2": { "zh": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.748Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.749Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.903Z" + "updatedAt": "2025-11-29T02:56:02.759Z" } } }, "8d435bf9e6c99e8e1a52f439de6bcbecd2baf3265ece4535053d1e1416ca45c2": { "0c0d01e2f586c0d713dccf1bdfde13a36570342ea30a52d1914566a1af56d594": { "ru": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.711Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.729Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.726Z" } } }, "ff15f334dd81c6f832484d8628568a040ff836d4668005abe916911afbffe911": { "5255a26915e56655751575c9c47141ed725215520f648de9ddb2650d95ec7c9d": { "ru": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.676Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.691Z" + "updatedAt": "2025-11-29T02:56:02.689Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.691Z" + "updatedAt": "2025-11-29T02:56:02.691Z" } } }, "84d3a07f6bb23015f78e31d1cc93e61eaf670a2dcee7c14342d97b32fb037866": { "e5b0ff50a5b4e2b593b51ad0606dd79a8525ea9ba7bc58e22bd24ad8c5a925cc": { "ru": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.677Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.694Z" + "updatedAt": "2025-11-29T02:56:02.698Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.678Z" } } }, "54d5d67f63f4e8a40581478b2c6f0684322d03116d22c84c5ebed5934c483f47": { "04a1c4adbd60bd15811afb47b49c06837b0eb88b3c5f243bc17465571d25d192": { "ru": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.713Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.741Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.722Z" } } }, "fbe38e1b6e52f3e6a217864f12729f9229c6e773c063d08c4fefa0972fe40f33": { "45c2a21595b33f95e98b84bb6f2c46e0dd1efdfbc1f9b42ba02cf96b3dc4ac1e": { "zh": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.715Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.734Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.719Z" } } }, "e9c8787fbd5d3ab34de4fbc2069baaf46f6986970cc7b8edaffc49a991d61cf1": { "7b366931a91740ebcbb465a17f5142106ecae677c271c9b69d08fa475ef502a6": { "ru": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.677Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.692Z" + "updatedAt": "2025-11-29T02:56:02.693Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.688Z" } } }, "14c0bbca8f7e350393ed679d410ca4b9cd58e0c5ee29885f7e65beae7f51c703": { "82258f2bbaceee1cc2b71c162991c1eb92c67498d494693cd385b4bbbb78fedf": { "zh": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.715Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.742Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.708Z" } } }, "dd1f243e110cd8cd4c72fabd62923f7077ed63859ba2c578b1561943fa5490a9": { "38b8464001ddae6ec2a702908a9a44c1549405c54b818345c5ee01e6079833f1": { "ru": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.750Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.901Z" + "updatedAt": "2025-11-29T02:56:02.755Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.900Z" + "updatedAt": "2025-11-29T02:56:02.754Z" } } }, "ba14369199fbec0937cc2e6400083d328a65fa21e4191586d4474ff60d50b27a": { "687b275c30319ae8712f2bb22a713be7698df9bf60e3f0a3a92687b0ad5813e5": { "zh": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.607Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.612Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.620Z" } } }, "0aefd7962edb78c98f3d45305d81752ebb2eaf0195c75d6a1cd6e7ad0ef5617a": { "5d1d0d81a87bc16246cc6d195a4d9c9f3090b00692a1dcfb3dd44b533128b6dc": { "ru": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.716Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.730Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.717Z" } } }, "6b0a1864f6fd70f19415c4e085caeeff45b83244daed33758454b88d9859c692": { "ecc79a94c617ae9c2438b3b427bea3004cc3f1e8a3f90157b36f8157166a99c0": { "ru": { - "updatedAt": "2025-11-26T07:24:02.653Z" + "updatedAt": "2025-11-29T02:56:02.411Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.653Z" + "updatedAt": "2025-11-29T02:56:02.412Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.653Z" + "updatedAt": "2025-11-29T02:56:02.414Z" } } }, "543d200284e9587853538717503646bf5a945bb43ccdb3b059dbf4eac4c1219f": { "54eb6cb69d7901f33c8b60f1ebf53444695ba214c41ecd088af34c6dde0d4e44": { "ru": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.751Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.904Z" + "updatedAt": "2025-11-29T02:56:02.762Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.750Z" } } }, "fb3d54543e5565bc4305346ef7c2d5312674405acb6e193ffaf4fb30ddd7ce71": { "df9135ddc19fc1bbbb29d708bd2c3afbd621e4a67a544ede4538a80aa5b420b7": { "zh": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.717Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.721Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.712Z" } } }, "14b4676b953c664afb277f933e119c8da2f742590c1a9a4bb7b2beee22a7eb7c": { "5ee021b8f49ccf1b18d5dd6f94a9b7418709365c4195a6b0854ae20f5132dd10": { "ru": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.679Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.684Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.684Z" } } }, "0f67bde502826e1dba901c267e553e40b45a88ea2514fac35224b3011c9eee95": { "40ccc189c309d81655c42b58d6550569ed8e72b0cd53cc36991d1ab17eeb62a2": { "ru": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.680Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.695Z" + "updatedAt": "2025-11-29T02:56:02.700Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.688Z" } } }, "93a056e5b771b1f20f3660dfb370f302960d593ccff14a5684b961c760cac61a": { "b34875547efada966d6f58a27a70b1a17213f7251649cd70a29b9fcfe4aeecfe": { "ru": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.718Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.723Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.720Z" } } }, "ebc5db761ec12b7516bddcdbb93d868ef5c7d1458f56a4288fab25b5e45a980e": { "e20f9f94eb03e49c98c43e022936ac730a22ccaa64a4911703f457858a10f672": { "ru": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.680Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.693Z" + "updatedAt": "2025-11-29T02:56:02.694Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.695Z" + "updatedAt": "2025-11-29T02:56:02.700Z" } } }, "f016a1612cced253f74884a4791ce47126fba584f3ee773967310982b7597b83": { "cc687fc17daeeb33c7c5bef1a2bc7ce51ba437f92c4354369ab58a024c2123b9": { "ru": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.681Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.687Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.688Z" } } }, "f657cce435f5bbd4c37d13d06e137048b8588d93820f3ee19d2b600ed82b6819": { "f4e41d0b3fe1c04866d1690f92f407974255a1b7b269dd34af873b60f54ecb09": { "ru": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.751Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.902Z" + "updatedAt": "2025-11-29T02:56:02.756Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.748Z" } } }, "5a8a41312c127bc8ee51985dd35b7a34db3722502d9dd3b6517218f83ee15209": { "cdc27bc165065afbf272c456901edc7e818c1288e8bf98aa8115b3cc4184e430": { "ru": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.681Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.703Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.732Z" } } }, "bb301384e711a26eac5ab620725ba3651e9a050418e5c4b03409244a6916096a": { "fa37176654ae0b31692c4310f41376cac060e1fac5de1cd5fa4a6795dccc88be": { "ru": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.682Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.707Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.693Z" } } }, "be5b2c5f34f09aeff162abaf45ccf882807b091723c8992305ab5dd6d9d85255": { "a4494efc6991ad7d0de3d84b86e624697071ddfce8e39ebd42923fd6777c8531": { "zh": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.683Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.685Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.685Z" } } }, "b7ac58ff02407e2eedc607e8ffaadc709667604b213c6400361a10c2a2c6e252": { "ae94f635f518e540a73bbd471cee47b91d539ed719fbffdaf358c667006c4bb0": { "zh": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.683Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.686Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.678Z" } } }, "f2566c10efb98a7e07538653cda7cc2135c5c1aaaef306a48e8e753ebc662a1e": { "86c47ff8f3b3666e1a6b49b2c8302b448389e1e3b41ab3b1450e055082821549": { "zh": { - "updatedAt": "2025-11-26T07:24:02.654Z" + "updatedAt": "2025-11-29T02:56:02.416Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.654Z" + "updatedAt": "2025-11-29T02:56:02.415Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.656Z" + "updatedAt": "2025-11-29T02:56:02.434Z" } } }, "c3d6ae1d7c3ab47f1321484233d7e2d4c6960c431966f43a50c94da67e615da5": { "7fe2061b7ffe48c965db16b4f632dfa6a0cb32888881320b91a370311396c437": { "ru": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.643Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.642Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.643Z" } } }, "6f8f89ce13c70fe1235d08203ef798a559154950245f81065ab893d0e5c542e3": { "f96e0b809311db6c2baef6eea1807c7d62c21afafa50f43dcaed5dc333127e20": { "zh": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.722Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.737Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.738Z" } } }, "857f78e82a54d7a2128693b3d739a16697e3d23a8ab3595b336d9da8d6d1d643": { "3fadea060a820d56c666c2cf5cdeb8e49e9c833dfa43de6b17bb735aecf7c763": { "ru": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.686Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.699Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.703Z" } } }, "98f9d0cfd669fd1fa447820ed42dde75e265419fd66cf20c9292293dd4a825b7": { "ef840aa109bf499596594d13130b402a3f00f31d42de8569556571fe1c214cfc": { "ru": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.752Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.752Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.705Z" + "updatedAt": "2025-11-29T02:56:02.749Z" } } }, "0ccba8d2db72b1884bbc46c41967afaeff1aa84c34d44e471d4f0a6956691e16": { "94c625175686dfb070b11d461168883b7020c135e87e95dc215bd6a1888c5c54": { "ru": { - "updatedAt": "2025-11-26T07:24:02.690Z" + "updatedAt": "2025-11-29T02:56:02.687Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.691Z" + "updatedAt": "2025-11-29T02:56:02.690Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.691Z" + "updatedAt": "2025-11-29T02:56:02.690Z" } } }, "c3624723e67987627989b19cf8887d0607b1cfe3b554bdb9b1a4afe0241fb796": { "394ce4286ff89f65fa6b50578d4a94d4eaf540883591642f71afb2825984bad3": { "zh": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.487Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.488Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.489Z" } } }, "3f0eaac3f28ba8b2234626f11889b6f51135f12393d659a739adcfe6bb3acaee": { "b93542926f20e8394566dc0612022ddaf2939a3fdd8e5ae25b2ba31cb94de320": { "zh": { - "updatedAt": "2025-11-26T07:24:02.654Z" + "updatedAt": "2025-11-29T02:56:02.419Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.657Z" + "updatedAt": "2025-11-29T02:56:02.437Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.653Z" + "updatedAt": "2025-11-29T02:56:02.414Z" } } }, "101a525d5bb936cf99909df3325b1ed7ac0b685ee9889c47f517b4323eba52db": { "fead6f3f426b4d09ad7d10dd975751d5778ec0e92cce0f8ec88ce01950911970": { "zh": { - "updatedAt": "2025-11-26T07:24:12.058Z" + "updatedAt": "2025-11-29T02:56:02.473Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.475Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.057Z" + "updatedAt": "2025-11-29T02:56:02.467Z" } } }, "6bc2d77e531374ac95719fbbe878154b867b374b36d2f4e8485da1fa3a3820c6": { "d33c2c466bd3a7370a079c2bfd8752318550c559a12158bcc434cabdaec31040": { "zh": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.724Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.735Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.708Z" } } }, "43bdb45dd285638fe98614183eaf90571d4631d1e726c04b99db3c3faa08af32": { "4ba84b799e9b0e8d9b223c47606c717ef7d6ddd565986bc7b238eb33165681f5": { "ru": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.753Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.904Z" + "updatedAt": "2025-11-29T02:56:02.761Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.903Z" + "updatedAt": "2025-11-29T02:56:02.757Z" } } }, "fbc3d920f0695e12f892f5ecdcfa4bc88cf0bb49809defb12c39db77838dee89": { "505618685d75d6489d64b01bd2297e8b2e4ce44b92900a9edcf4d95a5eebb475": { "ru": { - "updatedAt": "2025-11-26T07:24:02.655Z" + "updatedAt": "2025-11-29T02:56:02.422Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.657Z" + "updatedAt": "2025-11-29T02:56:02.438Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.657Z" + "updatedAt": "2025-11-29T02:56:02.435Z" } } }, "67e6b09bfe484e48895cf047e4050cb1f08398f2f779e27c7acf3ff69d9c5e8d": { "7b905336c6f753917b4e006f53075b8ba27cb105a18643882989eab9b01e424f": { "ru": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.725Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.738Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.711Z" } } }, "736363d0859d8864ef39d3c2b3906d5ee9e8520ec754a5daaa253102669dbfe3": { "4c2ab8cb337c681d306ce35ffbf49cc6acb8d68b78b1f946b2757bbefd07e898": { "zh": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.725Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.734Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.729Z" } } }, "f9122446fb42667abd4d27483874244c927449544300488e6be5e19f0f5c5196": { "fc2f22b778e933aded713c592fc3c7f36b5925e3b1dddf870b9f00d0d86f3078": { "ru": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.726Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.733Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.710Z" } } }, "235b40c46d2961005ce3297b1e97ffe8edc82de828ff56822b9e32359796e9a9": { "c5ef2e83c2e151559f9dd5524371a9d5b3447d2d1d74ee4818d09823d6de408d": { "zh": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.656Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.692Z" + "updatedAt": "2025-11-29T02:56:02.646Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.667Z" } } }, "462cdde9af0d98973a369e372516b17fe788292eab3b5888894d73e9cbffb6cd": { "d745f7b346b2c1bf0d164fbdb236d9160be09038c4c9ffee5d2fe13aaa441118": { "zh": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.619Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.624Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.616Z" } } }, "710ad55c0afad6985a560346d1622540e29d92eadcee6064888e0cacbfeda384": { "54f1a9cd08afe76cfdeea722af528c57303609afdc34748e3328885c439ce7bf": { "ru": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:56:02.481Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.058Z" + "updatedAt": "2025-11-29T02:56:02.472Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.475Z" } } }, "0fb5c4c89db0cb83f6bd1cdef9a19071c391929cb24660f2f66de45b10763ba3": { "23aae78ddaf4de455a27e50918cb30da7db97d56977cd4dbe8df7b2e1cd49fc4": { "ru": { - "updatedAt": "2025-11-26T07:24:02.658Z" + "updatedAt": "2025-11-29T02:56:02.439Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.656Z" + "updatedAt": "2025-11-29T02:56:02.430Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.657Z" + "updatedAt": "2025-11-29T02:56:02.436Z" } } }, "45c65db56b87943c8cc881cc85fe81f875a263a988b758817095b2448ebeab1c": { "ef02a49eb6596c142aa773eb78cf22212510b6f1bb9809d02c025e4d34ab82d7": { "zh": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.657Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.642Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.656Z" } } }, "b58d28384b38660cb355b5217eb858f4bc83ad7155278c40ae4663b230c74fd8": { "f5263d91719fc0aa0d4dc51eba8629ecf707553c3c6fd5144e8f1ca748775d75": { "zh": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.581Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.598Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.572Z" } } }, "8d7c4ba98d5f5bbc6e42b2591da7f2b20f246b15396b0ab2075839fef18b5697": { "157c626f8a13dd4dc09e8313f1bf33c397d35bf379c354eb9d973e648827bef2": { "zh": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.620Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.637Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.614Z" } } }, "4d0528f558f80f4881563682077f001ad134becf467e305c86fc84dd7697b089": { "42d9d42562a4f705923103bf4a3b7173addf1f1dd5adc163a37dbd936aa49889": { "ru": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.657Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.650Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.645Z" } } }, "a5d93e69125f512b3e1f00266e424585b846115536039af5f58cae578c2829e3": { "ecacb8f11638f831b9c20da459d9a74e871ae3943e5721f34aba4985e3a9d9eb": { "zh": { - "updatedAt": "2025-11-26T07:24:02.667Z" + "updatedAt": "2025-11-29T02:56:02.551Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.666Z" + "updatedAt": "2025-11-29T02:56:02.549Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.667Z" + "updatedAt": "2025-11-29T02:56:02.552Z" } } }, "5bb6610775ffe555ff909d1e5c0cb423ff2c15c044240729c60b0ebe39bbca30": { "d2a5526c06779a9c79d3b4da1256e4feac0aed57c3171d923a4e08990a784158": { "ru": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.658Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:56:02.647Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.682Z" + "updatedAt": "2025-11-29T02:56:02.672Z" } } }, "2c61f03a4fe808580cff4e8aa1a6939d84eb12b9a43724b98bab278d020bb194": { "4158e73583a46ee61d2835723076f3fd91bdae28b86fb6f4d6ab8870a8146937": { "ru": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.582Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.578Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.575Z" } } }, "8fb2e5e5d61ff6b4830012f315c75ccd22ef6f64c4ee7685c2cd3215aabfe79d": { "c393d1a8b5995f5444564d2d762f97bb4815829fdfb74c4739bd527681d89cee": { "zh": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.658Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.662Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.661Z" } } }, "1a54cbb6d0259ab1c0a7866c16289a6efb190e3d138af3035a9b892ce04da57d": { "35875b5d8355a345f2dea01781d4a86cccffca2873f0f1c8151df687559a6ee2": { "ru": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.621Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.633Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.617Z" } } }, "c5c96baff0600024d6bbb610d9cae24faf4a22e4f54fbcc16da6eea5801d716e": { "75a61fac01b9a0c4dc6479a31dfe0ccf020bf8c906301ce66ddb70adc32e62a1": { "ru": { - "updatedAt": "2025-11-26T07:24:02.696Z" + "updatedAt": "2025-11-29T02:56:02.659Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.693Z" + "updatedAt": "2025-11-29T02:56:02.647Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.662Z" } } }, "be5b364ee73eb51fe865a890d10236c2eae4146ef19afc9755721c110139579f": { "e55f970b0157d55548b665f2a95fc93e3875eadfb7a385687eb591b21d592f97": { "zh": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.491Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.061Z" + "updatedAt": "2025-11-29T02:56:02.486Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.490Z" } } }, "4449f60ff9c38182ac376f1ec8ad4f5c377a1d189bf6b8bd0b3f294437ebd1a5": { "b4657b26faf846e566012308f61103c34dbe662b80add135f7d0720222c74ea5": { "zh": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.621Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.608Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.617Z" } } }, "809f990c2475c0e585de5f7677ad5e69d2c480395ed833dfa2922067881e3350": { "1534d3d5fab78c52b36945dc4157e83845141abc6b963eed5bb780b27e5e23e2": { "zh": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.492Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.501Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.502Z" } } }, "8184344ce9b79685863100b25d75f907caba31a6f26b64caf68881e98ea41913": { "8fe3205e82057a29dc0d8aaa2e33ec896cd304ef416bcfb7264bf8da1fbaaa77": { "zh": { - "updatedAt": "2025-11-26T07:24:18.904Z" + "updatedAt": "2025-11-29T02:56:02.761Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.904Z" + "updatedAt": "2025-11-29T02:56:02.760Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.902Z" + "updatedAt": "2025-11-29T02:56:02.756Z" } } }, "0c03db74eb0923183ef12e6e957c01e6d8255d17051d0474807d2dfe15494516": { "8d293de1b22941bb10fe562a4e677c7c7472f7d882ef5aadce39c9033dabb63f": { "zh": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.703Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.705Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.701Z" } } }, "a1c0860ae09b803ff5ed9c9a0c438bd6b2800982753e32c40c910f32979fca1d": { "48ad888591a6dabb0298398a02a18436095ab5c603d344f9156ff7e7ccdb28ae": { "zh": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.739Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.736Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.714Z" } } }, "86a43cc92512a5c918f3385b494d3169c660273f3661eb8dafdc49055b720698": { "60b60a413c29322369042c265eefb3d9aa56d79f8c71fe607cd1ac9eeb60e393": { "zh": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.740Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.740Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.720Z" } } }, "036300ef3b2f4858d6615f663b03ca7a594a026409e0fe0ca41882745b846afc": { "1ad91e7f68dcee666ce7f7d2260270095678629c6052b5b84bf68dc6d54020c4": { "ru": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.495Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.489Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.062Z" + "updatedAt": "2025-11-29T02:56:02.492Z" } } }, "586898784b2000de57eead4932f64db3ae6900471f06aee84b184f3bf8efdf12": { "9c727f0fda6cea3eb8d9add0737f40fd7c2a246e0b779e6a2ea7559741c3af0b": { "zh": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.496Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.495Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.497Z" } } }, @@ -22065,1097 +23401,1108 @@ "jp": { "updatedAt": "2025-11-26T07:24:02.670Z" } + }, + "5962997760b38b2cb309d629f1dcf48964113a84f277bdc508e98c8bad0fa965": { + "zh": { + "updatedAt": "2025-11-29T02:56:02.562Z" + }, + "jp": { + "updatedAt": "2025-11-29T02:56:02.563Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:02.563Z" + } } }, "e79b575c27312875f3076748b2d4de3bfd78216748310c894e316b5c6b915aa6": { "7a7699a4379151bff326d63b86c2e5f5b0c36a7de56625710bbef094f9488e4d": { "zh": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.723Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.739Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.724Z" } } }, "c74acd4897e7b7ee4b2df0bff72a35b3b8acbfe976eaa8215f2fcfc031f94ccf": { "720c459362ca150d27eb7701d7e48ce41817e1142bf4ebb8b4e2a87705715ada": { "ru": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.572Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.587Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.589Z" } } }, "503329b0d4a76ca6bed899e9672f8b552300a0c87af309f4216ae734b9861fd2": { "675e12d63a5beef8dc9c071b80bc5249b9dc320e87ed8e63ab1dba75742d1c49": { "zh": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.573Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.581Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.578Z" } } }, "90f0e15a1b59f060a6f0f952d87af6522508eab261e93dd1ff9d2f135297bc7b": { "b323a03a283828a8dd2bdb1310eabc167e779d51e7e53bc928a0c3475022c6ed": { "zh": { - "updatedAt": "2025-11-26T07:24:18.901Z" + "updatedAt": "2025-11-29T02:56:02.755Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.904Z" + "updatedAt": "2025-11-29T02:56:02.760Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.901Z" + "updatedAt": "2025-11-29T02:56:02.756Z" } } }, "e1777c4c468ab2516b850e57b6f6bc5a611e182371ea737b4494074aa581da40": { "c93f95ca1da1b0eee11a33d644aec21a8b55b826129592b9eba161908812b369": { "ru": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.646Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.653Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.682Z" + "updatedAt": "2025-11-29T02:56:02.671Z" } } }, "64e0092d1db56a02e6a5bca8f0b5056cf1f521390ec3925bb3e50df81aa7ac85": { "9a5dd87bf7b220294da0bc415b255ea64029a767c79b1e6a895b5d3d57801055": { "zh": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.650Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.652Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.653Z" } } }, "d012409948884982e8bdf1e450327b34af2546383469b4fd132b635459e6f305": { "95aa9403608d32399c22cc7fc263d9ab30a605eea3844947170400f89d7e71d1": { "ru": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.620Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.612Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.608Z" } } }, "00174dfb396f321fadf5749558a865565bf4dae8cc5d6fa8f305ef68a7f1c6b2": { "d2f79ac832b7a2d7aaa410633fb001b9e95f4660cc65da2bdbe34ab52df0894a": { "ru": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.659Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.644Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:56:02.649Z" } } }, "774db99efcf187fd85ea22f0f07cfb6cf5fb6cc68251b2913b976e914e74a951": { "cc59400f1e7b6cc7c2ce5902dae7bd2a641bff181193f2f3f16b2cc24b094add": { "zh": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.583Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.595Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.571Z" } } }, "4da7a2a8dcc0e8244d17285e749f8d2f66e7c939010b06d93f9506b5e0443395": { "5d4659d3e6e8c514f951b33a0e387bbd5340061d0fa6ede0b8d63a27a889570a": { "zh": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.660Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.666Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:56:02.648Z" } } }, "8a9dc951991e7089ccd4e1eedd2df9ce190a4888a63408845057666bec28693d": { "3ea6e01fdab2aaecd5561d6a3738320c4c955d0937ec5157cb9ac2e69e3fa30b": { "ru": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.702Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.704Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.701Z" } } }, "e0416bafda40f9b0abd3190774a6d8b8b6fecab49f9676913bac6e5e053b382e": { "aa3e533069b101ec06bf29cb5c1935709f54b0a36858f4636f093f238b277647": { "zh": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.622Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.613Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.641Z" } } }, "6bec8fb9d627bbc8d58479b40c1ff2e2105bf84d0574e514ce2d4a909b35d280": { "9892fa9d4ee47152dab0a70403163228e13146e378a484ac01ec35395c96a186": { "zh": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.737Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.728Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.727Z" } } }, "d600a99ead8b0977fbdf31462c610327f9207f07a47047e4cfafebac76ac6789": { "ba98a569e23d5a0b5a2bee157907242c18d05d010d12a96d4526528db77500b5": { "zh": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.584Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.586Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.580Z" } } }, "6c4d95e5c9add2129eec07c7db776b15731e42064678712cecf1b19d27e9fe1e": { "26bab87ac6555b58f09e971a206121597dc934bf1607e0bc1d1c1ca74b3c8ab5": { "zh": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.584Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.673Z" + "updatedAt": "2025-11-29T02:56:02.570Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.588Z" } } }, "c97c8d3fc1255144232e48ef1068845cf9a505bf268924eb00d02e4a764b06d4": { "cbf44b30af8d393437b434943a6b72c84ddfbb0c5021ffa6ee01fcee470fce64": { "zh": { - "updatedAt": "2025-11-26T07:24:02.667Z" + "updatedAt": "2025-11-29T02:56:02.553Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.666Z" + "updatedAt": "2025-11-29T02:56:02.550Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.667Z" + "updatedAt": "2025-11-29T02:56:02.552Z" } } }, "aa965228754f809fd54c3e57e8b77d0a2e9c4a048e0e68cef7ae8c333114457a": { "f9ce484d23646e185c37dd955d8f8211aaac0ff9716bb25cc7a6c1dfc7722732": { "zh": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.623Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.637Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.609Z" } } }, "db4a603afaa721633684ab401b86356ad8252b3e4987d3d7f3a1c55750046ef3": { "c71c72e22f263d7e5cb4b6bc6151025b50d1a6999e50ff20143e7d9570eab7e8": { "zh": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.624Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.628Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.628Z" } } }, "cde7d435635c91652b2386bf1619cb7ad40c1a75333e02d9abeca5d374b5fcd2": { "7ed8aea2f22f07b5e6da1bc31a668115f599b57278bd5f78ed4d027851ee59f9": { "ru": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.625Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.606Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.615Z" } } }, "baa5800841c33574a763c76d84029b7167e28cd0e383b549d3c87bdde30230b1": { "4e66ec48e4681668b3829e07df4225df08079780a33326c20145dbd63d2cf115": { "ru": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.702Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.693Z" + "updatedAt": "2025-11-29T02:56:02.696Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.694Z" + "updatedAt": "2025-11-29T02:56:02.696Z" } } }, "6999f92f0023fe1dd1e922ddaaf1df722f316e49e43a1f46219683d3add8c812": { "9280cf92c0f64187017d3e623d9d06cf5122c9cca98da66abea3317bbf634e3b": { "zh": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.626Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.607Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.625Z" } } }, "534c97b1abac407b7ffecba5c237d20ca3ad4c270a44ed90b44e77de585a610d": { "7ba7deb86c597b598ca684677abf36c48f1d224dfbe3c8465bb1e2b40a280f81": { "ru": { - "updatedAt": "2025-11-26T07:24:02.667Z" + "updatedAt": "2025-11-29T02:56:02.553Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.668Z" + "updatedAt": "2025-11-29T02:56:02.554Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.669Z" + "updatedAt": "2025-11-29T02:56:02.557Z" } } }, "2c9a0b8bcdb6bc350cecc5d8a2a8571d9ab75452db549ce31e1fdb37159adb97": { "a30a7c92ea08285c067ff0984feefbb3785f4b1f14d7715bfc668fb4bbc9261f": { "ru": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.585Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.592Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.585Z" } } }, "89191e0f0f3ac7ad6fcbe90e008723be94527b1dc5730c24b0ef28b7567b621a": { "db61043ee1c3c508cdf7d9dd474714bef6965ab628e609c3b20ddf986ef02cc9": { "zh": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.627Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.638Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.640Z" } } }, "e9514b207fd2f0999e54604bcc5f81ff6fdaee6511cc23ec24b5e33bcbd7a748": { "9824c5507b882758b8df0cd7ac8ec6f8ec745839288f88d8cad0156e2ed55258": { "zh": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.627Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.610Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.613Z" } } }, "bb75403cac8908b2d1e0f7435d3c432ee901f13dfdca991fb73204120a85338c": { "0a7663696896ca536cf8c5b6b0059cce8944689bcec816f2b5c5b41720cbd804": { "zh": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.663Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.669Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.651Z" } } }, "c66448d10c048389547620c0efc34decc72e9f80bc32daa2c49d957e3c02fa1b": { "1f29d5a37e6fed39b5f9602645e28d9fa470dce74a39a6c598dbd0a16867a37c": { "ru": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.663Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.654Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.679Z" + "updatedAt": "2025-11-29T02:56:02.660Z" } } }, "7a098dff053dea397b97871863eca7199375f5d95f819134c433310d813f3ae4": { "ea322771a5ea71a865948471da4a31d3c932f43e7f418fbd44d17ba4dd564761": { "zh": { - "updatedAt": "2025-11-26T07:24:02.668Z" + "updatedAt": "2025-11-29T02:56:02.555Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.669Z" + "updatedAt": "2025-11-29T02:56:02.557Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.669Z" + "updatedAt": "2025-11-29T02:56:02.556Z" } } }, "a36c558e3cc8eb2a3b03c01a4286bfac9d72237977464d90e7395a10cf2209e0": { "94ce7d6626e94f915dc3f8c3c80748074f7c1a750f5800beccd7406817b5d19f": { "zh": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.629Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.639Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.626Z" } } }, "68ae98d78891d0611568e05de511ec72306b7b3511df399280a7ae2c79b3ee06": { "33c7517467d660435f217ea64c4bf7d1325b67636ba929b3ced122cbffac2355": { "zh": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.493Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.500Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.499Z" } } }, "561284460b1fb2a4c59ce07e83be4fee1a8ff052b66a64ff66141a296715102c": { "30382cd05cdfc447ce68389ab117d0b72fb4faf154b6c67bed6c57d0ed565d98": { "ru": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.665Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.670Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.671Z" } } }, "8b014d0b3ce023d8c15fd8c5eb2d350cacf9cf3c41dd4b69ff25dd2351d35db0": { "891d96677ae497189e4ef48d65804e3b886d35381aa01b9dd409f5c32ee066aa": { "ru": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.666Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.670Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.667Z" } } }, "82fa28546b5677c4d98f580e1e222959c159ae3d9905e0932fbfebe2ebde8218": { "5207e407e3f1eccc511c0aaa51164bd35e4d15543e26e8e004002a81d42f5b90": { "ru": { - "updatedAt": "2025-11-26T07:24:02.668Z" + "updatedAt": "2025-11-29T02:56:02.494Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.668Z" + "updatedAt": "2025-11-29T02:56:02.497Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.669Z" + "updatedAt": "2025-11-29T02:56:02.500Z" } } }, "9e8c51287c7f24817ec004d3002c1ce3b305ec30df1100b9d028e5ebc63461bd": { "afbdd8bf1a036d21dd54275c5ec03df46552510b37adf7a05917d6570967651d": { "ru": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.590Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.602Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.600Z" } } }, "2e86bca26b2ac693c6c25e4a60919c546b7872ba88d487d37cba83528dd4c1c0": { "82625a723fba7e62c237b3557661bd75bff3e41b4de031a888fc315f70bf8f60": { "ru": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.591Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.576Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.640Z" } } }, "03f4f6675beb54a72bd7e3d62bec8c07f1c24ef51dcd84e88ba10e86e3a5a9b7": { "eb1beb44798239cd7a4b527f6d7acf65bd7638560f8fda08cbea63789789cbab": { "ru": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.591Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.580Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.574Z" } } }, "32ffa87be40ab5f31e20d44d8997706429f8284873cee16bf953aa7c8a533e87": { "987df6e0573b5dadab1d721fb8b42546edd8a72a4c4ef547c90da774cfdc0384": { "zh": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.633Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.618Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.622Z" } } }, "a2e55a90379e6ffc005d5cc760c9bf50e3a6631ad77cd354c2d442860ad851ea": { "a0801c6bb244ad72c6b1b26969b590462545f49f3c2c06d4078fe79f62be5841": { "ru": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.591Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.595Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.583Z" } } }, "9d795e71c1e5b5159a55b2c1f0aef5b2b5ba275de3636e7962e76d9cac324863": { "e14d02d5377204ff07364b01b4777caa9edee903a191d54d14cd619978c349a5": { "ru": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.593Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.597Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.603Z" } } }, "459dcfc8cfcb0c798eda34051037eaf36f0e8bdbf413d5ca0f86faf6d1ae4e24": { "f469d58719f2670441a26ddce21a692caf6821dcb698ad90eba442b062adb5aa": { "ru": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.636Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.614Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.074Z" + "updatedAt": "2025-11-29T02:56:02.629Z" } } }, "6aaffe8268bf79e8f4faf87000cd0de5d6453e5299b00696c4cf31cfb8d96d5b": { "ddba7dec037a2fad87464c00483c81011ad76357b5c4963561b6fb33a626d74e": { "zh": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.519Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.518Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.063Z" + "updatedAt": "2025-11-29T02:56:02.498Z" } } }, "299acd2896dbdcc7fc9ec56b51b4a1990b56dd0fe41acb3e57f9cae1bd915ac7": { "99ca8337276f2850a682286f3aa13f69597377997f305892b1182845150c4e2e": { "zh": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.706Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.693Z" + "updatedAt": "2025-11-29T02:56:02.695Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.689Z" + "updatedAt": "2025-11-29T02:56:02.682Z" } } }, "3246877b14617a738e90832de040052391f7c8fc094ca44b2455eef30fbf314e": { "d6d3906022ccc3319721785ef9aa9f57093fc737336e72eddec0d952f2c844d7": { "zh": { - "updatedAt": "2025-11-26T07:24:18.905Z" + "updatedAt": "2025-11-29T02:56:02.763Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.905Z" + "updatedAt": "2025-11-29T02:56:02.765Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.753Z" } } }, "3635e79a2e76bb297d10c5dd4637f4fd94275c1ba1081c959a4f02a8d8049bf6": { "69cff4cb3337c445b437475f175d0c1ab8c863e57aa050035a2284326ea56533": { "zh": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.644Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.652Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.668Z" } } }, "c3ae4d87db64f55d260d37bff7580e0a1ff638a6c1bebc984889a0f53e882bd1": { "c8ec9fc9c8400c3e7fc2098760f4d554623fe5eaab093ad69821218853b4e3b8": { "ru": { - "updatedAt": "2025-11-26T07:24:02.673Z" + "updatedAt": "2025-11-29T02:56:02.570Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.598Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.599Z" } } }, "7974b5d9fc7e953fa4aecd07c2f6f9176f90a9a89310ebe7fcb27dff7fdf734a": { "b66740bd12022ccefeb425eba94ee09c08528b3a5b347793bb597e953e4f21b2": { "ru": { - "updatedAt": "2025-11-26T07:24:12.077Z" + "updatedAt": "2025-11-29T02:56:02.645Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.665Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.661Z" } } }, "0d605e87bc30a8f48c930071ba0ea5cd2b5ebdbd6763536c9fdc4f2ed918a40d": { "8b7aa2cd071eea2c995cc398e7fb600f77f1f9a7fa0450f42449838022126464": { "ru": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.588Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.599Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.676Z" + "updatedAt": "2025-11-29T02:56:02.586Z" } } }, "51f9cca65edfee082630f0b1fb8e3a29f4ab177d7d5452a9abc2e1f9b56e3c53": { "96fa3e43effb19ba6584f2d1ae472b68548bb3a136e72cc23135e36bd3bd7b5a": { "zh": { - "updatedAt": "2025-11-26T07:24:02.697Z" + "updatedAt": "2025-11-29T02:56:02.664Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.707Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.694Z" + "updatedAt": "2025-11-29T02:56:02.697Z" } } }, "0f09f5442f4b4bac183a39fe7c4ebb5f27e3e93b8fbdd22c1bf04db43e598523": { "8dd4d3197218cd45163cf27ba0c5e57b39a8db91e1ae9ccb34b1ee6871418db0": { "ru": { - "updatedAt": "2025-11-26T07:24:02.668Z" + "updatedAt": "2025-11-29T02:56:02.555Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.669Z" + "updatedAt": "2025-11-29T02:56:02.556Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.670Z" + "updatedAt": "2025-11-29T02:56:02.558Z" } } }, "04bd894d54eb7791d6c20efe6b82643d60ba5f94079895df60cd832a967a8b72": { "b4b191db3e0a1686174b935b4a408eec87a5d10accead9bfce53f6fdb0c78147": { "ru": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.593Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.594Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.593Z" } } }, "ee7cf7082c51841ba27fc19b990495b38b92128a79d2a323ecbca6bb723f0e8e": { "7deda54447cba9acce76845c952c2c7f4ee86488c276f4a335c96e4c55dc6bcd": { "ru": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.634Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.638Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.636Z" } } }, "cbfa6856b07360063ce643d5dc0c1d3cc2418e2639de759af00c6f665fc517e4": { "0140ef2e17d32f74a3b543e6327533884c8025b049e9fdc7af2a729378577a5e": { "ru": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.635Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.635Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.076Z" + "updatedAt": "2025-11-29T02:56:02.641Z" } } }, "c91f782ae583639337bdc49114576cfdd9c9355b699a68919bf1bd023713faef": { "bec2f91a18ab29d790a84a8d99cfc87824936240769c4e0889827b57e2472e09": { "zh": { - "updatedAt": "2025-11-26T07:24:02.704Z" + "updatedAt": "2025-11-29T02:56:02.741Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.731Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.701Z" + "updatedAt": "2025-11-29T02:56:02.727Z" } } }, "abdc65a73d328d0f6587eba73db81db937a7f67106eeb840b67ebf52e35e6379": { "3d443c4abc73eddf8e334725cfa0abf5cbeb70f4475566a8d40953e253b629bc": { "zh": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.600Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.601Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.597Z" } } }, "6f7b91f9de26806b740498adc5e643a9126c17702c3c29691e1666087c366cf0": { "a1903aea52e9e31c6386a9cb6e37a8b774a6be1ff6724d1c7674a90cee7e9059": { "ru": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.601Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.602Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.068Z" + "updatedAt": "2025-11-29T02:56:02.596Z" } } }, "fae1576558dadb0c932329389ce8fbcbeee0d35379cb6c996673cd93aad35a13": { "3c3975cd182172060059f7637ba3d00c8b28a90dce27de128e912a0c986041da": { "ru": { - "updatedAt": "2025-11-26T07:24:02.682Z" + "updatedAt": "2025-11-29T02:56:02.672Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.683Z" + "updatedAt": "2025-11-29T02:56:02.672Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.681Z" + "updatedAt": "2025-11-29T02:56:02.668Z" } } }, "3f14c9de32cc2309c896fed678c5b28a7dbf39af5a00bc45e0fd013b9c4d05d5": { "30c6636556ee6c7c353538457f6b3b57a9f5c21c15e651b2997b487922e38fc3": { "ru": { - "updatedAt": "2025-11-26T07:24:18.905Z" + "updatedAt": "2025-11-29T02:56:02.764Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.902Z" + "updatedAt": "2025-11-29T02:56:02.757Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.905Z" + "updatedAt": "2025-11-29T02:56:02.762Z" } } }, "6bed7e7a83ecb81ba1dd2bac10ae908f5dca2985a1372a02ea6f37edc19fb8d6": { "d69df1442a7aad94ba9096815aac2b779c3a23eed85dba10c8cf5e643215acf7": { "ru": { - "updatedAt": "2025-11-26T07:24:02.683Z" + "updatedAt": "2025-11-29T02:56:02.674Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.683Z" + "updatedAt": "2025-11-29T02:56:02.674Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.683Z" + "updatedAt": "2025-11-29T02:56:02.673Z" } } }, "3e0601c102f0cd71b8eb284da75b1cb579b66391d37fa681cf6d4bc5e1cc1d58": { "4eeb3b260eb5599be93bf2151af54a52820bc5b7145e432d1d16218f6b0c376b": { "zh": { - "updatedAt": "2025-11-26T07:24:02.670Z" + "updatedAt": "2025-11-29T02:56:02.558Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.670Z" + "updatedAt": "2025-11-29T02:56:02.560Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.671Z" + "updatedAt": "2025-11-29T02:56:02.562Z" } } }, "8b38fc05c0c3883d9a4ec8bbf5caa1bbc4260e946b23ad31bf5c97563bd88229": { "58e3bcd0e949f466dc2d6e918d912d126143beea61afa2ee594bb6cb9d60e88d": { "zh": { - "updatedAt": "2025-11-26T07:24:02.670Z" + "updatedAt": "2025-11-29T02:56:02.560Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.666Z" + "updatedAt": "2025-11-29T02:56:02.551Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.669Z" + "updatedAt": "2025-11-29T02:56:02.556Z" } } }, "11f0d2e2fe5381cbdabf5c8d911e42f98d764106a83601de0c96203590ad4cc5": { "125142acfba42f104cc8a667d2cd001ded4684ba6896567aa756cbbcdfe1e975": { "zh": { - "updatedAt": "2025-11-26T07:24:12.069Z" + "updatedAt": "2025-11-29T02:56:02.604Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.605Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.606Z" } } }, "6152b4089faf21cb920f0b0e0f015947f4aa6a6539cc24579a8054117329f175": { "58de10c3764c8ae20317dce26cff68631d85677a41b3f5dbd50c51245bb6c66d": { "zh": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.503Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.506Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.064Z" + "updatedAt": "2025-11-29T02:56:02.503Z" } } }, "bca14edd411fa9f3a8a9611aaacff6972d87258f38acd6410fdf5b4d4cdbaa55": { "6bdb09ec322273b515c242a0a196c778ff9876e649fa65392b8031cb787249d3": { "zh": { - "updatedAt": "2025-11-26T07:24:12.057Z" + "updatedAt": "2025-11-29T02:56:02.466Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.057Z" + "updatedAt": "2025-11-29T02:56:02.467Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.058Z" + "updatedAt": "2025-11-29T02:56:02.467Z" } } }, "90b37c7973739db627d82b16799b1a59ebcb776db33ad8298491b0bbbed6c3de": { "73ba6fad372ebd5b4ddf82f283b3e7b1f303a8f02d8ddee4e4e8d3c0290b12ee": { "zh": { - "updatedAt": "2025-11-26T07:24:12.058Z" + "updatedAt": "2025-11-29T02:56:02.469Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.476Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.058Z" + "updatedAt": "2025-11-29T02:56:02.472Z" } } }, "5dcc85853637a46f967236f293c74ce6629e743899ffb1d793ba5c7ffae90dbf": { "6777f02cb4aba6cf43d71fcfd0acc7ed50b7a116661de2ebd8193b82df093941": { "zh": { - "updatedAt": "2025-11-26T07:24:02.654Z" + "updatedAt": "2025-11-29T02:56:02.416Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.656Z" + "updatedAt": "2025-11-29T02:56:02.427Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.654Z" + "updatedAt": "2025-11-29T02:56:02.418Z" } } }, "094593271a536e71ddc700495b0cf0f1048d6ab6c2dad60a929934f0798430ea": { "3dd2ef060c7a1cfaa56099a332e54eba203c50d4214e0f5bf98d281ff70e8d9e": { "ru": { - "updatedAt": "2025-11-26T07:24:02.654Z" + "updatedAt": "2025-11-29T02:56:02.417Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.657Z" + "updatedAt": "2025-11-29T02:56:02.438Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.656Z" + "updatedAt": "2025-11-29T02:56:02.434Z" } } }, "27e2bd6338f55fdbb9b18fcf67e0a0a67489a58d4e1c0e9ebb6902b05fc36aac": { "8929ff1edb2d47de0f53425237359fc7c4a1036ef99e001d0d30c2d13140051c": { "ru": { - "updatedAt": "2025-11-26T07:24:02.655Z" + "updatedAt": "2025-11-29T02:56:02.421Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.655Z" + "updatedAt": "2025-11-29T02:56:02.424Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.653Z" + "updatedAt": "2025-11-29T02:56:02.413Z" } } }, "19a3aba2f96aa29e64f1d6662e4c6e8d99c98fade3c4d0aa0badaed1632f4c7c": { "dc4c51508caf2bb72e5375d6abe27b369e6eacb14cc00c78c196a37458e79501": { "ru": { - "updatedAt": "2025-11-26T07:24:12.058Z" + "updatedAt": "2025-11-29T02:56:02.474Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.478Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.060Z" + "updatedAt": "2025-11-29T02:56:02.480Z" } } }, "dfad0bc3b6417f406a00ff9ef3820a57dfc8f664400a7ce0134d81da437d7e07": { "79123cc58b0a88edb3bafb181767cf704d4908d66876b9628ebccd1e31728887": { "zh": { - "updatedAt": "2025-11-26T07:24:02.655Z" + "updatedAt": "2025-11-29T02:56:02.423Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.656Z" + "updatedAt": "2025-11-29T02:56:02.432Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.652Z" + "updatedAt": "2025-11-29T02:56:02.410Z" } } }, "4b87a5344a9b716648c77706eed8254331cf4a6ce21d8a43d267f67270734d1f": { "fb4dfb8f9e647f53e63097ab00045af768eb9222f514d424b3a57634d8f3681e": { "ru": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.476Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.059Z" + "updatedAt": "2025-11-29T02:56:02.478Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.058Z" + "updatedAt": "2025-11-29T02:56:02.471Z" } } }, "f0a5d6e46b2ddd583ab900563a42b7687a1b4924afd5d0cb5260268c8952f6d0": { "3a8f69d0d17e9065a46d4d7456a503262e2f2a05ac3d4b37f49520b5f716b1c3": { "zh": { - "updatedAt": "2025-11-26T07:24:02.692Z" + "updatedAt": "2025-11-29T02:56:02.694Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.693Z" + "updatedAt": "2025-11-29T02:56:02.695Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.688Z" + "updatedAt": "2025-11-29T02:56:02.675Z" } } }, "9027438a5e9e30a2c6e8e4d197b479cebf29c05aaa3a716589f591c0ff697c0d": { "d5d6ea5e34429a4a6f22bad136f5d5eb712bbb922cae22a6c870b906c7befadf": { "zh": { - "updatedAt": "2025-11-26T07:24:18.902Z" + "updatedAt": "2025-11-29T02:56:02.728Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:18.902Z" + "updatedAt": "2025-11-29T02:56:02.733Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.706Z" + "updatedAt": "2025-11-29T02:56:02.716Z" } } }, "492b567700669f175480e40ecf1c553c463e77a0bb36e30e76eb3628c35e7db3": { "84c653bd2e6590cbd982437c2304ff4818581c1e60afb256437642c4a3dc66c5": { "ru": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:56:02.648Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.654Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.680Z" + "updatedAt": "2025-11-29T02:56:02.664Z" } } }, "dbc3d877611d9d2c9a27f2ea076decc1afc5907f3c3c02044504a307308653af": { "79b34ec963ce2ab8bc60d33c073caf0fc42c9aed7f3b97c1ed638390938960de": { "zh": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.611Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.618Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.623Z" } } }, "e5b56f33a8458d42151bcbd638d4692704a7d1f97fb2c4ed94143ff1e460a418": { "7eab19fd44668e93c10760c5fe2d6a1421e507a9cec55dfd91ed0fcab85c27f1": { "ru": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.611Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.615Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.609Z" } } }, "3f3b14a0c691ae2b5345864fd4ad20a184225db1e35ffcbd455da1aeec5f0d48": { "a9c8fa4f53951ce4026e170171a0517a80777e9037e5bb2f16eab83d3ffaa9cc": { "zh": { - "updatedAt": "2025-11-26T07:24:02.657Z" + "updatedAt": "2025-11-29T02:56:02.437Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.656Z" + "updatedAt": "2025-11-29T02:56:02.428Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.655Z" + "updatedAt": "2025-11-29T02:56:02.420Z" } } }, "5b41c30593068b713e26045c49b89ef31bda4b2d25564fc71eeafadaa3a88b3b": { "ecb137fd1463f816c7efffc5bf4c604e7cfa7735755e22327018e286ec755267": { "zh": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.730Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.736Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.699Z" + "updatedAt": "2025-11-29T02:56:02.718Z" } } }, "7c145e871f942571130b488686f2c93299c7784ad34d23a45c99e2947f75208c": { "193be2e12900fc92f5c6cf9d55c9d419bf67397ce7c166154cf4356eaee3bb11": { "zh": { - "updatedAt": "2025-11-26T07:24:02.702Z" + "updatedAt": "2025-11-29T02:56:02.731Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:02.703Z" + "updatedAt": "2025-11-29T02:56:02.735Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.700Z" + "updatedAt": "2025-11-29T02:56:02.719Z" } } }, "f5b83279dab37d495f5c4fd259883e2f59a812c65ccc8ed0c351f21a2028e710": { "caa363689f97df04d5bdb8cc80dfede581f616ede687804ff5915657268592d2": { "ru": { - "updatedAt": "2025-11-26T07:24:18.903Z" + "updatedAt": "2025-11-29T02:56:02.758Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:18.903Z" + "updatedAt": "2025-11-29T02:56:02.759Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:18.905Z" + "updatedAt": "2025-11-29T02:56:02.763Z" } } }, "bdeb28bdbd403e8a7dbfd53a18daf2d16a5ec80e2b272afff63299b084ee54d4": { "8d2b2934162408394b787a0c9376fd5fc5d3b70e883799983cb40e9cd3caec2b": { "ru": { - "updatedAt": "2025-11-26T07:24:02.694Z" + "updatedAt": "2025-11-29T02:56:02.699Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.694Z" + "updatedAt": "2025-11-29T02:56:02.697Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.698Z" + "updatedAt": "2025-11-29T02:56:02.705Z" } } }, "6d9be1cdfeaef3b95b6937fe4da26361e0723bbb44069a88774c3f6c426953ff": { "27c7a63e2afca841ae5e7d6fe8b9f6f3c513769116043f854361c07302afa76a": { "ru": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.575Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.675Z" + "updatedAt": "2025-11-29T02:56:02.577Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:02.674Z" + "updatedAt": "2025-11-29T02:56:02.574Z" } } }, "08f3b123bce337ae576d91effb4c4e0aa8ce5818f4196baa0ba59915bd0d269e": { "a29ff4b6f7e821d9ae449a998417a11cc1c6705210186befa92aa45136de5da9": { "ru": { - "updatedAt": "2025-11-26T07:24:12.071Z" + "updatedAt": "2025-11-29T02:56:02.576Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.579Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.075Z" + "updatedAt": "2025-11-29T02:56:02.589Z" } } }, "0e3c84ac0dcb64d166a9e4cad32d3420219fe50fe305e36aa358456c172e2cf7": { "318568dae18d539030ba9900a07a5c387e0ffd38a7b84468080ad1adcdccfc39": { "ru": { - "updatedAt": "2025-11-26T07:24:02.677Z" + "updatedAt": "2025-11-29T02:56:02.651Z" }, "zh": { - "updatedAt": "2025-11-26T07:24:02.678Z" + "updatedAt": "2025-11-29T02:56:02.655Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.078Z" + "updatedAt": "2025-11-29T02:56:02.649Z" } } }, "808e737b87d86c00037ee9499555e8d37bc7fd2e51f5ef796a4a104d5f453b14": { "4719caa724ba0e2a9f5dae16a0fe1e64ccb82cd37762f0d2649a253c1acc65eb": { "zh": { - "updatedAt": "2025-11-26T07:24:12.072Z" + "updatedAt": "2025-11-29T02:56:02.616Z" }, "ru": { - "updatedAt": "2025-11-26T07:24:12.073Z" + "updatedAt": "2025-11-29T02:56:02.619Z" }, "jp": { - "updatedAt": "2025-11-26T07:24:12.070Z" + "updatedAt": "2025-11-29T02:56:02.610Z" } } }, @@ -23165,6 +24512,19 @@ "updatedAt": "2025-11-26T07:19:33.942Z" } } + }, + "66bbf0d8525a651b70357530fa66ca0f30073bb1460c57979838338b1c0d8749": { + "9a8d534c4d4974d982e6c1d6d31787e905d1215b8eade3bf1524a2e15a6fa2c0": { + "jp": { + "updatedAt": "2025-11-29T02:56:03.769Z" + }, + "ru": { + "updatedAt": "2025-11-29T02:56:03.769Z" + }, + "zh": { + "updatedAt": "2025-11-29T02:56:03.769Z" + } + } } } } diff --git a/i18n/jp/code.json b/i18n/jp/code.json index 74b4afa66a5..1e7cfdc6688 100644 --- a/i18n/jp/code.json +++ b/i18n/jp/code.json @@ -68,8 +68,8 @@ "description": "検索ページ上の検索フィールド用の ARIA ラベル" }, "theme.SearchPage.algoliaLabel": { - "message": "Algolia を使って検索", - "description": "Algolia メンションの ARIA ラベル" + "message": "Algolia 提供の検索", + "description": "Algoliaメンション用のARIAラベル" }, "theme.SearchPage.noResultsText": { "message": "結果が見つかりません", @@ -84,60 +84,60 @@ "description": "ブログサイドバーの「最近の投稿」用 ARIA ラベル" }, "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { - "message": "「{label}」の展開/折りたたみを切り替える", - "description": "折りたたみ式サイドバーカテゴリの切り替え用 ARIA ラベル" + "message": "折りたたみ式サイドバーのカテゴリ「{label}」を開閉する", + "description": "折りたたみ式サイドバーカテゴリを切り替えるためのARIAラベル" }, "theme.NavBar.navAriaLabel": { - "message": "ナビゲーション", + "message": "メイン", "description": "メインナビゲーションの ARIA ラベル" }, "theme.navbar.mobileLanguageDropdown.label": { - "message": "その他の言語", + "message": "言語", "description": "モバイル向け言語切り替えドロップダウンのラベル" }, "theme.blog.post.readMore": { - "message": "詳細を見る", - "description": "ブログ記事の抜粋部分に表示される、記事全文へのリンク用ラベル" + "message": "詳細はこちら", + "description": "ブログ記事の抜粋に表示され、記事全文へのリンクとして使われるラベル" }, "theme.blog.post.readMoreLabel": { - "message": "{title} の詳細を確認する", - "description": "抜粋からブログ記事の全文へのリンクに使用する ARIA ラベル" + "message": "{title} の詳細はこちら", + "description": "抜粋からブログ記事全文へのリンクに使用する ARIA ラベル" }, "theme.blog.post.readingTime.plurals": { - "message": "読了時間:約 {readingTime} 分", - "description": "「{readingTime} 分で読了」というテキストの複数形に対応したラベルです。ご利用の言語でサポートされている複数形の形を、可能な限り多く使用してください(\"|\" で区切ります)。詳しくは https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照してください。" + "message": "1分で読めます|{readingTime}分で読めます", + "description": "「{readingTime} 分で読める」というラベルの複数形用文字列。使用する言語がサポートしている複数形の種類に応じて(\"|\" で区切って)指定してください(https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照)。" }, "theme.docs.breadcrumbs.home": { "message": "ホーム", - "description": "パンくずリスト内のホームリンク用ARIAラベル" + "description": "パンくずリスト内のホームページ項目の ARIA ラベル" }, "theme.docs.sidebar.navAriaLabel": { "message": "ドキュメントのサイドバー", "description": "サイドバー ナビゲーションの ARIA ラベル" }, "theme.docs.sidebar.collapseButtonTitle": { - "message": "サイドバーを閉じる", - "description": "ドキュメントサイドバーの折りたたみボタン用の title 属性" + "message": "サイドバーを折りたたむ", + "description": "ドキュメントサイドバーの折りたたみボタンの title 属性" }, "theme.docs.sidebar.collapseButtonAriaLabel": { - "message": "サイドバーを閉じる", + "message": "サイドバーを折りたたむ", "description": "ドキュメントサイドバーの折りたたみボタンの title 属性" }, "theme.docs.sidebar.closeSidebarButtonAriaLabel": { - "message": "ナビゲーションを閉じる", - "description": "モバイルサイドバーの閉じるボタン用のARIAラベル" + "message": "ナビゲーションバーを閉じる", + "description": "モバイルサイドバーの閉じるボタンの ARIA ラベル" }, "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { "message": "← メインメニューへ戻る", - "description": "モバイルナビバーのサイドバー内にあるセカンダリメニュー(通常はドキュメントサイドバーの表示に使用)からメインメニューに戻るための「戻る」ボタンのラベル" + "description": "モバイルナビバー内のサイドバーにあるセカンダリメニュー(主にドキュメントサイドバーの表示に使用)で、メインメニューに戻るための「戻る」ボタンのラベル" }, "theme.ErrorPageContent.title": { - "message": "エラーが発生しました", - "description": "ページがクラッシュしたときに表示される代替ページのタイトル" + "message": "このページでエラーが発生しました。", + "description": "ページがクラッシュしたときに表示されるフォールバックページのタイトル" }, "theme.BackToTopButton.buttonAriaLabel": { - "message": "ページの先頭へ戻る", - "description": "「先頭に戻る」ボタンの ARIA ラベル" + "message": "ページの先頭に戻る", + "description": "「ページの先頭に戻る」ボタンの ARIA ラベル" }, "theme.blog.title": { "message": "ナレッジベース", @@ -145,283 +145,282 @@ }, "theme.blog.archive.title": { "message": "アーカイブ", - "description": "ブログアーカイブページのページタイトルとヒーロータイトル" + "description": "ブログアーカイブページのページタイトルとヒーローセクションのタイトル" }, "theme.blog.archive.description": { "message": "アーカイブ", - "description": "ブログアーカイブページ用のページおよびヒーローの説明文" + "description": "ブログアーカイブページのページおよびヒーローの説明文" }, "theme.blog.paginator.navAriaLabel": { - "message": "ブログ記事一覧ナビゲーション", - "description": "ブログページネーション用の ARIA ラベル" + "message": "ブログ一覧ページのナビゲーション", + "description": "ブログのページネーションのための ARIA ラベル" }, "theme.blog.paginator.newerEntries": { - "message": "新規記事", - "description": "新しいブログ記事ページ(前のページ)に移動するためのラベル" + "message": "新しい投稿", + "description": "新しいブログ記事のページ(前のページ)に移動するためのラベル" }, "theme.blog.paginator.olderEntries": { - "message": "以前の記事", - "description": "古いブログ記事(次のページ)に移動するためのラベル" + "message": "以前のエントリー", + "description": "古いブログ記事のページ(次ページ)に移動するためのラベル" }, "theme.blog.post.paginator.navAriaLabel": { - "message": "ブログ記事ナビゲーション", - "description": "ブログ記事ページネーション用の ARIA ラベル" + "message": "ブログ記事ページ内ナビゲーション", + "description": "ブログ記事のページネーションの ARIA ラベル" }, "theme.blog.post.paginator.newerPost": { "message": "新しい記事", - "description": "前後のブログ記事に移動するボタンのラベル" + "description": "新しい/前のブログ記事に移動するためのボタンラベル" }, "theme.blog.post.paginator.olderPost": { - "message": "過去の記事", - "description": "前後のブログ記事に移動するナビゲーションボタンのラベル" + "message": "過去の投稿", + "description": "前/次のブログ記事へ移動するためのボタンラベル" }, "theme.tags.tagsPageLink": { "message": "すべてのタグを表示", - "description": "タグリストページへのリンク用ラベル" + "description": "タグ一覧ページへのリンクのラベル" }, "theme.colorToggle.ariaLabel": { - "message": "ダークモードを切り替える(現在:{mode})", - "description": "ナビゲーションバーのカラーモード切り替えトグル用の ARIA ラベル" + "message": "ダーク/ライトモードの切り替え(現在:{mode})", + "description": "ナビバーのカラーモード切り替えボタンの ARIA ラベル" }, "theme.colorToggle.ariaLabel.mode.dark": { "message": "ダークモード", - "description": "ダークモードの名称" + "description": "ダークカラーモードの名前" }, "theme.colorToggle.ariaLabel.mode.light": { "message": "ライトモード", - "description": "ライトカラーモード用の名前" + "description": "ライトカラーモードの名前" }, "theme.docs.DocCard.categoryDescription.plurals": { - "message": "{count} 件", - "description": "生成されたインデックスでカテゴリカードに表示され、そのカテゴリ内のアイテム数を示すデフォルトの説明文" + "message": "1件|{count}件", + "description": "生成されたインデックスで、このカテゴリに含まれるアイテム数を説明するカテゴリカードの既定の説明文" }, "theme.docs.paginator.navAriaLabel": { - "message": "ドキュメントのページング", - "description": "ドキュメントのページネーション用 ARIA ラベル" + "message": "ドキュメントページ", + "description": "ドキュメントのページ送り用 ARIA ラベル" }, "theme.docs.paginator.previous": { "message": "前へ", - "description": "前のドキュメントに移動するためのラベル" + "description": "前のドキュメントに移動するためのナビゲーションラベル" }, "theme.docs.paginator.next": { "message": "次へ", "description": "次のドキュメントに移動するためのラベル" }, "theme.docs.tagDocListPageTitle.nDocsTagged": { - "message": "{count} 件のタグ付き文書", - "description": "「{count} docs tagged」の複数形ラベル。使用する言語がサポートしているだけ多くの複数形フォームを \"|\" で区切って指定してください(https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照)。" + "message": "タグ付けされたドキュメント 1 件|タグ付けされたドキュメント {count} 件", + "description": "「{count} docs tagged」というラベルの複数形表現です。対象言語がサポートする限り多くの複数形(「|」で区切って記述)を使用してください(https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照)。" }, "theme.docs.tagDocListPageTitle": { - "message": "「{tagName}」タグの付いたドキュメント {nDocsTagged} 件", + "message": "「{tagName}」のタグが付いた {nDocsTagged}", "description": "ドキュメントタグのページタイトル" }, "theme.docs.versions.unreleasedVersionLabel": { - "message": "これは、{siteTitle} のプレリリース版 {versionLabel} に関するドキュメントです。", - "description": "ユーザーが未リリース版ドキュメントを閲覧していることを示すラベル" + "message": "これは、{siteTitle} {versionLabel} バージョン向けの未公開ドキュメントです。", + "description": "ユーザーに、未リリースのドキュメントのバージョンを閲覧中であることを知らせるためのラベル" }, "theme.docs.versions.unmaintainedVersionLabel": { - "message": "このドキュメントは {siteTitle} バージョン {versionLabel} 向けのもので、現在は更新されていません。", - "description": "保守されていないドキュメントのバージョンをユーザーが閲覧しているときに表示されるラベル" + "message": "これは、現在はメンテナンスが行われていない {siteTitle} {versionLabel} のドキュメントです。", + "description": "ユーザーに、保守されていないドキュメントのバージョンを閲覧していることを知らせるラベル" }, "theme.docs.versions.latestVersionSuggestionLabel": { "message": "最新のドキュメントは {latestVersionLink}({versionLabel})を参照してください。", - "description": "ユーザーに対し最新バージョンを確認するよう促すラベル" + "description": "ユーザーに最新バージョンの確認を促すためのラベル" }, "theme.docs.versions.latestVersionLinkLabel": { "message": "最新バージョン", - "description": "「最新バージョンを提案」リンクに表示されるラベル" + "description": "最新バージョンを提案するリンクに使用されるラベル" }, "theme.docs.versionBadge.label": { - "message": "バージョン: {versionLabel}", - "description": "バージョンラベル" + "message": "バージョン: {versionLabel}" }, "theme.common.editThisPage": { "message": "このページを編集", - "description": "現在のページ編集リンクのラベル" + "description": "現在のページを編集するリンクのラベル" }, "theme.common.headingLinkTitle": { - "message": "{heading} への固定リンク", - "description": "この見出しへのリンク" + "message": "「{heading}」への直接リンク", + "description": "見出しへのリンク用タイトル" }, "theme.lastUpdated.atDate": { - "message": "{date} に", - "description": "ページの最終更新日を表示する際に使用されるテキスト" + "message": " {date} 時点で", + "description": "ページの最終更新日を示す文言" }, "theme.lastUpdated.byUser": { - "message": "{user}", - "description": "ページの最終更新者を示すラベル" + "message": " 作成者: {user}", + "description": "ページの最終更新者を示す語" }, "theme.lastUpdated.lastUpdatedAtBy": { - "message": "最終更新: {atDate}{byUser}", - "description": "ページの最終更新日時と更新者を示すテキスト" + "message": "最終更新{atDate}{byUser}", + "description": "ページの最終更新日時と更新者を表示するための文" }, "theme.tags.tagsListLabel": { "message": "タグ:", - "description": "タグリストの横に表示されるラベル" + "description": "タグリスト横のラベル" }, "theme.AnnouncementBar.closeButtonAriaLabel": { "message": "閉じる", - "description": "お知らせバーの閉じるボタンの ARIA ラベル" + "description": "お知らせバーの閉じるボタン用の ARIA ラベル" }, "theme.admonition.warning": { "message": "警告", - "description": "警告ブロック(:::warning)のデフォルトラベル" + "description": "Warning アドモニション(:::warning)に使用されるデフォルトのラベル" }, "theme.CodeBlock.copied": { - "message": "コピーしました!", - "description": "コードブロックの「コピー」ボタンのラベル" + "message": "コピー済み", + "description": "コードブロック上の「コピーしました」ボタンラベル" }, "theme.CodeBlock.copyButtonAriaLabel": { - "message": "コードをコピー", - "description": "「コードをコピー」ボタンの ARIA ラベル" + "message": "コードをクリップボードにコピー", + "description": "コードブロックをコピーするボタン用の ARIA ラベル" }, "theme.CodeBlock.copy": { "message": "コピー", - "description": "コードブロックの「コピー」ボタンのラベル" + "description": "コードブロック内の「コピー」ボタンのラベル" }, "theme.CodeBlock.wordWrapToggle": { "message": "行の折り返しを切り替える", - "description": "コードブロックの行折り返し切り替えボタンの title 属性" + "description": "コードブロックの行の折り返しを切り替えるボタンの title 属性" }, "theme.DocSidebarItem.expandCategoryAriaLabel": { - "message": "「{label}」の目次を開く", + "message": "「{label}」カテゴリを展開", "description": "サイドバーのカテゴリを展開するための ARIA ラベル" }, "theme.DocSidebarItem.collapseCategoryAriaLabel": { - "message": "{label} の目次を閉じる", - "description": "サイドバーのカテゴリを折りたたむための ARIA ラベル" + "message": "サイドバーの「{label}」カテゴリを折りたたむ", + "description": "サイドバーのカテゴリを折りたたむためのARIAラベル" }, "theme.NotFound.p1": { - "message": "お探しのページは見つかりませんでした", + "message": "お探しのものが見つかりませんでした。", "description": "404 ページの第1段落" }, "theme.NotFound.p2": { - "message": "このページへリンクしているサイトの管理者に、リンクがリンク切れであることをお知らせください。", - "description": "404ページの第2段落" + "message": "元のURLにリンクしていたサイトの管理者に連絡し、そのリンクが切れていることをお知らせください。", + "description": "404 ページの 2 番目の段落" }, "theme.TOCCollapsible.toggleButtonLabel": { - "message": "このページ内の見出し", + "message": "このページの内容", "description": "折りたたみ式目次コンポーネントのボタンに表示されるラベル" }, "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { - "message": "ナビゲーションバーを開く", - "description": "モバイルナビゲーションのハンバーガーメニューボタンの ARIA ラベル" + "message": "ナビゲーションバーの表示を切り替え", + "description": "モバイルナビゲーションのハンバーガーメニューボタンに設定する ARIA ラベル" }, "theme.docs.sidebar.expandButtonTitle": { "message": "サイドバーを開く", - "description": "ドキュメントサイドバーの展開ボタン用ARIAラベルとtitle属性" + "description": "ドキュメントサイドバーの展開ボタンに使用する ARIA ラベルと title 属性" }, "theme.docs.sidebar.expandButtonAriaLabel": { - "message": "サイドバーを開く", - "description": "ドキュメントサイドバーの展開ボタンで使用される ARIA ラベルと title 属性" + "message": "サイドバーを展開", + "description": "ドキュメントサイドバーの展開ボタンに使用する ARIA ラベルと title 属性" }, "theme.SearchBar.label": { "message": "検索", "description": "検索ボタンの ARIA ラベルとプレースホルダー" }, "theme.SearchModal.searchBox.resetButtonTitle": { - "message": "クリア", - "description": "検索ボックスのリセットボタンのラベルおよび ARIA ラベル" + "message": "クエリをクリア", + "description": "検索ボックスのリセットボタン用のラベルと ARIA ラベル" }, "theme.SearchModal.searchBox.cancelButtonText": { "message": "キャンセル", "description": "検索ボックスのキャンセルボタンのラベルおよび ARIA ラベル" }, "theme.SearchModal.startScreen.recentSearchesTitle": { - "message": "最近の検索", - "description": "最近の検索のタイトル" + "message": "最近", + "description": "最近の検索の見出し" }, "theme.SearchModal.startScreen.noRecentSearchesText": { "message": "最近の検索はありません", - "description": "最近の検索がない場合に表示されるテキスト" + "description": "最近の検索がない場合に表示するテキスト" }, "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": { "message": "この検索条件を保存", - "description": "「最近の検索を保存」ボタンのラベル" + "description": "最近の検索を保存するボタンのラベル" }, "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": { - "message": "履歴からこの検索を削除", - "description": "[最近の検索をクリア]ボタンのラベル" + "message": "この検索を履歴から削除", + "description": "「最近の検索を削除」ボタンのラベル" }, "theme.SearchModal.startScreen.favoriteSearchesTitle": { - "message": "保存した検索", - "description": "お気に入り検索用のタイトル" + "message": "お気に入り", + "description": "お気に入り検索のタイトル" }, "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": { - "message": "この検索をお気に入りから削除", - "description": "「お気に入り検索を削除」ボタンのラベル" + "message": "この検索条件をお気に入りから削除", + "description": "お気に入り検索を削除するボタンのラベル" }, "theme.SearchModal.errorScreen.titleText": { - "message": "検索結果を取得できませんでした", + "message": "結果を取得できませんでした", "description": "検索モーダルのエラー画面用タイトル" }, "theme.SearchModal.errorScreen.helpText": { "message": "ネットワーク接続を確認してください。", - "description": "検索モーダルのエラー画面に表示するヘルプテキスト" + "description": "検索モーダルのエラー画面に表示されるヘルプテキスト" }, "theme.SearchModal.footer.selectText": { - "message": "選択", - "description": "Enterキー押下時の動作の説明" + "message": "選択する", + "description": "Enter キーに割り当てられたアクションの説明テキスト" }, "theme.SearchModal.footer.selectKeyAriaLabel": { "message": "Enterキー", - "description": "選択を確定するための Enter キーボタンの ARIA ラベル" + "description": "選択を確定する Enter キー ボタン用の ARIA ラベル" }, "theme.SearchModal.footer.navigateText": { - "message": "実行", - "description": "上矢印キーおよび下矢印キーの動作説明テキスト" + "message": "移動する", + "description": "↑キーおよび↓キーの操作内容を説明するテキスト" }, "theme.SearchModal.footer.navigateUpKeyAriaLabel": { - "message": "上矢印キー", - "description": "ナビゲーション用の上矢印キー ボタンの ARIA ラベル" + "message": "上向き矢印", + "description": "ナビゲーションを行うための「上向き矢印キー」ボタン用の ARIA ラベル" }, "theme.SearchModal.footer.navigateDownKeyAriaLabel": { - "message": "下向き矢印キー", - "description": "ナビゲーションを操作する下向き矢印キー ボタンの ARIA ラベル" + "message": "下向きの矢印", + "description": "ナビゲーション用の下向き矢印キー ボタンの ARIA ラベル" }, "theme.SearchModal.footer.closeText": { "message": "閉じる", - "description": "Esc キー動作の説明" + "description": "Escapeキー押下時の動作を説明するテキスト" }, "theme.SearchModal.footer.closeKeyAriaLabel": { "message": "Escキー", - "description": "モーダルを閉じるための Escape キーボタン用の ARIA ラベル" + "description": "Escape キーでモーダルを閉じるボタンの ARIA ラベル" }, "theme.SearchModal.footer.searchByText": { - "message": "検索", - "description": "この文章は、検索機能が Algolia によって実現されていることを説明しています。" + "message": "検索条件", + "description": "このテキストでは、検索が Algolia によって実行されていることを説明しています。" }, "theme.SearchModal.noResultsScreen.noResultsText": { - "message": "該当する結果はありません", - "description": "このテキストは、次の検索に対して結果が見つからなかったことを示しています" + "message": "該当する結果がありません", + "description": "このテキストは、次の検索に結果がないことを説明しています。" }, "theme.SearchModal.noResultsScreen.suggestedQueryText": { - "message": "次の検索を試してください:", - "description": "以下の検索で結果が見つからなかった場合に表示される、提案検索クエリのテキスト" + "message": "検索してみてください", + "description": "次の検索で結果が見つからなかった場合に表示する、提案クエリのテキスト" }, "theme.SearchModal.noResultsScreen.reportMissingResultsText": { - "message": "もっと良い検索結果はありますか?", - "description": "ユーザーが一部の結果が抜けていると感じたときに表示されるプロンプト用のテキスト" + "message": "このクエリで結果が返るはずだとお考えですか?", + "description": "ユーザーが結果が不足していると感じたときの質問文のテキスト" }, "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": { - "message": "レポート", - "description": "不足している結果を報告するためのリンクのラベル" + "message": "ご連絡ください。", + "description": "結果が見つからないことを報告するリンク用のテキスト" }, "theme.SearchModal.placeholder": { - "message": "ドキュメントを検索", - "description": "DocSearch ポップアップモーダル内の入力フィールド用プレースホルダーテキスト" + "message": "ドキュメント検索", + "description": "DocSearch ポップアップモーダルの入力フィールドのプレースホルダー" }, "theme.blog.post.plurals": { - "message": "{count} 件", - "description": "「{count} 件の投稿」に対応する複数形ラベル。言語がサポートする複数形の形をすべて使用し(\"|\" で区切る)、詳細は https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照してください。" + "message": "1件の投稿|{count}件の投稿", + "description": "「{count} 件の投稿」に対応する複数形ラベルです。使用している言語でサポートされているだけの複数形(\"|\" で区切る)を使用してください(https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照)。" }, "theme.blog.tagTitle": { - "message": "「{tagName}」タグが付いた投稿が {nPosts} 件あります", + "message": "「{tagName}」タグが付いた投稿 {nPosts} 件", "description": "ブログタグページのタイトル" }, "theme.blog.author.pageTitle": { "message": "{authorName} - 投稿 {nPosts}件", - "description": "ブログ執筆者ページのタイトル" + "description": "ブログ著者向けページのタイトル" }, "theme.blog.authorsList.pageTitle": { "message": "著者", @@ -429,35 +428,35 @@ }, "theme.blog.authorsList.viewAll": { "message": "すべての著者を表示", - "description": "ブログ執筆者ページへのリンクラベル" + "description": "ブログ著者ページへのリンクのラベル" }, "theme.blog.author.noPosts": { - "message": "この著者はまだ何も投稿していません。", - "description": "まだブログ記事を投稿していない著者向けのテキスト" + "message": "この著者はまだ投稿を公開していません。", + "description": "ブログ記事をまだ投稿していない著者向けのテキスト" }, "theme.contentVisibility.unlistedBanner.title": { - "message": "非公開ページ", + "message": "非掲載ページ", "description": "限定公開コンテンツ用バナーのタイトル" }, "theme.contentVisibility.unlistedBanner.message": { - "message": "このページは非公開です。検索結果には表示されず、このページへの直接リンクを知っているユーザーのみが閲覧できます。", - "description": "限定公開コンテンツバナーのメッセージ" + "message": "このページは一覧に表示されません。検索エンジンでインデックスされず、直接のリンクを知っているユーザーだけがアクセスできます。", + "description": "限定公開コンテンツ用バナー メッセージ" }, "theme.contentVisibility.draftBanner.title": { "message": "下書きページ", - "description": "下書きコンテンツ用バナーのタイトル" + "description": "下書きコンテンツのバナータイトル" }, "theme.contentVisibility.draftBanner.message": { - "message": "このページはドラフトであり、本番環境で一般公開されているコンテンツには含まれていません。", - "description": "ドラフトコンテンツのバナーメッセージ" + "message": "このページはドラフトです。開発環境でのみ表示され、本番ビルドからは除外されます。", + "description": "ドラフトコンテンツバナーのメッセージ" }, "theme.ErrorPageContent.tryAgain": { - "message": "再試行してください。", - "description": "React のエラーバウンダリがエラーを検知した際に、レンダリングを再試行するボタンのラベル" + "message": "再試行してください", + "description": "React のエラーバウンダリがエラーをキャプチャしたときに、再度レンダリングを試行するためのボタンのラベル" }, "theme.common.skipToMainContent": { "message": "メインコンテンツへスキップ", - "description": "アクセシビリティのために使用される「コンテンツへスキップ」ラベル。キーボードの Tab/Enter による操作で、ユーザーがメインコンテンツへすばやく移動できるようにします" + "description": "キーボードの Tab/Enter 操作でメインコンテンツへすばやく移動できるようにする、アクセシビリティ対応の「コンテンツへスキップ」ラベル" }, "theme.tags.tagsPageTitle": { "message": "タグ", @@ -586,20 +585,16 @@ "description": "有用なデータセットとチュートリアル" }, "sidebar.dropdownCategories.category.Cloud": { - "message": "クラウド", - "description": "クラウド" + "message": "クラウド" }, "sidebar.dropdownCategories.category.description.Cloud": { - "message": "ClickHouse を最速でデプロイする方法", - "description": "ClickHouse を最速でデプロイする方法" + "message": "ClickHouse を最速でデプロイする方法" }, "sidebar.dropdownCategories.category.Cloud.Get Started": { - "message": "はじめに", - "description": "はじめに" + "message": "はじめに" }, "sidebar.dropdownCategories.category.Cloud.Get Started.description": { - "message": "今すぐ ClickHouse Cloud を始めましょう", - "description": "ClickHouse Cloud をすぐに使い始める" + "message": "ClickHouse Cloud をすぐに使い始める" }, "sidebar.dropdownCategories.category.Cloud.Managing Cloud": { "message": "クラウド管理", @@ -746,36 +741,28 @@ "description": "ClickHouse の運用・管理に役立つメタデータテーブル" }, "sidebar.dropdownCategories.category.Reference": { - "message": "リファレンス", - "description": "リファレンス" + "message": "リファレンス" }, "sidebar.dropdownCategories.category.description.Reference": { - "message": "ClickHouse 機能のリファレンスドキュメント", - "description": "ClickHouse 機能リファレンス" + "message": "ClickHouse 機能のリファレンスドキュメント" }, "sidebar.dropdownCategories.category.Reference.Introduction": { - "message": "概要", - "description": "はじめに" + "message": "概要" }, "sidebar.dropdownCategories.category.Reference.Introduction.description": { - "message": "ClickHouse の構文を学ぶ", - "description": "ClickHouse の構文を学ぶ" + "message": "ClickHouse の構文を学習する" }, "sidebar.dropdownCategories.category.Reference.Functions": { - "message": "関数", - "description": "関数" + "message": "関数" }, "sidebar.dropdownCategories.category.Reference.Functions.description": { - "message": "データ分析向けの数百種類の組み込み関数", - "description": "データ分析のための数百の組み込み関数" + "message": "データ分析に役立つ数百の組み込み関数" }, "sidebar.dropdownCategories.category.Reference.Engines": { - "message": "エンジン", - "description": "エンジン" + "message": "エンジン" }, "sidebar.dropdownCategories.category.Reference.Engines.description": { - "message": "データに最適なテーブルエンジンおよびデータベースエンジンを利用する", - "description": "データに適したテーブルエンジンとデータベースエンジンを選ぶ" + "message": "データに適したテーブルエンジンとデータベースエンジンを選択する" }, "sidebar.dropdownCategories.category.Reference.Other Features": { "message": "追加の機能", @@ -786,12 +773,10 @@ "description": "ClickHouse のその他の機能を詳しく見る" }, "sidebar.dropdownCategories.category.Integrations": { - "message": "連携", - "description": "連携" + "message": "連携" }, "sidebar.dropdownCategories.category.description.Integrations": { - "message": "ClickHouse 用のインテグレーション、クライアント、ドライバー", - "description": "ClickHouse のインテグレーション、クライアント、およびドライバー" + "message": "ClickHouse で利用できるインテグレーション、クライアント、ドライバー" }, "sidebar.dropdownCategories.category.Integrations.All Integrations": { "message": "すべての連携", @@ -810,12 +795,10 @@ "description": "お好みのプログラミング言語から ClickHouse を利用する" }, "sidebar.dropdownCategories.category.Integrations.ClickPipes": { - "message": "ClickPipes", - "description": "ClickPipes" + "message": "ClickPipes" }, "sidebar.dropdownCategories.category.Integrations.ClickPipes.description": { - "message": "ClickHouse へのデータ取り込みを最も簡単に行う方法", - "description": "ClickHouse にデータを取り込む最も簡単な方法" + "message": "ClickHouse へのデータ取り込みを最も簡単に行う方法" }, "sidebar.dropdownCategories.category.Integrations.Native Clients & Interfaces": { "message": "ネイティブクライアントとインターフェース", @@ -858,20 +841,16 @@ "description": "さまざまな ELT ツールで ClickHouse にデータを取り込む" }, "sidebar.dropdownCategories.category.chDB": { - "message": "chDB", - "description": "chDB" + "message": "chDB" }, "sidebar.dropdownCategories.category.description.chDB": { - "message": "chDB は、ClickHouse の組み込み版です。", - "description": "chDB は組み込み型 ClickHouse データベースです" + "message": "chDB は ClickHouse の組み込み版です" }, "sidebar.dropdownCategories.category.chDB.Learn chDB": { - "message": "chDB について詳しく知る", - "description": "chDB を学ぶ" + "message": "chDB を学ぶ" }, "sidebar.dropdownCategories.category.chDB.Learn chDB.description": { - "message": "chDB の使用方法を学ぶ", - "description": "chDB を使用する" + "message": "chDB の使用方法を学ぶ" }, "sidebar.dropdownCategories.category.chDB.Language Integrations": { "message": "言語インテグレーション", @@ -882,44 +861,34 @@ "description": "プログラミング言語向けクライアントライブラリを使用して chDB に接続する" }, "sidebar.dropdownCategories.category.chDB.Guides": { - "message": "ガイド", - "description": "ガイド" + "message": "ガイド" }, "sidebar.dropdownCategories.category.chDB.Guides.description": { - "message": "chDB の利用ガイド", - "description": "chDB の利用ガイド" + "message": "chDB を活用するためのガイド" }, "sidebar.dropdownCategories.category.About": { - "message": "概要", - "description": "概要" + "message": "概要" }, "sidebar.dropdownCategories.category.description.About": { - "message": "ClickHouse の詳細を確認する", - "description": "ClickHouse についてさらに詳しく知る" + "message": "ClickHouse の詳細を確認する" }, "sidebar.dropdownCategories.category.About.Adopters": { - "message": "実装例", - "description": "導入企業" + "message": "採用企業" }, "sidebar.dropdownCategories.category.About.Adopters.description": { - "message": "ClickHouse を導入している企業", - "description": "ClickHouse ユーザー" + "message": "ClickHouse 採用企業" }, "sidebar.dropdownCategories.category.About.Changelogs": { - "message": "変更履歴", - "description": "更新履歴" + "message": "変更履歴" }, "sidebar.dropdownCategories.category.About.Changelogs.description": { - "message": "最新の ClickHouse の変更内容を確認", - "description": "ClickHouse の最近の変更を確認" + "message": "ClickHouse の最新の変更内容を表示" }, "sidebar.dropdownCategories.category.About.Support": { - "message": "サポート", - "description": "サポート" + "message": "サポート" }, "sidebar.dropdownCategories.category.About.Support.description": { - "message": "ClickHouse エンジニアによるサポート", - "description": "ClickHouse エンジニアに相談する" + "message": "ClickHouse エンジニアによるサポート" }, "sidebar.dropdownCategories.category.About.Development and Contributing": { "message": "開発と貢献", @@ -938,408 +907,29 @@ "Report an issue": { "message": "問題を報告する" }, - "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": { - "message": "サイドバーの折りたたみカテゴリ「{label}」の表示/非表示を切り替える", - "description": "折りたたみ式サイドバーカテゴリを切り替えるための ARIA ラベル" - }, - "theme.NavBar.navAriaLabel": { - "message": "メイン", - "description": "メインナビゲーションの ARIA ラベル" - }, - "theme.navbar.mobileLanguageDropdown.label": { - "message": "言語", - "description": "モバイル版の言語切り替えドロップダウンのラベル" - }, - "theme.NotFound.p1": { - "message": "お探しの内容が見つかりませんでした。", - "description": "404 ページの第1段落" - }, - "theme.NotFound.p2": { - "message": "元のURLへリンクしていたサイトの管理者に連絡し、そのリンクがリンク切れであることを知らせてください。", - "description": "404ページの2番目の段落" - }, - "theme.blog.post.readingTime.plurals": { - "message": "読了時間1分|読了時間{readingTime}分", - "description": "「{readingTime} 分で読める」のラベルを複数形にしたものです。あなたの言語がサポートする複数形の形ごとにラベルを用意し、\"|\" で区切って指定してください(https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照)。" - }, - "theme.docs.breadcrumbs.home": { - "message": "ホームページ", - "description": "パンくずリスト内のホームページ用の ARIA ラベル" - }, - "theme.blog.post.readMore": { - "message": "続きを読む", - "description": "ブログ記事の抜粋に表示され、完全な記事へのリンクとして使われるラベル" - }, - "theme.blog.post.readMoreLabel": { - "message": "{title} について詳しく見る", - "description": "抜粋からブログ記事の全文へのリンク用の ARIA ラベル" - }, - "theme.docs.sidebar.collapseButtonTitle": { - "message": "サイドバーを折りたたむ", - "description": "ドキュメントサイドバーの折りたたみボタンの title 属性" - }, - "theme.docs.sidebar.collapseButtonAriaLabel": { - "message": "サイドバーを閉じる", - "description": "ドキュメントサイドバーの折りたたみボタンに設定する title 属性" - }, - "theme.docs.sidebar.navAriaLabel": { - "message": "ドキュメントのサイドバー", - "description": "サイドバー ナビゲーションの ARIA ラベル" - }, - "theme.docs.sidebar.closeSidebarButtonAriaLabel": { - "message": "ナビゲーションバーを閉じる", - "description": "モバイルサイドバーの閉じるボタンの ARIA ラベル" - }, - "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { - "message": "← メインメニューに戻る", - "description": "モバイル用ナビバーのサイドバーにあるセカンダリメニュー(主にドキュメントサイドバーの表示に使用)で、メインメニューへ戻るための戻るボタンのラベル" - }, - "theme.ErrorPageContent.title": { - "message": "このページでエラーが発生しました。", - "description": "ページクラッシュ時に表示されるフォールバックページのタイトル" - }, - "theme.BackToTopButton.buttonAriaLabel": { - "message": "ページトップに戻る", - "description": "「ページの先頭に戻る」ボタンのARIAラベル" - }, - "theme.blog.archive.title": { - "message": "アーカイブ", - "description": "ブログアーカイブページのページタイトルおよびヒーロータイトル" - }, - "theme.blog.archive.description": { - "message": "アーカイブ", - "description": "ブログアーカイブページのページ全体およびヒーローセクションの説明文" - }, - "theme.blog.paginator.navAriaLabel": { - "message": "ブログ一覧ページのナビゲーション", - "description": "ブログのページネーション用の ARIA ラベル" - }, - "theme.blog.paginator.newerEntries": { - "message": "新しい投稿", - "description": "新しいブログ記事のページ(前のページ)に移動するためのラベル" - }, - "theme.blog.paginator.olderEntries": { - "message": "過去のエントリ", - "description": "古いブログ記事のページ(次のページ)に移動するためのラベル" - }, - "theme.blog.post.paginator.navAriaLabel": { - "message": "ブログ記事ページのナビゲーション", - "description": "ブログ記事のページネーションに使用する ARIA ラベル" - }, - "theme.blog.post.paginator.newerPost": { - "message": "新しい記事", - "description": "新しい/前のブログ記事へ移動するためのボタンラベル" - }, - "theme.blog.post.paginator.olderPost": { - "message": "以前の投稿", - "description": "前/次のブログ記事へ移動するためのボタンラベル" - }, - "theme.tags.tagsPageLink": { - "message": "すべてのタグを表示", - "description": "タグ一覧ページへのリンクのラベル" - }, - "theme.colorToggle.ariaLabel": { - "message": "ダークモード/ライトモードを切り替える(現在:{mode})", - "description": "ナビゲーションバーのカラーモード切り替えトグル用の ARIA ラベル" - }, - "theme.colorToggle.ariaLabel.mode.dark": { - "message": "ダークモード", - "description": "ダークカラーモードの名称" - }, - "theme.colorToggle.ariaLabel.mode.light": { - "message": "ライトモード", - "description": "ライトカラーモードの名前" - }, - "theme.docs.DocCard.categoryDescription.plurals": { - "message": "1 件|{count} 件", - "description": "自動生成されたインデックスで、このカテゴリに含まれる項目数を示すカテゴリカードの既定の説明文" - }, - "theme.docs.paginator.navAriaLabel": { - "message": "ドキュメントページ", - "description": "ドキュメントページネーション用の ARIA ラベル" - }, - "theme.docs.paginator.previous": { - "message": "前へ", - "description": "前のドキュメントに戻るためのラベル" - }, - "theme.docs.paginator.next": { - "message": "次へ", - "description": "次のドキュメントに進むためのラベル" - }, - "theme.docs.tagDocListPageTitle.nDocsTagged": { - "message": "1 件のドキュメントにタグ付け済み|{count} 件のドキュメントにタグ付け済み", - "description": "「{count} docs tagged」というラベルの複数形。使用する言語がサポートする複数形の形の種類だけ、\"|\" で区切って指定してください(https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照)。" - }, - "theme.docs.tagDocListPageTitle": { - "message": "「{tagName}」タグ付きの{nDocsTagged}", - "description": "ドキュメントタグのページタイトル" - }, - "theme.docs.versionBadge.label": { - "message": "バージョン: {versionLabel}" - }, - "theme.docs.versions.unreleasedVersionLabel": { - "message": "これは、{siteTitle} の {versionLabel} バージョンに関する未リリースのドキュメントです。", - "description": "ユーザーに未リリースのドキュメントバージョンを閲覧中であることを知らせるラベル" - }, - "theme.docs.versions.unmaintainedVersionLabel": { - "message": "これは、{siteTitle} {versionLabel} 向けのドキュメントで、現在は積極的にはメンテナンスされていません。", - "description": "ユーザーに、閲覧中のドキュメントがメンテナンスされていないバージョンであることを知らせるためのラベル" - }, - "theme.docs.versions.latestVersionSuggestionLabel": { - "message": "最新のドキュメントは、{latestVersionLink}({versionLabel})を参照してください。", - "description": "ユーザーに最新バージョンの確認を促すラベル" - }, - "theme.docs.versions.latestVersionLinkLabel": { - "message": "最新バージョン", - "description": "最新バージョンの提案リンク用のラベル" - }, - "theme.common.editThisPage": { - "message": "このページを編集", - "description": "現在のページを編集するリンクのラベル" - }, - "theme.common.headingLinkTitle": { - "message": "{heading} への直接リンク", - "description": "見出しリンクのタイトル" - }, - "theme.lastUpdated.atDate": { - "message": " {date} に", - "description": "ページの最終更新日を示す文言" - }, - "theme.lastUpdated.byUser": { - "message": " 著者: {user}", - "description": "ページの最終更新者を示す文言" - }, - "theme.lastUpdated.lastUpdatedAtBy": { - "message": "最終更新日時{atDate}{byUser}", - "description": "ページの最終更新日時と更新者を表示するための文言" - }, - "theme.tags.tagsListLabel": { - "message": "タグ:", - "description": "タグリストの横にあるラベル" - }, - "theme.admonition.warning": { - "message": "警告", - "description": "Warning アドモニション (:::warning) に使用されるデフォルトのラベル" - }, - "theme.AnnouncementBar.closeButtonAriaLabel": { - "message": "閉じる", - "description": "お知らせバーの閉じるボタンの ARIA ラベル" - }, - "theme.CodeBlock.copied": { - "message": "コピーしました", - "description": "コードブロック上の「コピー済み」ボタンのラベル" - }, - "theme.CodeBlock.copyButtonAriaLabel": { - "message": "コードをクリップボードにコピー", - "description": "コードブロックをコピーするボタン用の ARIA ラベル" - }, - "theme.CodeBlock.copy": { - "message": "コピー", - "description": "コードブロックのコピーボタンのラベル" - }, - "theme.CodeBlock.wordWrapToggle": { - "message": "行の折り返しを切り替える", - "description": "コードブロックの行折り返しを切り替えるボタンの title 属性" - }, - "theme.DocSidebarItem.expandCategoryAriaLabel": { - "message": "サイドバーの「{label}」カテゴリを展開する", - "description": "サイドバーのカテゴリを展開するための ARIA ラベル" - }, - "theme.DocSidebarItem.collapseCategoryAriaLabel": { - "message": "サイドバーの「{label}」カテゴリを折りたたむ", - "description": "サイドバーのカテゴリを折りたたむための ARIA ラベル" - }, - "theme.TOCCollapsible.toggleButtonLabel": { - "message": "このページの内容", - "description": "折りたたみ式目次コンポーネントのボタンに表示されるラベル" - }, - "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { - "message": "ナビゲーションバーの表示切り替え", - "description": "モバイルナビゲーションのハンバーガーメニューボタンのARIAラベル" - }, - "theme.docs.sidebar.expandButtonTitle": { - "message": "サイドバーを展開", - "description": "ドキュメントサイドバーの展開ボタンに使用する ARIA ラベルおよび title 属性" - }, - "theme.docs.sidebar.expandButtonAriaLabel": { - "message": "サイドバーを展開", - "description": "ドキュメントサイドバーの展開ボタンに設定する ARIA ラベルおよび title 属性" - }, - "theme.SearchPage.algoliaLabel": { - "message": "Algolia による検索", - "description": "Algolia メンション用の ARIA ラベル" - }, - "theme.SearchBar.label": { - "message": "検索", - "description": "検索ボタンの ARIA ラベルとプレースホルダー" - }, - "theme.SearchModal.searchBox.resetButtonTitle": { - "message": "クエリをクリア", - "description": "検索ボックスのリセットボタンのラベルと ARIA ラベル" - }, - "theme.SearchModal.searchBox.cancelButtonText": { - "message": "キャンセル", - "description": "検索ボックスのキャンセルボタンのラベルおよび ARIA ラベル" - }, - "theme.SearchModal.startScreen.recentSearchesTitle": { - "message": "最近", - "description": "最近の検索の見出し" - }, - "theme.SearchModal.startScreen.noRecentSearchesText": { - "message": "最近の検索はありません", - "description": "最近の検索がない場合に表示するテキスト" - }, - "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": { - "message": "この検索条件を保存", - "description": "「最近の検索を保存」ボタンのラベル" - }, - "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": { - "message": "この検索を履歴から削除", - "description": "最近の検索の削除ボタンのラベル" - }, - "theme.SearchModal.startScreen.favoriteSearchesTitle": { - "message": "お気に入り", - "description": "お気に入り検索のタイトル" - }, - "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": { - "message": "お気に入りからこの検索を削除", - "description": "お気に入り検索の削除ボタンのラベル" - }, - "theme.SearchModal.errorScreen.titleText": { - "message": "結果を取得できませんでした", - "description": "検索モーダルのエラー画面タイトル" - }, - "theme.SearchModal.errorScreen.helpText": { - "message": "ネットワーク接続を確認してください。", - "description": "検索モーダルのエラー画面に表示されるヘルプテキスト" - }, - "theme.SearchModal.footer.selectText": { - "message": "選択する", - "description": "Enterキー押下時の動作の説明文" - }, - "theme.SearchModal.footer.selectKeyAriaLabel": { - "message": "Enterキー", - "description": "選択を確定する Enter キー ボタンの ARIA ラベル" - }, - "theme.SearchModal.footer.navigateText": { - "message": "移動する", - "description": "↑キーおよび↓キーの操作内容を説明するテキスト" - }, - "theme.SearchModal.footer.navigateUpKeyAriaLabel": { - "message": "上矢印", - "description": "ナビゲーション用の上矢印キー ボタンの ARIA ラベル" - }, - "theme.SearchModal.footer.navigateDownKeyAriaLabel": { - "message": "下向きの矢印", - "description": "ナビゲーションを開始する下向き矢印キー ボタンの ARIA ラベル" - }, - "theme.SearchModal.footer.closeText": { - "message": "閉じる", - "description": "Escape キー押下時の動作を説明するテキスト" - }, - "theme.SearchModal.footer.closeKeyAriaLabel": { - "message": "Escキー", - "description": "モーダルを閉じるための Esc キーボタンの ARIA ラベル" - }, - "theme.SearchModal.footer.searchByText": { - "message": "検索方法", - "description": "このテキストでは、検索に Algolia を使用していることを説明しています。" - }, - "theme.SearchModal.noResultsScreen.noResultsText": { - "message": "の検索結果はありません", - "description": "このテキストは、次の検索に対する結果が存在しないことを説明しています" - }, - "theme.SearchModal.noResultsScreen.suggestedQueryText": { - "message": "次のキーワードで検索してみてください", - "description": "次の検索で結果が見つからなかった場合に表示する、提案クエリのテキスト" - }, - "theme.SearchModal.noResultsScreen.reportMissingResultsText": { - "message": "このクエリで結果が返るはずだとお考えですか?", - "description": "ユーザーが結果が不足していると感じたときに表示される質問のテキスト" - }, - "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": { - "message": "ご連絡ください。", - "description": "不足している結果を報告するためのリンクテキスト" - }, - "theme.SearchModal.placeholder": { - "message": "ドキュメントを検索", - "description": "DocSearch のポップアップモーダルにある入力フィールドのプレースホルダー" - }, - "theme.blog.post.plurals": { - "message": "1件の投稿|{count}件の投稿", - "description": "「{count} 件の投稿」の複数形用ラベルです。使用言語がサポートする複数形のパターンをすべて(\"|\" で区切って)指定してください(https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html を参照)。" - }, - "theme.blog.tagTitle": { - "message": "「{tagName}」タグが付いた投稿 {nPosts} 件", - "description": "ブログタグ用ページのタイトル" - }, - "theme.blog.author.pageTitle": { - "message": "{authorName} - 投稿 {nPosts}件", - "description": "ブログ著者ページのタイトル" - }, - "theme.blog.authorsList.pageTitle": { - "message": "著者", - "description": "著者ページのタイトル" - }, - "theme.blog.authorsList.viewAll": { - "message": "すべての著者を表示", - "description": "ブログ著者ページへのリンクのラベル" - }, - "theme.blog.author.noPosts": { - "message": "この著者はまだ投稿を作成していません。", - "description": "ブログ投稿が 0 件の著者向けテキスト" - }, - "theme.contentVisibility.unlistedBanner.title": { - "message": "非公開ページ", - "description": "非公開コンテンツバナーのタイトル" - }, - "theme.contentVisibility.unlistedBanner.message": { - "message": "このページは非公開設定になっています。検索エンジンによってインデックスされることはなく、このページへの直接リンクを知っているユーザーだけがアクセスできます。", - "description": "非公開コンテンツバナーのメッセージ" - }, - "theme.contentVisibility.draftBanner.title": { - "message": "下書きページ", - "description": "下書きコンテンツバナーのタイトル" - }, - "theme.contentVisibility.draftBanner.message": { - "message": "このページはドラフトです。開発環境でのみ表示され、本番環境のビルドには含まれません。", - "description": "下書きコンテンツ用バナーのメッセージ" - }, - "theme.ErrorPageContent.tryAgain": { - "message": "再試行", - "description": "React のエラーバウンダリがエラーを捕捉した際に、再レンダリングを試みるボタンのラベル" - }, - "theme.common.skipToMainContent": { - "message": "メインコンテンツへスキップ", - "description": "アクセシビリティ向上のために使用される「コンテンツへスキップ」ラベルで、キーボードの Tab/Enter 操作によってメインコンテンツへ素早く移動できるようにします" - }, - "theme.tags.tagsPageTitle": { - "message": "タグ", - "description": "タグ一覧ページのタイトル" - }, "sidebar.dropdownCategories.category.Get started": { "message": "はじめに" }, "sidebar.dropdownCategories.category.description.Get started": { - "message": "ClickHouse の使い方を学ぶ" + "message": "ClickHouse の使い方を習得する" }, "sidebar.dropdownCategories.category.Get started.Introduction": { - "message": "イントロダクション" + "message": "概要" }, "sidebar.dropdownCategories.category.Get started.Introduction.description": { - "message": "ClickHouse の紹介" + "message": "ClickHouse の概要" }, "sidebar.dropdownCategories.category.Get started.Concepts": { - "message": "コンセプト" + "message": "基本概念" }, "sidebar.dropdownCategories.category.Get started.Concepts.description": { - "message": "知っておくべき中核概念" + "message": "理解しておくべき基本概念" }, "sidebar.dropdownCategories.category.Get started.Starter guides": { - "message": "スターターガイド" + "message": "入門ガイド" }, "sidebar.dropdownCategories.category.Get started.Starter guides.description": { - "message": "ClickHouse を学ぶならここから" + "message": "ClickHouse を学ぶなら、まずはここから" }, "sidebar.dropdownCategories.category.Get started.Best practices": { "message": "ベストプラクティス" @@ -1348,16 +938,16 @@ "message": "ClickHouse のベストプラクティスに従う" }, "sidebar.dropdownCategories.category.Get started.Migration guides": { - "message": "マイグレーションガイド" + "message": "移行ガイド" }, "sidebar.dropdownCategories.category.Get started.Migration guides.description": { "message": "データベースを ClickHouse に移行する" }, "sidebar.dropdownCategories.category.Get started.Use case guides": { - "message": "ユースケースガイド" + "message": "ユースケース別ガイド" }, "sidebar.dropdownCategories.category.Get started.Use case guides.description": { - "message": "ClickHouse の一般的なユースケースガイド" + "message": "ClickHouse の代表的なユースケースガイド" }, "sidebar.dropdownCategories.category.Get started.Example datasets": { "message": "サンプルデータセット" @@ -1366,28 +956,16 @@ "message": "役立つデータセットとチュートリアル" }, "sidebar.dropdownCategories.category.Get started.Tips and community wisdom": { - "message": "ヒントとコミュニティの知恵" + "message": "ヒントとコミュニティからの知見" }, "sidebar.dropdownCategories.category.Get started.Tips and community wisdom.description": { "message": "コミュニティからのヒントとコツ" }, - "sidebar.dropdownCategories.category.Cloud": { - "message": "Cloud" - }, - "sidebar.dropdownCategories.category.description.Cloud": { - "message": "ClickHouse をデプロイする最速の方法" - }, - "sidebar.dropdownCategories.category.Cloud.Get Started": { - "message": "はじめる" - }, - "sidebar.dropdownCategories.category.Cloud.Get Started.description": { - "message": "ClickHouse Cloud をすぐに始める" - }, "sidebar.dropdownCategories.category.Cloud.Features": { "message": "機能" }, "sidebar.dropdownCategories.category.Cloud.Features.description": { - "message": "ClickHouse Cloud が提供する機能" + "message": "ClickHouse Cloud の提供機能" }, "sidebar.dropdownCategories.category.Cloud.Guides": { "message": "ガイド" @@ -1399,52 +977,52 @@ "message": "リファレンス" }, "sidebar.dropdownCategories.category.Cloud.Reference.description": { - "message": "ClickHouse Cloud のリファレンスドキュメント" + "message": "ClickHouse Cloud リファレンスドキュメント" }, "sidebar.dropdownCategories.category.Manage data": { - "message": "データ管理" + "message": "データを管理する" }, "sidebar.dropdownCategories.category.description.Manage data": { - "message": "ClickHouse でデータを管理する方法" + "message": "ClickHouse でのデータ管理方法" }, "sidebar.dropdownCategories.category.Manage data.Core data concepts": { - "message": "コアデータコンセプト" + "message": "データの基本概念" }, "sidebar.dropdownCategories.category.Manage data.Core data concepts.description": { - "message": "ClickHouse の内部概念を理解する" + "message": "ClickHouse の内部的な概念を理解する" }, "sidebar.dropdownCategories.category.Manage data.Updating data": { "message": "データの更新" }, "sidebar.dropdownCategories.category.Manage data.Updating data.description": { - "message": "ClickHouse でデータを更新・置換する" + "message": "ClickHouse のデータの更新と置換" }, "sidebar.dropdownCategories.category.Manage data.Deleting data": { "message": "データの削除" }, "sidebar.dropdownCategories.category.Manage data.Deleting data.description": { - "message": "ClickHouse でデータを削除する" + "message": "ClickHouse でのデータ削除" }, "sidebar.dropdownCategories.category.Manage data.Data modeling": { "message": "データモデリング" }, "sidebar.dropdownCategories.category.Manage data.Data modeling.description": { - "message": "スキーマとデータモデルを最適化する" + "message": "スキーマとデータモデルの最適化" }, "sidebar.dropdownCategories.category.Manage data.Performance and optimizations": { "message": "パフォーマンスと最適化" }, "sidebar.dropdownCategories.category.Manage data.Performance and optimizations.description": { - "message": "ClickHouse を最適化するためのガイド" + "message": "ClickHouse の最適化に役立つガイド" }, "sidebar.dropdownCategories.category.Server admin": { - "message": "サーバー管理" + "message": "サーバー管理者" }, "sidebar.dropdownCategories.category.description.Server admin": { "message": "ClickHouse の管理とデプロイ" }, "sidebar.dropdownCategories.category.Server admin.Deployments and scaling": { - "message": "デプロイとスケーリング" + "message": "デプロイメントとスケーリング" }, "sidebar.dropdownCategories.category.Server admin.Deployments and scaling.description": { "message": "ClickHouse をデプロイする方法" @@ -1453,16 +1031,16 @@ "message": "セキュリティと認証" }, "sidebar.dropdownCategories.category.Server admin.Security and authentication.description": { - "message": "ClickHouse デプロイメントを保護する" + "message": "ClickHouse デプロイメントをセキュアにする" }, "sidebar.dropdownCategories.category.Server admin.Settings": { "message": "設定" }, "sidebar.dropdownCategories.category.Server admin.Settings.description": { - "message": "ClickHouse を設定する" + "message": "ClickHouse の設定" }, "sidebar.dropdownCategories.category.Server admin.Tools and utilities": { - "message": "ツールとユーティリティ" + "message": "ツールおよびユーティリティ" }, "sidebar.dropdownCategories.category.Server admin.Tools and utilities.description": { "message": "ClickHouse を管理するためのツール" @@ -1471,115 +1049,79 @@ "message": "システムテーブル" }, "sidebar.dropdownCategories.category.Server admin.System tables.description": { - "message": "ClickHouse を管理するためのメタデータテーブル" - }, - "sidebar.dropdownCategories.category.Reference": { - "message": "リファレンス" - }, - "sidebar.dropdownCategories.category.description.Reference": { - "message": "ClickHouse 機能のリファレンスドキュメント" - }, - "sidebar.dropdownCategories.category.Reference.Introduction": { - "message": "イントロダクション" - }, - "sidebar.dropdownCategories.category.Reference.Introduction.description": { - "message": "ClickHouse の構文を学ぶ" - }, - "sidebar.dropdownCategories.category.Reference.Functions": { - "message": "関数" - }, - "sidebar.dropdownCategories.category.Reference.Functions.description": { - "message": "データ分析に役立つ数百の組み込み関数" - }, - "sidebar.dropdownCategories.category.Reference.Engines": { - "message": "エンジン" - }, - "sidebar.dropdownCategories.category.Reference.Engines.description": { - "message": "データに適したテーブルおよびデータベースエンジンを使用する" - }, - "sidebar.dropdownCategories.category.Integrations": { - "message": "インテグレーション" - }, - "sidebar.dropdownCategories.category.description.Integrations": { - "message": "ClickHouse で使用するインテグレーション、クライアント、ドライバー" + "message": "ClickHouse の管理を支援するメタデータテーブル" }, "sidebar.dropdownCategories.category.Integrations.All integrations": { - "message": "すべてのインテグレーション" + "message": "すべての統合" }, "sidebar.dropdownCategories.category.Integrations.All integrations.description": { "message": "ClickHouse を他のデータベースやアプリケーションと統合する" }, "sidebar.dropdownCategories.category.Integrations.Language clients": { - "message": "言語クライアント" + "message": "各種言語向けクライアント" }, "sidebar.dropdownCategories.category.Integrations.Language clients.description": { - "message": "お好みの言語で ClickHouse を使用する" - }, - "sidebar.dropdownCategories.category.Integrations.ClickPipes": { - "message": "ClickPipes" - }, - "sidebar.dropdownCategories.category.Integrations.ClickPipes.description": { - "message": "ClickHouse にデータを取り込む最も簡単な方法" + "message": "ClickHouse はお好みの言語から利用できます" }, "sidebar.dropdownCategories.category.Integrations.Native clients & interfaces": { "message": "ネイティブクライアントとインターフェース" }, "sidebar.dropdownCategories.category.Integrations.Native clients & interfaces.description": { - "message": "ClickHouse に接続するクライアントとインターフェースを選択する" + "message": "ClickHouse に接続するためのクライアントとインターフェースを選択する" }, "sidebar.dropdownCategories.category.Integrations.Data sources": { "message": "データソース" }, "sidebar.dropdownCategories.category.Integrations.Data sources.description": { - "message": "お好みのソースから ClickHouse にデータを読み込む" + "message": "お好みのソースから ClickHouse にデータを取り込む" }, "sidebar.dropdownCategories.category.Integrations.Data visualization": { - "message": "データ可視化" + "message": "データの可視化" }, "sidebar.dropdownCategories.category.Integrations.Data visualization.description": { - "message": "ClickHouse をお好みの可視化ツールに接続する" + "message": "ClickHouse をお気に入りの可視化ツールに接続する" }, "sidebar.dropdownCategories.category.Integrations.Data formats": { - "message": "データフォーマット" + "message": "データ形式" }, "sidebar.dropdownCategories.category.Integrations.Data formats.description": { - "message": "ClickHouse がサポートするデータフォーマットを探索する" + "message": "ClickHouse がサポートするデータ形式" }, "sidebar.dropdownCategories.category.Integrations.Data ingestion": { - "message": "データ取り込み" + "message": "データインジェスト" }, "sidebar.dropdownCategories.category.Integrations.Data ingestion.description": { - "message": "さまざまな ELT ツールで ClickHouse にデータを取り込む" + "message": "多様な ELT ツールを活用して ClickHouse にデータを取り込む" }, "sidebar.dropdownCategories.category.ClickStack": { "message": "ClickStack" }, "sidebar.dropdownCategories.category.description.ClickStack": { - "message": "ClickStack - ClickHouse 可観測性スタック" + "message": "ClickStack - ClickHouse オブザーバビリティ スタック" }, "sidebar.dropdownCategories.category.ClickStack.Getting started": { "message": "はじめに" }, "sidebar.dropdownCategories.category.ClickStack.Getting started.description": { - "message": "ClickStack を始める" + "message": "ClickStack の始め方" }, "sidebar.dropdownCategories.category.ClickStack.Sample datasets": { "message": "サンプルデータセット" }, "sidebar.dropdownCategories.category.ClickStack.Sample datasets.description": { - "message": "サンプルデータセットで ClickStack を学ぶ" + "message": "サンプルデータセットを使って ClickStack を学ぶ" }, "sidebar.dropdownCategories.category.ClickStack.Architecture": { "message": "アーキテクチャ" }, "sidebar.dropdownCategories.category.ClickStack.Architecture.description": { - "message": "ClickStack のアーキテクチャに慣れる" + "message": "ClickStack のアーキテクチャを把握する" }, "sidebar.dropdownCategories.category.ClickStack.Deployment": { "message": "デプロイメント" }, "sidebar.dropdownCategories.category.ClickStack.Deployment.description": { - "message": "ClickStack のデプロイメントモードを選択する" + "message": "ClickStack のデプロイ方式を選択する" }, "sidebar.dropdownCategories.category.ClickStack.Ingesting data": { "message": "データの取り込み" @@ -1588,144 +1130,33 @@ "message": "ClickStack にデータを取り込む" }, "sidebar.dropdownCategories.category.ClickStack.Configuration options": { - "message": "設定オプション" + "message": "構成オプション" }, "sidebar.dropdownCategories.category.ClickStack.Configuration options.description": { - "message": "本番環境で ClickStack をデプロイする" + "message": "本番環境での ClickStack のデプロイ" }, "sidebar.dropdownCategories.category.ClickStack.Production": { "message": "本番環境" }, "sidebar.dropdownCategories.category.ClickStack.Production.description": { - "message": "本番環境で ClickStack をデプロイする" + "message": "本番環境に ClickStack をデプロイする" }, "sidebar.dropdownCategories.category.ClickStack.Integration examples": { - "message": "インテグレーション例" + "message": "統合の例" }, "sidebar.dropdownCategories.category.ClickStack.Integration examples.description": { - "message": "インテグレーションクイックスタートガイド" - }, - "sidebar.dropdownCategories.category.chDB": { - "message": "chDB" - }, - "sidebar.dropdownCategories.category.description.chDB": { - "message": "chDB は ClickHouse の組み込みバージョン" - }, - "sidebar.dropdownCategories.category.chDB.Learn chDB": { - "message": "chDB を学ぶ" - }, - "sidebar.dropdownCategories.category.chDB.Learn chDB.description": { - "message": "chDB の使い方を学ぶ" + "message": "インテグレーション用クイックスタートガイド" }, "sidebar.dropdownCategories.category.chDB.Language integrations": { - "message": "言語インテグレーション" + "message": "言語別インテグレーション" }, "sidebar.dropdownCategories.category.chDB.Language integrations.description": { - "message": "言語クライアントを使用して chDB に接続する" - }, - "sidebar.dropdownCategories.category.chDB.Guides": { - "message": "ガイド" - }, - "sidebar.dropdownCategories.category.chDB.Guides.description": { - "message": "chDB を使用するためのガイド" - }, - "sidebar.dropdownCategories.category.About": { - "message": "について" - }, - "sidebar.dropdownCategories.category.description.About": { - "message": "ClickHouse についてもっと知る" - }, - "sidebar.dropdownCategories.category.About.Adopters": { - "message": "採用企業" - }, - "sidebar.dropdownCategories.category.About.Adopters.description": { - "message": "ClickHouse 採用企業" - }, - "sidebar.dropdownCategories.category.About.Changelogs": { - "message": "変更履歴" - }, - "sidebar.dropdownCategories.category.About.Changelogs.description": { - "message": "ClickHouse の最新の変更を確認する" - }, - "sidebar.dropdownCategories.category.About.Support": { - "message": "サポート" - }, - "sidebar.dropdownCategories.category.About.Support.description": { - "message": "ClickHouse エンジニアからサポートを受ける" + "message": "プログラミング言語クライアントを使用して chDB に接続する" }, "sidebar.dropdownCategories.category.About.Development and contributing": { - "message": "開発と貢献" + "message": "開発および貢献" }, "sidebar.dropdownCategories.category.About.Development and contributing.description": { - "message": "ClickHouse に貢献する方法を学ぶ" - }, - "homepage.hero.description": { - "message": "ガイド、リファレンスドキュメント、ビデオを通じて ClickHouse の使い方を学ぶ" - }, - "homepage.hero.quickStart": { - "message": "クイックスタート" - }, - "homepage.hero.getStartedCloud": { - "message": "Cloud を始める" - }, - "homepage.hero.installLocally": { - "message": "ローカルにインストール" - }, - "homepage.hero.getStartedOSS": { - "message": "OSS を始める" - }, - "homepage.search.title": { - "message": "ドキュメントを検索" - }, - "homepage.connect.title": { - "message": "ClickHouse に接続" - }, - "homepage.connect.description": { - "message": "数分でアプリケーションを ClickHouse に接続" - }, - "homepage.connect.viewAll": { - "message": "すべてのクライアントとドライバーを見る" - }, - "homepage.connect.clickhouseCli": { - "message": "ClickHouse CLI" - }, - "homepage.connect.cloudSqlConsole": { - "message": "Cloud SQL コンソール" - }, - "homepage.migrate.title": { - "message": "ClickHouse に移行" - }, - "homepage.migrate.description": { - "message": "他のデータベース、データウェアハウス、オブジェクトストレージからデータを読み込む" - }, - "homepage.migrate.viewAll": { - "message": "すべての統合を見る" - }, - "homepage.deploy.title": { - "message": "ClickHouse をデプロイ" - }, - "homepage.deploy.description": { - "message": "ClickHouse をクラウドまたは独自のインフラストラクチャにデプロイ" - }, - "homepage.deploy.cloud": { - "message": "Cloud" - }, - "homepage.deploy.nodeDeployment": { - "message": "ノードデプロイ" - }, - "homepage.deploy.clusterDeployment": { - "message": "クラスターデプロイ" - }, - "homepage.resources.title": { - "message": "その他のリソース" - }, - "homepage.resources.contactSupport": { - "message": "サポートに連絡" - }, - "homepage.resources.changelog": { - "message": "変更履歴" - }, - "homepage.resources.sampleDatasets": { - "message": "サンプルデータセット" + "message": "ClickHouse への貢献方法を学ぶ" } -} +} \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/Insert_select_settings_tuning.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/Insert_select_settings_tuning.mdx index 8796bb08cf3..c22a0c05d58 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/Insert_select_settings_tuning.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/Insert_select_settings_tuning.mdx @@ -9,35 +9,34 @@ tags: ['設定', 'エラーと例外'] {/* トランケート */} - ## Question \{#question\} -`INSERT...SELECT` ステートメントを実行すると、TOO_MANY_PARTS(too many parts)エラーが発生します。 +`INSERT...SELECT` ステートメントを実行すると、TOO_MANY_PARTS(too many parts)エラーが発生します。 -この問題を解決するにはどうすればよいですか? +この問題を解決するにはどうすればよいですか? ## 回答 \{#answer\} このエラーを回避するために調整可能な設定の一部を以下に示します。これは ClickHouse のエキスパートレベルのチューニングであり、ここで示す値は、適用先となる ClickHouse Cloud サービスまたはオンプレミスクラスターの仕様を十分に理解したうえでのみ設定すべきです。そのため、これらの値を「すべてに当てはまる一律の推奨値」として受け取らないでください。 -[max_insert_block_size](https://clickhouse.com/docs/operations/settings/settings#settings-max_insert_block_size) = `100_000_000`(デフォルト `1_048_576`) +[max_insert_block_size](https://clickhouse.com/docs/operations/settings/settings#settings-max_insert_block_size) = `100_000_000`(デフォルト `1_048_576`) 約 100 万から 1 億に増やすことで、より大きなブロックを形成できるようになります。 注意: この設定は、サーバー側でブロックを形成する場合にのみ適用されます。つまり、HTTP インターフェイス経由の INSERT には適用されますが、clickhouse-client には適用されません。 -[min_insert_block_size_rows](https://clickhouse.com/docs/operations/settings/settings#min-insert-block-size-rows) = `100_000_000`(デフォルト `1_048_576`) +[min_insert_block_size_rows](https://clickhouse.com/docs/operations/settings/settings#min-insert-block-size-rows) = `100_000_000`(デフォルト `1_048_576`) 約 100 万から 1 億に増やすことで、より大きなブロックを形成できるようになります。 -[min_insert_block_size_bytes](https://clickhouse.com/docs/operations/settings/settings#min-insert-block-size-bytes) = `500_000_000`(デフォルト `268_435_456`) +[min_insert_block_size_bytes](https://clickhouse.com/docs/operations/settings/settings#min-insert-block-size-bytes) = `500_000_000`(デフォルト `268_435_456`) 268.44 MB から 500 MB に増やすことで、より大きなブロックを形成できるようになります。 -[parts_to_delay_insert](https://clickhouse.com/docs/operations/settings/merge-tree-settings#parts-to-delay-insert) = `500`(デフォルト `150`) +[parts_to_delay_insert](https://clickhouse.com/docs/operations/settings/merge-tree-settings#parts-to-delay-insert) = `500`(デフォルト `150`) 単一パーティション内のアクティブなパーツ数がしきい値に達したときに、INSERT が意図的に遅延されないよう、この値を増やします。 -[parts_to_throw_insert](https://clickhouse.com/docs/operations/settings/merge-tree-settings#parts-to-throw-insert) = `1500`(デフォルト `3000`) +[parts_to_throw_insert](https://clickhouse.com/docs/operations/settings/merge-tree-settings#parts-to-throw-insert) = `1500`(デフォルト `3000`) この値を増やすと、一般的にはテーブルに対するクエリ性能に影響しますが、データ移行の用途であれば問題ありません。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/ODBC-authentication-failed-error-using-PowerBI-CH-connector.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/ODBC-authentication-failed-error-using-PowerBI-CH-connector.mdx index d1ad911a316..9adf54592d8 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/ODBC-authentication-failed-error-using-PowerBI-CH-connector.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/ODBC-authentication-failed-error-using-PowerBI-CH-connector.mdx @@ -13,8 +13,7 @@ import powerbi_error from "@site/static/images/knowledgebase/powerbi_odbc_authen {/* 省略 */} - -## 質問 +## 質問 \{#question\} コネクタを使用して Power BI から ClickHouse に接続しようとすると、認証エラーが発生します。 @@ -32,7 +31,6 @@ ClickHouseがインストールされているサーバー上の /etc/clickhouse Power BI ODBC 認証エラーのダイアログ - ## 回答 \{#answer\} ClickHouse ODBC Driver をバージョン [1.4.1](https://github.com/ClickHouse/clickhouse-odbc/releases/tag/1.4.1.20250523) に更新してください。 @@ -41,6 +39,6 @@ ClickHouse ODBC Driver をバージョン [1.4.1](https://github.com/ClickHouse/ 接続には専用のユーザーアカウントを使用し、パスワードを手動で設定することを推奨します。ClickHouse Cloud を使用していて、`default` ユーザーと同等の管理者レベルのアクセス権が必要な場合は、新しいユーザーを作成し、そのユーザーに `default_role` を割り当ててください。 -詳細については次を参照してください: +詳細については次を参照してください:\ https://clickhouse.com/docs/operations/access-rights#user-account-management https://clickhouse.com/docs/cloud/security/cloud-access-management#database-roles \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/about-quotas-and-query-complexity.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/about-quotas-and-query-complexity.mdx index 2f71c2f2bad..eef3f884781 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/about-quotas-and-query-complexity.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/about-quotas-and-query-complexity.mdx @@ -10,7 +10,6 @@ description: 'クォータとクエリの複雑性は、ユーザーが ClickHou {/* 切り捨て */} - ## クォータとクエリの複雑度について \{#about-quotas-and-query-complexity\} [クォータ](https://clickhouse.com/docs/operations/quotas) と [クエリの複雑度](https://clickhouse.com/docs/operations/settings/query-complexity) は、ユーザーが ClickHouse 上で実行できる操作を制限するための強力な手段です。 @@ -19,7 +18,7 @@ description: 'クォータとクエリの複雑性は、ユーザーが ClickHou このナレッジベース記事では、これら 2 つの異なるアプローチをどのように適用するかの例を示します。 -## サンプルデータ +## サンプルデータ \{#the-sample-data\} 以降の例では、次のような単純なサンプルテーブルを使用します。 @@ -71,8 +70,7 @@ clickhouse-cloud :) SELECT * FROM default.test_table_00006488 LIMIT 5 -- 5 rows in set. Elapsed: 0.003 sec. ``` - -## クォータの使用 +## クォータの使用 \{#using-quotas\} この例では、ロールを作成し、そのロールに対して各 10 秒の間隔ごとに取得できる結果行を最大 10 行に制限するクォータを適用します。 @@ -138,7 +136,6 @@ clickhouse-cloud :) CREATE QUOTA quota_max_10_result_rows_per_10_seconds FOR INT 次に、ユーザー `user_with_quota` としてログインします - ```sql -- クォータがロールを通じて適用されているユーザーとしてログイン clickhouse-cloud :) SELECT user() @@ -238,8 +235,7 @@ clickhouse-cloud :) select now() ユーザーは、新しい 10 行分の結果セットを取得できる「許容量」が再び付与されるまで、さらに 5 秒待つ必要があることに注意してください。 - -## クエリ複雑度の使用 +## クエリ複雑度の使用 \{#using-query-complexity\} この例では、各クエリで返される行数を1行のみに制限するQuery Complexity `SETTING`を適用するロールを作成します。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/add-column.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/add-column.mdx index 5531a22d3ee..dbd7894bbaf 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/add-column.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/add-column.mdx @@ -10,8 +10,7 @@ keywords: ['列の追加'] {/* 省略 */} - -## テーブルにカラムを追加する +## テーブルにカラムを追加する \{#adding-a-column-to-a-table\} ここでは `clickhouse-local` を使用します。 @@ -49,8 +48,7 @@ FROM events; └────────────┴────────┘ ``` - -## 新しいカラムを追加する +## 新しいカラムを追加する \{#adding-a-new-column\} ここでは、`favoriteNumber` という名前の新しいカラムを `Float64` 型で追加するとします。 これは、[`ALTER TABLE...ADD COLUMN`](/sql-reference/statements/alter/column#add-column) 句を使って実行できます。 @@ -87,8 +85,7 @@ INSERT INTO events (name) VALUES ('Tyler'); └────────────┴────────┴────────────────┘ ``` - -## 列のデフォルト値を変更する +## 列のデフォルト値を変更する \{#modifying-a-columns-default-value\} `favoriteNumber` 列の型を [`ALTER TABLE...MODIFY COLUMN`](/sql-reference/statements/alter/column#modify-column) 句を使って別の型に変更すると、興味深い挙動が見られます。 @@ -147,8 +144,7 @@ INSERT INTO events (name) VALUES ('Tanya'); `Tanya` には新しいデフォルト値 `21` が適用されますが、`Alexey` には以前のデフォルト値 `99` がそのまま残ります。 - -## テーブル内のカラム位置の制御 +## テーブル内のカラム位置の制御 \{#controlling-column-position-in-table\} 新しいカラムを追加すると、デフォルトではテーブルの最後に追加されます。 `FIRST` 句と `AFTER` 句を使うことで、カラムを配置する位置を制御できます。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/alter-user-settings-exception.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/alter-user-settings-exception.mdx index 36a439005ab..06aa205860c 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/alter-user-settings-exception.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/alter-user-settings-exception.mdx @@ -10,8 +10,7 @@ keywords: ['例外', 'ユーザー設定'] {/* トランケート */} - -## DB::Exception: Cannot update user `default` in users.xml because this storage is readonly. (ACCESS_STORAGE_READONLY) \{#dbexception-cannot-update-user-default-in-usersxml-because-this-storage-is-readonly-access_storage_readonly\} +## DB::Exception: Cannot update user `default` in users.xml because this storage is readonly. (ACCESS_STORAGE_READONLY) \{#dbexception-cannot-update-user-default-in-usersxml-because-this-storage-is-readonly-access_storage_readonly\} ユーザーの設定を変更しようとすると、上記の例外が発生することがあります。 @@ -31,5 +30,4 @@ keywords: ['例外', 'ユーザー設定'] ## SQL ベースのアクセス制御を有効化する \{#enable-sql-driven-access-control\} -default ユーザーに対して、SQL ベースのアクセス制御とアカウント管理を有効にできます。これを有効にするための手順は、この[ページ](/operations/access-rights#enabling-access-control -)で説明されています。 \ No newline at end of file +default ユーザーに対して、SQL ベースのアクセス制御とアカウント管理を有効にできます。これを有効にするための手順は、この[ページ](/operations/access-rights#enabling-access-control)で説明されています。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/are_materialized_views_inserted_asynchronously.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/are_materialized_views_inserted_asynchronously.mdx index 94e823f6765..bcbabb30241 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/are_materialized_views_inserted_asynchronously.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/are_materialized_views_inserted_asynchronously.mdx @@ -10,7 +10,6 @@ keywords: ['マテリアライズドビュー'] {/* 省略 */} - ## マテリアライズドビューへの挿入は同期的に行われますか? \{#are-materialized-views-inserted-synchronously\} **質問:** あるソーステーブルに新しい行が挿入されると、その新しい行はそのソーステーブルに紐づくすべてのマテリアライズドビューにも送られます。マテリアライズドビューへの挿入は同期的に実行されますか?つまり、サーバーからクライアントへ挿入成功が通知された時点で、すべてのマテリアライズドビューが完全に更新され、クエリに利用可能になっていることを意味しますか? diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/async_vs_optimize_read_in_order.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/async_vs_optimize_read_in_order.mdx index f548bb8a701..12437a9e058 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/async_vs_optimize_read_in_order.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/async_vs_optimize_read_in_order.mdx @@ -15,12 +15,11 @@ import optimize_read from "@site/static/images/knowledgebase/optimize_read.png"; {/* 省略 */} - ## 同期データ読み取り \{#synchronous-data-reading\} 新しい設定 `allow_asynchronous_read_from_io_pool_for_merge_tree` によって、読み取りスレッド(ストリーム)の数を、クエリ実行パイプラインの残りの処理で使用されるスレッド数よりも多く設定できます。 -通常、[max_threads](https://clickhouse.com/docs/operations/settings/settings/#settings-max_threads) 設定は、並列読み取りスレッド数と並列クエリ処理スレッド数を[制御](https://clickhouse.com/company/events/query-performance-introspection)します。 +通常、[max_threads](https://clickhouse.com/docs/operations/settings/settings/#settings-max_threads) 設定は、並列読み取りスレッド数と並列クエリ処理スレッド数を[制御](https://clickhouse.com/company/events/query-performance-introspection)します。 同期データ読み取りの図 @@ -28,26 +27,26 @@ import optimize_read from "@site/static/images/knowledgebase/optimize_read.png"; ### 非同期データ読み取り \{#asynchronous-data-reading\} -新しい設定 [allow_asynchronous_read_from_io_pool_for_merge_tree](https://github.com/ClickHouse/ClickHouse/pull/43260) により、**CPU リソースが限られた ClickHouse Cloud サービスでのコールドクエリを高速化**し、**I/O ボトルネックとなるクエリのパフォーマンスを向上**させるために、読み取りスレッド(ストリーム)の数を、クエリ実行パイプラインの残りの部分で使用されるスレッド数より多く設定できるようになりました。 -この設定が有効な場合、読み取りスレッドの数は [max_streams_for_merge_tree_reading](https://github.com/ClickHouse/ClickHouse/pull/43260) 設定によって制御されます。 +新しい設定 [allow_asynchronous_read_from_io_pool_for_merge_tree](https://github.com/ClickHouse/ClickHouse/pull/43260) により、**CPU リソースが限られた ClickHouse Cloud サービスでのコールドクエリを高速化**し、**I/O ボトルネックとなるクエリのパフォーマンスを向上**させるために、読み取りスレッド(ストリーム)の数を、クエリ実行パイプラインの残りの部分で使用されるスレッド数より多く設定できるようになりました。 +この設定が有効な場合、読み取りスレッドの数は [max_streams_for_merge_tree_reading](https://github.com/ClickHouse/ClickHouse/pull/43260) 設定によって制御されます。 非同期データ読み取りの図 データは、異なるカラムから非同期かつ並列に読み取られます。 -また、読み取りスレッド(ストリーム)の数と、クエリ実行パイプラインの残りの部分で使用されるスレッド数との比率を設定するための [max_streams_to_max_threads_ratio](https://github.com/ClickHouse/ClickHouse/pull/43260) 設定も存在します。ただし、ベンチマークでは `max_streams_for_merge_tree_reading` 設定ほどの効果はありませんでした。 +また、読み取りスレッド(ストリーム)の数と、クエリ実行パイプラインの残りの部分で使用されるスレッド数との比率を設定するための [max_streams_to_max_threads_ratio](https://github.com/ClickHouse/ClickHouse/pull/43260) 設定も存在します。ただし、ベンチマークでは `max_streams_for_merge_tree_reading` 設定ほどの効果はありませんでした。 -### optimize_read_in_order の場合はどうなりますか? \{#what-about-optimize_read_in_order\} +### optimize_read_in_order の場合はどうなりますか? \{#what-about-optimize_read_in_order\} -[optimize_read_in_order 最適化](https://clickhouse.com/docs/sql-reference/statements/select/order-by/#optimization-of-data-reading)を有効にすると、クエリのソート順がディスク上のデータの物理的な並び順を反映している場合、ClickHouse はメモリ内でのデータの再ソート処理を[省略](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes)できます。**ただし、そのためにはデータを順序どおりに読み出す必要があります(非同期読み取りとは対照的です)。** +[optimize_read_in_order 最適化](https://clickhouse.com/docs/sql-reference/statements/select/order-by/#optimization-of-data-reading)を有効にすると、クエリのソート順がディスク上のデータの物理的な並び順を反映している場合、ClickHouse はメモリ内でのデータの再ソート処理を[省略](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes)できます。**ただし、そのためにはデータを順序どおりに読み出す必要があります(非同期読み取りとは対照的です)。** 順序どおりの読み取り最適化を示す図 -### optimize_read_in_order は非同期読み取りよりも優先される \{#optimize_read_in_order-has-precedence-over-asynchronous-reading\} +### optimize_read_in_order は非同期読み取りよりも優先される \{#optimize_read_in_order-has-precedence-over-asynchronous-reading\} ClickHouse が `optimize_read_in_order optimization` を適用できると判断した場合、`allow_asynchronous_read_from_io_pool_for_merge_tree` 設定は無視されるか、無効化されます。 -### 上記の内容をすべて踏まえた例 +### 上記の内容をすべて踏まえた例 \{#example-demonstrating-all-of-the-above\} * [UK Property Price Paid テーブル](https://clickhouse.com/docs/getting-started/example-datasets/uk-price-paid) を作成してデータをロードする @@ -139,7 +138,6 @@ SETTINGS * `optimize_read_in_order optimization` を適用できる場合、 非同期読み取り用に 60 個、残りのクエリ実行パイプライン用に 20 個のスレッドを使用するクエリパイプラインを確認する - ``` EXPLAIN PIPELINE SELECT * diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-clickpipes.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-clickpipes.mdx index 6e094550f38..a6e7d92dadf 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-clickpipes.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-clickpipes.mdx @@ -10,7 +10,6 @@ keywords: ['AWS PrivateLink', 'プライベート RDS', 'ClickPipes'] {/* 切り捨て */} - ## ClickPipes 用にプライベート RDS を公開するための AWS PrivateLink セットアップ \{#aws-privatelink-setup-to-expose-private-rds-for-clickpipes\} ClickPipes からプライベート RDS にアクセスできるようにするために、AWS PrivateLink 経由で公開するセットアップ手順です。クロスリージョンアクセスにも対応します。 @@ -26,46 +25,48 @@ ClickPipes からプライベート RDS にアクセスできるようにする RDS インスタンス向けの **VPC エンドポイントサービス** を作成するには、次の手順に従います。エンドポイントサービスが必要な RDS インスタンスが複数ある場合は(インスタンスごとに異なるリスナーポートを使用している場合も含めて)、これらの手順を繰り返してください。 1. VPC の特定および [NLB の作成](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html) - - 対象の VPC を特定し、Network Load Balancer (NLB) を作成します。NLB はインターネット向け(public)ではなく、内部向け(private)である必要がある点に注意してください。 + * 対象の VPC を特定し、Network Load Balancer (NLB) を作成します。NLB はインターネット向け(public)ではなく、内部向け(private)である必要がある点に注意してください。 2. ターゲットグループの設定 - - ターゲットグループは、RDS インスタンスのエンドポイント IP とポート(通常、PostgreSQL は 5432、MySQL は 3306)を指すように設定します。 - :::note + * ターゲットグループは、RDS インスタンスのエンドポイント IP とポート(通常、PostgreSQL は 5432、MySQL は 3306)を指すように設定します。 + + :::note + + 新しい RDS エンドポイント IP でターゲットグループを更新する処理を自動化したい場合は、AWS Lambda 関数やその他の自動化ツールを使用できます。 + この目的で使用できる Terraform モジュールの 1 つとしては、[こちら](https://github.com/MaterializeInc/terraform-aws-rds-privatelink) があります。 - 新しい RDS エンドポイント IP でターゲットグループを更新する処理を自動化したい場合は、AWS Lambda 関数やその他の自動化ツールを使用できます。 - この目的で使用できる Terraform モジュールの 1 つとしては、[こちら](https://github.com/MaterializeInc/terraform-aws-rds-privatelink) があります。 + ::: - ::: - - **重要**: DB Cluster / Aurora の場合に使用する RDS インスタンスエンドポイントは、共通(クラスター)エンドポイントではなく WRITER エンドポイント **のみ** を使用してください。 - - NLB による TLS 終端を回避するため、プロトコルには TCP を使用していることを確認してください。 + * **重要**: DB Cluster / Aurora の場合に使用する RDS インスタンスエンドポイントは、共通(クラスター)エンドポイントではなく WRITER エンドポイント **のみ** を使用してください。 + * NLB による TLS 終端を回避するため、プロトコルには TCP を使用していることを確認してください。 3. リスナーポートの設定 - - ロードバランサーのリスナーポートは、ターゲットグループで使用しているポート(通常、PostgreSQL は 5432、MySQL は 3306)と一致させる必要があります。 + * ロードバランサーのリスナーポートは、ターゲットグループで使用しているポート(通常、PostgreSQL は 5432、MySQL は 3306)と一致させる必要があります。 4. VPC エンドポイントサービスの作成 - - VPC 内で、NLB を指すエンドポイントサービスを作成します。 - - 特定アカウントからの接続要求を承諾できるように設定します。 + * VPC 内で、NLB を指すエンドポイントサービスを作成します。 + * 特定アカウントからの接続要求を承諾できるように設定します。 5. ClickPipes にエンドポイントサービスの利用を許可 - - ClickPipes アカウントがこのエンドポイントサービスを要求できるように権限を付与します。 - - 許可されたプリンシパルとして、次のプリンシパル ID を追加します: - ``` - arn:aws:iam::072088201116:root - ``` + * ClickPipes アカウントがこのエンドポイントサービスを要求できるように権限を付与します。 + * 許可されたプリンシパルとして、次のプリンシパル ID を追加します: + ``` + arn:aws:iam::072088201116:root + ``` 6. NLB で「Enforce Security Group Inbound Rules on Private Link Traffic」を無効化(NLB にセキュリティグループがアタッチされている場合) - - NLB の設定画面で、セキュリティグループがアタッチされている場合は "Enforce Security Group Inbound Rules on Private Link Traffic" 設定を無効にします。 - - Terraform を使用している場合は、NLB に対して `enforce_security_group_inbound_rules_on_private_link_traffic` 属性を `off` に設定します。 - - ClickPipes の VPC から NLB へのトラフィックを許可するには、この設定が**必須**です。 + * NLB の設定画面で、セキュリティグループがアタッチされている場合は "Enforce Security Group Inbound Rules on Private Link Traffic" 設定を無効にします。 + * Terraform を使用している場合は、NLB に対して `enforce_security_group_inbound_rules_on_private_link_traffic` 属性を `off` に設定します。 + * ClickPipes の VPC から NLB へのトラフィックを許可するには、この設定が**必須**です。 7. **任意**: データベースのリージョンが ClickPipes のリージョンと異なる場合のクロスリージョンサポートの有効化 - - VPC コンソールの `Endpoint Services` で、対象のエンドポイントサービスを選択します。 - - `Actions` ボタンをクリックし、`Modify supported Regions` を選択します。 - - エンドポイントサービスへのアクセスを許可したいリージョンを追加します。ClickPipes のリージョン一覧については、[こちら](/integrations/clickpipes#list-of-static-ips) を参照してください。 + * VPC コンソールの `Endpoint Services` で、対象のエンドポイントサービスを選択します。 + * `Actions` ボタンをクリックし、`Modify supported Regions` を選択します。 + * エンドポイントサービスへのアクセスを許可したいリージョンを追加します。ClickPipes のリージョン一覧については、[こちら](/integrations/clickpipes#list-of-static-ips) を参照してください。 8. **MySQL を使用する場合の推奨設定** - - MySQL を使用している場合は、ソースデータベースのパラメータとして `skip_name_resolve=1` を設定することを推奨します。 + * MySQL を使用している場合は、ソースデータベースのパラメータとして `skip_name_resolve=1` を設定することを推奨します。 NLB からのヘルスチェックが繰り返し行われるため、MySQL が NLB ホストをブロックしてしまう場合があります。このパラメータを設定すると DNS ホスト名ルックアップを完全に回避できるため、NLB ホストがブロックされることはありません。RDS を使用している場合、この変更にはインスタンスの再起動が必要です。 ## 接続の開始 \{#initiating-connection\} diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-msk-clickpipes.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-msk-clickpipes.mdx index fe981b48c62..56a15c61b56 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-msk-clickpipes.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/aws-privatelink-setup-for-msk-clickpipes.mdx @@ -10,7 +10,6 @@ keywords: ['AWS PrivateLink', 'MSK', 'ClickPipes'] {/* 省略 */} - ## 概要 \{#overview\} このガイドでは、[ClickPipes reverse private endpoint](/integrations/clickpipes/aws-privatelink#msk-multi-vpc) と併せて使用する **MSK マルチ VPC 環境** のセットアップ方法を説明します。 @@ -22,37 +21,37 @@ MSK クラスターの VPC は、ClickPipes が提供されているリージョ ## マルチ VPC 接続を有効にする \{#enabling-multi-vpc-connectivity\} 1. MSK クラスターに移動します。 - - Amazon MSK コンソールの左側ナビゲーションペインから「Clusters」を選択します。 - - マルチ VPC 接続を設定したい対象の MSK クラスターを選択します。 + * Amazon MSK コンソールの左側ナビゲーションペインから「Clusters」を選択します。 + * マルチ VPC 接続を設定したい対象の MSK クラスターを選択します。 2. MSK マルチ VPC 接続を有効にします - - **Connectivity** タブで **Multi-VPC connectivity** セクションを探します。 - - **Edit** をクリックします。 - - **Turn-on MSK multi-VPC connectivity** オプションを有効にします。 - - 画面の指示に従って設定を完了します。 + * **Connectivity** タブで **Multi-VPC connectivity** セクションを探します。 + * **Edit** をクリックします。 + * **Turn-on MSK multi-VPC connectivity** オプションを有効にします。 + * 画面の指示に従って設定を完了します。 3. ClickPipes アカウントプリンシパルをクラスターのポリシーに追加します - - **Configuration** タブに移動します。 - - **Cluster policy** セクションで **Edit** をクリックします。 - - **IAM policy** に `arn:aws:iam::072088201116:root` を含めます。例: - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": [ - "arn:aws:iam::072088201116:root" - ] - }, - "Action": [ - "kafka-cluster:Connect", - "kafka-cluster:DescribeCluster", - "kafka-cluster:ListClusters" - ] - } - ] - } - ``` + * **Configuration** タブに移動します。 + * **Cluster policy** セクションで **Edit** をクリックします。 + * **IAM policy** に `arn:aws:iam::072088201116:root` を含めます。例: + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": [ + "arn:aws:iam::072088201116:root" + ] + }, + "Action": [ + "kafka-cluster:Connect", + "kafka-cluster:DescribeCluster", + "kafka-cluster:ListClusters" + ] + } + ] + } + ``` ## リバースプライベートエンドポイントの作成 \{#creating-reverse-private-endpoint\} diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/backing_up_a_specific_partition.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/backing_up_a_specific_partition.mdx index da0fd3d5804..edd2acb5ef2 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/backing_up_a_specific_partition.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/backing_up_a_specific_partition.mdx @@ -10,12 +10,11 @@ keywords: ['バックアップ', 'パーティション'] {/* 切り捨て */} - ## 質問 \{#question\} ClickHouseで特定のパーティションだけをバックアップするにはどうすればよいですか? -## 回答 +## 回答 \{#answer\} 以下の例では、[docker compose examples](https://github.com/ClickHouse/examples/blob/main/docker-compose-recipes/README.md) ページに掲載されている S3(Minio)ディスクの[設定](https://github.com/ClickHouse/examples/blob/main/docker-compose-recipes/recipes/ch-and-minio-S3/README.md)を使用しています。 @@ -138,7 +137,6 @@ Ok. バックアップから、ID が `1` のパーティションだけを復元します: - ``` ch_minio_s3 :) RESTORE TABLE my_table PARTITION 1 FROM Disk('s3','backups/'); diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/calculate-pi-using-sql.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/calculate-pi-using-sql.mdx index 54d6912d00f..2cea4aa9887 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/calculate-pi-using-sql.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/calculate-pi-using-sql.mdx @@ -10,8 +10,7 @@ keywords: ['円周率の計算', 'SQL'] {/* 切り捨て */} - -## 円周率の日です!SQLを使用して円周率を計算する +## 円周率の日です!SQLを使用して円周率を計算する \{#its-pi-day-lets-calculate-pi-using-sql\} 円周率の日おめでとうございます!ClickHouseのSQLクエリを使って円周率を計算してみるのは面白いのではないかと考えました。これまでに考案した内容は以下の通りです... diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/calculate_ratio_of_zero_sparse_serialization.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/calculate_ratio_of_zero_sparse_serialization.mdx index f154b22936f..e9404ddbbbf 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/calculate_ratio_of_zero_sparse_serialization.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/calculate_ratio_of_zero_sparse_serialization.mdx @@ -10,8 +10,7 @@ keywords: ['空/ゼロ値比率', '計算'] {/* 途中省略 */} - -## テーブル内の各カラムにおける空値/ゼロ値の比率を計算する方法 +## テーブル内の各カラムにおける空値/ゼロ値の比率を計算する方法 \{#how-to-calculate-the-ratio-of-emptyzero-values-in-every-column-in-a-table\} カラムがスパース(空である、または主にゼロを含む)な場合、ClickHouse はそのカラムをスパース形式でエンコードし、自動的に計算を最適化できます。クエリ処理時にデータを完全に伸長する必要がなくなります。実際、カラムがどの程度スパースかが分かっていれば、[`ratio_of_defaults_for_sparse_serialization` 設定](https://clickhouse.com/docs/operations/settings/merge-tree-settings#ratio_of_defaults_for_sparse_serialization)を使ってその比率を指定し、シリアライゼーションを最適化できます。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/cannot-append-data-to-parquet-format.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/cannot-append-data-to-parquet-format.mdx index 91733ef6538..b1443adada1 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/cannot-append-data-to-parquet-format.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/cannot-append-data-to-parquet-format.mdx @@ -10,8 +10,7 @@ keywords: ['Parquet', 'Cannot Append Data'] {/* 切り捨て */} - -## ClickHouse での「Cannot Append Data in Parquet Format」エラーの解消 +## ClickHouse での「Cannot Append Data in Parquet Format」エラーの解消 \{#resolving-cannot-append-data-in-parquet-format-error-in-clickhouse\} ClickHouse で「Cannot append data in format Parquet to file」というエラーが発生していますか? diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/certificate_verify_failed_error.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/certificate_verify_failed_error.mdx index cb83d047e59..82a14bc7db5 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/certificate_verify_failed_error.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/certificate_verify_failed_error.mdx @@ -10,7 +10,6 @@ keywords: ['エラー', 'SSL 証明書', '210'] {/* 途中省略 */} - ## ClickHouse におけるコード 210 の SSL 証明書検証エラーの解決 \{#resolving-ssl-certificate-verify-error-in-clickhouse\} このエラーは通常、次のように報告されます。 @@ -21,10 +20,10 @@ keywords: ['エラー', 'SSL 証明書', '210'] このエラーは、`clickhouse-client` を使用して ClickHouse サーバーへの接続を試みている際に発生します。エラーの原因は次のいずれかです。 -- クライアント設定ファイル `config.xml` に、マシンの CA デフォルトストアにあるルート証明書が含まれていない -- 自己署名証明書または内部 CA 証明書が適切に設定されていない +* クライアント設定ファイル `config.xml` に、マシンの CA デフォルトストアにあるルート証明書が含まれていない +* 自己署名証明書または内部 CA 証明書が適切に設定されていない -## 解決策 +## 解決策 \{#solution\} 内部 CA または自己署名 CA を使用する場合は、クライアントディレクトリ(例: `/etc/clickhouse-client`)内の `config.xml` で CA ルート証明書を設定し、デフォルトの場所から読み込まれるデフォルトのルート CA 証明書を無効にします。 @@ -45,7 +44,6 @@ keywords: ['エラー', 'SSL 証明書', '210'] ``` - ## 追加リソース \{#additional-resources\} -[https://clickhouse.com/docs/interfaces/cli/#configuration_files](https://clickhouse.com/docs/interfaces/cli/#configuration_files) を参照してください \ No newline at end of file +[https://clickhouse.com/docs/interfaces/cli/#configuration_files](https://clickhouse.com/docs/interfaces/cli/#configuration_files) を参照してください \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/change-billing-email.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/change-billing-email.mdx index 0be3e96164e..4d8fe866dc5 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/change-billing-email.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/change-billing-email.mdx @@ -10,7 +10,6 @@ keywords: ['請求担当者の変更', 'ClickHouse Cloud'] {/* 以降を省略 */} - ## 質問 \{#question\} ClickHouse Cloud の Billing Contact(請求担当者)を変更するにはどうすればよいですか? @@ -20,5 +19,5 @@ ClickHouse Cloud の Billing Contact(請求担当者)を変更するには 管理者として請求連絡先を変更するには、以下の手順に従ってください。 1. 新しいユーザーを管理者として Cloud Organization に招待します。 -2. 招待が承諾されたら、ClickHouse Cloud Console の請求ページ(Admin > Billing)に移動し、「Billing contacts」セクションを探します。 +2. 招待が承諾されたら、ClickHouse Cloud Console の請求ページ(Admin > Billing)に移動し、「Billing contacts」セクションを探します。 3. 「Edit」ボタンをクリックし、新しい管理者ユーザーを請求連絡先として設定します。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/change-the-prompt-in-clickhouse-client.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/change-the-prompt-in-clickhouse-client.mdx index 4ec126ad57c..b321715c2d5 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/change-the-prompt-in-clickhouse-client.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/change-the-prompt-in-clickhouse-client.mdx @@ -32,8 +32,7 @@ import prompt_8 from "@site/static/images/knowledgebase/change-the-prompt-in-cli プロンプトを更新する方法はいくつかあり、それぞれについて順に説明します。 - -## --prompt フラグ +## --prompt フラグ \{#--prompt-flag\} フラグを変更する 1 つ目の方法は、`--prompt` を使用することです。 @@ -45,8 +44,7 @@ clickhouse --prompt 👉 指さしの絵文字が追加された ClickHouse クライアントプロンプト - -## 設定ファイル - トップレベル +## 設定ファイル - トップレベル \{#config-file---top-level\} 別の方法として、`config.xml` ファイルでプロンプトのプレフィックスを指定することもできます。 @@ -89,8 +87,7 @@ clickhouse -C christmas.yaml 黄色の丸い絵文字が表示された ClickHouse クライアントのプロンプト - -## 設定ファイル - connections_credentials +## 設定ファイル - connections_credentials \{#config-file---connections_credentials\} 別の方法として、接続ごとの認証情報に対して個別にプロンプトを指定することもできます。 これは、clickhouse-client を使用している場合にのみ有効です。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/check-query-cache-in-use.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/check-query-cache-in-use.mdx index 27d7cd58057..4f46cecc136 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/check-query-cache-in-use.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/check-query-cache-in-use.mdx @@ -10,14 +10,13 @@ keywords: ['クエリキャッシュ'] {/* 切り捨て */} - ## クエリでクエリキャッシュが使用されているかを確認するにはどうすればよいですか? \{#how-can-i-check-that-query-cache-is-being-used-in-my-query\} [clickhouse client](https://clickhouse.com/docs/interfaces/cli) と ClickHouse Cloud サービスを使用した次の例を参照します。 `query_cache_test` テーブルを作成します -## clickhouse client の使い方 +## clickhouse client の使い方 \{#using-clickhouse-client\} ```sql clickhouse-cloud :) CREATE TABLE query_cache_test (name String, age UInt8) ENGINE =MergeTree ORDER BY name @@ -69,7 +68,6 @@ Ok. クエリキャッシュの利用を要求するクエリを実行します(クエリの末尾に `SETTINGS use_query_cache=true` を追加します): - ```sql clickhouse-cloud :) SELECT name FROM query_cache_test WHERE age > 1000 FORMAT Null SETTINGS use_query_cache=true; @@ -153,8 +151,7 @@ Ok. 2回目の実行では、既に保存されていたエントリが見つかったため(`Entry found for query SELECT...`)、クエリはクエリキャッシュを利用しました。 - -## SQL だけを使用する +## SQL だけを使用する \{#using-just-sql\} `clickhouse client` のトレースログを確認せず、SQL コマンドを発行するだけでも、 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/check_query_processing_time_only.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/check_query_processing_time_only.mdx index 577748635e6..88f88451dd1 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/check_query_processing_time_only.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/check_query_processing_time_only.mdx @@ -10,12 +10,11 @@ keywords: ['クエリ処理時間'] {/* トランケート */} - ## 質問 \{#question\} クエリが多数の行を返しますが、知りたいのは処理時間だけです。クエリの出力を表示せずに、処理時間だけを確認するにはどうすればよいですか? -## 回答 +## 回答 \{#answer\} クエリに `FORMAT Null` を追加して、出力形式を `Null` に設定します。これにより、データがクライアントへ送信されるのを防げます。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/check_users_roles.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/check_users_roles.mdx index 0cb8dcaab01..7e2cc5b56ec 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/check_users_roles.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/check_users_roles.mdx @@ -10,7 +10,6 @@ keywords: ['ユーザーロール'] {/* 切り捨て */} - ## Question \{#question\} ロールに割り当てられているユーザーおよびユーザーに割り当てられているロールを確認するにはどうすればよいですか? diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/clickhouse_cloud_api_usage.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/clickhouse_cloud_api_usage.mdx index 863a0074736..1af20f726ff 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/clickhouse_cloud_api_usage.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/clickhouse_cloud_api_usage.mdx @@ -10,14 +10,13 @@ keywords: ['cURL', 'クラウド管理', 'ClickHouse API'] {/* 切り捨て */} - ## ClickHouse API と cURL を使用して Cloud サービスを開始・停止・再開する方法 \{#how-to-start-stop-and-resume-a-cloud-service-using-the-clickhouse-api-and-curl\} ## 質問 \{#question\} API エンドポイント経由で ClickHouse Cloud サービスを起動・停止・再開するにはどうすればよいですか? -## 回答 +## 回答 \{#answer\} 1. アイドル状態の Cloud サービスを起動/再開するには、インスタンスに対して ping を送信します。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/columnar-database.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/columnar-database.mdx index 38149d55081..97ee0309949 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/columnar-database.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/columnar-database.mdx @@ -14,7 +14,6 @@ import ColumnOriented from '@site/static/images/column-oriented.gif'; {/* 省略 */} - ## はじめに \{#introduction\} カラム型データベースでは、各カラムのデータが互いに独立して保存されます。これにより、任意のクエリで使用されるカラムのデータだけをディスクから読み取ることができます。その代償として、行全体に影響する処理のコストは相対的に高くなります。カラム型データベースは、カラム指向データベース管理システムと同義です。ClickHouse は、その代表的な例です。 @@ -23,9 +22,9 @@ import ColumnOriented from '@site/static/images/column-oriented.gif'; カラムナ型データベースの主な利点は次のとおりです。 -- 多数のカラムのうち、少数のカラムを使用するクエリ。 -- 大量のデータに対する集約クエリ。 -- カラム単位でのデータ圧縮。 +* 多数のカラムのうち、少数のカラムを使用するクエリ。 +* 大量のデータに対する集約クエリ。 +* カラム単位でのデータ圧縮。 ## 行指向データベース vs 列指向データベース \{#row-oriented-vs-column-oriented-databases\} diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/common-rbac-queries.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/common-rbac-queries.mdx index 7147506b923..dca3a9672a5 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/common-rbac-queries.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/common-rbac-queries.mdx @@ -10,19 +10,17 @@ keywords: ['RBAC', 'クエリ'] {/* 切り捨て */} - ## はじめに \{#introduction\} 以下は、ユーザーに特定の権限を付与するためによく使用されるクエリです。 -## 現在のユーザーと同じ権限を別のユーザーに付与するには? +## 現在のユーザーと同じ権限を別のユーザーに付与するには? \{#how-do-i-grant-the-same-permissions-as-the-current-user-to-another-user\} ```sql GRANT CURRENT GRANTS ON *.* TO another_user; ``` - -## 現在のユーザーに付与されている権限に基づいて、別のユーザーに特定の権限を付与するにはどうすればよいですか? +## 現在のユーザーに付与されている権限に基づいて、別のユーザーに特定の権限を付与するにはどうすればよいですか? \{#how-do-i-grant-a-specific-permission-to-a-user-based-on-the-grants-of-the-current-user\} 次の例では、`another_user` は現在のユーザーがアクセス可能なすべてのデータベースおよびテーブルに対して `SELECT` クエリを実行できるようになります。 @@ -30,8 +28,7 @@ GRANT CURRENT GRANTS ON *.* TO another_user; GRANT CURRENT GRANTS(SELECT ON *.*) TO another_user; ``` - -## 現在のユーザーに付与されている権限に基づいて、特定のデータベースに対する特定の権限をユーザーに付与するにはどうすればよいですか? +## 現在のユーザーに付与されている権限に基づいて、特定のデータベースに対する特定の権限をユーザーに付与するにはどうすればよいですか? \{#how-do-i-grant-a-specific-permission-to-a-user-for-a-specific-database-based-on-the-grants-of-the-current-user\} 次の例では、`another_user` は `my_database` 内のすべてのテーブルに対して `INSERT` 文を実行できるようになります。 @@ -39,8 +36,7 @@ GRANT CURRENT GRANTS(SELECT ON *.*) TO another_user; GRANT INSERT ON my_database.* TO another_user; ``` - -## デフォルトユーザーと同じ権限を特定ユーザーにすべて付与するにはどうすればよいですか? +## デフォルトユーザーと同じ権限を特定ユーザーにすべて付与するにはどうすればよいですか? \{#how-do-i-give-access-to-all-grants-for-a-specific-user-based-on-the-default-user\} ```sql GRANT default_role TO another_user; diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/compare_resultsets.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/compare_resultsets.mdx index cbd02075a83..417b615faef 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/compare_resultsets.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/compare_resultsets.mdx @@ -10,12 +10,11 @@ keywords: ['検証', '結果セット', 'ハッシュ関数'] {/* 省略 */} - ## 質問 \{#question\} 2 つのクエリが同じ結果セットを返すことを検証するにはどうすればよいですか? -## 回答 +## 回答 \{#answer\} 以下の方法を利用できます。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/comparing-metrics-between-queries.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/comparing-metrics-between-queries.mdx index 1dee630ec0e..14110af4b47 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/comparing-metrics-between-queries.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/comparing-metrics-between-queries.mdx @@ -10,8 +10,7 @@ keywords: [クエリの比較, メトリクスの比較, クエリ パフォー {/* 切り捨て */} - -## 2 つのクエリ間でメトリクスを比較する +## 2 つのクエリ間でメトリクスを比較する \{#compare-metrics-between-two-queries\} 2 つのクエリ間でメトリクスを比較するには、まず両方のクエリの `query_id` を取得する必要があります。 @@ -42,7 +41,6 @@ FORMAT PrettyCompactMonoBlock 2つのクエリを比較したメトリクスのテーブルが表示されます。 - ```sql ┌─metric──────────────────────────────────────────────┬───────v1─┬───────v2─┬──────────────────dB─┬───perc─┬─bar───────────────────────────────┐ │ OSReadBytes │ 0 │ 528384 │ inf │ 100 │ █████████████████████████████████ │ diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/configure-a-user-setting.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/configure-a-user-setting.mdx index d490f4c9303..b06efd5828e 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/configure-a-user-setting.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/configure-a-user-setting.mdx @@ -10,12 +10,11 @@ keywords: ['SET', 'ALTER', 'ユーザー', 'クエリ', 'セッション'] {/* トランケート */} - ## はじめに \{#introduction\} ClickHouse でユーザーの設定を定義する方法はいくつかあります。どの方法を取るかは、ユースケースやその設定をどのくらいの期間有効にしておきたいかによって異なります。いくつかのシナリオを見ていきましょう… -## 単一のクエリに対して設定を行う +## 単一のクエリに対して設定を行う \{#configure-a-setting-for-a-single-query\} `SELECT` クエリには `SETTINGS` 句を含めることができ、そこに任意の数の設定を定義できます。これらの設定はそのクエリに対してのみ適用されます。例えば: @@ -27,8 +26,7 @@ SETTINGS max_threads = 8; このクエリでは、使用されるスレッド数の最大値は 8 です。 - -## セッションに対する設定を構成する +## セッションに対する設定を構成する \{#configure-a-setting-for-a-session\} `SET` 句を使用して、クライアントセッションの存続期間に有効な設定を定義できます。これはアドホックなテストや、いくつかのクエリを実行している間だけ有効な設定にしたい場合に便利ですが、それ以上の期間は有効にしたくない場合に適しています。 @@ -39,8 +37,7 @@ SELECT * FROM my_table; ``` - -## 特定のユーザー向けの設定を構成する +## 特定のユーザー向けの設定を構成する \{#configure-a-setting-for-a-particular-user\} `ALTER USER` を使用して、特定のユーザーだけに適用される設定を定義します。例えば: diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/configure_cap_ipc_lock_and_cap_sys_nice_in_docker.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/configure_cap_ipc_lock_and_cap_sys_nice_in_docker.mdx index d1de3ed7b38..3109b05085a 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/configure_cap_ipc_lock_and_cap_sys_nice_in_docker.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/configure_cap_ipc_lock_and_cap_sys_nice_in_docker.mdx @@ -10,8 +10,7 @@ keywords: ['Docker', 'CAP_IPC_LOCK', 'CAP_SYS_NICE'] {/* 切り捨て */} - -## 質問 +## 質問 \{#question\} Docker で ClickHouse を実行していると、システムに `CAP_IPC_LOCK` と `CAP_SYS_NICE` のケーパビリティがないと Docker から警告されます。どのように対処すればよいですか? @@ -31,8 +30,7 @@ docker run -d --name clickhouse-server \ 2023.04.19 08:04:10.065860 [ 1 ] {} Application: プロセスにCAP_SYS_NICE機能がないため、'os_thread_priority'設定は効果がありません。ClickHouseパッケージが正しくインストールされていないことが原因の可能性があります。'sudo setcap cap_sys_nice=+ep /usr/bin/clickhouse'を手動で実行することで問題を解決できます。なお、'nosuid'でマウントされたファイルシステムでは動作しません。 ``` - -## 回答 +## 回答 \{#answer\} 1. コンテナに `IPC_LOCK` および `SYS_NICE` のケーパビリティを付与するために、2つの `--cap-add` 引数を追加します。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/connection_timeout_remote_remoteSecure.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/connection_timeout_remote_remoteSecure.mdx index 6e70bec2ce6..0f94e7aebe9 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/connection_timeout_remote_remoteSecure.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/connection_timeout_remote_remoteSecure.mdx @@ -10,8 +10,7 @@ keywords: ['接続試行が失敗しました'] {/* 省略 */} - -## コード: 279. DB::NetException: All connection tries failed. +## コード: 279. DB::NetException: All connection tries failed. \{#code-279-dbnetexception-all-connection-tries-failed\} **問題** [`remote()` または `remoteSecure()`](https://clickhouse.com/docs/sql-reference/table-functions/remote/) テーブル関数を使用すると、別の ClickHouse ノード上のリモートテーブルにアクセスできます。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/custom-dns-alias-for-instance.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/custom-dns-alias-for-instance.mdx index 76d0ae5b984..6efbeab50a5 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/custom-dns-alias-for-instance.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/custom-dns-alias-for-instance.mdx @@ -15,12 +15,11 @@ hide_title: true
- # リバースプロキシを設定してカスタム DNS エイリアスを設定する \{#custom-dns-alias\} > このナレッジベース記事では、Nginx などのリバースプロキシを使用して、ClickHouse ネイティブクライアント向けに ClickHouse Cloud インスタンスのカスタム DNS エイリアスを設定する方法を順を追って説明します。 -## 自己署名証明書を作成する +## 自己署名証明書を作成する \{#create-certificate\} :::note 署名付き証明書を使用している場合、この手順は不要です。 @@ -51,8 +50,7 @@ hide_title: true ``` - -## Nginx 設定を更新する +## Nginx 設定を更新する \{#update-nginx-config\} `nginx.conf` ファイルに以下の内容を追加します: @@ -93,8 +91,7 @@ stream { ここで言う `isrgrootx1.pem` は ClickHouse Cloud のルート証明書で、 [こちら](https://letsencrypt.org/certs/isrgrootx1.pem) からダウンロードできます。 - -## hosts ファイルを更新する +## hosts ファイルを更新する \{#update-hosts-file\} :::note 独自のドメインコントローラーを使用している場合、次の手順は不要です @@ -110,8 +107,7 @@ Nginx サーバー上の `/etc/hosts` ファイルに以下を追加します: ここでの `10.X.Y.Z` は、あなたの環境における特定の Nginx サーバーの IP アドレスを指します。 - -## エイリアスを使用して Cloud に接続する +## エイリアスを使用して Cloud に接続する \{#connect-to-cloud-using-alias\} これで、カスタムエイリアスを使って接続する準備が整いました。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/dbms-naming.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/dbms-naming.mdx index 739b0281a02..64ac74dbbee 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/dbms-naming.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/dbms-naming.mdx @@ -10,15 +10,14 @@ keywords: ['ClickHouse の意味'] {/* 省略 */} - ## ClickHouse という名前の意味 \{#clickhouse-meaning-explained\} これは「**Click**stream(クリックストリーム)」と「Data ware**House**(データウェアハウス)」を組み合わせたものです。Yandex.Metrica における元々のユースケースに由来しており、ClickHouse はインターネット全体から人々のあらゆるクリックを記録することになっていて、現在もその役割を果たしています。このユースケースの詳細は [ClickHouse history](https://clickhouse.com/docs/about-us/history) ページで確認できます。 この 2 つの意味には、次の 2 点の含意があります。 -- `Click**H**ouse` の正しい表記は、必ず H を大文字にすることです。 -- 省略する必要がある場合は **CH** を使用してください。歴史的な理由により、中国では CK と省略する形も人気があります。これは、最初期の中国語での ClickHouse に関する講演の 1 つでこの表記が使われたことが主な理由です。 +* `Click**H**ouse` の正しい表記は、必ず H を大文字にすることです。 +* 省略する必要がある場合は **CH** を使用してください。歴史的な理由により、中国では CK と省略する形も人気があります。これは、最初期の中国語での ClickHouse に関する講演の 1 つでこの表記が使われたことが主な理由です。 :::info ClickHouse に名前が付けられてから何年も後になって、このように、それ自体が意味を持つ 2 つの単語を組み合わせるアプローチが、データベースに名前を付ける最良の方法として取り上げられました。これは、Carnegie Mellon University のデータベース学准教授である Andy Pavlo による [研究](https://www.cs.cmu.edu/~pavlo/blog/2020/03/on-naming-a-database-management-system.html) で示されています。ClickHouse は、彼の「史上最高のデータベース名」賞を Postgres と分け合いました。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/delete-old-data.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/delete-old-data.mdx index de70b4a3166..622c8e7544b 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/delete-old-data.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/delete-old-data.mdx @@ -10,7 +10,6 @@ keywords: ['古いレコードの削除'] {/* 省略 */} - ## 結論は「はい」です \{#the-short-answer-is-yes\} 結論は「はい」です。ClickHouse には、古いデータを削除してディスク使用量を削減できる複数の仕組みがあります。それぞれ異なるシナリオを想定しています。 @@ -27,7 +26,7 @@ TTL はデータを [/dev/null](https://en.wikipedia.org/wiki/Null_device) に [TTL の設定](https://clickhouse.com/docs/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl)についての詳細は、こちらを参照してください。 -## DELETE FROM +## DELETE FROM \{#delete-from\} [DELETE FROM](https://clickhouse.com/docs/sql-reference/statements/delete) を使用すると、標準的な DELETE クエリを ClickHouse で実行できます。フィルター句で対象となった行には削除フラグが付き、以降の結果セットからは除外されます。削除済み行のクリーンアップ(物理削除)は非同期に行われます。 @@ -40,7 +39,6 @@ SET allow_experimental_lightweight_delete = true; ::: - ## ALTER DELETE \{#alter-delete\} `ALTER DELETE` は、非同期バッチ処理を用いて行を削除します。`DELETE FROM` と異なり、`ALTER DELETE` の実行後からバッチ処理が完了するまでの間に実行されたクエリの結果には、削除対象となっている行も含まれます。詳細については [ALTER DELETE](https://clickhouse.com/docs/sql-reference/statements/alter/delete) ドキュメントを参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/dictionaries-consistent-state.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/dictionaries-consistent-state.mdx index 9e35c7de71e..5ab572a8ee7 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/dictionaries-consistent-state.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/dictionaries-consistent-state.mdx @@ -10,8 +10,7 @@ keywords: ['辞書'] {/* トランケート */} - -## ClickHouse におけるディクショナリ +## ClickHouse におけるディクショナリ \{#dictionaries-in-clickhouse\} ClickHouse Cloud で作成されたディクショナリは、作成直後の段階では一時的に不整合な状態になる場合があります。つまり、作成直後にはディクショナリ内にデータがまったく表示されないことがあります。ただし、数回リトライすると、作成クエリが別のレプリカで実行され、データが表示されるようになります。 @@ -44,7 +43,6 @@ SOURCE(CLICKHOUSE(QUERY SETTINGS select_sequential_consistency=1' USER default PASSWORD '')) ``` - ## なぜこの問題が発生するのですか? \{#why-does-this-issue-occur\} データを挿入してから辞書を作成または再読み込みする際、DDL がデータ(または新しいデータ)よりも先にレプリカへ到達する場合があります。これにより、レプリカ間で辞書の内容に不整合が生じます。その結果、どのレプリカがクエリを受信するかによって、得られる結果が異なる可能性があります。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/dictionary_using_strings.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/dictionary_using_strings.mdx index 698414ccdb4..f3182015160 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/dictionary_using_strings.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/dictionary_using_strings.mdx @@ -10,12 +10,11 @@ keywords: ['Dictionary', '文字列キー', '文字列値'] {/* truncate */} - ## 質問 \{#question\} MergeTree テーブルをソースとし、文字列キーおよび文字列値を使用する ClickHouse 辞書の作成方法 -## 回答 +## 回答 \{#answer\} * 辞書の元となるテーブルを作成します diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/difference_between_official_builds_and_3rd_party.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/difference_between_official_builds_and_3rd_party.mdx index b4766fa0fb8..02894a71d24 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/difference_between_official_builds_and_3rd_party.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/difference_between_official_builds_and_3rd_party.mdx @@ -10,7 +10,6 @@ keywords: ['公式ビルド', 'サードパーティ製ビルド'] {/* 切り捨て */} - ## 質問 \{#question\} 他のベンダーが独自ビルドの ClickHouse を提供しているのを見かけます。公式の ClickHouse ビルドとこれらのサードパーティ製ビルドにはどのような違いがありますか? @@ -19,17 +18,17 @@ keywords: ['公式ビルド', 'サードパーティ製ビルド'] 他のビルドで確認された違いには、次のようなものがあります。 -- **"official"** という文言がベンダー名に置き換えられている -- 数か月遅れて公開され、***最近のバグ修正が含まれていない*** ため、公式バージョンではすでに修正済みの脆弱性を含んでいる可能性がある -- ビルドがビットレベルで同一ではなく、コード中のアドレスも異なる。その結果として、これらのビルドから得られたスタックトレースを解析できず、ClickHouse チームはこれらのビルドに関する質問に回答できない -- ビルドは監査不可能かつ再現不可能であり、同じビルドログを持つ公開 CI システムが存在しない -- これらのビルドでは ClickHouse のテストスイートが実行されていないため、テストスイートによる動作検証が行われていない -- すべてのアーキテクチャ(ARM など)向けに提供されていない場合がある -- 特定の顧客向けのパッチが含まれていることがあり、それによって互換性が損なわれたり、追加のリスクが生じたりする可能性がある +* **"official"** という文言がベンダー名に置き換えられている +* 数か月遅れて公開され、***最近のバグ修正が含まれていない*** ため、公式バージョンではすでに修正済みの脆弱性を含んでいる可能性がある +* ビルドがビットレベルで同一ではなく、コード中のアドレスも異なる。その結果として、これらのビルドから得られたスタックトレースを解析できず、ClickHouse チームはこれらのビルドに関する質問に回答できない +* ビルドは監査不可能かつ再現不可能であり、同じビルドログを持つ公開 CI システムが存在しない +* これらのビルドでは ClickHouse のテストスイートが実行されていないため、テストスイートによる動作検証が行われていない +* すべてのアーキテクチャ(ARM など)向けに提供されていない場合がある +* 特定の顧客向けのパッチが含まれていることがあり、それによって互換性が損なわれたり、追加のリスクが生じたりする可能性がある ドキュメントの [インストール手順](https://clickhouse.com/docs/install) に従い、公式ビルドを用いて ClickHouse の最新版を実行することを推奨します。 -- 毎月 **stable バージョン** を 1 つリリースしており、直近 3 つの stable リリースについては、診断およびバグ修正のバックポートという観点でサポートしています。 -- また年に 2 回 **long-term support (LTS) バージョン** をリリースしており、初回リリースから 1 年間サポートされます。これは、頻繁なアップグレードや非 LTS ソフトウェアの利用が許可されていない企業を主な対象としています。(私たちは毎月の stable ビルドを強く推奨しています。) +* 毎月 **stable バージョン** を 1 つリリースしており、直近 3 つの stable リリースについては、診断およびバグ修正のバックポートという観点でサポートしています。 +* また年に 2 回 **long-term support (LTS) バージョン** をリリースしており、初回リリースから 1 年間サポートされます。これは、頻繁なアップグレードや非 LTS ソフトウェアの利用が許可されていない企業を主な対象としています。(私たちは毎月の stable ビルドを強く推奨しています。) ドキュメントには、[stable と LTS リリースの違いに関する詳細](https://clickhouse.com/docs/faq/operations/production#how-to-choose-between-clickhouse-releases) も記載しています。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/enabling-ssl-with-lets-encrypt.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/enabling-ssl-with-lets-encrypt.mdx index 9027b4792d1..4d662279b21 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/enabling-ssl-with-lets-encrypt.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/enabling-ssl-with-lets-encrypt.mdx @@ -13,8 +13,7 @@ import security_group from "@site/static/images/knowledgebase/lets-encrypt-ssl/p {/* truncate */} - -## 手順 +## 手順 \{#steps-to-follow\} 以下の手順では、単一の ClickHouse Server に対して [Let's Encrypt](https://letsencrypt.org/) を使用して SSL を有効にする方法を説明します。Let's Encrypt は無料かつ自動化されたオープンな認証局 (Certificate Authority, CA) であり、誰もが HTTPS を用いて自分の Web サイトを容易に保護できるように設計されています。証明書の発行および更新プロセスを自動化することで、Let's Encrypt は手動による操作を必要とせずに Web サイトの安全性を維持します。 @@ -75,7 +74,6 @@ sudo apt install certbot
- ```bash sudo certbot certonly デバッグログを /var/log/letsencrypt/letsencrypt.log に保存しています @@ -164,7 +162,6 @@ echo "127.0.0.1 product-test-server.clickhouse-dev.com" | sudo tee -a /etc/hosts :::warning ワイルドカードアドレスからの接続を許可する場合は、以下のいずれかの対策を必ず講じてください。 - * サーバーはファイアウォールで保護されており、信頼できないネットワークからはアクセスできないこと。 * すべてのユーザーはネットワークアドレスのサブセットに制限されていること(`users.xml` を参照)。 * すべてのユーザーが十分に強力なパスワードを持ち、セキュアな (TLS) インターフェイスのみがアクセス可能であるか、もしくは接続が TLS インターフェイス経由でのみ行われていること。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/exception-too-many-parts.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/exception-too-many-parts.mdx index c5960131c28..ab5c16127ed 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/exception-too-many-parts.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/exception-too-many-parts.mdx @@ -10,8 +10,7 @@ keywords: ['Too many parts'] {/* 省略 */} - -## DB::Exception: パーツが多すぎます (Error: 252)。マージ処理が挿入よりも著しく遅くなっています +## DB::Exception: パーツが多すぎます (Error: 252)。マージ処理が挿入よりも著しく遅くなっています \{#dbexception-too-many-parts-252-merges-are-processing-significantly-slower-than-inserts\} MergeTree テーブルで `parts_to_throw_insert` 設定の上限に達しました。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/exchangeStatementToSwitchTables.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/exchangeStatementToSwitchTables.mdx index 70956e855f8..2d73da3dd25 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/exchangeStatementToSwitchTables.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/exchangeStatementToSwitchTables.mdx @@ -12,12 +12,11 @@ keywords: ['EXCHANGE'] *** - ## 質問 \{#question\} [`EXCHANGE`](/sql-reference/statements/exchange) コマンドを使ってテーブル名を入れ替えるにはどうすればよいですか? -## 回答 +## 回答 \{#answer\} `EXCHANGE` コマンドは、現在のテーブルを、一時的に使用している別のテーブル(そのテーブルで Primary Key やその他の設定が更新されている可能性があるもの)と入れ替える必要がある場合に役立ちます。 この操作は `RENAME` コマンドと異なり、アトミックに実行されます。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/execute-system-queries-in-cloud.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/execute-system-queries-in-cloud.mdx index 57baca78b1b..bcafc523b68 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/execute-system-queries-in-cloud.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/execute-system-queries-in-cloud.mdx @@ -10,8 +10,7 @@ keywords: ['clusterAllReplicas'] {/* 切り捨て */} - -## 解答 +## 解答 \{#answer\} ClickHouse Cloud サービス内のすべてのノードで同じクエリを実行するには、[clusterAllReplicas](https://clickhouse.com/docs/sql-reference/table-functions/cluster/) を使用します。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/file-export.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/file-export.mdx index 516073b525b..aacfdcf62d1 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/file-export.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/file-export.mdx @@ -10,8 +10,7 @@ keywords: ['データのエクスポート', 'INTO OUTFILE', 'File テーブル {/* 省略 */} - -## INTO OUTFILE 句の使用 +## INTO OUTFILE 句の使用 \{#using-into-outfile-clause\} クエリに [INTO OUTFILE](https://clickhouse.com/docs/sql-reference/statements/select/into-outfile) 句を追加します。 @@ -48,8 +47,7 @@ INTO OUTFILE 'taxi_rides.txt' FORMAT CSV ``` - -## File テーブルエンジンを使用する +## File テーブルエンジンを使用する \{#using-a-file-engine-table\} 別の選択肢として、[File](https://clickhouse.com/docs/engines/table-engines/special/file) テーブルエンジンを使用する方法があります。この場合、ClickHouse はデータを保存するためにファイルを利用します。ファイルに対して直接クエリの実行やデータの挿入ができます。 @@ -79,8 +77,7 @@ INSERT INTO my_table VALUES `File` テーブルエンジンは、ファイルシステム上のファイルを作成したりクエリを実行したりするのに非常に便利ですが、`File` テーブルは `MergeTree` テーブルではないため、`MergeTree` が提供するすべての利点は得られないことに注意してください。ClickHouse からデータを使いやすい形式でエクスポートする際の利便性を目的として `File` を使用してください。 ::: - -## コマンドラインでのリダイレクトの使用 +## コマンドラインでのリダイレクトの使用 \{#using-command-line-redirection\} ```bash $ clickhouse-client --query "SELECT * from table" --format FormatName > result.txt diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/filtered-aggregates.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/filtered-aggregates.mdx index cc131d548af..cc98f2b3bc9 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/filtered-aggregates.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/filtered-aggregates.mdx @@ -10,8 +10,7 @@ keywords: ['フィルタ付き集約'] {/* 切り捨て */} - -## フィルタ付き集約の利用 +## フィルタ付き集約の利用 \{#using-filtered-aggregates\} ClickHouse では、*フィルタ付き集約* を記述するためのシンプルで直感的な方法が提供されています。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/find-expensive-queries.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/find-expensive-queries.mdx index ee8901abda7..515159a2c20 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/find-expensive-queries.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/find-expensive-queries.mdx @@ -11,8 +11,7 @@ keywords: ['高コストなクエリ'] {/* 省略 */} - -## 回答 +## 回答 \{#answer\} `system` データベースの `query_log` テーブルは、すべてのクエリを記録しており、次の情報を含みます: @@ -53,7 +52,6 @@ LIMIT 10; └─────────────┴─────────────────────┴──────────────────────────────────────┴────────────┴─────────────┴────────────┴───────────────────────┘ ``` - :::note `initial_query_id` は、リクエストを受信したノードから開始される分散クエリ実行における最初のクエリの ID を表します。`query_id` には、別のノード上で実行される子クエリの ID が含まれます。詳細は [この記事](https://clickhouse.com/docs/knowledgebase/find-expensive-queries#initial_query_id-vs-query_id) を参照してください。 ::: @@ -95,8 +93,7 @@ SELECT FROM s3Cluster('default','https://clickhouse-public-datasets.s3.amazonaws.com/youtube/original/files/*.zst', 'JSONLines') ``` - -## initial_query_id VS query_id +## initial_query_id VS query_id \{#initial_query_id-vs-query_id\} クラスタ構成の ClickHouse 環境(ClickHouse Cloud など)では、`initial_query_id` はリクエストを受け付けたノードから起動される分散クエリ実行における、最初に発行されたクエリの ID を表します。 この場合、`query_id` フィールドには、別のノード上で実行される子クエリの ID が含まれます。 @@ -122,7 +119,6 @@ LIMIT 10 FORMAT Pretty; 次のような結果が得られます: - ``` ┏━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ hostname() ┃ type ┃ event_time ┃ initial_query_id ┃ query_id ┃ memory ┃ userCPU ┃ systemCPU ┃ normalized_query_hash ┃ @@ -185,7 +181,6 @@ LIMIT 10 FORMAT Pretty; └────────────────────────┴─────────────┴─────────────────────┴──────────────────────────────────────┴──────────────────────────────────────┴────────────┴─────────┴───────────┴───────────────────────┘ ``` - 一方、`query_id = initial_query_id` を指定すると、分散クエリが最初に発行されたローカルノード上で実行されたクエリのみが返されます。 ```sql diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/finding_expensive_queries_by_memory_usage.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/finding_expensive_queries_by_memory_usage.mdx index 9d67333b23f..348f0800080 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/finding_expensive_queries_by_memory_usage.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/finding_expensive_queries_by_memory_usage.mdx @@ -10,8 +10,7 @@ keywords: ['負荷の高いクエリ', 'メモリ使用量'] {/* 切り詰め */} - -## `system.query_log` テーブルの使用 +## `system.query_log` テーブルの使用 \{#using-the-systemquery_log-table\} 次の便利なクエリを使用すると、実行されたクエリのうち、どれが最も多くのメモリを使用したかを確認できます。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/fix-developer-verification-error-in-macos.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/fix-developer-verification-error-in-macos.mdx index e5d2445e11d..d2b94bebef4 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/fix-developer-verification-error-in-macos.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/fix-developer-verification-error-in-macos.mdx @@ -17,7 +17,6 @@ import privacy_allow from "@site/static/images/knowledgebase/fix-the-developer-v *** - ## macOS の開発元検証エラーを解消する \{#fix-the-developer-verification-error-in-macos\} `brew` を使って ClickHouse をインストールした場合、macOS でエラーが表示されることがあります。 @@ -34,20 +33,22 @@ import privacy_allow from "@site/static/images/knowledgebase/fix-the-developer-v `clickhouse` 実行ファイルを隔離領域から削除する最も簡単な方法は次のとおりです。 1. **システム設定** を開きます。 -1. **プライバシーとセキュリティ** に移動します。 - macOS の「プライバシーとセキュリティ」設定のデフォルト表示 +2. **プライバシーとセキュリティ** に移動します。 + + macOS の「プライバシーとセキュリティ」設定のデフォルト表示 + +3. ウィンドウの一番下までスクロールし、*"clickhouse-macos-aarch64" was blocked from use because it is not from an identified developer"* というメッセージを探します。 -1. ウィンドウの一番下までスクロールし、_"clickhouse-macos-aarch64" was blocked from use because it is not from an identified developer"_ というメッセージを探します。 -1. **このまま開く** をクリックします。 +4. **このまま開く** をクリックします。 - macOS の「プライバシーとセキュリティ」設定で「このまま開く」ボタンが表示されている状態 + macOS の「プライバシーとセキュリティ」設定で「このまま開く」ボタンが表示されている状態 -1. macOS のユーザーパスワードを入力します。 +5. macOS のユーザーパスワードを入力します。 これでターミナルから `clickhouse` コマンドを実行できるようになります。 -## ターミナルでの手順 +## ターミナルでの手順 \{#terminal-process\} `Allow Anyway` ボタンを押してもこの問題が解決しないことがあります。その場合は、コマンドラインから同じ処理を実行することもできます。 あるいは、単にコマンドラインのほうが好みという場合もあるでしょう。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/generate-har-file.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/generate-har-file.mdx index b626020186f..1c8929d98aa 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/generate-har-file.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/generate-har-file.mdx @@ -10,7 +10,6 @@ description: 'HAR (HTTP Archive) ファイルは、ブラウザーのネット {/* 切り捨て */} - ## Google Chrome から \{#from-google-chrome\} 1. F12 キー、または Ctrl + Shift + I(Windows/Linux) / Cmd + Option + I(Mac)を押して、デベロッパーツールを開きます。 @@ -35,9 +34,9 @@ description: 'HAR (HTTP Archive) ファイルは、ブラウザーのネット ## Safari から \{#from-safari\} 1. 開発ツールを有効にします(まだ有効にしていない場合): - - Safari > 設定 > 詳細 を開きます。 - - 一番下の「メニューバーに“開発”メニューを表示」をオンにします。 -2. 「開発」>「Web インスペクタを表示」をクリックします。 + * Safari > 設定 > 詳細 を開きます。 + * 一番下の「メニューバーに“開発”メニューを表示」をオンにします。 +2. 「開発」>「Web インスペクタを表示」をクリックします。 3. 「ネットワーク」タブをクリックします。 4. ページを再読み込みして、問題を再現します。 5. 開発ツールから「書き出す」ボタンをクリックします。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/how-do-i-contribute-code-to-clickhouse.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/how-do-i-contribute-code-to-clickhouse.mdx index 70562c67f45..460b9196b24 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/how-do-i-contribute-code-to-clickhouse.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/how-do-i-contribute-code-to-clickhouse.mdx @@ -10,7 +10,6 @@ keywords: ['コントリビューション', 'オープンソース'] {/* 切り捨て */} - ## ClickHouse への貢献方法 \{#how-to-contribute-in-clickhouse\} ClickHouse は、[GitHub 上で開発されている](https://github.com/ClickHouse/ClickHouse)オープンソースプロジェクトです。 diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/how-to-check-my-clickhouse-cloud-sevice-state.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/how-to-check-my-clickhouse-cloud-sevice-state.mdx index 1e610ee3e4d..9d197ee7ea1 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/how-to-check-my-clickhouse-cloud-sevice-state.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/how-to-check-my-clickhouse-cloud-sevice-state.mdx @@ -10,7 +10,6 @@ keywords: ['クラウドサービスの状態'] {/* 途中省略 */} - ## ClickHouse Cloud サービスの状態を確認する方法 \{#how-to-check-your-clickhouse-cloud-service-state\} ClickHouse Cloud サービスの状態はどのように確認できますか?サービスが停止、アイドル状態、または実行中かを確認したいのですが、その際にサービスを起動させたくありません。 @@ -19,8 +18,8 @@ ClickHouse Cloud サービスの状態はどのように確認できますか? [ClickHouse Cloud API](/cloud/manage/api/api-overview) は、クラウドサービスの状態を確認するのに便利です。Cloud API を使用する前に、対象サービスで API キーを作成する必要があります。これは ClickHouse Cloud の [clickhouse.cloud](https://console.clickhouse.cloud) で行えます: -- [API 概要](/cloud/manage/api/api-overview) -- [Swagger](https://clickhouse.com/docs/cloud/manage/api/swagger) +* [API 概要](/cloud/manage/api/api-overview) +* [Swagger](https://clickhouse.com/docs/cloud/manage/api/swagger) 1. サービスの状態を確認するには、次を実行します。`Key-ID` と `Key-Secret` はそれぞれ自身の値に置き換えてください。 @@ -34,7 +33,7 @@ ClickHouse Cloud サービスの状態はどのように確認できますか? result":{"id":"[Service-ID]","name":"[Service-Name]","provider":"aws","region":"us-east-1","state":"**idle**","endpoints":[{"protocol":"nativesecure","host":"[Connect-URL]","port":9440},{"protocol":"https","host":"[Connect-URL]","port":8443}],"tier":"development","idleScaling":true,"idleTimeoutMinutes":15,"ipAccessList":[{"source":"[my-IP]","description":"[my-IP-name]"}],"createdAt":"2023-04-13T23:47:47Z"},"status":200} ``` -1. [jq ユーティリティ](https://jqlang.github.io/jq/) を使用して `state` キーのみを抽出できます。 +2. [jq ユーティリティ](https://jqlang.github.io/jq/) を使用して `state` キーのみを抽出できます。 ```shell curl --user '[Key-ID]:[Key-Secret]' https://api.clickhouse.cloud/v1/organizations/[Org-ID]/services/[Service-ID] | jq '.state' @@ -46,7 +45,7 @@ ClickHouse Cloud サービスの状態はどのように確認できますか? **idle** ``` -1. 稼働中のサービスに対して同じコマンドを実行すると、次のような出力が得られます。 +3. 稼働中のサービスに対して同じコマンドを実行すると、次のような出力が得られます。 ```json **running** diff --git a/i18n/jp/docusaurus-plugin-content-blog/current/how-to-connect-to-ch-cloud-using-ssh-keys.mdx b/i18n/jp/docusaurus-plugin-content-blog/current/how-to-connect-to-ch-cloud-using-ssh-keys.mdx index 34c74f09a62..f271400f4b6 100644 --- a/i18n/jp/docusaurus-plugin-content-blog/current/how-to-connect-to-ch-cloud-using-ssh-keys.mdx +++ b/i18n/jp/docusaurus-plugin-content-blog/current/how-to-connect-to-ch-cloud-using-ssh-keys.mdx @@ -10,7 +10,6 @@ keywords: ['クラウド', 'SSH'] {/* 切り捨て */} - ## 質問 \{#question\} SSH 鍵認証を使用して ClickHouse に接続するにはどうすればよいですか? @@ -19,9 +18,9 @@ SSH 鍵認証を使用して ClickHouse に接続するにはどうすればよ ここでは例として ClickHouse Cloud を使用していますが、この手順は OSS 版 ClickHouse でも同様に利用できます。 ::: - + + + +fullscreen; +picture-in-picture" + allowfullscreen + /> -
+
現在データがどこにあるかに応じて、ClickHouse Cloud にデータを移行する方法はいくつかあります。 -- [セルフマネージド環境から Cloud へ](/cloud/migration/clickhouse-to-cloud): `remoteSecure` 関数を使用してデータを転送します -- [別の DBMS から](/cloud/migration/clickhouse-local): [clickhouse-local] ETL ツールと、現在利用中の DBMS に対応する ClickHouse のテーブル関数を組み合わせて使用します -- [どこからでも!](/cloud/migration/etl-tool-to-clickhouse): さまざまな種類のデータソースに接続できる、広く利用されている ETL/ELT ツールのいずれかを使用します -- [オブジェクトストレージから](/integrations/migration/object-storage-to-clickhouse): S3 から ClickHouse へ簡単にデータを取り込めます +* [セルフマネージド環境から Cloud へ](/cloud/migration/clickhouse-to-cloud): `remoteSecure` 関数を使用してデータを転送します +* [別の DBMS から](/cloud/migration/clickhouse-local): [clickhouse-local] ETL ツールと、現在利用中の DBMS に対応する ClickHouse のテーブル関数を組み合わせて使用します +* [どこからでも!](/cloud/migration/etl-tool-to-clickhouse): さまざまな種類のデータソースに接続できる、広く利用されている ETL/ELT ツールのいずれかを使用します +* [オブジェクトストレージから](/integrations/migration/object-storage-to-clickhouse): S3 から ClickHouse へ簡単にデータを取り込めます [Redshift からの移行](/migrations/redshift/migration-guide)の例では、ClickHouse にデータを移行する 3 つの異なる方法を紹介しています。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md index 1b1ec86cb56..21c89290d82 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# ClickHouse と PostgreSQL の比較 +# ClickHouse と PostgreSQL の比較 {#comparing-clickhouse-and-postgresql} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md index 91a64ccd7a6..20c74d9da68 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md @@ -129,7 +129,7 @@ ClickHouse は、[限定された構成](/guides/developer/transactional) の下 -## 圧縮 +## 圧縮 {#compression} ClickHouse のカラム指向ストレージでは、Postgres と比較して圧縮効率が大幅に優れることがよくあります。以下は、両方のデータベースで Stack Overflow の全テーブルを格納した場合のストレージ要件を比較した例です。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md index 9e5c1fc20d5..ac242a28c78 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md @@ -31,49 +31,49 @@ Postgres から ClickHouse への典型的なマイグレーション例を示 ```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 +# posts {#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 +# posthistory {#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 +# badges {#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 +# postlinks {#postlinks} wget [https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz](https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz) gzip -d postlinks.sql.gz @@ -87,9 +87,9 @@ ClickHouseにとっては小規模ですが、このデータセットはPostgre ``` -## データの移行 +## データの移行 {#migrating-data} -### リアルタイムレプリケーション(CDC) +### リアルタイムレプリケーション(CDC) {#real-time-replication-or-cdc} PostgreSQL 用の ClickPipes をセットアップするには、この[ガイド](/integrations/clickpipes/postgres)を参照してください。このガイドでは、さまざまな種類のソースとなる Postgres インスタンスを扱っています。 @@ -125,7 +125,7 @@ ORDER BY id; セットアップが完了すると、ClickPipes は PostgreSQL から ClickHouse へのすべてのデータ移行を開始します。ネットワークやデプロイメントの規模によって所要時間は異なりますが、Stack Overflow データセットであれば数分程度で完了するはずです。 -### 手動による一括ロードと定期更新 +### 手動による一括ロードと定期更新 {#initial-bulk-load-with-periodic-updates} 手動アプローチを用いる場合、データセットの初回一括ロードは次の方法で実施できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md index 803667e73c1..37bd95e03b9 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md @@ -21,7 +21,7 @@ CDC を利用したリアルタイムレプリケーションで PostgreSQL か -## ClickHouse でクエリを最適化する +## ClickHouse でクエリを最適化する {#optimize-queries-in-clickhouse} 最小限のクエリ書き換えで移行することも可能ですが、クエリを大幅に単純化し、さらにクエリパフォーマンスを向上させるために、ClickHouse の機能を活用することを推奨します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md index dd7dc90718e..fa6a319abb2 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md @@ -49,7 +49,7 @@ CDC を用いたリアルタイムレプリケーションを利用する場合 -## パーティション +## パーティション {#partitions} Postgres ユーザーであれば、テーブルをより小さく扱いやすい単位であるパーティションに分割することで、大規模データベースのパフォーマンスと管理性を向上させるテーブルパーティショニングの概念にはなじみがあるはずです。このパーティショニングは、指定した列(例: 日付)の範囲や、定義済みリスト、あるいはキーに対するハッシュを用いることで実現できます。これにより、管理者は日付範囲や地理的な位置などの特定の条件に基づいてデータを整理できます。パーティショニングは、パーティションプルーニングや効率的なインデックス作成による高速なデータアクセスを可能にすることで、クエリ性能の向上に寄与します。また、テーブル全体ではなく個々のパーティション単位で操作できるため、バックアップやデータ削除といったメンテナンス作業の効率化にもつながります。さらに、負荷を複数のパーティションに分散させることで、PostgreSQL データベースのスケーラビリティを大幅に向上させることができます。 @@ -76,7 +76,7 @@ PARTITION BY toYear(CreationDate) パーティションについての詳細な説明は ["Table partitions"](/partitions) を参照してください。 -### パーティションの用途 +### パーティションの用途 {#applications-of-partitions} ClickHouse におけるパーティションは、Postgres と同様の用途がありますが、いくつか細かな違いがあります。より具体的には次のとおりです。 @@ -132,7 +132,7 @@ OK -## マテリアライズドビューとプロジェクションの比較 +## マテリアライズドビューとプロジェクションの比較 {#materialized-views-vs-projections} Postgres では、単一のテーブルに対して複数のインデックスを作成でき、さまざまなアクセスパターンに最適化できます。この柔軟性により、管理者や開発者は特定のクエリや運用要件に合わせてデータベースのパフォーマンスを調整できます。ClickHouse におけるプロジェクションの概念はこれと完全に同じではありませんが、テーブルに対して複数の `ORDER BY` 句を指定できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md index 1aed389601f..1593003ce1b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md @@ -12,7 +12,7 @@ import bigquery_1 from '@site/static/images/migrations/bigquery-1.png'; import Image from '@theme/IdealImage'; -# ClickHouse Cloud と BigQuery の比較 +# ClickHouse Cloud と BigQuery の比較 {#comparing-clickhouse-cloud-and-bigquery} @@ -186,7 +186,7 @@ ClickHouse は、分析タスクにより適したものとなるよう、多く -## 配列 +## 配列 {#arrays} BigQuery の配列関数が 8 個であるのに対して、ClickHouse には 80 個以上の[組み込み配列関数](/sql-reference/functions/array-functions)があり、幅広い問題をエレガントかつシンプルにモデリング・解決できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md index 07ee62f5e5c..3cdac048853 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md @@ -75,7 +75,7 @@ Change Data Capture(CDC)は、2 つのデータベース間でテーブル -## スキーマの設計 +## スキーマの設計 {#designing-schemas} Stack Overflow のデータセットには、関連する多数のテーブルが含まれています。まずは主要なテーブルの移行に集中することを推奨します。これは必ずしも最大のテーブルとは限らず、むしろ分析クエリの発行が最も多いと想定されるテーブルです。そうすることで、主要な ClickHouse の概念に慣れることができます。このテーブルは、追加のテーブルが増えるにつれて、ClickHouse の機能を最大限に活用し最適なパフォーマンスを得るために、再モデリングが必要になる場合があります。このモデリングプロセスについては、[データモデリングのドキュメント](/data-modeling/schema-design#next-data-modeling-techniques)で解説しています。 @@ -108,7 +108,7 @@ CREATE TABLE stackoverflow.posts ( ); ``` -### 型の最適化 +### 型の最適化 {#optimizing-types} [こちら](/data-modeling/schema-design)で説明しているプロセスに従うと、次のようなスキーマになります。 @@ -174,11 +174,11 @@ ClickHouse で選択したプライマリキーは、インデックスだけで -## データモデリング手法 +## データモデリング手法 {#data-modeling-techniques} BigQuery から移行するユーザーは、まず [ClickHouse におけるデータモデリングガイド](/data-modeling/schema-design) を参照することを推奨します。このガイドでは同じ Stack Overflow データセットを使用し、ClickHouse の機能を活用した複数のアプローチを解説しています。 -### パーティション +### パーティション {#partitions} BigQuery ユーザーは、大規模なデータベースにおいて、テーブルを「パーティション」と呼ばれる小さく扱いやすい単位に分割することで、性能と管理性を向上させるテーブルパーティショニングの概念に馴染みがあるはずです。パーティショニングは、指定したカラム(例: 日付)に対する範囲、定義済みリスト、あるいはキーに対するハッシュによって実現できます。これにより、管理者は日付範囲や地理的位置といった特定の条件に基づいてデータを整理できます。 @@ -205,7 +205,7 @@ ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) PARTITION BY toYear(CreationDate) ``` -#### 用途 +#### 用途 {#applications} ClickHouse におけるパーティショニングの用途は BigQuery と似ていますが、いくつか細かな違いがあります。具体的には次のとおりです。 @@ -259,7 +259,7 @@ ALTER TABLE posts -## マテリアライズドビューとプロジェクション +## マテリアライズドビューとプロジェクション {#materialized-views-vs-projections} ClickHouse のプロジェクションの概念により、ユーザーは 1 つのテーブルに対して複数の `ORDER BY` 句を指定できます。 @@ -396,7 +396,7 @@ WHERE UserId = 8592047 ``` -## ClickHouse 向けの BigQuery クエリの書き換え +## ClickHouse 向けの BigQuery クエリの書き換え {#rewriting-bigquery-queries-in-clickhouse} 以下は、BigQuery と ClickHouse のクエリを比較したサンプルクエリです。このリストは、ClickHouse の機能を活用してクエリを大幅に簡素化する方法を示すことを目的としています。ここでの例では、Stack Overflow の全データセット(2024 年 4 月まで)を使用します。 @@ -464,7 +464,7 @@ LIMIT 5 ``` -## 集約関数 +## 集約関数 {#aggregate-functions} 可能な場合は、ClickHouse の集約関数を活用してください。以下では、各年でもっとも閲覧された質問を求めるために、[`argMax` 集約関数](/sql-reference/aggregate-functions/reference/argmax) を使用する例を示します。 @@ -519,7 +519,7 @@ MaxViewCount: 66975 ``` -## 条件式と配列 +## 条件式と配列 {#conditionals-and-arrays} 条件式と配列関数を使うと、クエリを大幅に簡潔にできます。次のクエリは、2022 年から 2023 年にかけての出現回数が 10000 回を超えるタグのうち、増加率が最も大きいものを算出します。以下の ClickHouse クエリが、条件式・配列関数・`HAVING` 句および `SELECT` 句でエイリアスを再利用できる機能のおかげで簡潔になっている点に注目してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md index 6d4a02d2af3..7357b4280c6 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md @@ -30,7 +30,7 @@ BigQuery から ClickHouse へのデータエクスポートにかかる時間 -## テーブルデータを GCS にエクスポートする +## テーブルデータを GCS にエクスポートする {#1-export-table-data-to-gcs} この手順では、[BigQuery SQL ワークスペース](https://cloud.google.com/bigquery/docs/bigquery-web-ui) を使用して SQL 文を実行します。ここでは、[`EXPORT DATA`](https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements) ステートメントを使用して、`mytable` という BigQuery テーブルを GCS のバケットにエクスポートします。 @@ -67,7 +67,7 @@ END WHILE; * 列指向フォーマットである Parquet は、標準で圧縮されており、BigQuery によるエクスポートおよび ClickHouse によるクエリが高速であるため、より優れたデータ交換形式です。 -## GCS から ClickHouse へのデータインポート +## GCS から ClickHouse へのデータインポート {#2-importing-data-into-clickhouse-from-gcs} エクスポートが完了したら、このデータを ClickHouse のテーブルにインポートできます。以下のコマンドを実行するには、[ClickHouse SQL console](/integrations/sql-clients/sql-console) か [`clickhouse-client`](/interfaces/cli) を使用できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md index b477425dc1e..9bf8778db6c 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md @@ -13,7 +13,7 @@ import cloud_architecture from '@site/static/images/cloud/onboard/discover/use_c import Image from '@theme/IdealImage'; -# Snowflake から ClickHouse への移行 +# Snowflake から ClickHouse への移行 {#snowflake-to-clickhouse-migration} > このドキュメントでは、Snowflake から ClickHouse へのデータ移行の概要を説明します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md index 0699341a4b9..3d616d779c9 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md @@ -12,7 +12,7 @@ import migrate_snowflake_clickhouse from '@site/static/images/migrations/migrate import Image from '@theme/IdealImage'; -# SnowflakeからClickHouseへの移行 +# SnowflakeからClickHouseへの移行 {#migrate-from-snowflake-to-clickhouse} > 本ガイドでは、SnowflakeからClickHouseへデータを移行する方法について説明します。 @@ -21,7 +21,7 @@ SnowflakeとClickHouse間でデータを移行するには、転送用の中間 -## Snowflake からデータをエクスポートする +## Snowflake からデータをエクスポートする {#1-exporting-data-from-snowflake} Snowflake から ClickHouse への移行 @@ -59,7 +59,7 @@ COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 heade 約 5TB のデータセットで最大ファイルサイズが 150MB、かつ同じ AWS `us-east-1` リージョン内にある 2X-Large Snowflake ウェアハウスを使用する場合、S3 バケットへのデータのコピーには約 30 分かかります。 -## ClickHouse へのインポート +## ClickHouse へのインポート {#2-importing-to-clickhouse} データが中間オブジェクトストレージにステージングされたら、以下のように [s3 テーブル関数](/sql-reference/table-functions/s3) などの ClickHouse の関数を使用して、テーブルにデータを挿入できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md index c1a31c32cc2..dacd8e3ec5d 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md @@ -10,7 +10,7 @@ doc_type: 'guide' -# Snowflake SQL 変換ガイド +# Snowflake SQL 変換ガイド {#snowflake-sql-translation-guide} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md index b5e1ee5aeb7..d197b1233c8 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md @@ -8,6 +8,6 @@ show_related_blogs: true doc_type: 'landing-page' --- -# Elasticsearch から ClickHouse への移行 +# Elasticsearch から ClickHouse への移行 {#elasticsearch-to-clickhouse-migration} オブザーバビリティのユースケースについては、[Elasticsearch から ClickStack への移行](/use-cases/observability/clickstack/migration/elastic) の移行ドキュメントを参照してください。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md index ce49f001ee5..32f1c411563 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# Amazon Redshift から ClickHouse への移行 +# Amazon Redshift から ClickHouse への移行 {#amazon-redshift-to-clickhouse-migration} > このドキュメントでは、Amazon Redshift から ClickHouse へのデータ移行の概要を説明します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md index 33827b48ceb..cd2404f2389 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md @@ -7,9 +7,8 @@ title: 'Amazon Redshift から ClickHouse への移行ガイド' doc_type: 'guide' --- -import MigrationGuide from '@site/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' +import MigrationGuide from '@site/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' +# Amazon Redshift から ClickHouse への移行ガイド {#amazon-redshift-to-clickhouse-migration-guide} -# Amazon Redshift から ClickHouse への移行ガイド - - \ No newline at end of file + \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md index 32a05db8eee..98c69a3b873 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md @@ -9,7 +9,7 @@ doc_type: 'reference' -# Amazon Redshift SQL 変換ガイド +# Amazon Redshift SQL 変換ガイド {#amazon-redshift-sql-translation-guide} @@ -52,9 +52,9 @@ ClickHouse と Redshift 間でデータを移動するユーザーは、ClickHou -## DDL 構文 +## DDL 構文 {#compression} -### ソートキー +### ソートキー {#sorting-keys} ClickHouse と Redshift の両方には「ソートキー」という概念があり、 データを保存する際にどのような順序で格納するかを定義します。Redshift では、 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md index 63ddb3a17e6..e4f4b779086 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md @@ -8,7 +8,7 @@ keywords: ['移行', 'ClickHouse Cloud', 'OSS', 'セルフマネージド環境 --- import Image from '@theme/IdealImage'; -import AddARemoteSystem from '@site/docs/_snippets/_add_remote_ip_access_list_detail.md'; +import AddARemoteSystem from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_add_remote_ip_access_list_detail.md'; import self_managed_01 from '@site/static/images/integrations/migration/self-managed-01.png'; import self_managed_02 from '@site/static/images/integrations/migration/self-managed-02.png'; import self_managed_03 from '@site/static/images/integrations/migration/self-managed-03.png'; @@ -16,16 +16,13 @@ import self_managed_04 from '@site/static/images/integrations/migration/self-man import self_managed_05 from '@site/static/images/integrations/migration/self-managed-05.png'; import self_managed_06 from '@site/static/images/integrations/migration/self-managed-06.png'; +# セルフマネージド ClickHouse と ClickHouse Cloud 間の移行 {#migrating-between-self-managed-clickhouse-and-clickhouse-cloud} -# セルフマネージド ClickHouse と ClickHouse Cloud 間の移行 - -セルフマネージド ClickHouse の移行 +セルフマネージド ClickHouse の移行 このガイドでは、セルフマネージドな ClickHouse サーバーから ClickHouse Cloud への移行方法と、ClickHouse Cloud のサービス間での移行方法を説明します。[`remoteSecure`](/sql-reference/table-functions/remote) 関数は、`SELECT` および `INSERT` クエリでリモートの ClickHouse サーバーにアクセスするために使用します。これにより、`SELECT` を埋め込んだ `INSERT INTO` クエリを書くことで、テーブルを簡単に移行できます。 - - -## 自前運用の ClickHouse から ClickHouse Cloud への移行 +## 自前運用の ClickHouse から ClickHouse Cloud への移行 {#migrating-from-self-managed-clickhouse-to-clickhouse-cloud} 自前運用の ClickHouse からの移行 @@ -36,7 +33,7 @@ ClickHouse Cloud が垂直・水平スケーリングを自動的に処理する この例では、自前運用の ClickHouse サーバーが *ソース*、ClickHouse Cloud サービスが *宛先* になります。 -### 概要 +### 概要 {#overview} 手順は次のとおりです。 @@ -46,11 +43,11 @@ ClickHouse Cloud が垂直・水平スケーリングを自動的に処理する 4. (該当する場合)宛先側の IP アクセスリストからソースサーバーを削除する 5. ソース側のサービスから読み取り専用ユーザーを削除する -### あるシステムから別のシステムへのテーブルの移行 +### あるシステムから別のシステムへのテーブルの移行 {#migration-of-tables-from-one-system-to-another} この例では、1 つのテーブルを自前運用の ClickHouse サーバーから ClickHouse Cloud に移行します。 -### ソース側の ClickHouse システム(現在データを保持しているシステム)での作業 +### ソース側の ClickHouse システム(現在データを保持しているシステム)での作業 {#on-the-source-clickhouse-system-the-system-that-currently-hosts-the-data} * ソーステーブル(この例では `db.table`)を読み取ることができる読み取り専用ユーザーを追加します @@ -72,7 +69,7 @@ FROM system.tables WHERE database = 'db' AND table = 'table' ``` -### 宛先側の ClickHouse Cloud システム上で: +### 宛先側の ClickHouse Cloud システム上で: {#on-the-destination-clickhouse-cloud-system} * 宛先データベースを作成します。 @@ -119,8 +116,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 'default', 'PASS') SELECT * FROM db.table ``` - -## ClickHouse Cloud サービス間での移行 +## ClickHouse Cloud サービス間での移行 {#migrating-between-clickhouse-cloud-services} 自己管理型 ClickHouse の移行 @@ -143,7 +139,7 @@ ClickHouse Cloud サービス間でデータを移行する主なユースケー 6. デスティネーション上で IP Access List を再設定する 7. ソースサービスから読み取り専用ユーザーを削除する -#### ソースサービスに読み取り専用ユーザーを追加する +#### ソースサービスに読み取り専用ユーザーを追加する {#add-a-read-only-user-to-the-source-service} * ソーステーブル(この例では `db.table`)を読み取れる読み取り専用ユーザーを追加します @@ -164,7 +160,7 @@ ClickHouse Cloud サービス間でデータを移行する主なユースケー where database = 'db' and table = 'table' ``` -#### デスティネーションサービス上でテーブル構造を複製する +#### デスティネーションサービス上でテーブル構造を複製する {#duplicate-the-table-structure-on-the-destination-service} デスティネーションにまだデータベースが存在しない場合は、先に作成します: @@ -181,7 +177,7 @@ ClickHouse Cloud サービス間でデータを移行する主なユースケー CREATE TABLE db.table ... ``` -#### ソースサービスへのリモートアクセスを許可する +#### ソースサービスへのリモートアクセスを許可する {#allow-remote-access-to-the-source-service} ソースからデスティネーションへデータをプルするには、ソースサービスが接続を許可している必要があります。ソースサービス上で一時的に「IP Access List」機能を無効化します。 @@ -191,7 +187,7 @@ ClickHouse Cloud サービス間でデータを移行する主なユースケー 許可リストを編集し、一時的に **Anywhere** からのアクセスを許可します。詳細については [IP Access List](/cloud/security/setting-ip-filters) ドキュメントを参照してください。 -#### ソースからデスティネーションへデータをコピーする +#### ソースからデスティネーションへデータをコピーする {#copy-the-data-from-source-to-destination} * `remoteSecure` 関数を使用して、ソースの ClickHouse Cloud サービスからデータをプルします。 デスティネーションに接続し、デスティネーション側の ClickHouse Cloud サービスで次のコマンドを実行します: @@ -203,11 +199,11 @@ ClickHouse Cloud サービス間でデータを移行する主なユースケー * デスティネーションサービス上のデータを確認します -#### ソース上で IP Access List を再設定する +#### ソース上で IP Access List を再設定する {#re-establish-the-ip-access-list-on-the-source} 以前にアクセスリストをエクスポートしている場合は、**Share** を使って再インポートできます。エクスポートしていない場合は、アクセスリストにエントリを再度追加してください。 -#### 読み取り専用ユーザー `exporter` を削除する +#### 読み取り専用ユーザー `exporter` を削除する {#remove-the-read-only-exporter-user} ```sql DROP USER exporter diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md index 497022943f0..dce22244c4e 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md @@ -11,14 +11,14 @@ import Image from '@theme/IdealImage'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; -import AddARemoteSystem from '@site/docs/_snippets/_add_remote_ip_access_list_detail.md'; +import AddARemoteSystem from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_add_remote_ip_access_list_detail.md'; import ch_local_01 from '@site/static/images/integrations/migration/ch-local-01.png'; import ch_local_02 from '@site/static/images/integrations/migration/ch-local-02.png'; import ch_local_03 from '@site/static/images/integrations/migration/ch-local-03.png'; import ch_local_04 from '@site/static/images/integrations/migration/ch-local-04.png'; -# clickhouse-local を使用した ClickHouse への移行 +# clickhouse-local を使用した ClickHouse への移行 {#migrating-to-clickhouse-using-clickhouse-local} セルフマネージド ClickHouse の移行 @@ -91,21 +91,21 @@ Mac で `clickhouse-local` を実行するには、`./clickhouse local` を使 -## 例 1: Integration テーブルエンジンを使用して MySQL から ClickHouse Cloud へ移行する +## 例 1: Integration テーブルエンジンを使用して MySQL から ClickHouse Cloud へ移行する {#example-1-migrating-from-mysql-to-clickhouse-cloud-with-an-integration-engine} ソースの MySQL データベースからデータを読み取るために、[mysql テーブル関数](/sql-reference/table-functions/mysql/) によって動的に作成される [integration テーブルエンジン](/engines/table-engines/integrations/mysql/) を使用し、ClickHouse Cloud サービス上の宛先テーブルにデータを書き込むために [remoteSecure テーブル関数](/sql-reference/table-functions/remote/) を使用します。 自己管理型 ClickHouse からの移行 -### 宛先側の ClickHouse Cloud サービスで: +### 宛先側の ClickHouse Cloud サービスで: {#on-the-destination-clickhouse-cloud-service} -#### 宛先データベースを作成する: +#### 宛先データベースを作成する: {#create-the-destination-database} ```sql CREATE DATABASE db ``` -#### MySQL テーブルと同じスキーマを持つ出力先テーブルを作成します: +#### MySQL テーブルと同じスキーマを持つ出力先テーブルを作成します: {#create-a-destination-table-that-has-a-schema-equivalent-to-the-mysql-table} ```sql CREATE TABLE db.table ... @@ -115,9 +115,9 @@ CREATE TABLE db.table ... ClickHouse Cloud の宛先テーブルのスキーマと、元の MySQL テーブルのスキーマは整合している必要があります(カラム名と順序が同一であり、かつカラムのデータ型が互換性を持っている必要があります)。 ::: -### clickhouse-local を実行するホストマシン上で: +### clickhouse-local を実行するホストマシン上で: {#on-the-clickhouse-local-host-machine} -#### マイグレーション用クエリで clickhouse-local を実行します: +#### マイグレーション用クエリで clickhouse-local を実行します: {#run-clickhouse-local-with-the-migration-query} ```sql ./clickhouse-local --query " @@ -131,16 +131,16 @@ SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');" ::: -## 例 2: JDBC ブリッジを使用して MySQL から ClickHouse Cloud へ移行する +## 例 2: JDBC ブリッジを使用して MySQL から ClickHouse Cloud へ移行する {#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge} [jdbc テーブル関数](/sql-reference/table-functions/jdbc.md) によってオンザフライで作成される [JDBC integration テーブルエンジン](/engines/table-engines/integrations/jdbc.md) を、[ClickHouse JDBC Bridge](https://github.com/ClickHouse/clickhouse-jdbc-bridge) および MySQL JDBC ドライバーと組み合わせて使用してソースの MySQL データベースからデータを読み取り、[remoteSecure テーブル関数](/sql-reference/table-functions/remote.md) を使用して ClickHouse Cloud サービス上の宛先テーブルにデータを書き込みます。 自己管理型 ClickHouse からの移行 -### 宛先の ClickHouse Cloud サービス側での作業: +### 宛先の ClickHouse Cloud サービス側での作業: {#on-the-destination-clickhouse-cloud-service-1} -#### 宛先データベースを作成する: +#### 宛先データベースを作成する: {#create-the-destination-database-1} ```sql CREATE DATABASE db diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md index 2c02d711cc8..15a23962893 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md @@ -10,15 +10,14 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import third_party_01 from '@site/static/images/integrations/migration/third-party-01.png'; +# サードパーティ製 ETL ツールの利用 {#using-a-3rd-party-etl-tool} -# サードパーティ製 ETL ツールの利用 - -自己管理型 ClickHouse の移行 +自己管理型 ClickHouse の移行 外部データソースから ClickHouse にデータを移動する優れた方法の 1 つは、数多く存在する一般的な ETL/ELT ツールのいずれかを利用することです。以下のツールについてはドキュメントを用意しています。 -- [Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) -- [dbt](/integrations/data-ingestion/etl-tools/dbt/index.md) -- [Vector](/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) +* [Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) +* [dbt](/integrations/data-ingestion/etl-tools/dbt/index.md) +* [Vector](/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) なお、ClickHouse と連携できる ETL/ELT ツールは他にも多数あります。ご利用中(あるいはお好み)のツールについては、そのツールのドキュメントを参照して詳細を確認してください。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md index b61bfea74cc..fffa8dedad7 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md @@ -9,19 +9,18 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import object_storage_01 from '@site/static/images/integrations/migration/object-storage-01.png'; +# クラウドオブジェクトストレージから ClickHouse Cloud へのデータ移行 {#move-data-from-cloud-object-storage-to-clickhouse-cloud} -# クラウドオブジェクトストレージから ClickHouse Cloud へのデータ移行 - -Migrating Self-managed ClickHouse +Migrating Self-managed ClickHouse Cloud Object Storage をデータレイクとして利用していて、そのデータを ClickHouse Cloud にインポートしたい場合や、 現在利用しているデータベースシステムがデータを直接 Cloud Object Storage にオフロードできる場合には、 Cloud Object Storage に保存されたデータを ClickHouse Cloud のテーブルへ移行するために、以下のいずれかの テーブル関数を使用できます。 -- [s3](/sql-reference/table-functions/s3.md) または [s3Cluster](/sql-reference/table-functions/s3Cluster.md) -- [gcs](/sql-reference/table-functions/gcs) -- [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage) +* [s3](/sql-reference/table-functions/s3.md) または [s3Cluster](/sql-reference/table-functions/s3Cluster.md) +* [gcs](/sql-reference/table-functions/gcs) +* [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage) 現在利用しているデータベースシステムがデータを直接 Cloud Object Storage にオフロードできない場合は、 [サードパーティ製 ETL/ELT ツール](/cloud/migration/etl-tool-to-clickhouse) や [clickhouse-local](/cloud/migration/clickhouse-local) を使って、 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md index 88161598c3a..eced5a28c85 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md @@ -7,12 +7,12 @@ hide_title: true doc_type: 'guide' --- -import TableOfContentsBestPractices from '@site/docs/best-practices/_snippets/_table_of_contents.md'; -import TableOfContentsOptimizationAndPerformance from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; -import TableOfContentsSecurity from '@site/docs/cloud/_snippets/_security_table_of_contents.md'; +import TableOfContentsBestPractices from '@site/i18n/jp/docusaurus-plugin-content-docs/current/best-practices/_snippets/_table_of_contents.md'; +import TableOfContentsOptimizationAndPerformance from '@site/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; +import TableOfContentsSecurity from '@site/i18n/jp/docusaurus-plugin-content-docs/current/cloud/_snippets/_security_table_of_contents.md'; -# リソースの概要 +# リソースの概要 {#resource-tour} この記事では、ClickHouse Cloud デプロイメントを最大限に活用するために、 ドキュメント内で利用できる各種リソースの概要を紹介します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/index.md index b91b0c318cf..4e03af7d173 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/onboard/index.md @@ -9,7 +9,7 @@ keywords: ['オンボーディング', 'はじめに', 'クラウド設定', ' -# ClickHouse Cloud を始める +# ClickHouse Cloud を始める {#get-started-with-clickhouse-cloud} ClickHouse Cloud を初めて使用する方で、どこから始めればよいかわからない場合、このドキュメントセクションでは、迅速に稼働させるために必要なすべての手順を説明します。ClickHouse Cloud を探索する過程で各ステップをガイドできるよう、この入門セクションを3つのサブセクションに分けて構成しています。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md index 79a62dc9190..7732d5b0c73 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md @@ -12,7 +12,7 @@ doc_type: 'changelog' -#### 後方互換性のない変更 +#### 後方互換性のない変更 {#backward-incompatible-change} * ネストされた型内にある疑わしい/実験的な型を検証するようにしました。これまでは、Array/Tuple/Map のようなネストされた型内では(JSON を除き)そのような型を検証していませんでした。[#59385](https://github.com/ClickHouse/ClickHouse/pull/59385) ([Kruglov Pavel](https://github.com/Avogar))。 * ソート句 `ORDER BY ALL`(v23.12 で導入された)は `ORDER BY *` に置き換えられました。以前の構文は、`all` というカラムを持つテーブルでは誤りの原因になりやすいものでした。[#59450](https://github.com/ClickHouse/ClickHouse/pull/59450)([Robert Schulze](https://github.com/rschu1ze))。 @@ -29,7 +29,7 @@ doc_type: 'changelog' -#### 新機能 +#### 新機能 {#new-feature} * 値の件数とその誤差を返す Topk/topkweighed モードをサポート。 [#54508](https://github.com/ClickHouse/ClickHouse/pull/54508) ([UnamedRus](https://github.com/UnamedRus)). * ビュー/マテリアライズドビューで DEFINER ユーザーを指定できる新しい構文を追加しました。これにより、基盤となるテーブルに対する明示的な権限付与なしに、ビューからの SELECT/INSERT を実行できるようになりました。 [#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) ([pufit](https://github.com/pufit)). @@ -57,7 +57,7 @@ doc_type: 'changelog' -#### パフォーマンスの向上 +#### パフォーマンスの向上 {#performance-improvement} * SELECT 句の GROUP BY キーに対する min/max/any/anyLast 集約関数を除去します。 [#52230](https://github.com/ClickHouse/ClickHouse/pull/52230) ([JackyWoo](https://github.com/JackyWoo)). * 複数の [nullable] カラムが関係する場合のシリアル化集約メソッドのパフォーマンスを改善しました。これは抽象化の整合性を損なうことのない、[#51399](https://github.com/ClickHouse/ClickHouse/issues/51399) の汎用バージョンです。[#55809](https://github.com/ClickHouse/ClickHouse/pull/55809)([Amos Bird](https://github.com/amosbird))。 @@ -86,7 +86,7 @@ doc_type: 'changelog' -#### 改善 +#### 改善 {#improvement} * マテリアライズドビューに対して `MODIFY COLUMN` クエリを実行する際は、内部テーブルの構造を確認し、すべてのカラムが存在していることを保証してください。 [#47427](https://github.com/ClickHouse/ClickHouse/pull/47427) ([sunny](https://github.com/sunny19930321)). * パーサーが扱うすべてのキーワードを含むテーブル `system.keywords` を追加しました。主に、ファジングおよびシンタックスハイライトを改善するために使用されます。 [#51808](https://github.com/ClickHouse/ClickHouse/pull/51808) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md index 4c5672a6c8b..c7922a7a5a9 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md @@ -10,7 +10,7 @@ doc_type: 'changelog' -# Cloud 向け v24.5 の変更履歴 +# Cloud 向け v24.5 の変更履歴 {#v245-changelog-for-cloud} v24.5 リリースに基づく ClickHouse Cloud サービスに関する変更点です。 @@ -128,7 +128,7 @@ v24.5 リリースに基づく ClickHouse Cloud サービスに関する変更 -# 改良点 +# 改良点 {#improvements} * `optimize_monotonous_functions_in_order_by` 設定を削除しました。この設定は実質的に何もしない(no-op)状態になりつつあります。 [#63004](https://github.com/ClickHouse/ClickHouse/pull/63004) (Raúl Marín). diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md index e38d4ec4f3a..404b7407e9b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md @@ -10,7 +10,7 @@ doc_type: 'changelog' -# ClickHouse Cloud 向け v24.6 変更ログ +# ClickHouse Cloud 向け v24.6 変更ログ {#v246-changelog-for-cloud} v24.6 リリースに基づき、ClickHouse Cloud サービスに関係する変更点を記載します。 @@ -110,7 +110,7 @@ v24.6 リリースに基づき、ClickHouse Cloud サービスに関係する変 -## バグ修正(公式安定版リリースにおけるユーザー影響のある不具合) +## バグ修正(公式安定版リリースにおけるユーザー影響のある不具合) {#bug-fix-user-visible-misbehavior-in-an-official-stable-release} * IN および indexHint() 使用時に 'set' スキップインデックスが動作しない問題を修正。 #62083 (Michael Kolupaev)。 * テーブルが adaptive granularity を使用していない場合に、FINAL を使用したクエリが誤った結果を返す問題を修正。#62432 (Duc Canh Le)。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md index 9de9d1c8165..227364349d1 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md @@ -22,7 +22,7 @@ v24.10 リリースに基づく ClickHouse Cloud サービスに関する主な -## 新機能 +## 新機能 {#new-feature} * リフレッシュ可能なマテリアライズドビューが本番利用向けに安定しました。 [#70550](https://github.com/ClickHouse/ClickHouse/pull/70550) ([Michael Kolupaev](https://github.com/al13n321))。リフレッシュ可能なマテリアライズドビューが Replicated データベースでもサポートされるようになりました。 [#60669](https://github.com/ClickHouse/ClickHouse/pull/60669) ([Michael Kolupaev](https://github.com/al13n321))。 * 関数 `toStartOfInterval()` に、TimescaleDB の `time_bucket()` 関数および PostgreSQL の `date_bin()` 関数の動作をエミュレートする新しいオーバーロードが追加されました([#55619](https://github.com/ClickHouse/ClickHouse/issues/55619))。これにより、日付またはタイムスタンプ値を、*固定* の起点(0000-01-01 00:00:00.000)ではなく、*任意の* 起点からの指定した間隔の整数倍に切り揃えることができます。例えば、`SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30'));` は `2023-01-01 14:44:30` を返します。これは、起点 `2023-01-01 14:35:30` を基準として 1 分間隔の整数倍に切り揃えられた値です。[#56738](https://github.com/ClickHouse/ClickHouse/pull/56738)([Yarik Briukhovetskyi](https://github.com/yariks5s))。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md index dcf02be6892..a33dea964f0 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md @@ -11,7 +11,7 @@ import Image from '@theme/IdealImage'; import Architecture from '@site/static/images/cloud/reference/architecture.png'; -# ClickHouse Cloud アーキテクチャ +# ClickHouse Cloud アーキテクチャ {#clickhouse-cloud-architecture} ClickHouse Cloud のアーキテクチャ diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md index f451e9af942..50ae42958c3 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md @@ -181,9 +181,9 @@ ClickHouse Cloud の課金は、コンピュート、ストレージ、[デー -## よくある質問 +## よくある質問 {#faqs} -### ClickHouse Credit (CHC) とは何ですか? +### ClickHouse Credit (CHC) とは何ですか? {#what-is-chc} ClickHouse Credit は、ClickHouse Cloud の利用に対するクレジットの単位であり、1 CHC は 1 米ドル (US$1) に相当します。これは、ClickHouse がその時点で公開している価格表に基づいて適用されます。 @@ -191,27 +191,27 @@ ClickHouse Credit は、ClickHouse Cloud の利用に対するクレジットの Stripe を通じて請求されている場合、Stripe の請求書上では 1 CHC は US$0.01 として表示されます。これは、当社の標準 SKU(1 CHC = US$1)について、Stripe 側の仕様上、端数数量を請求できないためであり、その制約の中で正確な請求を行うためのものです。 ::: -### 旧プラン(レガシー)の料金はどこで確認できますか? +### 旧プラン(レガシー)の料金はどこで確認できますか? {#find-legacy-pricing} 旧プラン(レガシー)の料金情報は[こちら](https://clickhouse.com/pricing?legacy=true)で確認できます。 -### コンピュート(計算リソース)はどのように計測されますか? +### コンピュート(計算リソース)はどのように計測されますか? {#how-is-compute-metered} ClickHouse Cloud は、コンピュートを 8G RAM 単位で 1 分ごとに計測します。 コンピュートコストはティア、リージョン、クラウドサービスプロバイダーによって異なります。 -### ディスク上のストレージはどのように算出されますか? +### ディスク上のストレージはどのように算出されますか? {#how-is-storage-on-disk-calculated} ClickHouse Cloud はクラウドオブジェクトストレージを使用しており、ClickHouse のテーブルに保存されているデータの圧縮後サイズに基づいて使用量を計測します。 ストレージコストはティア間で共通ですが、リージョンおよびクラウドサービスプロバイダーによって異なります。 -### バックアップはストレージの合計に含まれますか? +### バックアップはストレージの合計に含まれますか? {#do-backups-count-toward-total-storage} ストレージとバックアップはいずれもストレージコストの対象となり、個別に請求されます。 すべてのサービスは、デフォルトで 1 日間保持される 1 つのバックアップが有効になっています。 追加のバックアップが必要なユーザーは、Cloud コンソールの設定タブで追加の[バックアップ](/cloud/manage/backups/overview)を構成することで対応できます。 -### 圧縮率はどのように見積もればよいですか? +### 圧縮率はどのように見積もればよいですか? {#how-do-i-estimate-compression} 圧縮率はデータセットごとに大きく異なります。 どの程度変動するかは、そもそもデータがどれだけ圧縮しやすいか(高カーディナリティと低カーディナリティのフィールドの数など)や、 @@ -228,12 +228,12 @@ FROM system.tables WHERE name = <任意のテーブル名> ``` -### セルフマネージドで運用している場合、クラウドでサービスを実行する際のコストを見積もるために ClickHouse はどのようなツールを提供していますか? +### セルフマネージドで運用している場合、クラウドでサービスを実行する際のコストを見積もるために ClickHouse はどのようなツールを提供していますか? {#what-tools-does-clickhouse-offer-to-estimate-the-cost-of-running-a-service-in-the-cloud-if-i-have-a-self-managed-deployment} ClickHouse のクエリログは、ClickHouse Cloud でワークロードを実行するためのコストを見積もる際に利用できる[主要なメトリクス](/operations/system-tables/query_log)を記録します。 セルフマネージド環境から ClickHouse Cloud への移行の詳細については[移行ドキュメント](/cloud/migration/clickhouse-to-cloud)を参照し、さらに質問がある場合は [ClickHouse Cloud support](https://console.clickhouse.cloud/support) までお問い合わせください。 -### ClickHouse Cloud にはどのような課金オプションがありますか? +### ClickHouse Cloud にはどのような課金オプションがありますか? {#what-billing-options-are-available-for-clickhouse-cloud} ClickHouse Cloud は次の課金オプションをサポートしています: @@ -245,11 +245,11 @@ ClickHouse Cloud は次の課金オプションをサポートしています: PAYG 向けの ClickHouse Cloud クレジットは 0.01 ドル単位で請求されるため、利用状況に応じてクレジットの端数も含めて課金できます。これは、事前購入するコミット型の ClickHouse クレジット(1 ドル単位の整数額で購入)とは異なります。 ::: -### クレジットカードを削除できますか? +### クレジットカードを削除できますか? {#can-i-delete-my-credit-card} Billing UI からクレジットカードを削除することはできませんが、いつでも更新することはできます。これにより、常に有効な支払い方法が組織に設定されていることを保証します。クレジットカードを削除する必要がある場合は、[ClickHouse Cloud support](https://console.clickhouse.cloud/support) までお問い合わせください。 -### 課金サイクルはどのくらいの期間ですか? +### 課金サイクルはどのくらいの期間ですか? {#how-long-is-the-billing-cycle} 課金は月次サイクルに従い、開始日は ClickHouse Cloud の組織が作成された日となります。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md index ee416883e96..5dd60175810 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md @@ -1,7 +1,7 @@ --- slug: /cloud/billing/marketplace/aws-marketplace-payg -title: 'AWS Marketplace の従量課金 (PAYG)' -description: 'AWS Marketplace(PAYG 従量課金)経由で ClickHouse Cloud に登録します。' +title: 'AWS Marketplace PAYG' +description: 'AWS Marketplace(PAYG)を通じて ClickHouse Cloud に申し込みます。' keywords: ['aws', 'marketplace', 'billing', 'PAYG'] doc_type: 'guide' --- @@ -17,21 +17,19 @@ import aws_marketplace_payg_8 from '@site/static/images/cloud/manage/billing/mar import aws_marketplace_payg_9 from '@site/static/images/cloud/manage/billing/marketplace/aws-marketplace-payg-9.png'; import Image from '@theme/IdealImage'; -PAYG(従量課金制)のパブリックオファーを利用して、[AWS Marketplace](https://aws.amazon.com/marketplace) から ClickHouse Cloud の利用を開始しましょう。 +[AWS Marketplace](https://aws.amazon.com/marketplace) の PAYG(従量課金制)パブリックオファーから ClickHouse Cloud の利用を開始しましょう。 ## 前提条件 {#prerequisites} -- 課金管理者によって購入権限が付与されている AWS アカウント。 -- 購入するには、そのアカウントで AWS Marketplace にログインしている必要があります。 -- サブスクリプションに ClickHouse の組織を接続するには、その組織の管理者である必要があります。 +- 請求管理者によって購入権限が有効化されている AWS アカウント。 +- サブスクリプションを購入するには、そのアカウントで AWS Marketplace にログインしている必要があります。 +- サブスクリプションに ClickHouse 組織を接続するには、その組織の管理者である必要があります。 :::note -1 つの AWS アカウントは、「ClickHouse Cloud - Pay As You Go」サブスクリプション 1 件のみに登録でき、そのサブスクリプションは 1 つの ClickHouse 組織にのみリンクできます。 +1 つの AWS アカウントは、「ClickHouse Cloud - Pay As You Go」サブスクリプション 1 件にしか登録できず、そのサブスクリプションは 1 つの ClickHouse 組織にのみリンクできます。 ::: - - ## サインアップ手順 {#steps-to-sign-up} @@ -46,25 +44,26 @@ PAYG(従量課金制)のパブリックオファーを利用して、[AWS Ma [リスティング](https://aws.amazon.com/marketplace/pp/prodview-p4gwofrqpkltu) をクリックし、続いて **View purchase options** をクリックします。 -AWS Marketplace の購入オプション表示画面 +AWS Marketplace の購入オプションの表示 ### 購読する {#subscribe} -次の画面で、**Subscribe** をクリックします。 +次の画面で「Subscribe」をクリックします。 :::note -**Purchase order (PO) number** は任意入力のため、省略してかまいません。 +**Purchase order (PO) number** は任意であり、入力しなくてもかまいません。 +**このリスティングには 2 つのオファーが用意されています。** 「ClickHouse Cloud - Pay As You Go Free Trial」のオファーを選択した場合、30 日間の AWS 管理の無料トライアルにサブスクライブすることになります。ただし、30 日が経過するとこのリスティングのサブスクリプションは終了します。ClickHouse の Pay As You Go を継続利用するには、このリスティング上のもう一方の「ClickHouse Cloud - Pay As You Go」オファーに再度サブスクライブする必要があります。 ::: -AWS Marketplace の購読画面 +AWS Marketplace でのサブスクライブ画面 ### アカウントをセットアップする {#set-up-your-account} -この時点ではセットアップは完了しておらず、まだ ClickHouse Cloud 組織の請求は AWS Marketplace 経由になっていないことに注意してください。Marketplace のサブスクリプション画面で **Set up your account** をクリックし、ClickHouse Cloud にリダイレクトしてセットアップを完了させる必要があります。 +この時点ではセットアップは完了しておらず、まだ ClickHouse Cloud の組織は Marketplace 経由での課金対象にはなっていない点に注意してください。Marketplace のサブスクリプション画面で「Set up your account」をクリックし、ClickHouse Cloud にリダイレクトしてセットアップを完了させます。 アカウントのセットアップ -ClickHouse Cloud にリダイレクトされたら、既存アカウントでログインするか、新しいアカウントを登録できます。ClickHouse Cloud 組織を AWS Marketplace の課金に紐付けるために、このステップは非常に重要です。 +ClickHouse Cloud にリダイレクトされたら、既存アカウントでログインするか、新規アカウントを登録できます。このステップは、ClickHouse Cloud の組織を AWS Marketplace の課金に紐付けるために非常に重要です。 :::note[新規 ClickHouse Cloud ユーザー] ClickHouse Cloud を初めて利用する場合は、以下の手順に従ってください。 @@ -73,38 +72,36 @@ ClickHouse Cloud を初めて利用する場合は、以下の手順に従って
新規ユーザー向けの手順 -ClickHouse Cloud を初めて利用する場合は、ページ下部の **Register** をクリックします。新規ユーザーの作成とメールアドレスの確認を求められます。メールアドレスを確認したら、ClickHouse Cloud のログインページは閉じてかまいません。https://console.clickhouse.cloud にアクセスし、新しく作成したユーザー名でログインします。 +ClickHouse Cloud を初めて利用する場合は、ページ下部の「Register」をクリックします。新しいユーザーの作成とメールアドレスの確認を求められます。メール確認が完了したら、ClickHouse Cloud のログインページを閉じ、https://console.clickhouse.cloud で新しいユーザー名を使用してログインできます。 ClickHouse Cloud のサインアップ :::note[新規ユーザー] -ビジネスに関する基本的な情報も入力する必要があります。以下のスクリーンショットを参照してください。 +ビジネスに関する基本的な情報の入力も必要になります。以下のスクリーンショットを参照してください。 ::: -開始前の入力画面 +開始前の画面 -開始前の入力画面(続き) +開始前の画面(続き)
-すでに ClickHouse Cloud を利用している場合は、既存の認証情報を使用してログインするだけでかまいません。 +既存の ClickHouse Cloud ユーザーの場合は、認証情報を使用してログインするだけで構いません。 -### Marketplace サブスクリプションを Organization に追加する {#add-marketplace-subscription} +### Marketplace サブスクリプションを組織に追加する {#add-marketplace-subscription} -正常にログインしたら、この Marketplace サブスクリプションで課金する新しい Organization を作成するか、このサブスクリプションに紐付けて課金する既存の Organization を選択します。 +ログインに成功したら、この Marketplace サブスクリプションで課金する新しい組織を作成するか、既存の組織のいずれかを選択して、このサブスクリプションの課金先として指定できます。 Marketplace サブスクリプションの追加 -このステップを完了すると、組織はこの AWS サブスクリプションに接続され、すべての利用料金は AWS アカウント経由で請求されます。 +このステップを完了すると、組織はこの AWS サブスクリプションに接続され、すべての使用量が AWS アカウント経由で課金されます。 -ClickHouse UI の組織の請求ページから、請求が AWS Marketplace にリンクされていることを確認できます。 +ClickHouse の UI にある組織の請求ページから、請求が AWS Marketplace にリンクされていることを確認できます。 請求ページの確認
- - ## サポート {#support} -問題が発生した場合は、[サポートチーム](https://clickhouse.com/support/program)までお気軽にお問い合わせください。 +問題が発生した場合は、[弊社サポートチーム](https://clickhouse.com/support/program)まで遠慮なくお問い合わせください。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx index 66d69f31285..5fd00ebc2c1 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx @@ -7,7 +7,7 @@ doc_type: 'guide' keywords: ['課金', 'ネットワーク転送量', 'データ送信量', 'コスト', '料金'] --- -import NetworkPricing from '@site/docs/cloud/reference/_snippets/_network_transfer_rates.md'; +import NetworkPricing from '@site/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/_snippets/_network_transfer_rates.md'; ClickHouse Cloud は、転送されるデータのイングレスとエグレスを計測します。 これには、ClickHouse Cloud への入出力データだけでなく、同一リージョン内および diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md index 34e6ddd0bbf..1bc939d3e74 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md @@ -7,9 +7,9 @@ keywords: ['請求', '支払いしきい値', '自動請求書発行', '請求 doc_type: 'guide' --- -# 支払いしきい値 +# 支払いしきい値 {#payment-thresholds} -請求期間中に ClickHouse Cloud のご利用金額が 10,000 米ドル(または同等額)に達すると、ご登録のお支払い方法から自動的に決済されます。決済に失敗した場合、猶予期間の後にサービスが一時停止または終了されます。 +請求期間中に ClickHouse Cloud のご利用金額が 10,000 米ドル(または同等額)に達すると、ご登録のお支払い方法から自動的に決済されます。決済に失敗した場合、猶予期間の後にサービスが一時停止または終了されます。 :::note この支払いしきい値は、一定額の利用を約束する契約や、その他 ClickHouse と個別に合意した契約を締結しているお客様には適用されません。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md index dc1b7de79b7..949d67078f1 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md @@ -11,7 +11,7 @@ import billing_compliance from '@site/static/images/cloud/manage/billing_complia import Image from '@theme/IdealImage'; -# ClickHouse Cloud の課金コンプライアンス +# ClickHouse Cloud の課金コンプライアンス {#clickhouse-cloud-billing-compliance} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md index 97fead5c6b5..ad4739223e1 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md @@ -10,7 +10,7 @@ doc_type: 'reference' import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge' -# サポート対象のクラウドリージョン +# サポート対象のクラウドリージョン {#supported-cloud-regions} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md index f39d46c5d76..ec51c52efd9 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md @@ -10,8 +10,7 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import cloud_settings_sidebar from '@site/static/images/cloud/manage/cloud-settings-sidebar.png'; - -# 設定の構成方法 +# 設定の構成方法 {#configuring-settings} 特定の[ユーザー](/operations/access-rights#user-account-management)または[ロール](/operations/access-rights#role-management)向けに ClickHouse Cloud サービスの設定を指定するには、[SQL ベースの Settings Profile](/operations/access-rights#settings-profiles-management)を使用する必要があります。Settings Profile を適用することで、サービスが停止したりアイドル状態になったりアップグレードされた場合でも、構成した設定が保持されます。Settings Profile の詳細については[こちらのページ](/operations/settings/settings-profiles.md)を参照してください。 @@ -19,4 +18,4 @@ import cloud_settings_sidebar from '@site/static/images/cloud/manage/cloud-setti ClickHouse Cloud サービスに対して指定できる設定の詳細については、[ドキュメント](/operations/settings)内のカテゴリ別の全設定一覧を参照してください。 -Cloud 設定サイドバー \ No newline at end of file +Cloud 設定サイドバー \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md index 7cfb7ca656d..4761d1b347a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md @@ -10,7 +10,7 @@ import BetaBadge from '@theme/badges/BetaBadge'; import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge'; -# セキュリティおよびコンプライアンスレポート +# セキュリティおよびコンプライアンスレポート {#security-and-compliance-reports} ClickHouse はお客様のセキュリティおよびコンプライアンスに関するニーズを評価し、追加のレポートに対するご要望に応じてプログラムの拡充を継続しています。詳細やレポートのダウンロードは、[Trust Center](https://trust.clickhouse.com) をご覧ください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md index 0f8964f21da..b5dc8d9ce75 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md @@ -37,7 +37,7 @@ doc_type: 'guide' -## アカウントの閉鎖をリクエストする +## アカウントの閉鎖をリクエストする {#request-account-closure} 閉鎖および削除のリクエストについては、認証が必要です。リクエストを迅速に処理できるよう、以下の手順に従ってください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/index.md index c15a604a50e..88bf9b736af 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/cloud/reference/index.md @@ -7,7 +7,7 @@ description: 'Cloud リファレンスセクション用ランディングペー doc_type: 'landing-page' --- -# Cloud リファレンス +# Cloud リファレンス {#cloud-reference} このセクションは ClickHouse Cloud のより技術的な詳細に関するリファレンスガイドで、次のページで構成されています: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/concepts/glossary.md b/i18n/jp/docusaurus-plugin-content-docs/current/concepts/glossary.md index 32138525a70..25d7f65ecc2 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/concepts/glossary.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/concepts/glossary.md @@ -10,7 +10,7 @@ doc_type: 'reference' {/* no-glossary */ } -# 用語集 +# 用語集 {#glossary} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/concepts/olap.md b/i18n/jp/docusaurus-plugin-content-docs/current/concepts/olap.md index 627c3f4582b..6e4289f6f26 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/concepts/olap.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/concepts/olap.md @@ -10,7 +10,7 @@ doc_type: 'reference' -# OLAP とは何ですか? +# OLAP とは何ですか? {#what-is-olap} [OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing) は Online Analytical Processing(オンライン分析処理)の略です。これは広い意味を持つ用語で、技術的観点とビジネス的観点の 2 つの視点から捉えることができます。最も抽象的なレベルでは、これらの単語を逆から読むとイメージしやすくなります: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx b/i18n/jp/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx index 0a1d4d292d8..8f376dd892a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx +++ b/i18n/jp/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx @@ -18,7 +18,7 @@ doc_type: 'guide' ## ストレージ層:同時に行われる INSERT は互いに独立している \{#storage-layer-concurrent-inserts-are-isolated-from-each-other\} - + + + + + + + \ No newline at end of file + - + -## Projections はどのように動作しますか? {#how-do-projections-work} +## Projection はどのように動作しますか? {#how-do-projections-work} -実務的には、Projection は元のテーブルに対する追加の「非表示テーブル」と考えることができます。Projection は元のテーブルとは異なる行順序を持つことができ、その結果として異なるプライマリインデックスを持つことができ、さらに集約値を自動的かつ段階的に事前計算できます。その結果、Projections を使用すると、クエリ実行を高速化するための 2 つの「チューニング手段」を得られます: +実際には、Projection は元のテーブルに付随する追加の「不可視なテーブル」のようなものと考えることができます。Projection は元のテーブルとは異なる行の順序を持つことができ、その結果として異なるプライマリインデックスを持つことができ、さらに集約値を自動的かつインクリメンタルに事前計算できます。その結果、Projection を使用すると、クエリ実行を高速化するための 2 つの「チューニング手段」を得られます: -- **プライマリインデックスを適切に利用する** -- **集約を事前計算する** +- **プライマリインデックスを適切に活用すること** +- **集約を事前計算すること** -Projections は、複数の行順序を持つテーブルを用意でき、挿入時に集約を事前計算できるという点で [Materialized Views](/materialized-views) と似ています。 -Projections は自動的に更新され、元のテーブルと同期された状態に保たれますが、Materialized Views は明示的に更新する必要があります。クエリが元のテーブルを対象とする場合、 -ClickHouse はプライマリキーを自動的にサンプリングし、同じ正しい結果を生成でき、かつ読み取るデータ量が最も少なくて済むテーブルを選択します。これは次の図に示すとおりです: +Projection は、複数の行順序を持ち、挿入時に集約を事前計算できるという点で [Materialized Views](/materialized-views) +(マテリアライズドビュー)と似ています。 +Projection は自動的に更新され、元のテーブルと同期が維持されますが、マテリアライズドビューは明示的に更新する必要があります。クエリが元のテーブルを対象とする場合、 +ClickHouse はプライマリキーを自動的にサンプリングし、同じ正しい結果を生成でき、かつ読み取る必要があるデータ量が最も少ないテーブルを、以下の図のように選択します: -ClickHouse における Projections +ClickHouse における Projection -### `_part_offset` を使ったよりスマートなストレージ {#smarter_storage_with_part_offset} +### `_part_offset` を用いたよりスマートなストレージ {#smarter_storage_with_part_offset} -バージョン 25.5 以降、ClickHouse は Projection 内で仮想カラム `_part_offset` をサポートしており、Projection を定義する新しい方法を提供します。 +バージョン 25.5 以降、ClickHouse はプロジェクション内で仮想カラム `_part_offset` を +サポートしており、プロジェクションの新しい定義方法を提供します。 -現在、Projection を定義する方法は 2 つあります: +現在、プロジェクションを定義する方法は 2 通りあります。 -- **全カラムを保存する(従来の動作)**: Projection には完全なデータが含まれ、直接読み取ることができます。そのため、フィルタが Projection のソート順と一致する場合に高速なパフォーマンスを提供します。 +- **全カラムを保存する(従来の動作)**: プロジェクションには完全なデータが含まれ、 + プロジェクションのソート順とフィルタが一致する場合は、プロジェクションから直接読み取ることで + 高速に処理できます。 -- **ソートキーと `_part_offset` のみを保存する**: Projection はインデックスのように動作します。 - ClickHouse は Projection のプライマリインデックスを使用して一致する行を特定しますが、実際のデータはベーステーブルから読み取ります。これにより、クエリ時の I/O がわずかに増える代わりに、ストレージのオーバーヘッドを削減できます。 +- **ソートキー + `_part_offset` のみを保存する**: プロジェクションはインデックスのように動作します。 + ClickHouse はプロジェクションのプライマリインデックスを使って一致する行を特定しますが、 + 実際のデータはベーステーブルから読み取ります。これにより、クエリ時の I/O がやや増える + 代わりにストレージのオーバーヘッドを削減できます。 -上記のアプローチは組み合わせて使用することもでき、一部のカラムを Projection 内に保存し、その他を `_part_offset` を介して間接的に保存できます。 +上記のアプローチは組み合わせることもでき、プロジェクションに一部のカラムを直接保存し、 +その他のカラムを `_part_offset` を介して間接的に保存できます。 +## プロジェクションを使用するタイミング {#when-to-use-projections} +プロジェクションは、新しいユーザーにとって魅力的な機能です。というのも、データ挿入時に自動的に +維持されるためです。さらに、クエリは 1 つのテーブルに対して送信するだけでよく、可能な場合には +プロジェクションが利用されて応答時間が短縮されます。 -## プロジェクションをいつ使用すべきか {#when-to-use-projections} - -プロジェクションは、新規ユーザーにとって魅力的な機能です。データの挿入に応じて自動的に -メンテナンスされるためです。さらに、クエリは単一のテーブルに対して送るだけでよく、可能な場合には -プロジェクションが活用されて応答時間を短縮できます。 - -これはマテリアライズドビューとは対照的です。マテリアライズドビューでは、ユーザーがフィルタ条件に +これはマテリアライズドビューとは対照的であり、マテリアライズドビューでは、ユーザーはフィルタに 応じて適切に最適化されたターゲットテーブルを選択するか、クエリを書き換える必要があります。 -そのためユーザーアプリケーション側への要求が大きくなり、クライアント側の複雑さが増加します。 +これにより、ユーザーアプリケーションへの依存度が高まり、クライアント側の複雑さが増します。 -これらの利点にもかかわらず、プロジェクションには本質的な制約がいくつか存在するため、ユーザーはそれらを -理解したうえで、慎重に使用する必要があります。 +これらの利点にもかかわらず、プロジェクションには本質的な制約がいくつか存在するため、 +ユーザーはその点を理解したうえで、必要最小限の利用にとどめるべきです。 -- プロジェクションでは、ソーステーブルと(非表示の)ターゲットテーブルで異なる TTL を使用できませんが、 - マテリアライズドビューでは異なる TTL を使用できます。 +- プロジェクションでは、ソーステーブルと(非表示の)ターゲットテーブルで異なる TTL を + 使用することはできませんが、マテリアライズドビューでは異なる TTL を使用できます。 - プロジェクションを持つテーブルでは、軽量な更新および削除はサポートされていません。 -- マテリアライズドビューは連鎖させることができます。1 つのマテリアライズドビューのターゲットテーブルを、 - 別のマテリアライズドビューのソーステーブルとして利用することができます。しかし、プロジェクションでは - これはできません。 -- プロジェクションは JOIN をサポートしませんが、マテリアライズドビューはサポートします。 -- プロジェクションはフィルタ(`WHERE` 句)をサポートしませんが、マテリアライズドビューはサポートします。 - -次のような場合にはプロジェクションの使用を推奨します。 - -- データの完全な並べ替えが必要な場合。理論上、プロジェクション内の式で `GROUP BY` を使用することも - できますが、集計の維持にはマテリアライズドビューの方が効果的です。クエリオプティマイザも、 - `SELECT * ORDER BY x` のような単純な並べ替えを行うプロジェクションをより積極的に活用する傾向があります。 - この式では、ストレージ使用量を削減するために、一部の列のみを選択することもできます。 -- ストレージ使用量の増加およびデータを 2 回書き込むことによるオーバーヘッドが発生する可能性を +- マテリアライズドビューはチェーン化できます。1 つのマテリアライズドビューのターゲットテーブルを、 + 別のマテリアライズドビューのソーステーブルとして利用することができます。このようなことは + プロジェクションでは不可能です。 +- プロジェクション定義では JOIN はサポートされませんが、マテリアライズドビューではサポートされます。 + ただし、プロジェクションを持つテーブルに対するクエリでは、自由に JOIN を使用できます。 +- プロジェクション定義ではフィルタ(`WHERE` 句)はサポートされませんが、マテリアライズドビューでは + サポートされます。とはいえ、プロジェクションを持つテーブルに対するクエリでは、自由にフィルタできます。 + +プロジェクションの使用を推奨するのは、次のような場合です。 + +- データの完全な並べ替えが必要な場合。理論上は、プロジェクション内の式で `GROUP BY` を + 使用することも可能ですが、集計の維持にはマテリアライズドビューの方が効果的です。 + クエリオプティマイザも、単純な並べ替え、すなわち `SELECT * ORDER BY x` を使用する + プロジェクションの方をより活用しやすくなります。 + ユーザーは、この式内で列のサブセットを選択することで、ストレージフットプリントを削減できます。 +- ストレージフットプリントの増加や、データを書き込む処理が 2 回になることに伴うオーバーヘッドを 許容できる場合。挿入速度への影響をテストし、 [ストレージオーバーヘッドを評価](/data-compression/compression-in-clickhouse)してください。 +## 例 {#examples} - -## 例 - -### プライマリキーに含まれていない列でのフィルタリング +### プライマリキーに含まれないカラムでのフィルタリング {#filtering-without-using-primary-keys} この例では、テーブルに Projection を追加する方法を説明します。 -また、テーブルのプライマリキーに含まれていない列を条件とするクエリを高速化するために、 -Projection をどのように利用できるかも見ていきます。 +また、この Projection を使用して、テーブルのプライマリキーに含まれない +カラムでフィルタリングを行うクエリを高速化する方法も見ていきます。 -この例では、`pickup_datetime` でソートされている、 +この例では、`pickup_datetime` で並べ替えられている、 [sql.clickhouse.com](https://sql.clickhouse.com/) で利用可能な New York Taxi Data -というデータセットを使用します。 +データセットを使用します。 -乗客がドライバーに 200 ドルを超えるチップを支払ったすべてのトリップ ID を検索する、 -単純なクエリを書いてみましょう。 +乗客が運転手に 200 ドルを超える額のチップを支払った +すべてのトリップ ID を検索する、簡単なクエリを書いてみましょう。 ```sql runnable SELECT @@ -115,16 +118,16 @@ FROM nyc_taxi.trips WHERE tip_amount > 200 AND trip_duration_min > 0 ORDER BY tip_amount, trip_id ASC ``` -`ORDER BY` に含まれていない `tip_amount` でフィルタリングしているため、ClickHouse はテーブル全体をスキャンする必要がありました。クエリを高速化しましょう。 +`ORDER BY` に含まれていない `tip_amount` でフィルタリングしているため、ClickHouse はテーブル全体をスキャンする必要がありました。このクエリを高速化していきましょう。 -元のテーブルとその結果を保持するために、新しいテーブルを作成し、`INSERT INTO SELECT` を使ってデータをコピーします。 +元のテーブルと結果を保持するために、新しいテーブルを作成し、`INSERT INTO SELECT` を使ってデータをコピーします。 ```sql CREATE TABLE nyc_taxi.trips_with_projection AS nyc_taxi.trips; INSERT INTO nyc_taxi.trips_with_projection SELECT * FROM nyc_taxi.trips; ``` -プロジェクションを追加するには、`ALTER TABLE` ステートメントと `ADD PROJECTION` ステートメントを組み合わせて使用します。 +プロジェクションを追加するには、`ALTER TABLE` 文と `ADD PROJECTION` 文を組み合わせて使用します。 ```sql ALTER TABLE nyc_taxi.trips_with_projection @@ -135,7 +138,7 @@ ADD PROJECTION prj_tip_amount ) ``` -プロジェクションを追加した後は、その中のデータを上記で指定したクエリに従って物理的に並び替えて書き換えるために、`MATERIALIZE PROJECTION` ステートメントを使用する必要があります。 +プロジェクションを追加した後は、上記で指定したクエリに従って、その中のデータが物理的に並べ替えおよび再書き込みされるように、`MATERIALIZE PROJECTION` ステートメントを実行する必要があります。 ```sql ALTER TABLE nyc.trips_with_projection MATERIALIZE PROJECTION prj_tip_amount @@ -152,10 +155,10 @@ FROM nyc_taxi.trips_with_projection WHERE tip_amount > 200 AND trip_duration_min ORDER BY tip_amount, trip_id ASC ``` -クエリの実行時間を大幅に短縮できており、スキャンする行数も少なくなっていることに注目してください。 +クエリ時間を大幅に短縮でき、スキャンが必要な行数も少なくなっていることに注目してください。 -上記のクエリが実際に作成したプロジェクションを使用していることは、 -`system.query_log` テーブルをクエリすることで確認できます。 +上記のクエリが実際に作成したプロジェクションを使用していたことは、 +`system.query_log` テーブルを参照することで確認できます。 ```sql SELECT query, projections @@ -173,17 +176,14 @@ WHERE query_id='' └───────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────┘ ``` -### プロジェクションを使用した UK Price Paid クエリの高速化 -プロジェクションを使用してクエリパフォーマンスを高速化できることを示すために、実際のデータセットを用いた例を見ていきます。この例では、チュートリアル [UK Property Price Paid](https://clickhouse.com/docs/getting-started/example-datasets/uk-price-paid) で使用している 3,003 万行のテーブルを使用します。このデータセットは -[sql.clickhouse.com](https://sql.clickhouse.com/?query_id=6IDMHK3OMR1C97J6M9EUQS) -環境内でも利用可能です。 +### プロジェクションを使用してUK不動産価格データのクエリを高速化する {#using-projections-to-speed-up-UK-price-paid} + +プロジェクションを使用してクエリパフォーマンスを高速化する方法を実証するため、実際のデータセットを使用した例を見ていきます。この例では、3,003万行を含む[UK Property Price Paid](https://clickhouse.com/docs/getting-started/example-datasets/uk-price-paid)チュートリアルのテーブルを使用します。このデータセットは[sql.clickhouse.com](https://sql.clickhouse.com/?query_id=6IDMHK3OMR1C97J6M9EUQS)環境でも利用可能です。 -テーブルの作成方法とデータの挿入方法を確認したい場合は、 -[「The UK property prices dataset」](/getting-started/example-datasets/uk-price-paid) -ページを参照してください。 +テーブルの作成方法とデータの挿入方法を確認する場合は、["英国不動産価格データセット"](/getting-started/example-datasets/uk-price-paid)のページを参照してください。 -このデータセットに対して 2 つの簡単なクエリを実行してみます。1 つ目はロンドンにある郡を、支払われた価格が高い順に一覧表示するもので、2 つ目は各郡の平均価格を計算するものです。 +このデータセットに対して2つの簡単なクエリを実行できます。1つ目はロンドンで最も高い支払価格を記録した郡を一覧表示し、2つ目は郡ごとの平均価格を計算します。 ```sql runnable SELECT @@ -195,7 +195,6 @@ ORDER BY price DESC LIMIT 3 ``` - ```sql runnable SELECT county, @@ -206,7 +205,7 @@ ORDER BY avg(price) DESC LIMIT 3 ``` -クエリ自体は非常に高速ですが、どちらのクエリでも 3,003 万行すべてに対してフルテーブルスキャンが発生している点に注目してください。これは、テーブル作成時の `ORDER BY` 句に `town` と `price` のどちらも含めなかったためです。 +両方のクエリで全3,003万行のフルテーブルスキャンが発生したことに注意してください。非常に高速ではありますが、これはテーブル作成時の ORDER BY 句に`town`も`price`も含まれていなかったためです: ```sql CREATE TABLE uk.uk_price_paid @@ -218,16 +217,16 @@ ENGINE = MergeTree ORDER BY (postcode1, postcode2, addr1, addr2); ``` -プロジェクションを使ってこのクエリを高速化できるか確認してみましょう。 +プロジェクションを使用してこのクエリを高速化できるか見てみましょう。 -元のテーブルと結果を保持するために、新しいテーブルを作成し、`INSERT INTO SELECT` を使ってデータをコピーします。 +元のテーブルと結果を保持するために、新しいテーブルを作成し、`INSERT INTO SELECT`を使用してデータをコピーします: ```sql CREATE TABLE uk.uk_price_paid_with_projections AS uk_price_paid; INSERT INTO uk.uk_price_paid_with_projections SELECT * FROM uk.uk_price_paid; ``` -ここでは、町と価格で並べ替えられたプライマリインデックスを持つ追加の(非表示の)テーブルを生成するプロジェクション `prj_oby_town_price` を作成し、データを投入します。これは、特定の町における最高支払額に対する郡の一覧を取得するクエリを最適化するためのものです。 +プロジェクション `prj_oby_town_price` を作成してデータを投入します。これにより、町と価格で順序付けされたプライマリインデックスを持つ追加の(非表示)テーブルが生成され、特定の町で最高価格が支払われた郡を一覧表示するクエリが最適化されます: ```sql ALTER TABLE uk.uk_price_paid_with_projections @@ -246,11 +245,9 @@ ALTER TABLE uk.uk_price_paid_with_projections SETTINGS mutations_sync = 1 ``` -[`mutations_sync`](/operations/settings/settings#mutations_sync) 設定は、 -同期実行を強制するために使用します。 +[`mutations_sync`](/operations/settings/settings#mutations_sync)設定を使用して、同期実行を強制します。 -投影 `prj_gby_county` を作成してデータを投入します。これは追加の(非表示の)テーブルで、 -既存の英国 130 郡すべてについて avg(price) 集約値を増分的に前計算します。 +プロジェクション `prj_gby_county` を作成して投入します。これは追加の(非表示の)テーブルであり、既存の英国130郡すべてについて avg(price) 集計値を段階的に事前計算します: ```sql ALTER TABLE uk.uk_price_paid_with_projections @@ -270,15 +267,14 @@ SETTINGS mutations_sync = 1 ``` :::note -上記の `prj_gby_county` プロジェクションのように、プロジェクション内で `GROUP BY` 句が使用されている場合、(非表示の)テーブルの基盤となるストレージエンジンは `AggregatingMergeTree` になり、すべての集約関数は `AggregateFunction` に変換されます。これにより、増分集約が適切に行われます。 +上記の `prj_gby_county` プロジェクションのように、プロジェクション内で `GROUP BY` 句が使用されている場合、(隠された)テーブルの基盤となるストレージエンジンは `AggregatingMergeTree` になり、すべての集約関数は `AggregateFunction` に変換されます。これにより、適切な増分データ集約が保証されます。 ::: -以下の図はメインテーブル `uk_price_paid_with_projections` -と、その 2 つのプロジェクションの可視化です。 +以下の図は、メインテーブル `uk_price_paid_with_projections` とその2つのプロジェクションの視覚化です: -メインテーブル uk_price_paid_with_projections とその 2 つのプロジェクションの可視化 +メインテーブル uk_price_paid_with_projections と、その 2 つのプロジェクションの可視化 -ロンドンにおける支払価格が最も高い上位 3 件の郡を列挙するクエリを再度実行すると、クエリパフォーマンスが向上していることが分かります。 +ロンドンにおける上位3件の高額取引価格の郡を一覧表示するクエリを再実行すると、クエリパフォーマンスが向上していることが確認できます: ```sql runnable SELECT @@ -290,7 +286,7 @@ ORDER BY price DESC LIMIT 3 ``` -同様に、平均支払価格が最も高い英国の郡を上位 3 件取得するクエリは次のとおりです。 +同様に、平均支払価格が最も高い上位3つの英国カウンティをリストするクエリの場合: ```sql runnable SELECT @@ -302,19 +298,13 @@ ORDER BY avg(price) DESC LIMIT 3 ``` -両方のクエリが元のテーブルを対象としており、2 つのプロジェクションを作成する前は、 -いずれのクエリもフルテーブルスキャン(ディスクから 3,003 万行すべてがストリーミングされた) -になっていることに注意してください。 +両方のクエリが元のテーブルを対象としており、2つのプロジェクションを作成する前は、両方のクエリでフルテーブルスキャン(全3,003万行がディスクから読み込まれる)が発生していたことに注意してください。 -また、支払価格が最も高い上位 3 件についてロンドンのカウンティを列挙するクエリでは、 -217 万行がストリーミングされていることにも注意してください。このクエリ用に最適化された -2 つ目のテーブルを直接使用した場合、ディスクからストリーミングされたのは 8.192 万行だけでした。 +また、ロンドンの郡を支払価格が最も高い上位 3 件について列挙するクエリでは、2.17 百万行がストリーミングされている点にも注意してください。このクエリ向けに最適化された 2 つ目のテーブルを直接使用した場合、ディスクから読み出されたのは 8.192 万行だけでした。 -この違いが生じる理由は、前述の `optimize_read_in_order` 最適化が、現時点では -プロジェクションではサポートされていないためです。 +この差が生じる理由は、上で述べた `optimize_read_in_order` 最適化が、現時点ではプロジェクションではサポートされていないためです。 -`system.query_log` テーブルを調査して、上記 2 つのクエリに対して ClickHouse が -2 つのプロジェクションを自動的に使用していることを確認します(以下の projections 列を参照): +`system.query_log` テーブルを確認すると、上記 2 つのクエリに対して ClickHouse が自動的に 2 つのプロジェクションを使用していることが分かります(下の projections 列を参照): ```sql SELECT @@ -330,7 +320,6 @@ ORDER BY initial_query_start_time DESC FORMAT Vertical ``` - ```response 行 1: ────── @@ -361,23 +350,25 @@ query_duration: 11 ms read_rows: 2.29 million projections: ['uk.uk_price_paid_with_projections.prj_obj_town_price'] -2行のセット。経過時間: 0.006秒。 +2行のセット。経過時間: 0.006秒 ``` -### さらに例を見てみましょう -次の例では、同じUKの価格データセットを使用し、プロジェクションあり/なしのクエリを比較します。 +### さらに例を示します {#further-examples} -オリジナルのテーブル(およびそのパフォーマンス)を保持するため、再度 `CREATE AS` と `INSERT INTO SELECT` を使用してテーブルのコピーを作成します。 +次の例では、同じ英国の価格データセットを使用し、プロジェクションを使用するクエリと使用しないクエリを比較します。 + +元のテーブル(とそのパフォーマンス)を維持するため、ここでも `CREATE AS` と `INSERT INTO SELECT` を使ってテーブルのコピーを作成します。 ```sql CREATE TABLE uk.uk_price_paid_with_projections_v2 AS uk.uk_price_paid; INSERT INTO uk.uk_price_paid_with_projections_v2 SELECT * FROM uk.uk_price_paid; ``` -#### プロジェクションを作成する -`toYear(date)`、`district`、`town` をディメンションとする集約プロジェクションを作成してみましょう。 +#### プロジェクションを作成する {#build-projection} + +`toYear(date)`、`district`、`town` をディメンションとする集約プロジェクションを作成します: ```sql ALTER TABLE uk.uk_price_paid_with_projections_v2 @@ -397,7 +388,7 @@ ALTER TABLE uk.uk_price_paid_with_projections_v2 ) ``` -既存データに対してプロジェクションを適用します。(マテリアライズしない場合、プロジェクションは新規に挿入されるデータに対してのみ作成されます): +既存データに対してプロジェクションをマテリアライズします。(マテリアライズしない場合、プロジェクションは新たに挿入されるデータに対してのみ作成されます): ```sql ALTER TABLE uk.uk_price_paid_with_projections_v2 @@ -405,9 +396,10 @@ ALTER TABLE uk.uk_price_paid_with_projections_v2 SETTINGS mutations_sync = 1 ``` -以下のクエリでは、プロジェクションあり/なしの場合のパフォーマンスを比較します。プロジェクションを無効にするには、デフォルトで有効になっている設定 [`optimize_use_projections`](/operations/settings/settings#optimize_use_projections) を使用します。 +次のクエリでは、プロジェクションあり/なしの場合のパフォーマンスを比較します。プロジェクションの使用を無効にするには、デフォルトで有効になっている設定 [`optimize_use_projections`](/operations/settings/settings#optimize_use_projections) を変更します。 + -#### クエリ 1. 年ごとの平均価格 +#### クエリ 1. 年ごとの平均価格 {#average-price-projections} ```sql runnable SELECT @@ -431,9 +423,10 @@ ORDER BY year ASC ``` -結果は同じですが、後者の例の方がパフォーマンスに優れています。 +結果は同じになるはずですが、後者の例のほうがパフォーマンスは良くなります。 -#### クエリ 2. ロンドンの年別平均価格 + +#### クエリ 2. ロンドンにおける年ごとの平均価格 {#average-price-london-projections} ```sql runnable SELECT @@ -458,9 +451,10 @@ GROUP BY year ORDER BY year ASC ``` -#### クエリ 3. 最も高価な地区 -条件 `(date >= '2020-01-01')` は、投影ディメンション(`toYear(date) >= 2020)`)に一致するように変更する必要があります。 +#### クエリ 3. 最も高価な地域 {#most-expensive-neighborhoods-projections} + +条件 (date >= '2020-01-01') を、プロジェクションのディメンション (`toYear(date) >= 2020)` と一致するように変更します。 ```sql runnable SELECT @@ -480,7 +474,6 @@ LIMIT 100 SETTINGS optimize_use_projections=0 ``` - ```sql runnable SELECT town, @@ -498,22 +491,26 @@ ORDER BY price DESC LIMIT 100 ``` -同じ結果になりますが、2 番目のクエリではクエリ性能が向上している点に注目してください。 +今回も結果は同じですが、2 番目のクエリではクエリ性能が向上している点に注目してください。 -### 1 つのクエリでプロジェクションを組み合わせる -バージョン 25.6 からは、前のバージョンで導入された `_part_offset` サポートを基盤として、 -ClickHouse は複数のプロジェクションを用いて、複数のフィルタ条件を持つ 1 つのクエリを高速化できるようになりました。 +### 1 つのクエリでプロジェクションを組み合わせる {#combining-projections} -重要なのは、ClickHouse は依然として 1 つのプロジェクション(またはベーステーブル)からのみデータを読み取りますが、 -読み取り前に不要なパーツを除外するために、他のプロジェクションのプライマリインデックスを利用できる点です。 -これは、複数のカラムでフィルタし、それぞれが異なるプロジェクションに一致し得るようなクエリで特に有用です。 +バージョン 25.6 以降では、前のバージョンで導入された `_part_offset` のサポートに基づき、 +ClickHouse は複数のプロジェクションを使用して、複数のフィルター条件を持つ +単一のクエリを高速化できるようになりました。 -> 現在、この仕組みはパーツ全体のみを除外します。グラニュールレベルでの除外は -> まだサポートされていません。 +重要な点として、ClickHouse は依然として 1 つのプロジェクション(またはベーステーブル) +からしかデータを読み取りませんが、読み取り前に不要なパーツを除外するために、 +他のプロジェクションのプライマリインデックスを利用できます。 +これは、複数の列でフィルタリングを行い、それぞれが異なるプロジェクションに +マッチする可能性があるクエリに特に有用です。 -これを示すために、`_part_offset` カラムを利用するプロジェクション付きのテーブルを定義し、 -上記の図に対応する 5 行のサンプルデータを挿入します。 +> 現在、このメカニズムはパーツ全体のみをプルーニングします。 +> グラニュールレベルでのプルーニングはまだサポートされていません。 + +これを示すため、(`_part_offset` 列を使用するプロジェクションを持つ)テーブルを定義し、 +上の図に対応する 5 行のサンプルデータを挿入します。 ```sql CREATE TABLE page_views @@ -535,11 +532,11 @@ CREATE TABLE page_views ENGINE = MergeTree ORDER BY (event_date, id) SETTINGS - index_granularity = 1, -- 1グラニュールあたり1行 - max_bytes_to_merge_at_max_space_in_pool = 1; -- マージを無効にする + index_granularity = 1, -- グラニュールあたり1行 + max_bytes_to_merge_at_max_space_in_pool = 1; -- マージを無効化 ``` -次に、テーブルにデータを挿入します。 +次にテーブルにデータを挿入します。 ```sql INSERT INTO page_views VALUES ( @@ -555,30 +552,30 @@ INSERT INTO page_views VALUES ( ``` :::note -注意: このテーブルでは、説明用に 1 行単位のグラニュールやパーツマージの無効化などのカスタム設定を使用していますが、本番環境での使用は推奨されません。 +注意: このテーブルは説明のために、1 行ごとの granule や part のマージ無効化といったカスタム設定を使用していますが、これらは本番環境での利用には推奨されません。 ::: -この構成により、次のような状態になります: +このセットアップにより、次のような状態になります: -* 5 つの個別のパーツ(挿入された各行につき 1 パーツ) -* 各行に対して 1 つのプライマリインデックスエントリ(ベーステーブルおよび各プロジェクション) -* 各パーツにはちょうど 1 行のみが含まれる +* 5 つの個別の part(挿入された各行につき 1 つ) +* ベーステーブルおよび各 projection で、行ごとに 1 つのプライマリインデックスエントリ +* 各 part にはちょうど 1 行のみが含まれる この構成で、`region` と `user_id` の両方でフィルタするクエリを実行します。 -ベーステーブルのプライマリインデックスは `event_date` と `id` から構築されているため、 -ここでは有用ではなく、そのため ClickHouse は次を使用します: +ベーステーブルのプライマリインデックスは `event_date` と `id` から構築されているため +ここでは役に立たないため、ClickHouse は代わりに次を使用します: -* `region_proj` を使って region ごとにパーツを絞り込み -* `user_id_proj` を使ってさらに `user_id` で絞り込み +* `region_proj` を用いて region に基づき part を絞り込む +* `user_id_proj` を用いてさらに `user_id` による絞り込みを行う -この挙動は `EXPLAIN projections = 1` を使うと確認でき、ClickHouse がプロジェクションをどのように選択し、適用しているかが分かります。 +この挙動は `EXPLAIN projections = 1` を使うことで確認できます。これにより、 +ClickHouse が projection をどのように選択し適用するかを確認できます。 ```sql EXPLAIN projections=1 SELECT * FROM page_views WHERE region = 'us_west' AND user_id = 107; ``` - ```response ┌─explain────────────────────────────────────────────────────────────────────────────────┐ 1. │ Expression ((Project names + Projection)) │ @@ -606,20 +603,21 @@ SELECT * FROM page_views WHERE region = 'us_west' AND user_id = 107; └────────────────────────────────────────────────────────────────────────────────────────┘ ``` -上に示した `EXPLAIN` の出力は、論理クエリプランを上から順に示しています: +上に示した `EXPLAIN` の出力は、論理クエリプランを上から下へと示しています。 + -| Row number | Description | -| ---------- | ---------------------------------------------------------------------------------------- | -| 3 | `page_views` ベーステーブルから読み取るプラン | -| 5-13 | `region_proj` を使用して region = 'us_west' である 3 つのパーツを特定し、5 つのパーツのうち 2 つをプルーニング | -| 14-22 | `user_id = 107` である 1 つのパーツを特定するために `user_id_proj` を使用し、残り 3 つのパーツのうちさらに 2 つをプルーニング | +| 行番号 | 説明 | +|--------|--------------------------------------------------------------------------------------------------------------| +| 3 | `page_views` ベーステーブルから読み取りを行う | +| 5-13 | `region_proj` を使用して region = 'us_west' である 3 つのパーツを特定し、5 つのパーツのうち 2 つを除外 | +| 14-22 | `user_id_proj` を使用して `user_id = 107` である 1 つのパーツを特定し、残り 3 つのパーツのうちさらに 2 つを除外 | 最終的に、ベーステーブルから読み取られるのは **5 つのパーツのうち 1 つだけ** です。 -複数のプロジェクションのインデックス分析を組み合わせることで、ClickHouse はスキャンするデータ量を大幅に削減し、 +複数の Projection に対するインデックス解析を組み合わせることで、ClickHouse はスキャンするデータ量を大幅に削減し、 ストレージのオーバーヘッドを抑えつつパフォーマンスを向上させます。 - ## 関連コンテンツ {#related-content} -- [ClickHouse のプライマリインデックスに関する実践的入門](/guides/best-practices/sparse-primary-indexes#option-3-projections) + +- [ClickHouse のプライマリインデックス実践入門](/guides/best-practices/sparse-primary-indexes#option-3-projections) - [マテリアライズドビュー](/docs/materialized-views) -- [ALTER PROJECTION](/sql-reference/statements/alter/projection) +- [ALTER PROJECTION](/sql-reference/statements/alter/projection) \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md b/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md index 359497f2ee1..a94b9cfd346 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md @@ -1,83 +1,77 @@ --- slug: /managing-data/materialized-views-versus-projections -sidebar_label: 'マテリアライズドビューとプロジェクションの比較' -title: 'マテリアライズドビューとプロジェクション' +sidebar_label: 'マテリアライズドビュー vs プロジェクション' +title: 'マテリアライズドビューとプロジェクションの比較' hide_title: false -description: 'ClickHouse におけるマテリアライズドビューとプロジェクションを、ユースケース、パフォーマンス、制約とあわせて比較する記事。' +description: 'ClickHouse におけるマテリアライズドビューとプロジェクションを、ユースケース、パフォーマンス、制約の観点から比較する記事です。' doc_type: 'reference' -keywords: ['materialized views', 'projections', 'differences'] +keywords: ['マテリアライズドビュー', 'プロジェクション', '違い'] --- -> ユーザーからよく寄せられる質問に、どのような場合にマテリアライズドビューを使用し、どのような場合に -> プロジェクションを使用すべきかというものがあります。本記事では、これら 2 つの機能の主な違いと、特定のシナリオでどちらを選択すべきかについて説明します。 +> ユーザーからよく寄せられる質問のひとつが、マテリアライズドビューと +プロジェクションのどちらをいつ使うべきかという点です。本記事では、この 2 つの主な違いと、どのような場面で一方を他方より選択すべきかを解説します。 +## 重要な違いのまとめ {#key-differences} - -## 主な違いの概要 {#key-differences} - -以下の表は、さまざまな観点から見たマテリアライズドビューとプロジェクションの主な違いをまとめたものです。 +以下の表は、検討すべきさまざまな観点における、マテリアライズドビューとプロジェクションの主な違いをまとめたものです。 | Aspect | Materialized views | Projections | |----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Data storage and location | 結果を**別個の明示的なターゲットテーブル**に保存し、ソーステーブルへの挿入時に挿入トリガーとして動作します。 | プロジェクションは最適化されたデータレイアウトを作成し、それらは物理的に**メインテーブルのデータと並んで保存**され、ユーザーからは見えません。 | -| Update mechanism | (増分マテリアライズドビューの場合)ソーステーブルへの `INSERT` に対して**同期的に**動作します。注: リフレッシュ可能なマテリアライズドビューを使用して**スケジュール実行**することもできます。 | メインテーブルへの `INSERT` 時に、バックグラウンドで**非同期的**に更新されます。 | -| Query interaction | マテリアライズドビューを利用する場合は、**ターゲットテーブルを直接クエリ**する必要があるため、クエリを作成する際にマテリアライズドビューの存在をユーザーが認識している必要があります。 | プロジェクションは ClickHouse のクエリオプティマイザによって**自動的に選択**され、ユーザーがプロジェクションを利用するために、そのテーブルに対するクエリを変更する必要がないという意味で透過的です。バージョン 25.6 からは、複数のプロジェクションによるフィルタリングも可能です。 | -| Handling `UPDATE` / `DELETE` | マテリアライズドビューはソーステーブルについての知識を持たず、ソーステーブル_への_挿入トリガーとしてのみ動作するため、ソーステーブルに対する `UPDATE` や `DELETE` 操作に**自動的には反応しません**。これによりソーステーブルとターゲットテーブルの間でデータの不整合や陳腐化が発生する可能性があり、回避にはワークアラウンドや定期的なフルリフレッシュ(リフレッシュ可能なマテリアライズドビュー経由)が必要です。 | 既定では、(特に lightweight delete(軽量削除)において)**`DELETED` 行とは互換性がありません**。`lightweight_mutation_projection_mode`(v24.7+)を使用することで互換性を有効化できます。 | -| `JOIN` support | 対応。リフレッシュ可能なマテリアライズドビューを用いて複雑な非正規化を行うことができます。増分マテリアライズドビューは、最も左側のテーブルへの挿入のみでトリガーされます。 | 非対応。プロジェクション定義内では、マテリアライズされたデータをフィルタリングするための `JOIN` 演算はサポートされていません。 | -| `WHERE` clause in definition | 対応。マテリアライズ前にデータをフィルタリングするために `WHERE` 句を含めることができます。 | 非対応。プロジェクション定義内では、マテリアライズされたデータをフィルタリングするための `WHERE` 句はサポートされていません。 | -| Chaining capabilities | 対応。あるマテリアライズドビューのターゲットテーブルを別のマテリアライズドビューのソースとして使用でき、多段パイプラインを構築できます。 | 非対応。プロジェクションを連鎖させることはできません。 | -| Applicable table engines | さまざまなソーステーブルエンジンで使用できますが、ターゲットテーブルは通常 `MergeTree` ファミリです。 | `MergeTree` ファミリのテーブルエンジンでのみ**利用可能**です。 | -| Failure handling | データ挿入時に失敗するとターゲットテーブル側でデータが失われるため、不整合が発生する可能性があります。 | 障害はバックグラウンドで**サイレントに**処理されます。クエリでは、マテリアライズ済みパーツと未マテリアライズパーツを透過的に混在させることができます。 | -| Operational overhead | 明示的なターゲットテーブルの作成と、しばしば手動でのバックフィルが必要です。`UPDATE`/`DELETE` との整合性維持には追加の複雑さが伴います。 | プロジェクションは自動的に管理され同期が保たれるため、一般に運用負荷は低くなります。 | -| `FINAL` query compatibility | 概ね互換性がありますが、多くの場合、ターゲットテーブル側で `GROUP BY` が必要になります。 | `FINAL` クエリでは**動作しません**。 | -| Lazy materialization | 対応。 | マテリアライゼーション関連機能を使用する際は、プロジェクション互換性の問題を監視してください。`query_plan_optimize_lazy_materialization = false` を設定する必要がある場合があります。 | -| Parallel replicas | 対応。 | 非対応。 | -| [`optimize_read_in_order`](/operations/settings/settings#optimize_read_in_order) | 対応。 | 対応。 | -| Lightweight updates and deletes | 対応。 | 非対応。 | - - +| Data storage and location | 結果を**別個の明示的なターゲットテーブル**に保存し、ソーステーブルへの `INSERT` 時に挿入トリガーとして動作します。 | プロジェクションは最適化されたデータレイアウトを作成し、物理的には**メインテーブルのデータと並んで保存**され、ユーザーからは見えません。 | +| Update mechanism | (インクリメンタルなマテリアライズドビューの場合)ソーステーブルへの `INSERT` に対して**同期的**に動作します。注: refreshable materialized view を使用することで、**スケジュール**実行も可能です。 | メインテーブルへの `INSERT` 後にバックグラウンドで**非同期的**に更新されます。 | +| Query interaction | Materialized View を利用するには**ターゲットテーブルを直接クエリ**する必要があり、クエリを書く際にユーザーはマテリアライズドビューの存在を意識する必要があります。 | プロジェクションは ClickHouse のクエリオプティマイザによって**自動的に選択**されます。ユーザーはプロジェクション付きテーブルに対してクエリを書き換える必要はなく、その点で透過的です。バージョン 25.6 以降では、複数のプロジェクションを条件に応じて併用することも可能です。 | +| Handling `UPDATE` / `DELETE` | materialized view は、ソーステーブルに関する情報を持たず、ソーステーブルへの挿入トリガーとしてのみ動作するため、ソーステーブルでの `UPDATE` や `DELETE` 操作に**自動では反応しません**。このためソーステーブルとターゲットテーブル間でデータの陳腐化や不整合が生じる可能性があり、回避にはワークアラウンドや、refreshable materialized view による定期的な完全リフレッシュが必要です。 | 既定では、(特に lightweight delete において)**`DELETED` 行とは非互換**です。`lightweight_mutation_projection_mode`(v24.7+)を有効にすることで互換性を持たせることができます。 | +| `JOIN` support | 対応あり。Refreshable materialized view は複雑な非正規化に利用できます。インクリメンタルなマテリアライズドビューは、左端のテーブルへの挿入時のみトリガーされます。 | 対応なし。プロジェクション定義内では、materialized なデータをフィルタリングするための `JOIN` 操作はサポートされません。ただし、プロジェクションを持つテーブル同士を結合するクエリ自体は通常どおり動作し、プロジェクションは各テーブルへのアクセスを個別に最適化します。 | +| `WHERE` clause in definition | 対応あり。マテリアライズ前にデータをフィルタするために `WHERE` 句を含めることができます。 | 対応なし。プロジェクション定義内では、materialized なデータをフィルタリングするための `WHERE` 句はサポートされていません。 | +| Chaining capabilities | 対応あり。あるマテリアライズドビューのターゲットテーブルを別のマテリアライズドビューのソースとして利用でき、多段パイプラインを構成できます。 | 対応なし。プロジェクションを連結(チェーン)することはできません。 | +| Applicable table engines | 各種ソーステーブルエンジンで利用できますが、ターゲットテーブルは通常 `MergeTree` ファミリーです。 | `MergeTree` ファミリーのテーブルエンジンに対してのみ**利用可能**です。 | +| Failure handling | データ挿入中に失敗した場合、ターゲットテーブル側でデータが失われ、整合性に問題が生じる可能性があります。 | 失敗はバックグラウンドで**サイレントに**処理されます。クエリは materialized なパーツと非 materialized なパーツをシームレスに混在させて参照できます。 | +| Operational overhead | 明示的なターゲットテーブルの作成と、多くの場合手動でのバックフィルが必要です。`UPDATE`/`DELETE` と整合性を保つための管理は複雑さを増します。 | プロジェクションは自動的に維持・同期され、一般的に運用上の負荷は低くなります。 | +| `FINAL` query compatibility | 概ね互換性がありますが、ターゲットテーブル上で `GROUP BY` が必要になることが多いです。 | `FINAL` クエリとは**併用できません**。 | +| Lazy materialization | 対応あり。 | materialization 関連機能を使用する際は、プロジェクションの互換性問題に注意してください。必要に応じて `query_plan_optimize_lazy_materialization = false` を設定する必要があります。 | +| Parallel replicas | 対応あり。 | 対応なし。 | +| [`optimize_read_in_order`](/operations/settings/settings#optimize_read_in_order) | 対応あり。 | 対応あり。 | +| Lightweight updates and deletes | 対応あり。 | 対応なし。 | ## マテリアライズドビューとプロジェクションの比較 {#choose-between} -### マテリアライズドビューを選ぶべきケース {#choosing-materialized-views} - -マテリアライズドビューの利用を検討すべきなのは次のような場合です: - -- **リアルタイム ETL と多段階データパイプライン** を扱う場合: データ到着時に複雑な変換や集約を実行したり、ビューをチェインして複数ステージにわたってデータをルーティングする必要がある場合。 -- **複雑な非正規化** が必要な場合: 複数のソース(テーブル、サブクエリ、ディクショナリ)からのデータを 1 つのクエリ最適化済みテーブルに事前結合する必要があり、特にリフレッシュ可能なマテリアライズドビューを使った定期的なフルリフレッシュが許容できる場合。 -- **スキーマを明示的に制御したい** 場合: 事前計算済み結果用に、独自のスキーマとエンジンを持つ独立したターゲットテーブルが必要であり、データモデリングの柔軟性を高めたい場合。 -- **インジェスト時にフィルタリングしたい** 場合: データがマテリアライズされる _前に_ フィルタリングし、ターゲットテーブルに書き込まれるデータ量を削減する必要がある場合。 +### マテリアライズドビューを選択するタイミング {#choosing-materialized-views} -### マテリアライズドビューを避けるべきケース {#avoid-materialized-views} +次のような場合は、マテリアライズドビューの利用を検討してください。 -マテリアライズドビューの使用を避けることを検討すべきなのは次のような場合です: +- **リアルタイム ETL と多段階のデータパイプライン**を扱う場合: データが到着したタイミングで複雑な変換や集計を実行したり、ビューを連結することで複数のステージにまたがってデータをルーティングする必要がある場合。 +- **複雑な非正規化**が必要な場合: 複数のソース(テーブル、サブクエリ、またはディクショナリ)のデータを 1 つのクエリ最適化されたテーブルに事前結合する必要があり、特にリフレッシュ可能なマテリアライズドビューを用いた定期的なフルリフレッシュが許容できる場合。 +- **スキーマを明示的に制御**したい場合: 事前計算済みの結果を保持するために、それ専用のスキーマとエンジンを持つ独立したターゲットテーブルが必要であり、データモデリングの柔軟性を高めたい場合。 +- **インジェスト時にフィルタリング**したい場合: データがマテリアライズされる_前に_フィルタリングを行い、ターゲットテーブルに書き込まれるデータ量を削減する必要がある場合。 -- **ソースデータが頻繁に更新または削除される** 場合: ソーステーブルとターゲットテーブル間の整合性を維持するための追加戦略がないと、増分マテリアライズドビューが古くなり、不整合を起こす可能性があります。 -- **シンプルさと自動最適化を優先したい** 場合: 別個のターゲットテーブルを管理したくない場合。 +### マテリアライズドビューの使用を避けるべき場合 {#avoid-materialized-views} -### プロジェクションを選ぶべきケース {#choosing-projections} +次のような場合には、マテリアライズドビューの使用を避けることを検討してください。 -プロジェクションの利用を検討すべきなのは次のような場合です: +- **ソースデータが頻繁に更新または削除される場合**: ソーステーブルとターゲットテーブル間の一貫性を保つための追加の戦略がないと、増分マテリアライズドビューは古くなり、一貫性が失われる可能性があります。 +- **シンプルさや自動最適化を重視する場合**: 別個のターゲットテーブルを管理することを避けたい場合。 -- **単一テーブルに対するクエリを最適化する** 場合: 主な目的が、単一のベーステーブルに対するクエリを高速化することであり、そのために別のソート順を提供したり、プライマリキーに含まれない列上のフィルタを最適化したり、単一テーブルに対する集約を事前計算したりする場合。 -- **クエリの透過性** を求める場合: クエリを変更せずに元のテーブルを対象にし、ClickHouse がクエリごとに最適なデータレイアウトを選択することに任せたい場合。 +### プロジェクションを選択すべきケース {#choosing-projections} -### プロジェクションを避けるべきケース {#avoid-projections} +次のような場合には、プロジェクションの利用を検討してください。 -プロジェクションの使用を避けることを検討すべきなのは次のような場合です: +- **単一テーブルに対するクエリの最適化**: 主な目的が、単一のベーステーブルに対するクエリを高速化することであり、そのために別のソート順を用意したり、プライマリキーに含まれない列に対するフィルタを最適化したり、単一テーブルに対する集計をあらかじめ計算しておきたい場合。 +- **クエリの透過性**を求める場合: クエリでは元のテーブルをそのまま対象とし、変更を加えずに、特定のクエリに対して ClickHouse が最適なデータレイアウトを自動的に選択するようにしたい場合。 -- **複雑なデータ変換や多段階 ETL が必要** な場合: プロジェクションは、その定義内で `JOIN` 演算をサポートせず、多段階パイプラインを構築するように変更することもできず、ウィンドウ関数や複雑な `CASE` 式など一部の SQL 機能も扱えません。そのため、複雑なデータ変換には適していません。 -- **マテリアライズされるデータを明示的にフィルタリングする必要がある** 場合: プロジェクションは、その定義内で `WHERE` 句をサポートしておらず、プロジェクション自体にマテリアライズされるデータをフィルタリングできません。 -- **MergeTree 以外のテーブルエンジンが使用されている** 場合: プロジェクションは `MergeTree` ファミリーのエンジンを使用するテーブルに対してのみ利用できます。 -- `FINAL` クエリが不可欠な場合: プロジェクションは、重複排除のために使用されることがある `FINAL` クエリでは機能しません。 -- [parallel replicas](/deployment-guides/parallel-replicas) が必要な場合: プロジェクションではサポートされていません。 +### プロジェクションの利用を避けるべき場合 {#avoid-projections} +次のような場合には、プロジェクションの使用を避けることを検討してください。 +- **複雑なデータ変換や多段階の ETL が必要な場合**: プロジェクション定義は `JOIN` 演算をサポートせず、多段階パイプラインを構築するために連鎖させることもできません。また、ウィンドウ関数や複雑な `CASE` 式など、一部の SQL 機能を扱うこともできません。プロジェクションを持つテーブルに対するクエリは自由に結合できますが、プロジェクション自体は複雑なデータ変換には適していません。 +- **マテリアライズするデータを明示的にフィルタリングする必要がある場合**: プロジェクションは、そのプロジェクションにマテリアライズされるデータをフィルタリングするための `WHERE` 句を定義内でサポートしていません。 +- **MergeTree 以外のテーブルエンジンを使用している場合**: プロジェクションは、`MergeTree` ファミリーのエンジンを使用するテーブルでのみ利用可能です。 +- **`FINAL` クエリが不可欠な場合**: プロジェクションは、重複排除などの目的で使用されることがある `FINAL` クエリとは併用できません。 +- **[parallel replicas](/deployment-guides/parallel-replicas) が必要な場合**: parallel replicas はプロジェクションと併用できません。 -## Summary {#summary} +## まとめ {#summary} -マテリアライズドビューとプロジェクションは、どちらもクエリの最適化やデータ変換のための強力なツールであり、一般的には「どちらか一方を選ぶ」ものとして考えることは推奨しません。代わりに、これらを補完的に組み合わせて使用することで、クエリのパフォーマンスを最大限に引き出すことができます。そのため、ClickHouse でマテリアライズドビューとプロジェクションのどちらを選択するかは、具体的なユースケースやアクセスパターンに大きく依存します。 +マテリアライズドビューとプロジェクションは、いずれもクエリの最適化やデータ変換のための強力なツールであり、一般的には「どちらか一方だけを選ぶ」ものとして捉える必要はありません。むしろ、両者を補完的に組み合わせて使用することで、クエリから最大限のパフォーマンスを引き出すことができます。そのため、ClickHouse においてマテリアライズドビューとプロジェクションのどちらを選択するかは、特定のユースケースやアクセスパターンに大きく依存します。 -一般的な指針として、1 つ以上のソーステーブルからターゲットテーブルへデータを集約したり、大規模な複雑な変換処理を実行する必要がある場合には、マテリアライズドビューの利用を検討すべきです。マテリアライズドビューは、高コストな集約処理の負荷をクエリ実行時から挿入時へと移すのに非常に優れています。日次・月次のロールアップやリアルタイムダッシュボード、データサマリなどに最適な選択肢です。 +一般的な指針として、1 つ以上のソーステーブルからターゲットテーブルへデータを集約したり、大規模かつ複雑な変換処理を行う必要がある場合は、マテリアライズドビューの利用を検討すべきです。マテリアライズドビューは、高コストな集計処理の負荷をクエリ時ではなく挿入時に移すことに非常に優れています。日次・月次ロールアップ、リアルタイムダッシュボード、サマリーデータなどの用途に最適な選択肢です。 -一方で、テーブルのプライマリキー(ディスク上のデータの物理的な並び順を決定するカラム)とは異なるカラムでフィルタするクエリを最適化する必要がある場合には、プロジェクションを使用すべきです。特に、テーブルのプライマリキーをもはや変更できない状況や、アクセスパターンがプライマリキーで表現できる範囲よりも多様である場合に有用です。 +一方で、プロジェクションを使うべきなのは、テーブルのプライマリキー(ディスク上のデータの物理的な並び順を決定する列)とは異なる列でフィルタリングするクエリを最適化する必要がある場合です。特に、テーブルのプライマリキーを変更することがもはや不可能な場合や、アクセスパターンがプライマリキーで想定されているものより多様な場合に有用です。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md b/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md index 7b3aba6c19f..afe692c2e6b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md @@ -122,6 +122,7 @@ With our initial schema defined, we can populate the data using an `INSERT INTO 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.) + ``` > The above query loads 60m rows. While small for ClickHouse, users with slower internet connections may wish to load a subset of data. This can be achieved by simply specifying the years they wish to load via a glob pattern e.g. `https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/2008.parquet` or `https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/{2008, 2009}.parquet`. See [here](/sql-reference/table-functions/file#globs-in-path) for how glob patterns can be used to target subsets of files. diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/index.md index be98cb2de83..a9c9baf38c6 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/index.md @@ -6,7 +6,7 @@ keywords: ['デプロイメントガイド', 'スケーリング', 'クラスタ doc_type: 'landing-page' --- -# デプロイメントとスケーリング +# デプロイメントとスケーリング {#deployment-and-scaling} 本セクションでは、次のトピックについて説明します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx index 5ac0b01b885..7dacdf00c37 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx +++ b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx @@ -20,11 +20,10 @@ import image_9 from '@site/static/images/deployment-guides/parallel-replicas-9.p - ## はじめに \{#introduction\} ClickHouse はクエリを非常に高速に処理しますが、これらのクエリはどのようにして -複数のサーバーに分散され、並列実行されているのでしょうか。 +複数のサーバーに分散され、並列実行されているのでしょうか。 > このガイドではまず、ClickHouse が分散テーブルを用いてクエリを複数のシャードにどのように分散するかを説明し、その後、クエリの実行に複数のレプリカをどのように活用できるかを解説します。 @@ -39,24 +38,27 @@ ClickHouse はクエリを非常に高速に処理しますが、これらのク 上図は、クライアントが分散テーブルにクエリを実行したときに何が起こるかを示しています。
    -
  1. - SELECT クエリは、任意のノード上の分散テーブルに送信されます - (ラウンドロビン戦略で選択されたノード、またはロードバランサーによって - 特定のサーバーにルーティングされたノードなど)。このノードが - コーディネータとして動作します。 -
  2. -
  3. - ノードは、分散テーブルに指定された情報を用いて、クエリを実行する必要がある - 各シャードを特定し、クエリをそれぞれのシャードに送信します。 -
  4. -
  5. - 各シャードはローカルでデータを読み取り、フィルタおよび集約したうえで、 - マージ可能な状態をコーディネータに返します。 -
  6. -
  7. - コーディネータノードがデータをマージし、その結果をクライアントに - 応答として返します。 -
  8. +
  9. + SELECT クエリは、任意のノード上の分散テーブルに送信されます + (ラウンドロビン戦略で選択されたノード、またはロードバランサーによって + 特定のサーバーにルーティングされたノードなど)。このノードが + コーディネータとして動作します。 +
  10. + +
  11. + ノードは、分散テーブルに指定された情報を用いて、クエリを実行する必要がある + 各シャードを特定し、クエリをそれぞれのシャードに送信します。 +
  12. + +
  13. + 各シャードはローカルでデータを読み取り、フィルタおよび集約したうえで、 + マージ可能な状態をコーディネータに返します。 +
  14. + +
  15. + コーディネータノードがデータをマージし、その結果をクライアントに + 応答として返します。 +
レプリカを追加した場合もプロセスはほぼ同様で、唯一の違いは、各シャードからは単一のレプリカのみがクエリを実行する点です。これにより、より多くのクエリを並列に処理できるようになります。 @@ -64,7 +66,7 @@ ClickHouse はクエリを非常に高速に処理しますが、これらのク ## 非シャーディングアーキテクチャ \{#non-sharded-architecture\} ClickHouse Cloud は、前述のアーキテクチャとは大きく異なるアーキテクチャを採用しています。 -(詳細については、["ClickHouse Cloud Architecture"](https://clickhouse.com/docs/cloud/reference/architecture) +(詳細については、["ClickHouse Cloud Architecture"](https://clickhouse.com/docs/cloud/reference/architecture) を参照してください)。コンピュートとストレージが分離され、事実上無制限のストレージ容量が 利用できるため、シャードの必要性はそれほど重要ではなくなります。 @@ -103,47 +105,54 @@ Keeper クラスタは、メタデータに関する単一の信頼できる情 並列レプリカでは、次のようになります。
    -
  1. - クライアントからのクエリはロードバランサーを通過した後、1 つのノードに - 送信されます。このノードがこのクエリのコーディネーターになります。 -
  2. -
  3. - ノードは各パーツのインデックスを解析し、処理すべき適切なパーツと - granule を選択します。 -
  4. -
  5. - コーディネーターは、ワークロードを複数の granule の集合に分割し、 - それぞれを異なるレプリカに割り当てられるようにします。 -
  6. -
  7. - 各 granule の集合は対応するレプリカによって処理され、完了後、 - マージ可能な状態がコーディネーターに送信されます。 -
  8. -
  9. - 最後に、コーディネーターがレプリカからのすべての結果をマージし、 - レスポンスをクライアントに返します。 -
  10. +
  11. + クライアントからのクエリはロードバランサーを通過した後、1 つのノードに + 送信されます。このノードがこのクエリのコーディネーターになります。 +
  12. + +
  13. + ノードは各パーツのインデックスを解析し、処理すべき適切なパーツと + granule を選択します。 +
  14. + +
  15. + コーディネーターは、ワークロードを複数の granule の集合に分割し、 + それぞれを異なるレプリカに割り当てられるようにします。 +
  16. + +
  17. + 各 granule の集合は対応するレプリカによって処理され、完了後、 + マージ可能な状態がコーディネーターに送信されます。 +
  18. + +
  19. + 最後に、コーディネーターがレプリカからのすべての結果をマージし、 + レスポンスをクライアントに返します。 +
上記のステップは、並列レプリカが理論上どのように動作するかを説明したものです。 しかし、実際には、このようなロジックが完全には機能しない要因が多数存在します。
    -
  1. - 一部のレプリカが利用不能になっている場合があります。 -
  2. -
  3. - ClickHouse におけるレプリケーションは非同期であるため、ある時点では - 一部のレプリカが同じパーツを保持していない可能性があります。 -
  4. -
  5. - レプリカ間のテールレイテンシを何らかの方法で扱う必要があります。 -
  6. -
  7. - ファイルシステムキャッシュは各レプリカ上のアクティビティに応じて - レプリカごとに異なるため、タスクをランダムに割り当てると、 - キャッシュの局所性を考慮した場合に最適とは言えない性能につながることがあります。 -
  8. +
  9. + 一部のレプリカが利用不能になっている場合があります。 +
  10. + +
  11. + ClickHouse におけるレプリケーションは非同期であるため、ある時点では + 一部のレプリカが同じパーツを保持していない可能性があります。 +
  12. + +
  13. + レプリカ間のテールレイテンシを何らかの方法で扱う必要があります。 +
  14. + +
  15. + ファイルシステムキャッシュは各レプリカ上のアクティビティに応じて + レプリカごとに異なるため、タスクをランダムに割り当てると、 + キャッシュの局所性を考慮した場合に最適とは言えない性能につながることがあります。 +
これらの要因をどのように克服するかについては、次のセクションで説明します。 @@ -155,18 +164,21 @@ Keeper クラスタは、メタデータに関する単一の信頼できる情 Announcements
    -
  1. - クライアントからのクエリはロードバランサーを経由して 1 つのノードに送信されます。このノードがこのクエリのコーディネーターになります。 -
  2. -
  3. - コーディネーターノードは、クラスター内のすべてのレプリカからアナウンスメントを取得するリクエストを送信します。レプリカは、テーブルの現在のパーツ集合について、わずかに異なる見え方をしている場合があります。そのため、誤ったスケジューリング判断を避けるために、この情報を収集する必要があります。 -
  4. -
  5. - その後、コーディネーターノードはアナウンスメントを使用して、異なるレプリカに割り当て可能なグラニュールの集合を定義します。たとえばここでは、レプリカ 2 は自分のアナウンスメントで part 3 を提示していないため、part 3 のグラニュールはレプリカ 2 には一切割り当てられていないことがわかります。また、レプリカ 3 はアナウンスメントを提供していないため、このレプリカにはタスクが割り当てられていない点にも注意してください。 -
  6. -
  7. - 各レプリカがそれぞれのグラニュールのサブセットに対してクエリ処理を行い、マージ可能な状態をコーディネーターに送り返した後、コーディネーターは結果をマージし、そのレスポンスをクライアントに送信します。 -
  8. +
  9. + クライアントからのクエリはロードバランサーを経由して 1 つのノードに送信されます。このノードがこのクエリのコーディネーターになります。 +
  10. + +
  11. + コーディネーターノードは、クラスター内のすべてのレプリカからアナウンスメントを取得するリクエストを送信します。レプリカは、テーブルの現在のパーツ集合について、わずかに異なる見え方をしている場合があります。そのため、誤ったスケジューリング判断を避けるために、この情報を収集する必要があります。 +
  12. + +
  13. + その後、コーディネーターノードはアナウンスメントを使用して、異なるレプリカに割り当て可能なグラニュールの集合を定義します。たとえばここでは、レプリカ 2 は自分のアナウンスメントで part 3 を提示していないため、part 3 のグラニュールはレプリカ 2 には一切割り当てられていないことがわかります。また、レプリカ 3 はアナウンスメントを提供していないため、このレプリカにはタスクが割り当てられていない点にも注意してください。 +
  14. + +
  15. + 各レプリカがそれぞれのグラニュールのサブセットに対してクエリ処理を行い、マージ可能な状態をコーディネーターに送り返した後、コーディネーターは結果をマージし、そのレスポンスをクライアントに送信します。 +
### 動的なコーディネーション \{#dynamic-coordination\} @@ -180,37 +192,41 @@ Keeper クラスタは、メタデータに関する単一の信頼できる情 動的コーディネーション - パート 1
    -
  1. - レプリカは、タスクを処理可能であること、またどの程度の作業量を処理可能かをコーディネータノードに通知します。 -
  2. -
  3. - コーディネータは、レプリカにタスクを割り当てます。 -
  4. +
  5. + レプリカは、タスクを処理可能であること、またどの程度の作業量を処理可能かをコーディネータノードに通知します。 +
  6. + +
  7. + コーディネータは、レプリカにタスクを割り当てます。 +
動的コーディネーション - パート 2
    -
  1. - レプリカ 1 と 2 はタスクを非常に速く完了できます。そのため、コーディネータノードに別のタスクを要求します。 -
  2. -
  3. - コーディネータは、新しいタスクをレプリカ 1 と 2 に割り当てます。 -
  4. +
  5. + レプリカ 1 と 2 はタスクを非常に速く完了できます。そのため、コーディネータノードに別のタスクを要求します。 +
  6. + +
  7. + コーディネータは、新しいタスクをレプリカ 1 と 2 に割り当てます。 +
動的コーディネーション - パート 3
    -
  1. - すべてのレプリカが、自身に割り当てられたタスクの処理を完了しました。そこで、さらにタスクを要求します。 -
  2. -
  3. - コーディネータは、アナウンスを使って残っているタスクを確認しますが、もはや残りのタスクはありません。 -
  4. -
  5. - コーディネータは、すべての処理が完了したことをレプリカに通知します。次に、マージ可能な状態をすべてマージし、クエリに応答します。 -
  6. +
  7. + すべてのレプリカが、自身に割り当てられたタスクの処理を完了しました。そこで、さらにタスクを要求します。 +
  8. + +
  9. + コーディネータは、アナウンスを使って残っているタスクを確認しますが、もはや残りのタスクはありません。 +
  10. + +
  11. + コーディネータは、すべての処理が完了したことをレプリカに通知します。次に、マージ可能な状態をすべてマージし、クエリに応答します。 +
### キャッシュローカリティの管理 \{#managing-cache-locality\} @@ -220,34 +236,38 @@ Keeper クラスタは、メタデータに関する単一の信頼できる情 保証できるでしょうか。前の例では、次のようにタスクが割り当てられていました。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
レプリカ 1レプリカ 2レプリカ 3
パート 1g1, g6, g7g2, g4, g5g3
パート 2g1g2, g4, g5g3
パート 3g1, g6g2, g4, g5g3
+ + レプリカ 1レプリカ 2レプリカ 3
パート 1g1, g6, g7g2, g4, g5g3
パート 2g1g2, g4, g5g3
パート 3g1, g6g2, g4, g5g3
同じタスクが同じレプリカに割り当てられ、キャッシュの恩恵を受けられるようにするために、 @@ -284,13 +304,13 @@ Keeper クラスタは、メタデータに関する単一の信頼できる情 | Setting | Description | |----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `enable_parallel_replicas` | `0`: 無効
`1`: 有効
`2`: 並列レプリカの使用を強制し、使用されない場合は例外をスローします。 | +| `enable_parallel_replicas` | `0`: 無効
`1`: 有効
`2`: 並列レプリカの使用を強制し、使用されない場合は例外をスローします。 | | `cluster_for_parallel_replicas` | 並列レプリケーションに使用するクラスタ名。ClickHouse Cloud を使用している場合は `default` を指定します。 | | `max_parallel_replicas` | 複数レプリカ上でクエリを実行する際に使用するレプリカの最大数。クラスタ内のレプリカ数より小さい値を指定した場合、ノードはランダムに選択されます。この値は水平方向のスケーリングを考慮してオーバーコミットとして設定することもできます。 | -| `parallel_replicas_min_number_of_rows_per_replica` | 処理が必要な行数に基づいて使用するレプリカ数を制限するのに役立ちます。使用されるレプリカ数は次の式で決まります:
`estimated rows to read` / `min_number_of_rows_per_replica`. | -| `allow_experimental_analyzer` | `0`: 旧アナライザを使用
`1`: 新アナライザを使用

使用するアナライザによって、並列レプリカの動作が変わる場合があります。 | +| `parallel_replicas_min_number_of_rows_per_replica` | 処理が必要な行数に基づいて使用するレプリカ数を制限するのに役立ちます。使用されるレプリカ数は次の式で決まります:
`estimated rows to read` / `min_number_of_rows_per_replica`. | +| `allow_experimental_analyzer` | `0`: 旧アナライザを使用
`1`: 新アナライザを使用

使用するアナライザによって、並列レプリカの動作が変わる場合があります。 | -## パラレルレプリカに関する問題の調査 +## パラレルレプリカに関する問題の調査 \{#investigating-issues-with-parallel-replicas\} 各クエリでどの設定が使用されているかは、 [`system.query_log`](/docs/operations/system-tables/query_log) テーブルで確認できます。 @@ -308,7 +328,6 @@ FROM clusterAllReplicas('default', system.events) WHERE event ILIKE '%ParallelReplicas%' ``` -
レスポンス @@ -370,7 +389,6 @@ WHERE query_id = 'ad40c712-d25d-45c4-b1a1-a28ba8d4019c' ORDER BY event_time_microseconds ASC ``` -
レスポンス diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md index a8b481d0a43..d751cfa1ba2 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md @@ -9,19 +9,19 @@ keywords: ['レプリケーション', '高可用性', 'クラスター構成', --- import Image from '@theme/IdealImage'; -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; import ReplicationArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/replication.png'; -import ConfigFileNote from '@site/docs/_snippets/_config-files.md'; -import KeeperConfigFileNote from '@site/docs/_snippets/_keeper-config-files.md'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import ServerParameterTable from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigFileNote from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_keeper-config-files.md'; +import ConfigExplanation from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import ServerParameterTable from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; +import KeeperConfig from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > この例では、データをレプリケートするシンプルな ClickHouse クラスターのセットアップ方法を学びます。ここでは 5 台のサーバーを構成します。うち 2 台はデータのコピーを保持するために使用します。残りの 3 台のサーバーは、データレプリケーションを調整するために使用します。 @@ -31,7 +31,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## 前提条件 {#pre-requisites} - 以前に [ローカルの ClickHouse サーバー](/install) をセットアップしている diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md index 1a3de02acd9..0d0da37adfc 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md @@ -9,19 +9,19 @@ keywords: ['シャーディング', '水平スケーリング', '分散データ --- import Image from '@theme/IdealImage'; -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; import ShardingArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/sharding.png'; -import ConfigFileNote from '@site/docs/_snippets/_config-files.md'; -import KeeperConfigFileNote from '@site/docs/_snippets/_keeper-config-files.md'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import ServerParameterTable from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigFileNote from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_keeper-config-files.md'; +import ConfigExplanation from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import ServerParameterTable from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; +import KeeperConfig from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > この例では、スケールするシンプルな ClickHouse クラスターのセットアップ方法を学びます。 > ここでは 5 台のサーバーを構成します。うち 2 台はデータのシャーディングに使用し、 @@ -33,7 +33,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## 前提条件 {#pre-requisites} - 以前に [ローカル ClickHouse サーバー](/install) をセットアップしたことがある diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md index 783be44d886..bb00080f6b9 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md @@ -10,14 +10,14 @@ keywords: ['クラスター デプロイメント', 'レプリケーション', import Image from '@theme/IdealImage'; import SharedReplicatedArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/both.png'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigExplanation from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import KeeperConfig from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > この例では、レプリケーションとスケールの両方に対応したシンプルな ClickHouse クラスターをセットアップする方法を学びます。クラスターは 2 つのシャードと 2 つのレプリカに加え、クラスター内の調整とクォーラムの維持を行う 3 ノード構成の ClickHouse Keeper クラスターで構成されています。 @@ -27,7 +27,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## 前提条件 {#prerequisites} - すでに [ローカルの ClickHouse サーバー](/install) をセットアップしている diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md index e2027e59947..4c8289717f2 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md @@ -8,7 +8,7 @@ doc_type: 'guide' keywords: ['デプロイメント', 'アーキテクチャ', 'レプリケーション', 'シャーディング', 'クラスタ構成'] --- -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; このセクションのデプロイメント例は、ClickHouse の Support and Services チームが ClickHouse ユーザーに提供しているアドバイスに基づいています。これらは実際に動作する例であり、 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/architecture.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/architecture.md deleted file mode 100644 index 8d9187de727..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/architecture.md +++ /dev/null @@ -1,324 +0,0 @@ ---- -description: 'ClickHouse のアーキテクチャとカラム指向設計に関する包括的な解説' -sidebar_label: 'アーキテクチャ概要' -sidebar_position: 50 -slug: /development/architecture -title: 'アーキテクチャ概要' -doc_type: 'reference' ---- - - - -# アーキテクチャ概要 - -ClickHouse は真のカラム指向 DBMS です。データはカラム単位で保存され、クエリ実行時には配列(カラムのベクターまたはチャンク)単位で処理されます。 -可能な限り、個々の値ではなく配列に対して演算が行われます。 -これは「ベクトル化クエリ実行」と呼ばれ、実際のデータ処理コストの削減に役立ちます。 - -このアイデア自体は新しいものではありません。 -その起源は `APL`(A Programming Language, 1957)およびその派生である `A +`(APL 方言)、`J`(1990)、`K`(1993)、`Q`(Kx Systems によるプログラミング言語, 2003)にさかのぼります。 -配列プログラミングは科学的なデータ処理で利用されています。また、リレーショナルデータベースにおいても決して新しいアイデアではありません。たとえば、この方式は `VectorWise` システム(Actian Corporation による Actian Vector Analytic Database としても知られる)で利用されています。 - -クエリ処理を高速化する手法としては、ベクトル化クエリ実行とランタイムコード生成の 2 つのアプローチがあります。後者はすべての間接参照と動的ディスパッチを排除します。どちらの手法も、一方が他方より常に優れているというわけではありません。多くの演算を一体化して CPU の実行ユニットやパイプラインを完全に活用できる場合、ランタイムコード生成の方が有利になることがあります。ベクトル化クエリ実行は、一時的なベクターをキャッシュに書き込み、再度読み出す必要があるため、実用性が低くなる場合があります。一時データが L2 キャッシュに収まりきらない場合、これは問題となります。一方で、ベクトル化クエリ実行は CPU の SIMD 機能をより容易に活用できます。私たちの協力者による [研究論文](http://15721.courses.cs.cmu.edu/spring2016/papers/p5-sompolski.pdf) では、両方の手法を組み合わせるのがより良いことが示されています。ClickHouse はベクトル化クエリ実行を採用しており、ランタイムコード生成については初期的な限定サポートを備えています。 - - - -## Columns {#columns} - -`IColumn` インターフェイスは、メモリ上のカラム(実際にはカラムのチャンク)を表現するために使用されます。このインターフェイスは、さまざまなリレーショナルオペレーターを実装するための補助メソッドを提供します。ほとんどすべての操作はイミュータブルであり、元のカラムを変更せずに、新しく変更済みのカラムを作成します。たとえば、`IColumn::filter` メソッドはフィルタ用のバイトマスクを受け取ります。これはリレーショナルオペレーターである `WHERE` および `HAVING` に使用されます。他の例としては、`ORDER BY` をサポートするための `IColumn::permute` メソッド、`LIMIT` をサポートするための `IColumn::cut` メソッドがあります。 - -さまざまな `IColumn` 実装(`ColumnUInt8`、`ColumnString` など)は、カラムのメモリレイアウトを管理します。メモリレイアウトは通常、連続した配列です。整数型のカラムでは、`std::vector` のような 1 つの連続した配列になります。`String` および `Array` カラムでは、2 つのベクタから構成されます。1 つはすべての配列要素を連続して格納するもので、もう 1 つは各配列の先頭位置へのオフセットを格納するものです。また、メモリ上には 1 つの値だけを保持しながら、見かけ上はカラムのように振る舞う `ColumnConst` も存在します。 - - - -## Field {#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` の外側で実装されています。 - -カラムに対するさまざまな関数は、`IColumn` のメソッドを用いて `Field` 値を取り出す、汎用的だが非効率な方法、あるいは特定の `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 フォーマットの一部として値をシリアライズするメソッドなどがあります。データフォーマットとの間に 1 対 1 の対応関係はありません。例えば、異なるデータフォーマットである `Pretty` と `TabSeparated` は、どちらも `IDataType` インターフェイスの同じヘルパーメソッド `serializeTextEscaped` を使用できます。 - - - -## ブロック {#block} - -`Block` は、メモリ上のテーブルの一部分(チャンク)を表すコンテナです。`(IColumn, IDataType, column name)` という三つ組の集合にすぎません。クエリ実行中、データは `Block` 単位で処理されます。`Block` があれば、データ本体(`IColumn` オブジェクト内)と、その列をどのように扱うかを示す型情報(`IDataType` 内)、および列名を保持していることになります。列名は、テーブルの元の列名である場合もあれば、計算の一時的な結果を得るために割り当てられた人工的な名前である場合もあります。 - -ブロック内の列に対して何らかの関数を計算する場合、その結果を表す別の列をブロックに追加し、演算がイミュータブルであるため、関数の引数となる列は変更しません。後で不要になった列はブロックから削除できますが、内容を変更することはありません。これは共通部分式の除去に便利です。 - -ブロックは、処理される各データチャンクごとに作成されます。同じ種類の計算に対しては、異なるブロック間であっても列名と型は同一であり、変わるのは列データだけであることに注意してください。ブロックサイズが小さい場合は、shared_ptr や列名をコピーするための一時文字列のオーバーヘッドが大きくなるため、ブロックデータをブロックヘッダから分離するのが望ましいです。 - - - -## プロセッサ {#processors} - -説明は [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 で初期化され、その WriteBuffer に書き込む前に圧縮を行います)、およびその他の用途に使用されます。`ConcatReadBuffer`、`LimitReadBuffer`、`HashingWriteBuffer` といった名前を見れば、用途はおおよそ想像できるでしょう。 - -Read/WriteBuffer はバイトのみを扱います。入出力のフォーマット処理を支援するため、`ReadHelpers` と `WriteHelpers` ヘッダファイル内に補助関数が用意されています。たとえば、数値を 10 進数形式で書き出すためのヘルパーがあります。 - -`JSON` 形式の結果セットを標準出力に書き出したいときに何が起こるかを見てみましょう。 -プル型の `QueryPipeline` からフェッチできる状態の結果セットがあるとします。 -まず、標準出力にバイトを書き込むために、`WriteBufferFromFileDescriptor(STDOUT_FILENO)` を作成します。 -次に、クエリパイプラインの結果を `JSONRowOutputFormat` に接続します。これはその `WriteBuffer` で初期化され、行を `JSON` 形式で標準出力に書き出します。 -これは、プル型の `QueryPipeline` を完了した `QueryPipeline` に変換する `complete` メソッドによって実行できます。 -内部では、`JSONRowOutputFormat` がさまざまな JSON の区切り記号を書き込み、`IColumn` への参照と行番号を引数として `IDataType::serializeTextJSON` メソッドを呼び出します。その結果、`IDataType::serializeTextJSON` は `WriteHelpers.h` 内のメソッド、たとえば数値型に対しては `writeText`、`DataTypeString` に対しては `writeJSONString` を呼び出します。 - - - -## テーブル {#tables} - -`IStorage` インターフェイスはテーブルを表します。このインターフェイスのさまざまな実装が、それぞれ異なるテーブルエンジンです。例としては `StorageMergeTree`、`StorageMemory` などがあります。これらのクラスのインスタンスがテーブルそのものです。 - -`IStorage` における主要なメソッドは `read` と `write` であり、そのほかにも `alter`、`rename`、`drop` などがあります。`read` メソッドは、テーブルから読み取るカラムの集合、考慮すべき `AST` クエリ、および希望するストリーム数を引数として受け取ります。戻り値は `Pipe` です。 - -ほとんどの場合、`read` メソッドの責務は、指定されたカラムをテーブルから読み取ることに限られ、それ以降のデータ処理は行いません。 -その後のすべてのデータ処理は、パイプラインの別の部分で処理され、`IStorage` の責務範囲外となります。 - -ただし、顕著な例外があります。 - -- AST クエリは `read` メソッドに渡され、テーブルエンジンはそれを利用してインデックスの利用可否を判断し、テーブルから読み取るデータ量を減らすことができます。 -- 場合によっては、テーブルエンジン自体が特定の段階までデータを処理できることがあります。たとえば、`StorageDistributed` はクエリをリモートサーバーに送信し、異なるリモートサーバーからのデータをマージできる段階まで処理するよう依頼し、その前処理済みデータを返すことができます。その後、クエリインタープリタがデータ処理を完了させます。 - -テーブルの `read` メソッドは、複数の `Processor` から成る `Pipe` を返すことができます。これらの `Processor` は、テーブルから並列に読み取ることができます。 -次に、これらの `Processor` を、式の評価やフィルタ処理などのさまざまな変換に接続できます。これらは独立して計算可能です。 -そして、それらの上に `QueryPipeline` を作成し、`PipelineExecutor` を通じて実行します。 - -`TableFunction` も存在します。これは、クエリの `FROM` 句で使用する一時的な `IStorage` オブジェクトを返す関数です。 - -自分のテーブルエンジンをどのように実装するかを手早く把握したい場合は、`StorageMemory` や `StorageTinyLog` のような単純なものを参照してください。 - -> `read` メソッドの結果として、`IStorage` は `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` クエリの解釈結果は「プル型」の `QueryPipeline` であり、結果セットを読み出すための専用の出力ポートを持ちます。 -`INSERT` クエリの解釈結果は「プッシュ型」の `QueryPipeline` であり、挿入するデータを書き込むための入力ポートを持ちます。 -そして `INSERT SELECT` クエリの解釈結果は「完結型」の `QueryPipeline` であり、入力も出力も持ちませんが、`SELECT` から `INSERT` へ同時にデータをコピーします。 - -`InterpreterSelectQuery` は、クエリの解析と変換のために `ExpressionAnalyzer` と `ExpressionActions` の仕組みを使用します。ここでルールベースのクエリ最適化の大部分が行われます。`ExpressionAnalyzer` はかなり込み入っており、書き直すべきです。さまざまなクエリ変換や最適化を別個のクラスに切り出し、クエリをモジュール化して変換できるようにする必要があります。 - -インタープリタに存在する問題に対処するため、新しく `InterpreterSelectQueryAnalyzer` が開発されました。これは `InterpreterSelectQuery` の新バージョンであり、`ExpressionAnalyzer` を使用せず、`AST` と `QueryPipeline` の間に `QueryTree` と呼ばれる追加の抽象化レイヤーを導入します。本番環境でそのまま使用可能な状態ですが、念のため、`enable_analyzer` 設定の値を `false` に設定することで無効化することもできます。 - - - -## 関数 {#functions} - -関数には通常の関数と集約関数があります。集約関数については次のセクションを参照してください。 - -通常の関数は行数を変更せず、各行を独立して処理しているかのように動作します。実際には、関数は個々の行に対して呼び出されるのではなく、ベクトル化されたクエリ実行を実現するために `Block` 単位のデータに対して呼び出されます。 - -[blockSize](/sql-reference/functions/other-functions#blockSize)、[rowNumberInBlock](/sql-reference/functions/other-functions#rowNumberInBlock)、[runningAccumulate](/sql-reference/functions/other-functions#runningAccumulate) のように、ブロック処理を活用し、行間の独立性を破るその他の関数もいくつか存在します。 - -ClickHouse は強い型付けを採用しているため、暗黙の型変換は行われません。関数が特定の型の組み合わせをサポートしていない場合、例外がスローされます。一方で、関数は多くの異なる型の組み合わせに対して動作(オーバーロード)させることができます。例えば、`plus` 関数(`+` 演算子を実装する関数)は、任意の数値型の組み合わせ、`UInt8` + `Float32`、`UInt16` + `Int8` などに対して動作します。また、`concat` 関数のように任意個数の引数を受け取れる可変長引数関数もあります。 - -関数の実装は、サポートするデータ型およびサポートする `IColumns` を明示的にディスパッチする必要があるため、やや扱いにくい場合があります。例えば、`plus` 関数は、各数値型の組み合わせと、左辺および右辺が定数か非定数かの組み合わせごとに、C++ テンプレートのインスタンシエーションによって生成されたコードを持ちます。 - -この部分は、テンプレートコードの肥大化を避けるためにランタイムコード生成を実装するのに非常に適した箇所です。また、fused multiply-add のような融合関数を追加したり、1 回のループ反復で複数の比較を行ったりすることも可能になります。 - -ベクトル化されたクエリ実行により、関数はショートサーキットされません。例えば、`WHERE f(x) AND g(y)` と記述した場合、`f(x)` が 0 である行(`f(x)` が 0 の定数式である場合を除く)であっても、両方の側が計算されます。しかし、`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 Server は POCO C++ Libraries をベースとしており、その設定の表現には `Poco::Util::AbstractConfiguration` を使用します。設定は `DaemonBase` クラスが継承している `Poco::Util::ServerApplication` クラスによって保持されており、この `DaemonBase` を `DB::Server` クラスが継承することで、clickhouse-server 自体を実装しています。したがって、設定には `ServerApplication::config()` メソッドでアクセスできます。 - -設定は複数のファイル(XML または YAML 形式)から読み込まれ、`ConfigProcessor` クラスによって 1 つの `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` は優先度付きのキューにジョブを蓄積します。各ジョブには整数の優先度があります。デフォルトの優先度は 0 です。より高い優先度値を持つすべてのジョブは、より低い優先度値のジョブより先に開始されます。ただし、すでに実行中のジョブ同士には差はないため、優先度が効いてくるのはプールが過負荷の場合にのみです。 - -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` クラスを参照してください)。 - - - -## 同時実行制御 - -並列実行が可能なクエリは、自身を制限するために `max_threads` 設定を使用します。この設定のデフォルト値は、単一クエリがすべての CPU コアを最適な形で利用できるように選択されています。では、複数のクエリが同時に実行されており、それぞれがデフォルトの `max_threads` 設定値を使用している場合はどうなるでしょうか。その場合、クエリ同士で CPU リソースを共有することになります。OS はスレッドを頻繁に切り替えることで公平性を保証しますが、これはある程度の性能低下を招きます。`ConcurrencyControl` は、このペナルティに対処し、大量のスレッド割り当てを避けるのに役立ちます。構成設定 `concurrent_threads_soft_limit_num` は、CPU に負荷をかけ始める前に、どれだけ多くのスレッドを同時に割り当てられるかを制限するために使用されます。 - -CPU の `slot` という概念が導入されます。スロットは同時実行性の単位です。スレッドを実行するには、クエリは事前にスロットを取得し、スレッドが停止したときにそれを解放する必要があります。スロットの数はサーバー全体で制限されています。複数のクエリが同時に実行されていて、総需要がスロット総数を上回る場合、それらのクエリは 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 により、CPU 負荷が高い状況でもクエリは少なくとも 1 本のスレッドで開始し、その後 `max_threads` までスケールアップできます。 - - -## 分散クエリ実行 {#distributed-query-execution} - -クラスタ構成のサーバーは、ほとんどが互いに独立しています。クラスタ内の 1 台またはすべてのサーバー上に `Distributed` テーブルを作成できます。`Distributed` テーブル自体はデータを保存せず、クラスタ内の複数ノード上にあるすべてのローカルテーブルへの「ビュー」を提供するだけです。`Distributed` テーブルに対して SELECT を実行すると、クエリを書き換え、負荷分散設定に従ってリモートノードを選択し、そのノードにクエリを送信します。`Distributed` テーブルは、異なるサーバーからの中間結果をマージできる段階まで、リモートサーバーにクエリ処理を依頼します。その後、中間結果を受け取り、それらをマージします。`Distributed` テーブルは、可能な限り多くの処理をリモートサーバー側に分散させ、ネットワーク経由で送信する中間データ量を抑えようとします。 - -IN 句や JOIN 句のサブクエリが存在し、それぞれが `Distributed` テーブルを使用している場合、状況はさらに複雑になります。このようなクエリの実行には、複数の異なる戦略があります。 - -分散クエリ実行のためのグローバルなクエリプランは存在しません。各ノードは、自身の担当部分に対するローカルなクエリプランのみを持ちます。ここで行っているのは単純な単一パスの分散クエリ実行だけです。つまり、リモートノードにクエリを送信し、その結果をマージします。しかし、カーディナリティの高い `GROUP BY` を含む複雑なクエリや、JOIN のための一時データ量が多いクエリに対しては、この方式では実用的ではありません。そのようなケースでは、サーバー間でデータを「再シャッフル」する必要があり、追加の調整が必要になります。ClickHouse はその種のクエリ実行を現在サポートしておらず、今後対応が必要です。 - - - -## Merge tree {#merge-tree} - -`MergeTree` は、プライマリキーによるインデックスをサポートするストレージエンジンファミリーです。プライマリキーには、任意のカラムや式のタプルを指定できます。`MergeTree` テーブル内のデータは「パーツ」に分割されて保存されます。各パーツはプライマリキー順でデータを保持するため、データはプライマリキータプルに対して辞書順に並びます。テーブル内のすべてのカラムは、これらのパーツ内の個別の `column.bin` ファイルに格納されます。ファイルは圧縮ブロックで構成されています。各ブロックは、平均的な値のサイズにもよりますが、通常は非圧縮データで 64 KB から 1 MB の範囲です。ブロックは、カラム値が互いに連続して配置されたものです。カラム値は各カラムで同じ順序(プライマリキーが順序を定義)になるため、多数のカラムを走査すると、対応する行の値を取得できます。 - -プライマリキー自体は「疎」です。すべての行を指すのではなく、一部のデータ範囲だけを指します。別途 `primary.idx` ファイルがあり、ここには N 行ごとのプライマリキーの値が格納されます。この N は `index_granularity` と呼ばれます(通常、N = 8192)。また、各カラムについては「マーク」を格納した `column.mrk` ファイルがあり、これはデータファイル内の N 行ごとのオフセットです。各マークは 2 つの値のペアで構成されます:圧縮ブロックの先頭へのファイル内オフセットと、展開済みブロック内でのデータ先頭へのオフセットです。通常、圧縮ブロックはマークに揃えられており、展開済みブロック内でのオフセットは 0 になります。`primary.idx` のデータは常にメモリ上にあり、`column.mrk` ファイルのデータはキャッシュされます。 - -`MergeTree` のパーツから何かを読み取るときは、まず `primary.idx` のデータを参照して、要求されたデータを含む可能性のある範囲を特定し、その後 `column.mrk` のデータを参照して、それらの範囲の読み取り開始位置となるオフセットを計算します。インデックスが疎であるため、余分なデータが読み込まれる場合があります。ClickHouse は単純なポイントクエリを高頻度で処理する用途には適していません。各キーに対して `index_granularity` 行を含む範囲全体を読み出す必要があり、かつ各カラムについて圧縮ブロック全体を展開する必要があるためです。インデックスを疎にしたのは、インデックスのメモリ消費を増やすことなく、単一サーバーあたり数兆行を維持できるようにするためです。また、プライマリキーが疎であるため、プライマリキーは一意ではありません。INSERT 時に、そのキーがテーブル内に存在するかどうかを検査することはできません。同じキーを持つ行をテーブル内に多数含めることができます。 - -`MergeTree` に対してデータを `INSERT` する場合、挿入されたデータのまとまりはプライマリキー順にソートされ、新しいパーツを形成します。バックグラウンドスレッドが定期的にいくつかのパーツを選択し、それらを 1 つのソート済みパーツにマージして、パーツ数を比較的少なく保ちます。このため「`MergeTree`」と呼ばれています。もちろん、マージ処理により「書き込み増幅」が発生します。すべてのパーツはイミュータブルであり、作成および削除されるだけで、変更されることはありません。SELECT が実行されると、その時点のテーブルのスナップショット(パーツの集合)を保持します。マージ後も、障害発生時のリカバリを容易にするために、古いパーツをしばらく保持します。そのため、マージ済みパーツが破損している可能性があると判断した場合には、そのパーツを元になったパーツ群で置き換えることができます。 - -`MergeTree` は MEMTABLE や LOG を含まないため、LSM ツリー構造ではありません。挿入されたデータは直接ファイルシステムに書き込まれます。この挙動により、MergeTree はバッチでのデータ挿入に非常に適したものになります。そのため、少量の行を頻繁に挿入するワークロードは MergeTree には最適ではありません。例えば、1 秒あたり数行程度であれば問題ありませんが、それを 1 秒あたり数千回行うようなパターンは MergeTree にとって最適ではありません。ただし、この制約を緩和するために、小さな挿入に対する非同期 INSERT モードが用意されています。このような設計にしたのは、システムを単純に保つためであり、また我々のアプリケーションではすでにバッチでデータを挿入しているためです。 - -バックグラウンドマージ中に追加処理を行う MergeTree エンジンも存在します。例としては `CollapsingMergeTree` や `AggregatingMergeTree` があります。これらは更新処理に対する特別なサポートとみなすことができます。ただし、これらは本当の意味での更新ではないことに注意してください。ユーザーは通常、バックグラウンドマージが実行されるタイミングを制御できず、また `MergeTree` テーブル内のデータは完全にマージされた 1 つのパーツではなく、ほとんど常に複数のパーツに分かれて保存されているためです。 - - - -## レプリケーション {#replication} - -ClickHouse におけるレプリケーションはテーブルごとに設定できます。同一サーバー上で、一部のテーブルはレプリケートし、別のテーブルはレプリケートしない、といった構成が可能です。また、あるテーブルは 2 重レプリケーション、別のテーブルは 3 重レプリケーション、といったように、テーブルごとに異なる方法でレプリケーションを構成することもできます。 - -レプリケーションは `ReplicatedMergeTree` ストレージエンジンで実装されています。`ZooKeeper` 内のパスはストレージエンジンのパラメータとして指定します。`ZooKeeper` 内で同じパスを持つすべてのテーブルは互いのレプリカとなり、データを同期し、一貫性を維持します。レプリカは、テーブルを作成または削除するだけで、動的に追加・削除できます。 - -レプリケーションは非同期マルチマスター方式を採用しています。`ZooKeeper` とのセッションを持つ任意のレプリカにデータを挿入でき、データは他のすべてのレプリカに非同期にレプリケートされます。ClickHouse は UPDATE をサポートしていないため、レプリケーションはコンフリクトフリーです。デフォルトでは挿入に対するクォーラム ACK は行われないため、ノードが 1 台障害を起こした場合、直前に挿入したデータが失われる可能性があります。挿入クォーラムは `insert_quorum` 設定を使用して有効化できます。 - -レプリケーションのメタデータは ZooKeeper に保存されます。そこには、実行すべきアクションの一覧を保持するレプリケーションログがあります。アクションには、パーツの取得、パーツのマージ、パーティションの削除などが含まれます。各レプリカはレプリケーションログを自分のキューにコピーし、そのキューからアクションを実行します。例えば挿入時には、「パーツを取得する」というアクションがログに作成され、すべてのレプリカがそのパーツをダウンロードします。マージは、バイト単位で同一の結果となるよう、レプリカ間で調整されます。すべてのパーツは、すべてのレプリカ上で同じ方法でマージされます。リーダーの 1 台が最初に新しいマージを開始し、「パーツをマージする」アクションをログに書き込みます。複数のレプリカ(あるいはすべて)が同時にリーダーになることができます。`merge_tree` 設定の `replicated_can_become_leader` を使用することで、あるレプリカをリーダーになれないようにすることができます。リーダーはバックグラウンドマージのスケジューリングを担当します。 - -レプリケーションは物理的に行われます。ノード間で転送されるのはクエリではなく、圧縮されたパーツのみです。ネットワーク増幅を避けてネットワークコストを抑えるため、マージはほとんどの場合、各レプリカ上で独立して処理されます。大きなマージ済みパーツがネットワーク越しに送信されるのは、レプリケーション遅延が大きい場合に限られます。 - -加えて、各レプリカは、自身の状態(パーツの集合とそのチェックサム)を ZooKeeper 内に保持しています。ローカルファイルシステム上の状態が ZooKeeper 内の参照状態と乖離した場合、レプリカは他のレプリカから不足しているパーツや破損しているパーツをダウンロードして、一貫性を復元します。ローカルファイルシステムに予期しないデータや破損したデータが存在する場合、ClickHouse はそれらを削除せず、別ディレクトリへ移動し、以後参照しないようにします。 - -:::note -ClickHouse クラスターは互いに独立したシャードで構成され、各シャードは複数のレプリカで構成されます。クラスターは**エラスティックではない**ため、新しいシャードを追加しても、シャード間でデータが自動的に再バランスされることはありません。その代わり、クラスターへの負荷は不均一であることを前提として調整されます。この実装はより細かな制御を可能にし、ノード数が数十程度の比較的小規模なクラスターでは問題ありません。しかし、私たちが本番環境で使用している数百ノード規模のクラスターでは、このアプローチは大きな欠点となります。クラスター全体にまたがり、動的にレプリケートされるリージョンを持ち、それらを自動的に分割およびクラスター間でバランスできるようなテーブルエンジンを実装する必要があります。 -::: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-arm.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-arm.md deleted file mode 100644 index 9fb456d8d01..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-arm.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -description: 'AARCH64 アーキテクチャ向け ClickHouse をソースコードからビルドするためのガイド' -sidebar_label: 'Linux 上での AARCH64 向けビルド' -sidebar_position: 25 -slug: /development/build-cross-arm -title: 'Linux 上で AARCH64 向け ClickHouse をビルドする方法' -doc_type: 'guide' ---- - -# Linux 上で AArch64 向けに ClickHouse をビルドする方法 - -AArch64 マシン上で AArch64 向けに ClickHouse をビルドする場合、特別な手順は必要ありません。 - -x86 Linux マシン上で AArch64 向けに ClickHouse をクロスコンパイルするには、`cmake` に次のフラグを指定します: `-DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake` \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md deleted file mode 100644 index c729981e2df..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: 'LoongArch64 アーキテクチャ向けに ClickHouse をソースコードからビルドするためのガイド' -sidebar_label: 'LoongArch64 向け Linux 上でのビルド' -sidebar_position: 35 -slug: /development/build-cross-loongarch -title: 'LoongArch64 向け Linux 上でのビルド' -doc_type: 'guide' ---- - - - -# Linux 上での LoongArch64 向けビルド - -ClickHouse は LoongArch64 を実験的にサポートしています - - - -## ClickHouse をビルドする - -ビルドに必要な LLVM のバージョンは 19.1.0 以上である必要があります。 - -```bash -cd ClickHouse -mkdir build-loongarch64 -CC=clang-19 CXX=clang++-19 cmake . -Bbuild-loongarch64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-loongarch64.cmake -ninja -C build-loongarch64 -``` - -生成されるバイナリは、LoongArch64 CPU アーキテクチャの Linux 環境でのみ実行できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-osx.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-osx.md deleted file mode 100644 index b279a8ab85d..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-osx.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: 'Linux 上で macOS システム向けの ClickHouse をクロスコンパイルするためのガイド' -sidebar_label: 'Linux で macOS 向けにビルド' -sidebar_position: 20 -slug: /development/build-cross-osx -title: 'Linux で macOS 向けにビルド' -doc_type: 'guide' ---- - - - -# Linux 上で macOS 向けの ClickHouse をビルドする方法 - -このドキュメントは、Linux マシンを使って OS X 上で実行する `clickhouse` バイナリをビルドしたい場合の手順です。 -主なユースケースは、Linux マシン上で実行される継続的インテグレーション(CI)チェックです。 -ClickHouse を直接 macOS 上でビルドしたい場合は、[ネイティブビルド手順](../development/build-osx.md)を参照してください。 - -macOS 向けのクロスビルドは [ビルド手順](../development/build.md) に基づいているため、まずそちらに従ってください。 - -以下のセクションでは、`x86_64` macOS 向けに ClickHouse をビルドする手順を説明します。 -ARM アーキテクチャをターゲットにする場合は、すべての `x86_64` を `aarch64` に置き換えてください。 -たとえば、手順全体を通して `x86_64-apple-darwin` を `aarch64-apple-darwin` に置き換えます。 - - - -## クロスコンパイル用ツールセットをインストールする - -`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 をビルドする - -```bash -cd ClickHouse -mkdir build-darwin -cd build-darwin -CC=clang-19 CXX=clang++-19 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/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md deleted file mode 100644 index 9344d23a940..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: 'RISC-V 64 アーキテクチャ向けに ClickHouse をソースコードからビルドするためのガイド' -sidebar_label: 'RISC-V 64 向け Linux でのビルド' -sidebar_position: 30 -slug: /development/build-cross-riscv -title: 'Linux 上で RISC-V 64 向けに ClickHouse をビルドする方法' -doc_type: 'guide' ---- - - - -# Linux 上で RISC-V 64 向けに ClickHouse をビルドする方法 - -ClickHouse は RISC-V を実験的にサポートしています。すべての機能を有効にできるわけではありません。 - - - -## ClickHouse をビルドする - -RISC-V ではないマシン上で RISC-V 向けにクロスコンパイルするには: - -```bash -cd ClickHouse -mkdir build-riscv64 -CC=clang-19 CXX=clang++-19 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/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md deleted file mode 100644 index 969418a150e..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -description: 's390x アーキテクチャ向けに ClickHouse をソースからビルドするためのガイド' -sidebar_label: 'Linux 上での s390x (zLinux) 向けビルド' -sidebar_position: 30 -slug: /development/build-cross-s390x -title: 'Linux 上での s390x (zLinux) 向けビルド' -doc_type: 'guide' ---- - - - -# Linux 上での s390x(zLinux)向けビルド - -ClickHouse は s390x を実験的にサポートしています。 - - - -## s390x 向けの ClickHouse のビルド - -s390x には、OpenSSL 関連のビルドオプションが 2 つあります。 - -* デフォルトでは、s390x 上では OpenSSL は共有ライブラリとしてビルドされます。これは、他のすべてのプラットフォームでは 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](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) 拡張機能が必要です。 -* [CMake Variants](https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/variants.md) を使用している場合、[Command Variable](https://github.com/rioj7/command-variable) 拡張機能を使うと動的な起動に役立ちます。 -* バックエンドとして使用する 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: デバッグ情報を出力する - buildType: Debug - release: - short: Release - long: 生成コードを最適化する - buildType: Release - relwithdebinfo: - short: RelWithDebInfo - long: デバッグ情報付きリリース - buildType: RelWithDebInfo - tsan: - short: MinSizeRel - long: 最小サイズリリース - buildType: MinSizeRel - -toolchain: - default: default - description: ツールチェーンを選択する - 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) qemuでs390xを起動", - "targetCreateCommands": ["target create ${command:cmake.launchTargetPath}"], - "processCreateCommands": ["gdb-remote 2159"], - "preLaunchTask": "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 'デバッガセッションを開始します' -cd $1 -qemu-s390x-static -g 2159 -L /usr/s390x-linux-gnu $2 $3 $4 -``` - -#### tasks.json - -`programs/server/config.xml` の設定を使用して、バイナリと同じディレクトリ内にある `tmp` フォルダーでコンパイル済み実行ファイルを `server` モードで実行するタスクを定義します。 - -```json -{ - "version": "2.0.0", - "tasks": [ - { - "label": "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": "^デバッガーセッションを開始", - "endsPattern": ".*" - } - } - ] - } - ] -} -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-e2k.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build-e2k.md deleted file mode 100644 index b859fdb2de3..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-e2k.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -description: 'E2K アーキテクチャ向けに ClickHouse をソースコードからビルドするためのガイド' -sidebar_label: 'Linux での E2K 向けビルド' -sidebar_position: 35 -slug: /development/build-e2k -title: 'Linux での E2K 向けビルド' -doc_type: 'guide' ---- - - - -# E2K 向け Linux 上でのビルド - -ClickHouse は E2K (Elbrus-2000) を非常に実験的にサポートしており、boost、croaring、libunwind、zstd などの e2k 向けにカスタムビルドされたライブラリを使用した最小限の構成で、ネイティブモードでのみコンパイル可能です。 - - - -## ClickHouse をビルドする - -ビルドに必要な LLVM のバージョンは 20.1.8 以上が必要です。 - -```bash -cd ClickHouse -mkdir build-e2k -cmake -DCMAKE_CROSSCOMPILING=OFF -DCOMPILER_CACHE=disabled \ - -DCMAKE_C_COMPILER=/usr/lib/llvm-20/bin/clang -DCMAKE_CXX_COMPILER=/usr/lib/llvm-20/bin/clang++ \ - -DLLD_PATH=/usr/lib/llvm-20/bin/ld.lld \ - -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \ - -DGLIBC_COMPATIBILITY=OFF -DENABLE_JEMALLOC=OFF -DENABLE_LIBRARIES=OFF \ - -DENABLE_SSL=OFF -DWERROR=OFF -DUSE_SIMDJSON=OFF -DENABLE_TESTS=OFF -DBOOST_USE_UCONTEXT=ON .. -ninja -j8 -``` - -生成されたバイナリは、E2K CPU アーキテクチャの Linux 環境でのみ実行できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-osx.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build-osx.md deleted file mode 100644 index 200c296a2fe..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build-osx.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -description: 'macOS システム上で ClickHouse をソースからビルドするためのガイド' -sidebar_label: 'macOS 上での macOS 向けビルド' -sidebar_position: 15 -slug: /development/build-osx -title: 'macOS 上での macOS 向けビルド' -keywords: ['macOS', 'Mac', 'ビルド'] -doc_type: 'guide' ---- - - - -# macOS 向けに macOS 上で ClickHouse をビルドする方法 - -:::info ClickHouse を自分でビルドする必要はありません! -[Quick Start](https://clickhouse.com/#quick-start) に記載されている手順に従って、事前にビルド済みの ClickHouse をインストールできます。 -::: - -ClickHouse は、macOS 10.15 (Catalina) 以降の macOS 上で、x86_64 (Intel) および arm64 (Apple Silicon) 向けにコンパイルできます。 - -コンパイラとしては、Homebrew の Clang のみがサポートされています。 - - - -## 前提条件をインストールする - -まず、共通の[前提条件ドキュメント](developer-instruction.md)を参照してください。 - -次に、[Homebrew](https://brew.sh/) をインストールし、次を実行します: - -その後、次を実行します: - -```bash -brew update -brew install ccache cmake ninja libtool gettext llvm lld binutils grep findutils nasm bash rust rustup -``` - -:::note -Apple はデフォルトで大文字・小文字を区別しないファイルシステムを使用します。通常はコンパイルには影響しません(特に scratch での make は問題なく動作します)が、`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 -S . -B build -cmake --build build -# 生成されるバイナリは次の場所に作成されます: build/programs/clickhouse -``` - -:::note -リンク時に `ld: archive member '/' not a mach-o file in ...` エラーが発生する場合は、 -フラグ `-DCMAKE_AR=/opt/homebrew/opt/llvm/bin/llvm-ar` を指定して llvm-ar を使用する必要がある場合があります。 -::: - - -## 注意点 - -`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` コマンドを実行します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/build.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/build.md deleted file mode 100644 index 07da31b680c..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/build.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -description: 'Linux システム上で ClickHouse をソースからビルドするためのステップバイステップガイド' -sidebar_label: 'Linux でビルド' -sidebar_position: 10 -slug: /development/build -title: 'Linux で ClickHouse をビルドする方法' -doc_type: 'guide' ---- - - - -# Linux 上で ClickHouse をビルドする方法 - -:::info ClickHouse を自分でビルドする必要はありません! -[Quick Start](https://clickhouse.com/#quick-start) に記載されているように、事前にビルド済みの ClickHouse をインストールできます。 -::: - -ClickHouse は以下のプラットフォーム上でビルドできます: - -- x86_64 -- AArch64 -- PowerPC 64 LE(実験的) -- s390/x(実験的) -- RISC-V 64(実験的) - - - -## 前提条件 {#assumptions} - -このチュートリアルは Ubuntu Linux をベースとしていますが、適切な変更を加えれば他の Linux ディストリビューションでも動作するはずです。 -開発用として推奨される最小の Ubuntu バージョンは 24.04 LTS です。 - -このチュートリアルは、ClickHouse リポジトリとそのすべてのサブモジュールがローカル環境にチェックアウト済みであることを前提としています。 - - - -## 前提条件をインストールする - -まず、共通の[前提条件のドキュメント](developer-instruction.md)を参照してください。 - -ClickHouse はビルドに CMake と Ninja を使用します。 - -ビルド時に既にコンパイル済みのオブジェクトファイルを再利用できるように、任意で ccache をインストールできます。 - -```bash -sudo apt-get update -sudo apt-get install build-essential git cmake ccache python3 ninja-build nasm yasm gawk lsb-release wget software-properties-common gnupg -``` - - -## Clang コンパイラをインストールする - -Ubuntu/Debian に Clang をインストールするには、[こちら](https://apt.llvm.org/)から LLVM 提供の自動インストールスクリプトを使用してください。 - -```bash -sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" -``` - -他の Linux ディストリビューションの場合は、LLVM の[事前ビルド済みパッケージ](https://releases.llvm.org/download.html)をインストールできるか確認してください。 - -2025 年 3 月時点では、Clang 19 以降が必要です。 -GCC やその他のコンパイラはサポートされていません。 - - -## Rust コンパイラをインストールする(任意) {#install-the-rust-compiler-optional} - -:::note -Rust は ClickHouse のオプションの依存関係です。 -Rust がインストールされていない場合、ClickHouse の一部の機能はコンパイルされません。 -::: - -まず、公式の [Rust ドキュメント](https://www.rust-lang.org/tools/install)の手順に従って `rustup` をインストールします。 - -C++ の依存関係と同様に、ClickHouse は vendoring(ベンダリング)を使用して、何がインストールされるかを正確に制御し、(`crates.io` レジストリのような)サードパーティサービスへの依存を避けています。 - -リリースモードでは、最新の rustup ツールチェーンであればどのバージョンでもこれらの依存関係は動作するはずですが、サニタイザを有効にする予定がある場合は、CI で使用しているものとまったく同じ `std` に一致するバージョン(そのための crate を vendoring しています)を使用する必要があります。 - - - -```bash -rustup toolchain install nightly-2025-07-07 -rustup default nightly-2025-07-07 -rustup component add rust-src -``` - -## ClickHouse のビルド - -すべてのビルド成果物を格納する専用ディレクトリ `build` を `ClickHouse` ディレクトリ内に作成することを推奨します。 - -```sh -mkdir build -cd build -``` - -異なるビルドタイプごとに(例:`build_release`、`build_debug` など)、複数のディレクトリを用意できます。 - -オプション: 複数のコンパイラバージョンがインストールされている場合、使用するコンパイラを明示的に指定することもできます。 - -```sh -export CC=clang-19 -export CXX=clang++-19 -``` - -開発用途では、`debug` ビルドを推奨します。 -`release` ビルドと比較してコンパイラ最適化レベル(`-O`)が低く、よりデバッグしやすくなります。 -また、`LOGICAL_ERROR` 型の内部例外は、穏やかに処理されるのではなく、即座にクラッシュを引き起こします。 - -```sh -cmake -D CMAKE_BUILD_TYPE=Debug .. -``` - -:::note -gdb などのデバッガを使用したい場合は、上記のコマンドに `-D DEBUG_O_LEVEL="0"` を追加して、すべてのコンパイラ最適化を無効にしてください。コンパイラ最適化により、gdb が変数を表示・参照できなくなる場合があります。 -::: - -ビルドするには ninja を実行します。 - -```sh -ninja clickhouse -``` - -すべてのバイナリ(ユーティリティとテスト)をビルドするには、引数を付けずに `ninja` を実行します: - -```sh -ninja -``` - -並列ビルドジョブの数は、パラメーター `-j` で制御できます。 - -```sh -ninja -j 1 clickhouse-server clickhouse-client -``` - -:::tip -CMake では、上記のコマンドを簡略化するためのショートカットが用意されています。 - -```sh -cmake -S . -B build # ビルドを構成、リポジトリのトップレベルディレクトリから実行 -cmake --build build # コンパイル -``` - -::: - - -## ClickHouse 実行ファイルの実行 - -ビルドが正常に完了すると、実行ファイルは `ClickHouse//programs/` に生成されます。 - -ClickHouse サーバーは、カレントディレクトリで設定ファイル `config.xml` を探します。 -または、コマンドラインで `-C` オプションを指定して設定ファイルを明示的に指定できます。 - -`clickhouse-client` を使用して ClickHouse サーバーに接続するには、別のターミナルを開き、`ClickHouse/build/programs/` に移動して `./clickhouse client` を実行します。 - -macOS または FreeBSD で `Connection refused` というメッセージが表示される場合は、ホストアドレスとして 127.0.0.1 を指定してください。 - -```bash -clickhouse client --host 127.0.0.1 -``` - - -## 高度なオプション - -### 最小構成でのビルド - -サードパーティ製ライブラリが提供する機能が不要な場合は、ビルド時間をさらに短縮できます。 - -```sh -cmake -DENABLE_LIBRARIES=OFF -``` - -問題が発生した場合は、すべて自己解決していただくことになります... - -Rust の利用にはインターネット接続が必要です。Rust サポートを無効にするには、次のようにします: - -```sh -cmake -DENABLE_RUST=OFF -``` - -### ClickHouse 実行ファイルの実行 - -システムにインストールされている本番環境版の ClickHouse バイナリを、コンパイル済みの ClickHouse バイナリに置き換えることができます。 -そのためには、公式ウェブサイトの手順に従ってマシンに ClickHouse をインストールしてください。 -次に、以下を実行します: - -```bash -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 バイナリを実行することもできます。 - -```bash -sudo service clickhouse-server stop -sudo -u clickhouse ClickHouse/build/programs/clickhouse server --config-file /etc/clickhouse-server/config.xml -``` - -### 任意の Linux 上でのビルド - -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 と同様の環境で、任意のビルドを次のコマンドを使ってローカルで実行できます: - -```bash -python -m ci.praktika "BUILD_JOB_NAME" -``` - -ここで BUILD_JOB_NAME は CI レポートに表示されるジョブ名であり、例えば "Build (arm_release)" や "Build (amd_debug)" などです。 - -このコマンドは、必要な依存関係がすべて含まれた適切な Docker イメージ `clickhouse/binary-builder` を取得して、 -その中でビルドスクリプト `./ci/jobs/build_clickhouse.py` を実行します。 - -ビルド成果物は `./ci/tmp/` に配置されます。 - -これは AMD と ARM の両方のアーキテクチャで動作し、Docker 以外に追加の依存関係は必要ありません。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md deleted file mode 100644 index 0cd5b7f0f56..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -description: 'DEFLATE_QPL Codec を用いて ClickHouse をビルドし、ベンチマークを実行する方法' -sidebar_label: 'DEFLATE_QPL のビルドとベンチマーク' -sidebar_position: 73 -slug: /development/building_and_benchmarking_deflate_qpl -title: 'DEFLATE_QPL を使用して ClickHouse をビルドする' -doc_type: 'guide' ---- - - - -# DEFLATE_QPL を使用して ClickHouse をビルドする - -- ホストマシンが QPL の要求する[前提条件](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#prerequisites)を満たしていることを確認してください -- `cmake` ビルド時には `deflate_qpl` はデフォルトで有効になっています。誤って設定を変更してしまった場合は、ビルドフラグ `ENABLE_QPL=1` になっていることを必ず再確認してください - -- 一般的な要件については、ClickHouse の一般的な[ビルド手順](/development/build.md)を参照してください - - - -# DEFLATE_QPL を使ってベンチマークを実行する - - - -## ファイル一覧 {#files-list} - -[qpl-cmake](https://github.com/ClickHouse/ClickHouse/tree/master/contrib/qpl-cmake) 配下の `benchmark_sample` フォルダには、Python スクリプトを用いてベンチマークを実行するためのサンプルが含まれています。 - -`client_scripts` には、代表的なベンチマークを実行するための Python スクリプトが含まれています。例えば: -- `client_stressing_test.py`: 1〜4 台のサーバーインスタンスに対してクエリのストレステストを行う Python スクリプト。 -- `queries_ssb.sql`: [Star Schema Benchmark](/getting-started/example-datasets/star-schema/) の全クエリを列挙したファイル。 -- `allin1_ssb.sh`: ベンチマークのワークフローを自動で一括実行するシェルスクリプト。 - -`database_files` には、lz4/deflate/zstd コーデックごとにデータベースファイルが保存されます。 - - - -## スター・スキーマ向けベンチマークを自動実行する: - -```bash -$ cd ./benchmark_sample/client_scripts -$ sh run_ssb.sh -``` - -処理が完了したら、`./output/` フォルダ内のすべての結果を確認してください。 - -失敗した場合は、以下のセクションに従ってベンチマークを手動で実行してください。 - - -## 定義 {#definition} - -[CLICKHOUSE_EXE] は ClickHouse の実行可能ファイルへのパスを表します。 - - - -## 環境 - -* CPU: Sapphire Rapid -* OS 要件については [System Requirements for QPL](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#system-requirements) を参照してください -* IAA のセットアップについては [Accelerator Configuration](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#accelerator-configuration) を参照してください -* Python モジュールをインストールします: - -```bash -pip3 install clickhouse_driver numpy -``` - -[IAA の自己チェック] - -```bash -$ accel-config list | grep -P 'iax|state' -``` - -期待される出力は次のとおりです: - -```bash - "dev":"iax1", - "state":"有効", - "state":"有効", -``` - -何も出力されない場合は、IAA の準備がまだ整っていないことを意味します。IAA のセットアップを再度確認してください。 - - -## 未加工データを生成する - -```bash -$ cd ./benchmark_sample -$ mkdir rawdata_dir && cd rawdata_dir -``` - -[`dbgen`](/getting-started/example-datasets/star-schema) を使用し、次のパラメータで 1 億行のデータを生成します: --s 20 - -`*.tbl` のようなファイルは、`./benchmark_sample/rawdata_dir/ssb-dbgen` 配下に出力されます: - - -## データベースのセットアップ - -LZ4 コーデックを使用したデータベースのセットアップ - -```bash -$ cd ./database_dir/lz4 -$ [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -コンソールに `Connected to ClickHouse server` というメッセージが表示されていれば、クライアントがサーバーへの接続を正常に確立できたことを意味します。 - -[Star Schema Benchmark](/getting-started/example-datasets/star-schema) で説明されている以下の 3 ステップを完了します。 - -* ClickHouse にテーブルを作成します -* データを挿入します。ここでは入力データとして `./benchmark_sample/rawdata_dir/ssb-dbgen/*.tbl` を使用します。 -* "star schema" を非正規化した "flat schema" に変換します - -IAA Deflate コーデックを使用してデータベースをセットアップします。 - -```bash -$ cd ./database_dir/deflate -$ [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -上記の lz4 と同様に 3 つの手順を完了します - -ZSTD コーデックを使用してデータベースをセットアップします - -```bash -$ cd ./database_dir/zstd -$ [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -上記の lz4 と同様に、同じ 3 つの手順を実行してください - -[self-check] -各コーデック(lz4/zstd/deflate)について、データベースが正しく作成されていることを確認するために、次のクエリを実行してください: - -```sql -SELECT count() FROM lineorder_flat -``` - -想定される出力は次のとおりです: - -```sql -┌───count()─┐ -│ 119994608 │ -└───────────┘ -``` - -[IAA Deflate コーデックのセルフチェック] - -クライアントから初めて挿入やクエリを実行した際に、ClickHouse サーバーのコンソールには次のログが出力されるはずです: - -```text -ハードウェアアクセラレーション対応DeflateQplコーデックが利用可能になりました! -``` - -もしこれが一度も出力されず、代わりに次のような別のログが表示される場合: - -```text -ハードウェアアクセラレーション対応DeflateQplコーデックの初期化に失敗しました -``` - -これは IAA デバイスが使用可能な状態になっていないことを意味します。IAA のセットアップをもう一度確認する必要があります。 - - -## 単一インスタンスでのベンチマーク - -* ベンチマークを開始する前に、C6 を無効化し、CPU周波数ガバナーを `performance` に設定してください - -```bash -$ cpupower idle-set -d 3 -$ cpupower frequency-set -g performance -``` - -* ソケットをまたぐメモリアクセスによるボトルネックの影響を排除するため、`numactl` を使用してサーバーを一方のソケットに、クライアントをもう一方のソケットにバインドします。 -* シングルインスタンスとは、1つのサーバーが1つのクライアントに接続されている構成を意味します。 - -次に、LZ4/Deflate/ZSTD のベンチマークをそれぞれ実行します: - -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > lz4.log -``` - -IAA Deflate: - -```bash -$ cd ./database_dir/deflate -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > deflate.log -``` - -ZSTD: - -```bash -$ cd ./database_dir/zstd -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > zstd.log -``` - -これで、想定どおり 3 件のログが出力されるはずです。 - -```text -lz4.log -deflate.log -zstd.log -``` - -パフォーマンスメトリクスの確認方法: - -QPS を中心に確認します。キーワード `QPS_Final` を検索し、統計情報を収集してください - - -## マルチインスタンスでのベンチマーク - -* メモリボトルネックがスレッド数の増加に与える影響を抑えるため、マルチインスタンス構成でベンチマークを実行することを推奨します。 -* マルチインスタンスとは、複数(2 または 4)台のサーバーがそれぞれ個別のクライアントに接続されている構成を指します。 -* 1 ソケット内のコアは均等に分割し、各サーバーにそれぞれ割り当てる必要があります。 -* マルチインスタンスの場合、各 codec 用に新しいディレクトリを作成し、シングルインスタンスと同様の手順でデータセットを挿入する必要があります。 - -主な違いは 2 つあります: - -* クライアント側では、テーブル作成およびデータ挿入時に、割り当てられたポートで ClickHouse を起動する必要があります。 -* サーバー側では、ポートが割り当てられた特定の XML 設定ファイルを指定して ClickHouse を起動する必要があります。マルチインスタンス用のすべてのカスタマイズ済み XML 設定ファイルは、./server_config 配下に用意されています。 - -ここでは、1 ソケットあたり 60 コアあり、2 インスタンスを起動する例を示します。 -最初のインスタンス用のサーバーを起動します -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -``` - -ZSTD: - -```bash -$ cd ./database_dir/zstd -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -``` - -IAA Deflate: - -```bash -$ cd ./database_dir/deflate -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -``` - -[2つ目のインスタンス用サーバーを起動する] - -LZ4: - -```bash -$ cd ./database_dir && mkdir lz4_s2 && cd lz4_s2 -$ cp ../../server_config/config_lz4_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null& -``` - -ZSTD: - -```bash -$ cd ./database_dir && mkdir zstd_s2 && cd zstd_s2 -$ cp ../../server_config/config_zstd_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null& -``` - -IAA Deflate: - -```bash -$ cd ./database_dir && mkdir deflate_s2 && cd deflate_s2 -$ cp ../../server_config/config_deflate_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null& -``` - -第2インスタンス向けテーブルの作成とデータ挿入 - -テーブルの作成: - -```bash -$ [CLICKHOUSE_EXE] client -m --port=9001 -``` - -データの挿入: - -```bash -$ [CLICKHOUSE_EXE] client --query "INSERT INTO [TBL_FILE_NAME] FORMAT CSV" < [TBL_FILE_NAME].tbl --port=9001 -``` - -* [TBL_FILE_NAME] は、`./benchmark_sample/rawdata_dir/ssb-dbgen` 配下にあり、正規表現 *. tbl にマッチするファイルの名前を表します。 -* `--port=9001` はサーバーインスタンスに割り当てられたポートを表し、config_lz4_s2.xml/config_zstd_s2.xml/config_deflate_s2.xml でも定義されています。さらに多くのインスタンスを起動する場合は、s3/s4 インスタンスをそれぞれ表す 9002/9003 に置き換える必要があります。指定しない場合、デフォルトのポートは 9000 で、これは最初のインスタンスで使用されています。 - -2 インスタンスでのベンチマーク - -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ cd ./database_dir/lz4_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > lz4_2insts.log -``` - -ZSTD: - - -```bash -$ cd ./database_dir/zstd -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ cd ./database_dir/zstd_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > zstd_2insts.log -``` - -IAA deflate - -```bash -$ cd ./database_dir/deflate -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ cd ./database_dir/deflate_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > deflate_2insts.log -``` - -ここで、client_stressing_test.py の最後の引数 `2` はインスタンス数を表します。インスタンス数を増やす場合は、この値を 3 または 4 に変更してください。このスクリプトは最大 4 インスタンスまでサポートします。 - -これで、期待どおり 3 件のログが出力されるはずです。 - -```text -lz4_2insts.log -deflate_2insts.log -zstd_2insts.log -``` - -パフォーマンスメトリクスの確認方法: - -ここでは QPS に注目します。キーワード `QPS_Final` を検索し、統計情報を収集してください。 - -4 インスタンス構成でのベンチマーク環境は、上記の 2 インスタンス構成の場合と同様です。 -レビュー用の最終レポートには、2 インスタンス構成のベンチマークデータを採用することを推奨します。 - - -## ヒント - -新しい ClickHouse サーバーを起動する前には毎回、バックグラウンドで動作している ClickHouse プロセスがないことを必ず確認し、残っている古いプロセスがあれば終了させてください。 - -```bash -$ ps -aux| grep clickhouse -$ kill -9 [PID] -``` - -./client_scripts/queries_ssb.sql 内のクエリ一覧を公式の [Star Schema Benchmark](/getting-started/example-datasets/star-schema) と比較すると、Q1.2 / Q1.3 / Q3.4 の 3 つのクエリが含まれていないことが確認できます。これは、これらのクエリでは CPU 使用率が 10% 未満と非常に低く、性能差を示すことができないためです。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/continuous-integration.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/continuous-integration.md deleted file mode 100644 index 73f5809c047..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/continuous-integration.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -description: 'ClickHouse の継続的インテグレーション (CI) システムの概要' -sidebar_label: '継続的インテグレーション (CI)' -sidebar_position: 55 -slug: /development/continuous-integration -title: '継続的インテグレーション (CI)' -doc_type: 'reference' ---- - - - -# 継続的インテグレーション (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 チェックを再実行するには、空のコミットをプッシュしてプルリクエストを更新します。 - -```shell -git reset -git commit --allow-empty -git push -``` - -どうすればよいか分からない場合は、メンテナーに相談してください。 - - -## master とのマージ {#merge-with-master} - -PR が master にマージ可能であることを確認します。 -マージできない場合は、`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 {#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) 用に、その変更内容を説明するユーザー向けメッセージを記述する必要があります。 - - - -## Docker image {#docker-image} - -ClickHouse server および keeper 用の Docker イメージをビルドし、正しくビルドできることを検証します。 - -### Official docker library tests {#official-docker-library-tests} - -[official Docker library](https://github.com/docker-library/official-images/tree/master/test#alternate-config-files) に含まれるテストを実行し、`clickhouse/clickhouse-server` Docker イメージが正しく動作することを検証します。 - -新しいテストを追加するには、`ci/jobs/scripts/docker_server/tests/$test_name` ディレクトリを作成し、その中に `run.sh` スクリプトを配置します。 - -テストの詳細については、[CI jobs scripts documentation](https://github.com/ClickHouse/ClickHouse/tree/master/ci/jobs/scripts/docker_server) を参照してください。 - - - -## マーカー確認 {#marker-check} - -このチェックは、CI システムがプルリクエストの処理を開始したことを意味します。 -ステータスが `pending` の場合は、すべてのチェックがまだ開始されていないことを意味します。 -すべてのチェックが開始されると、ステータスは `success` に変更されます。 - - - -## スタイルチェック - -コードベースに対してさまざまなスタイルチェックを実行します。 - -Style Check ジョブで実行される基本的なチェックは次のとおりです。 - -##### cpp - -[`ci/jobs/scripts/check_style/check_cpp.sh`](https://github.com/ClickHouse/ClickHouse/blob/master/ci/jobs/scripts/check_style/check_cpp.sh) スクリプト(ローカルでも実行可能)を使用して、単純な正規表現ベースのコードスタイルチェックを行います。\ -失敗した場合は、[コードスタイルガイド](style.md) に従ってスタイル上の問題を修正してください。 - -##### codespell, aspell - -文法ミスや綴りの誤りをチェックします。 - -##### mypy - -Python コードに対して静的型チェックを実行します。 - -### スタイルチェックジョブをローカルで実行する - -*Style Check* ジョブ全体は、Docker コンテナ内でローカルに実行できます: - -```sh -python -m ci.praktika run "Style check" -``` - -特定のチェック(例:*cpp* チェック)を実行するには: - -```sh -python -m ci.praktika run "Style check" --test cpp -``` - -これらのコマンドは `clickhouse/style-test` の Docker イメージを取得して、コンテナ環境でジョブを実行します。 -Python 3 と Docker 以外に必要な依存関係はありません。 - - -## Fast test - -通常、これは PR に対して最初に実行されるチェックです。 -ClickHouse をビルドし、一部を除くほとんどの [stateless functional tests](tests.md#functional-tests) を実行します。 -これが失敗すると、問題が修正されるまで後続のチェックは実行されません。 -どのテストが失敗したかを確認するにはレポートを参照し、その後[こちら](/development/tests#running-a-test-locally)で説明されているとおりにローカルでその失敗を再現します。 - -#### Fast test をローカルで実行する: - -```sh -python -m ci.praktika run "Fast test" [--test テスト名] -``` - -これらのコマンドは `clickhouse/fast-test` の Docker イメージを取得し、コンテナ化された環境でジョブを実行します。 -Python 3 と Docker 以外の依存関係は必要ありません。 - - -## ビルドチェック - -以降の手順で利用するために、さまざまな構成で ClickHouse をビルドします。 - -### ローカルでのビルドの実行 - -ビルドは、次のコマンドを使用して CI 環境に近い形でローカル実行できます。 - -```bash -python -m ci.praktika run "<ビルドジョブ名>" -``` - -Python 3 と Docker 以外に必要な依存関係はありません。 - -#### 利用可能なビルドジョブ - -ビルドジョブ名は CI レポートに表示されるものと完全に同一です。 - -**AMD64 ビルド:** - -* `Build (amd_debug)` - シンボル付きデバッグビルド -* `Build (amd_release)` - 最適化されたリリースビルド -* `Build (amd_asan)` - Address Sanitizer ビルド -* `Build (amd_tsan)` - Thread Sanitizer ビルド -* `Build (amd_msan)` - Memory Sanitizer ビルド -* `Build (amd_ubsan)` - Undefined Behavior Sanitizer ビルド -* `Build (amd_binary)` - Thin LTO なしのクイックリリースビルド -* `Build (amd_compat)` - 旧システム向け互換ビルド -* `Build (amd_musl)` - musl libc を使用したビルド -* `Build (amd_darwin)` - macOS ビルド -* `Build (amd_freebsd)` - FreeBSD ビルド - -**ARM64 ビルド:** - -* `Build (arm_release)` - ARM64 向け最適化リリースビルド -* `Build (arm_asan)` - ARM64 Address Sanitizer ビルド -* `Build (arm_coverage)` - カバレッジ計測付き ARM64 ビルド -* `Build (arm_binary)` - Thin LTO なしの ARM64 クイックリリースビルド -* `Build (arm_darwin)` - macOS ARM64 ビルド -* `Build (arm_v80compat)` - ARMv8.0 互換ビルド - -**その他のアーキテクチャ:** - -* `Build (ppc64le)` - PowerPC 64-bit Little Endian -* `Build (riscv64)` - RISC-V 64-bit -* `Build (s390x)` - IBM System/390 64-bit -* `Build (loongarch64)` - LoongArch 64-bit - -ジョブが成功すると、ビルド結果は `/ci/tmp/build` ディレクトリで利用可能になります。 - -**注意:** クロスコンパイルを使用する「Other Architectures」カテゴリ以外のビルドでは、指定した `BUILD_JOB_NAME` どおりのビルドを生成するために、ローカルマシンのアーキテクチャがビルドタイプと一致している必要があります。 - -#### 例 - -ローカルでデバッグビルドを実行するには: - -```bash -python -m ci.praktika run "Build (amd_debug)" -``` - - -上記の方法がうまくいかない場合は、ビルドログに出力されている cmake オプションを使用し、[一般的なビルド手順](../development/build.md)に従ってください。 -## Functional stateless tests {#functional-stateless-tests} - -さまざまな構成(release、debug、sanitizer 有効など)でビルドされた ClickHouse バイナリに対して [stateless functional tests](tests.md#functional-tests) を実行します。 -どのテストが失敗しているかをレポートで確認し、[こちら](/development/tests#functional-tests) に記載の手順に従ってローカルでその失敗を再現してください。 -再現には正しいビルド構成を使用する必要がある点に注意してください。あるテストは AddressSanitizer 下では失敗しても、Debug では成功する場合があります。 -[CI build checks page](/install/advanced) からバイナリをダウンロードするか、ローカルでビルドしてください。 - - - -## 結合テスト {#integration-tests} - -[結合テスト](tests.md#integration-tests)を実行します。 - - - -## バグ修正検証チェック {#bugfix-validate-check} - -新しいテスト(機能テストまたは統合テスト)が追加されているか、あるいは master ブランチからビルドしたバイナリで失敗するように既存のテストが変更されているかを確認します。 -このチェックは、プルリクエストに「pr-bugfix」ラベルが付与されたときにトリガーされます。 - - - -## ストレステスト {#stress-test} - -複数のクライアントからステートレスなファンクショナルテストを同時に実行し、同時実行に起因するエラーを検出します。これが失敗した場合は、次を行います。 - - * まず他のすべてのテスト失敗を修正する - * レポートを確認してサーバーログの場所を特定し、エラーの原因となり得る事項がないか確認する - - - -## 互換性チェック {#compatibility-check} - -古い libc バージョンのディストリビューション上で `clickhouse` バイナリが動作するかどうかを確認します。 -失敗した場合は、メンテナーにサポートを依頼してください。 - - - -## AST fuzzer {#ast-fuzzer} - -プログラムエラーを検出するために、ランダムに生成したクエリを実行します。 -失敗した場合は、メンテナーに助けを求めてください。 - - - -## パフォーマンス テスト {#performance-tests} - -クエリのパフォーマンスの変化を測定します。 -これは最も時間のかかるテストで、実行にはおよそ 6 時間弱を要します。 -パフォーマンス テスト レポートの詳細な説明は[こちら](https://github.com/ClickHouse/ClickHouse/tree/master/docker/test/performance-comparison#how-to-read-the-report)にあります。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/contrib.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/contrib.md deleted file mode 100644 index e8ef83d04ad..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/contrib.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: 'ClickHouse におけるサードパーティ製コンポーネントの利用状況と、サードパーティ製ライブラリの追加および管理方法について説明するページ。' -sidebar_label: 'サードパーティライブラリ' -sidebar_position: 60 -slug: /development/contrib -title: 'サードパーティライブラリ' -doc_type: 'reference' ---- - - - -# サードパーティライブラリ - -ClickHouse は、さまざまな目的でサードパーティライブラリを利用します。たとえば、他のデータベースへの接続、ディスクへの保存/ディスクからの読み込み時のデータのデコード/エンコード、あるいは特定の SQL 関数の実装などです。 -対象システムにインストールされているライブラリに依存しないようにするため、各サードパーティライブラリは Git サブモジュールとして ClickHouse のソースツリーにインポートされ、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) - - -## サードパーティライブラリの追加と保守 {#adding-and-maintaining-third-party-libraries} - -各サードパーティライブラリは、ClickHouse リポジトリの `contrib/` ディレクトリ配下に専用ディレクトリを持つ必要があります。 -ライブラリ用ディレクトリに外部コードをそのままコピーして放り込むことは避けてください。 -代わりに、外部の上流リポジトリからサードパーティコードを取得するための Git サブモジュールを作成してください。 - -ClickHouse で使用されるすべてのサブモジュールは `.gitmodule` ファイルに記載されています。 -- ライブラリをそのまま(デフォルトのケース)利用できる場合は、上流リポジトリを直接参照できます。 -- ライブラリにパッチ適用が必要な場合は、[GitHub の ClickHouse 組織](https://github.com/ClickHouse)内に上流リポジトリのフォークを作成してください。 - -後者の場合、上流のコミットからカスタムパッチを可能な限り切り離しておくことを目指します。 -そのために、統合したいブランチまたはタグから `ClickHouse/` プレフィックス付きのブランチを作成します。例: ブランチ `2024_2` に対しては `ClickHouse/2024_2`、タグ `release/vX.Y.Z` に対しては `ClickHouse/release/vX.Y.Z`。 -フォークしたリポジトリにおいて、上流の開発ブランチ `master` / `main` / `dev` を追従すること(つまり `ClickHouse/master` / `ClickHouse/main` / `ClickHouse/dev` といったプレフィックス付きブランチ)を避けてください。 -これらのブランチは常に変化するターゲットであり、適切なバージョニングを難しくします。 -「プレフィックス付きブランチ」にすることで、フォークに対して上流リポジトリから pull しても、カスタムな `ClickHouse/` ブランチには影響が及ばないようにできます。 -`contrib/` 内のサブモジュールは、フォークしたサードパーティリポジトリの `ClickHouse/` ブランチのみを追跡しなければなりません。 - -パッチは外部ライブラリの `ClickHouse/` ブランチに対してのみ適用されます。 - -これを行う方法は 2 つあります: -- フォークしたリポジトリ内の `ClickHouse/` プレフィックス付きブランチに対して新しい修正を加えたい場合(例: sanitizer の修正)。この場合、修正を `ClickHouse/` プレフィックス付きのブランチとして push します(例: `ClickHouse/fix-sanitizer-disaster`)。その後、新しいブランチからカスタムのトラッキングブランチ(例: `ClickHouse/2024_2 <-- ClickHouse/fix-sanitizer-disaster`)への PR を作成し、PR をマージします。 -- サブモジュールを更新し、以前のパッチを再適用する必要がある場合。このケースでは、古い PR を作り直すのはやり過ぎです。代わりに、古いコミットを新しいバージョンに対応した新しい `ClickHouse/` ブランチに単に cherry-pick すれば十分です。複数コミットからなる PR のコミットは、適宜 squash してかまいません。理想的には、カスタムパッチを上流にもコントリビュートしておき、新しいバージョンではそのパッチを省略できるようにします。 - -サブモジュールを更新したら、フォーク内の新しいハッシュを指すように ClickHouse 内のサブモジュールの参照を更新してください。 - -サードパーティライブラリ向けのパッチは公式リポジトリを念頭に置いて作成し、可能であればそのパッチを上流リポジトリへコントリビュートすることを検討してください。 -そうすることで他のユーザーもそのパッチの恩恵を受けられるようになり、ClickHouse チームの保守負荷を増やさずに済みます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/developer-instruction.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/developer-instruction.md deleted file mode 100644 index 2538b5bb412..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/developer-instruction.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: 'ClickHouse 開発用の前提条件とセットアップ手順' -sidebar_label: '前提条件' -sidebar_position: 5 -slug: /development/developer-instruction -title: '開発者向けの前提条件' -doc_type: 'guide' ---- - - - -# 前提条件 - -ClickHouse は Linux、FreeBSD、macOS 上でビルドできます。 -Windows を使用している場合でも、Ubuntu を実行している [VirtualBox](https://www.virtualbox.org/) などの Linux 仮想マシン上で ClickHouse をビルドできます。 - - - -## GitHub にリポジトリを作成する - -ClickHouse 向けの開発を始めるには、[GitHub](https://www.github.com/) アカウントが必要です。 -まだ SSH キーを持っていない場合は、ローカルで SSH キーを作成し、その公開鍵を GitHub にアップロードしてください。これはパッチを貢献するための前提条件です。 - -次に、右上隅の「fork」ボタンをクリックして、ご自身のアカウントの下に [ClickHouse リポジトリ](https://github.com/ClickHouse/ClickHouse/) をフォークします。 - -Issue の修正や機能追加などの変更を貢献するには、まずフォークしたリポジトリ内のブランチに変更をコミットし、その変更をメインのリポジトリに対して反映する「Pull Request」を作成します。 - -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)を参照してください。 - - -## リポジトリを開発マシンにクローンする - -まず、作業用マシンにソースファイルを取得します。具体的には、リポジトリをクローンします。 - -```sh -git clone git@github.com:your_github_username/ClickHouse.git # プレースホルダーをご自身のGitHubユーザー名に置き換えてください -cd ClickHouse -``` - -このコマンドは、ソースコード、テスト、その他のファイルを含むディレクトリ `ClickHouse/` を作成します。 -URL の後ろに任意のディレクトリ名を指定してチェックアウト先を変更できますが、このパスに空白(スペース)を含めないことが重要です。空白が含まれていると、その後のビルドが失敗する可能性があります。 - -ClickHouse の Git リポジトリは、サードパーティライブラリを取得するためにサブモジュールを使用しています。 -サブモジュールはデフォルトではチェックアウトされません。 -次のいずれかの方法を使用できます。 - -* `git clone` を `--recurse-submodules` オプション付きで実行する。 - -* `git clone` を `--recurse-submodules` なしで実行した場合、`git submodule update --init --jobs ` を実行して、すべてのサブモジュールを明示的にチェックアウトする(`` は、たとえば `12` に設定してダウンロードを並列化できます)。 - -* `git clone` を `--recurse-submodules` なしで実行し、不要なファイルや履歴をサブモジュールから省いてディスク使用量を削減するために [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` を実行します。この方法は CI では使用されていますが、サブモジュールの操作が不便になり遅くもなるため、ローカル開発には推奨されません。 - -Git サブモジュールのステータスを確認するには、`git submodule status` を実行します。 - -次のようなエラーメッセージが表示された場合 - -```bash -Permission denied (publickey). -fatal: Could not read from remote repository. - -正しいアクセス権限を持っていること、 -およびリポジトリが存在することを確認してください。 -``` - -GitHub に接続するための SSH キーが見つかりません。 -これらのキーは通常 `~/.ssh` に保存されています。 -SSH キーを利用できるようにするには、GitHub の設定画面からアップロードする必要があります。 - -また、HTTPS 経由でリポジトリをクローンすることもできます。 - -```sh -git clone https://github.com/ClickHouse/ClickHouse.git -``` - -しかし、この方法だけでは変更内容をサーバーにプッシュすることはできません。 -一時的にこのまま利用し、後から SSH キーを追加して、`git remote` コマンドでリポジトリのリモートアドレスを置き換えることもできます。 - -また、オリジナルの ClickHouse リポジトリのアドレスをローカルリポジトリに追加して、そこから更新を取得することもできます。 - -```sh -git remote add upstream git@github.com:ClickHouse/ClickHouse.git -``` - -このコマンドの実行に成功すると、`git pull upstream master` を実行して、メインの ClickHouse リポジトリから更新を取得できるようになります。 - -:::tip -`git push` をそのまま使用しないでください。誤って間違ったリモートやブランチに push してしまう可能性があります。 -`git push origin my_branch_name` のように、リモート名とブランチ名を明示的に指定することを推奨します。 -::: - - -## コードの記述 {#writing-code} - -以下に、ClickHouse 用のコードを書く際に役立つクイックリンクを示します。 - -- [ClickHouse のアーキテクチャ](/development/architecture/). -- [コードスタイルガイド](/development/style/). -- [サードパーティライブラリ](/development/contrib#adding-and-maintaining-third-party-libraries) -- [テストの記述](/development/tests/) -- [未解決の Issue](https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aopen+is%3Aissue+label%3A%22easy+task%22) - -### IDE {#ide} - -[Visual Studio Code](https://code.visualstudio.com/) と [Neovim](https://neovim.io/) は、ClickHouse の開発で実績のある 2 つの選択肢です。VS Code を使用する場合は、IntelliSense の代わりに、はるかに高性能な [clangd 拡張機能](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd) を使用することを推奨します。 - -[CLion](https://www.jetbrains.com/clion/) も優れた選択肢です。ただし、ClickHouse のような大規模なプロジェクトでは動作が遅くなる場合があります。CLion を使用する際は、次の点に留意してください。 - -- CLion は自動的に `build` ディレクトリを作成し、ビルドタイプとして `debug` を自動選択します -- ユーザーがインストールしたものではなく、CLion 内で定義されている CMake のバージョンを使用します -- CLion は、ビルドタスクの実行に `ninja` ではなく `make` を使用します(これは通常の動作です) - -使用できるその他の IDE としては、[Sublime Text](https://www.sublimetext.com/)、[Qt Creator](https://www.qt.io/product/development-tools)、[Kate](https://kate-editor.org/) などがあります。 - - - -## プルリクエストを作成する {#create-a-pull-request} - -GitHub の UI で自分の fork リポジトリに移動します。 -ブランチで開発している場合は、そのブランチを選択する必要があります。 -画面上に「Pull request」ボタンが表示されます。 -つまり、これは「自分の変更をメインリポジトリに取り込んでもらうようにリクエストを作成する」という意味です。 - -作業がまだ完了していなくても、プルリクエストは作成できます。 -この場合、タイトルの先頭に「WIP」(work in progress)を付けてください。後で変更してもかまいません。 -これは、変更内容の共同レビューやディスカッション、および利用可能なすべてのテストを実行するのに役立ちます。 -変更内容について簡潔な説明を記載することが重要です。これは後でリリースの変更履歴(changelog)を生成する際に使用されます。 - -ClickHouse の担当者があなたの PR に「can be tested」タグを付けると、テストが開始されます。 -最初のいくつかのチェック結果(例: コードスタイル)は数分以内に返ってきます。 -ビルドチェックの結果は 30 分以内に届きます。 -主要なテストセットの結果は 1 時間以内に報告されます。 - -システムは、あなたのプルリクエスト専用の ClickHouse バイナリビルドを用意します。 -これらのビルドを取得するには、チェック一覧の「Builds」項目の横にある「Details」リンクをクリックしてください。 -そこには、ClickHouse のビルド済み .deb パッケージへの直接リンクがあり、必要であれば本番サーバーにデプロイすることもできます。 - - - -## ドキュメントを作成する {#write-documentation} - -新機能を追加するプルリクエストには、必ず適切なドキュメントを含めてください。 -ドキュメントの変更をプレビューしたい場合は、ドキュメントページをローカルでビルドする手順が、README.md ファイル内の[こちら](https://github.com/ClickHouse/clickhouse-docs)に記載されています。 -ClickHouse に新しい関数を追加する際は、以下のテンプレートをガイドとして使用できます。 - - - -````markdown -# newFunctionName - -関数の簡単な説明をここに記載します。この関数が何を行うか、および典型的な使用例を簡潔に説明してください。 - -**構文** - -\```sql -newFunctionName(arg1, arg2[, arg3]) -\``` - -**引数** - -- `arg1` — 引数の説明。 [DataType](../data-types/float.md) -- `arg2` — 引数の説明。 [DataType](../data-types/float.md) -- `arg3` — オプション引数の説明(省略可能)。 [DataType](../data-types/float.md) - -**実装の詳細** - -関連する場合、実装の詳細についての説明を記載します。 - -**戻り値** - -- {関数が返す内容をここに挿入}を返します。 [DataType](../data-types/float.md) - -**例** - -クエリ: - -\```sql -SELECT 'write your example query here'; -\``` - -結果: - -\```response -┌───────────────────────────────────┐ -│ the result of the query │ -└───────────────────────────────────┘ -\``` -```` - - -## テストデータの使用 - -ClickHouse の開発にあたっては、実際の利用状況に近いデータセットを読み込む必要があることがよくあります。 -これは特にパフォーマンス テストにおいて重要です。 -そのために、Web アナリティクスの匿名化データを特別に用意しています。 -これを利用するには、追加で約 3 GB の空きディスク容量が必要です。 - -```sh - 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 -``` - -clickhouse-client で実行します: - -```sql -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); - -```` - -データをインポートします: - -```bash -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 -```` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/index.md deleted file mode 100644 index 4ad8d48567c..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/index.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -description: '開発と貢献のインデックスページ' -slug: /development/ -title: '開発と貢献' -doc_type: 'landing-page' ---- - -このセクションには、次のページが含まれます。 - -{/* 以下の目次は、YAML フロントマターの title、description、slug フィールドから、 - 次のスクリプトによって自動生成されています: - - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - - 誤りを見つけた場合や説明を改善したい場合は、これらのファイル自体を - 直接編集してください。 - */ } - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| ------------------------------------------------------------------------------------------- | --------------------------------------------------------- | -| [Developer Prerequisites](/development/developer-instruction) | ClickHouse 開発の前提条件とセットアップ手順 | -| [How to Build ClickHouse on Linux](/development/build) | Linux システム上で ClickHouse をソースからビルドするためのステップバイステップガイド | -| [Build on macOS for macOS](/development/build-osx) | macOS システム上で ClickHouse をソースからビルドするためのガイド | -| [Build on Linux for macOS](/development/build-cross-osx) | Linux 上で macOS 向けに ClickHouse をクロスコンパイルするためのガイド | -| [How to Build ClickHouse on Linux for AARCH64](/development/build-cross-arm) | AARCH64 アーキテクチャ向けに ClickHouse をソースからビルドするためのガイド | -| [How to Build ClickHouse on Linux for RISC-V 64](/development/build-cross-riscv) | RISC-V 64 アーキテクチャ向けに ClickHouse をソースからビルドするためのガイド | -| [Build on Linux for s390x (zLinux)](/development/build-cross-s390x) | s390x アーキテクチャ向けに ClickHouse をソースからビルドするためのガイド | -| [Build on Linux for E2K](/development/build-e2k) | E2K アーキテクチャ向けに ClickHouse をソースからビルドするためのガイド | -| [Build on Linux for LoongArch64](/development/build-cross-loongarch) | LoongArch64 アーキテクチャ向けに ClickHouse をソースからビルドするためのガイド | -| [Testing ClickHouse](/development/tests) | ClickHouse のテスト実行およびテストスイートの実行方法に関するガイド | -| [Architecture Overview](/development/architecture) | ClickHouse のアーキテクチャとカラム指向設計に関する包括的な概要 | -| [Continuous Integration (CI)](/development/continuous-integration) | ClickHouse の継続的インテグレーション (CI) システムの概要 | -| [Third-Party Libraries](/development/contrib) | ClickHouse におけるサードパーティライブラリの利用方法、およびライブラリの追加と保守方法を説明するページ | -| [C++ Style Guide](/development/style) | ClickHouse の C++ 開発におけるコーディングスタイルガイドライン | -| [Build Clickhouse with DEFLATE_QPL](/development/building_and_benchmarking_deflate_qpl) | ClickHouse を DEFLATE_QPL コーデック付きでビルドし、ベンチマークを実行する方法 | -| [Integrating Rust Libraries](/development/integrating_rust_libraries) | Rust ライブラリを ClickHouse に統合するためのガイド | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md deleted file mode 100644 index 4e585a1a138..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -description: 'Rust ライブラリを ClickHouse に統合するためのガイド' -sidebar_label: 'Rust ライブラリ' -slug: /development/integrating_rust_libraries -title: 'Rust ライブラリの統合' -doc_type: 'guide' ---- - -# Rust ライブラリ - -Rust ライブラリの統合については、BLAKE3 ハッシュ関数の統合を例に説明します。 - -統合の最初のステップは、ライブラリを /rust フォルダに追加することです。これを行うには、空の Rust プロジェクトを作成し、必要なライブラリを Cargo.toml に記述する必要があります。また、Cargo.toml に `crate-type = ["staticlib"]` を追加して、新しいライブラリをスタティックライブラリとしてコンパイルするよう設定する必要があります。 - -次に、Corrosion ライブラリを使用して CMake にライブラリをリンクする必要があります。最初のステップは、/rust フォルダ内の CMakeLists.txt にライブラリのフォルダを追加することです。その後、ライブラリディレクトリに CMakeLists.txt ファイルを追加する必要があります。その中で、Corrosion の import 関数を呼び出す必要があります。BLAKE3 をインポートするために、次の行が使用されました: - -```CMake -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++ のデータ型と互換性がないため、この空のライブラリプロジェクトを利用して、C/C++ から受け取ったデータの変換、ライブラリメソッドの呼び出し、および出力データの逆変換を行うためのシム用メソッドを作成します。例えば、BLAKE3 向けには次のようなメソッドが作成されました。 - -```rust -#[no_mangle] -pub unsafe extern "C" fn blake3_apply_shim( - begin: *const c_char, - _size: u32, - out_char_data: *mut u8, -``` - -```rust -#[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++ 互換のコンパイルを行うことはできません。さらに、これらは次の連携ステップにおいても必要となります。 - -シムメソッドのコードを書いた後は、ライブラリ用のヘッダーファイルを用意する必要があります。これは手動で作成することもできますし、cbindgen ライブラリを使用して自動生成することもできます。cbindgen を使用する場合は、`build.rs` のビルドスクリプトを記述し、cbindgen をビルド依存関係として追加する必要があります。 - -ヘッダーファイルを自動生成できるビルドスクリプトの例: - -```rust - 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 ビルドを修正する目的でのみ使用されています。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/development/style.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/style.md deleted file mode 100644 index 6a4630f655c..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/style.md +++ /dev/null @@ -1,892 +0,0 @@ ---- -description: 'ClickHouse C++ 開発のためのコーディングスタイルガイド' -sidebar_label: 'C++ スタイルガイド' -sidebar_position: 70 -slug: /development/style -title: 'C++ スタイルガイド' -doc_type: 'guide' ---- - - - -# C++ スタイルガイド - - - -## 一般的な推奨事項 {#general-recommendations} - -以下は推奨事項であり、必須ではありません。 -コードを編集する場合は、既存のコードの書式に従うのが理にかなっています。 -コードスタイルは一貫性のために必要です。一貫性があるとコードが読みやすくなり、検索もしやすくなります。 -多くの規則には論理的な理由があるわけではなく、確立された慣習に従って定められています。 - - - -## フォーマット - -**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.** 関数本体全体が1つの `statement` のみで構成されている場合は、1行で記述してもかまいません。行末の空白以外では、中括弧の前後にスペースを入れてください。 - -```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 << " 行/秒、" - << bytes_read_on_server * 1000.0 / elapsed_ns << " MB/秒) "; -``` - -**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.** クラスや構造体内では、`class/struct` と同じインデントレベルに `public`、`private`、`protected` を記述し、それ以外のコードをインデントします。 - -```cpp -template -class MultiVersion -{ -public: - /// 使用するオブジェクトのバージョン。shared_ptrがバージョンの生存期間を管理します。 - using Version = std::shared_ptr; - ... -} -``` - -**16.** ファイル全体で同じ `namespace` を使っていて、かつ他に特筆すべきものがなければ、`namespace` の内側でインデントを下げてオフセットを取る必要はありません。 - -**17.** `if`、`for`、`while` などの式のブロックが単一の `statement` だけから成る場合、中括弧は省略可能です。代わりに、その `statement` を別行に記述します。このルールは入れ子になった `if`、`for`、`while`、… に対しても有効です。 - -ただし、内側の `statement` が中括弧または `else` を含む場合、外側のブロックは中括弧で記述する必要があります。 - -```cpp -/// 書き込みを完了する。 -for (auto & stream : streams) - stream.second->finalize(); -``` - -**18.** 行末にスペースを入れてはいけません。 - -**19.** ソースファイルは UTF-8 でエンコードされている必要があります。 - - -**20.** 非 ASCII 文字も文字列リテラルで使用できます。 - -```cpp -<< ", " << (timer.elapsed() / chunks_stats.hits) << " μsec/hit."; -``` - -**21.** 1 行に複数の式を書かないでください。 - -**22.** 関数内のコードはセクションごとにまとめ、セクション同士は空行 1 行以内で区切ってください。 - -**23.** 関数やクラスなどのあいだは、1 ~ 2 行の空行で区切ってください。 - -**24.** 値に対する `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.** 1 つのステートメントで異なる型の複数の変数を宣言しないこと。 - -```cpp -//不正解 -int x, *y; -``` - -**28.** C スタイルのキャストを使用しないでください。 - -```cpp -//誤り -std::cerr << (int)c <<; std::endl; -//正しい -std::cerr << static_cast(c) << std::endl; -``` - -**29.** クラスや構造体では、各可視性スコープ内でメンバーと関数を別々にグループ化してください。 - -**30.** 小さなクラスや構造体では、メソッド宣言と実装を分離する必要はありません。 - -同じことは、任意のクラスや構造体の小さなメソッドにも当てはまります。 - -テンプレートクラスおよび構造体については、メソッド宣言と実装を分離しないでください(分離してしまうと、結局は同じ翻訳単位内で定義しなければならなくなるためです)。 - -**31.** 80文字ではなく、140文字で行を折り返してもかまいません。 - -**32.** 後置演算子が必要でない場合は、常に前置インクリメント/デクリメント演算子を使用してください。 - -```cpp -for (Names::const_iterator it = column_names.begin(); it != column_names.end(); ++it) -``` - - -## コメント - -**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 -/* -* プロシージャ名: -* 元のプロシージャ名: -* 作成者: -* 作成日: -* 変更日: -* 変更者: -* 元のファイル名: -* 目的: -* 用途: -* 区分: -* 使用クラス: -* 定数: -* ローカル変数: -* パラメータ: -* 作成日: -* 目的: -*/ -``` - -この例は、[http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/](http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/) から引用したものです。 - -**7.** 各ファイルの先頭に(作者名、作成日などの)不要なコメントを書かないこと。 - -**8.** 1 行コメントは `///` で始め、複数行コメントは `/**` で始めること。これらのコメントは「ドキュメンテーション」とみなされます。 - -注意: これらのコメントからドキュメンテーションを生成するために Doxygen を使用できます。ただし、IDE 内でコードをたどる方が便利なため、一般的には Doxygen はあまり使用されません。 - -**9.** 複数行コメントの先頭および末尾に空行を入れてはいけません(複数行コメントを閉じる行は例外)。 - -**10.** コードをコメントアウトする場合は、「ドキュメンテーション用」のコメントではなく、通常のコメントを使用すること。 - -**11.** コミットする前に、コメントアウトされたコードは削除すること。 - -**12.** コメントやコード内で卑俗な表現(汚い言葉)を使用しないこと。 - -**13.** 大文字を使用しないこと。過度な句読点や記号を使用しないこと。 - -```cpp -/// 何が失敗したのか??? -``` - -**14.** 区切り線としてコメントを使用しないでください。 - -```cpp -///****************************************************** -``` - -**15.** コメント欄で議論を始めないこと。 - -```cpp -/// なぜこれを行ったのですか? -``` - -**16.** ブロックの末尾に、その内容を説明するコメントを付ける必要はありません。 - -```cpp -/// for -``` - - -## 名前 - -**1.** 変数およびクラスメンバーの名前には、小文字とアンダースコアからなるスネークケースを使用します。 - -```cpp -size_t max_block_size; -``` - -**2.** 関数名(メソッド名)には、先頭を小文字にするキャメルケースを使用します。 - -```cpp -std::string getName() const override { return "Memory"; } -``` - -**3.** クラス(構造体)の名前には、先頭を大文字にした CamelCase を使用します。インターフェースには、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.** ファイル名は、その内容と同じスタイルにすること。 - -ファイルに1つのクラスのみが含まれている場合、ファイル名はクラス名と同じ形式(CamelCase)とすること。 - -ファイルに1つの関数のみが含まれている場合、ファイル名は関数名と同じ形式(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.** 略語は、よく知られているものであれば使用できます(略語の意味を Wikipedia や検索エンジンで容易に見つけられる場合)。 - -`AST`, `SQL` は可。 - -ランダムな文字列である `NVDH` などは不可です。 - -その省略形が一般的に使われているのであれば、単語を途中までに省略した形も使用できます。 - -コメント内に完全な名前が併記されている場合は、その略語を使用してもかまいません。 - -**17.** C++ ソースコードのファイル名には `.cpp` 拡張子を付けなければなりません。ヘッダーファイルには `.h` 拡張子を付けなければなりません。 - - -## コードの書き方 - -**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, "ファイル {} をクローズできません", file_name); -``` - -コード内の不変条件(インバリアント)をチェックするために assert を使用できます。 - -**4.** 例外の種類。 - -アプリケーションコードで複雑な例外階層を使う必要はありません。例外メッセージの文面は、システム管理者が理解できるものであるべきです。 - -**5.** デストラクタからの例外送出。 - -これは推奨されませんが、許容されます。 - -次の方法を使用してください: - -* 例外を引き起こす可能性のある処理を事前にすべて実行する関数(`done()` や `finalize()` など)を作成します。その関数が呼び出されていれば、その後のデストラクタで例外が発生することはないはずです。 -* (ネットワーク越しのメッセージ送信などの)複雑すぎる処理は、クラスの利用者が破棄前に呼び出さなければならない別のメソッドに切り出すことができます。 -* デストラクタ内で例外が発生した場合、それを隠蔽するよりも(ロガーが利用可能であれば)ログに記録した方がよいです。 -* シンプルなアプリケーションでは、例外処理を `std::terminate`(C++11 におけるデフォルトの `noexcept` のケース)に任せることは許容できます。 - -**6.** 無名コードブロック。 - -特定の変数をローカルにするために、1 つの関数の内部で別個のコードブロックを作成し、ブロックを抜けるときにデストラクタが呼び出されるようにします。 - -```cpp -Block block = data.in->read(); - -{ - std::lock_guard lock(mutex); - data.ready = true; - data.block = block; -} - -ready_any.set(); -``` - -**7.** マルチスレッド。 - -オフラインデータ処理プログラムでは: - -* まず単一 CPU コアで可能な限り最大の性能が出るようにする。そのうえで、必要に応じてコードを並列化する。 - -サーバーアプリケーションでは: - -* リクエストの処理にはスレッドプールを使用する。現在のところ、ユーザー空間でのコンテキストスイッチが必要になるタスクは発生していない。 - -並列化のために fork は使用しない。 - -**8.** スレッドの同期。 - -多くの場合、異なるスレッドが異なるメモリセル(さらに望ましいのは異なるキャッシュライン)を使用するようにでき、その場合はスレッド同期(`joinAll` を除く)を一切使用しなくてよい。 - -同期が必要な場合、ほとんどのケースでは `lock_guard` で保護されたミューテックスを使用すれば十分である。 - -それ以外のケースではシステムの同期プリミティブを使用する。ビジーウェイトは使用しないこと。 - -アトミック操作は、最も単純なケースにのみ使用すること。 - -ロックフリーのデータ構造を実装しようとしないこと。それが主たる専門分野である場合を除く。 - -**9.** ポインタ vs 参照。 - -ほとんどの場合、参照を優先して使用する。 - -**10.** `const`。 - -`const` 参照、`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.** ロギング。 - -コード全体にある例を参照してください。 - -コミットする前に、意味のないログやデバッグ用ログ、その他あらゆる種類のデバッグ出力はすべて削除してください。 - -ループ内でのロギングは、Trace レベルであっても避けてください。 - -ログは、どのログレベルでも読みやすいものでなければなりません。 - -ロギングは、基本的にアプリケーションコード内でのみ使用するようにしてください。 - -ログメッセージは英語で記述してください。 - -ログは、可能であればシステム管理者が理解できるものであるべきです。 - -ログに罵り言葉(スラング・卑語)を使用しないでください。 - -ログでは 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++で使用しない機能 - -**1.** 仮想継承は用いない。 - -**2.** 現代的なC++で便利なシンタックスシュガーが用意されているような構文は使用しない。例: - -```cpp -// 構文糖衣なしの従来の方法 -template ::value, void>> // std::enable_ifを使用したSFINAE、::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 // C++20コンセプトを使用したSFINAE、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`。執筆時点(2025 年 3 月)では、コードはバージョン 19 以上の clang でコンパイルされています。 - -標準ライブラリとして `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.** master ブランチへのコミットでビルドを壊してはいけません。 - -ただし、実用に耐えるとみなされるのは選別されたリビジョンのみです。 - -**8.** コードが一部しかできていなくても、できるだけ頻繁にコミットしてください。 - -そのためにブランチを使用します。 - -`master` ブランチ内のコードがまだビルド可能でない場合は、`push` の前にビルド対象から除外してください。数日以内に仕上げるか削除する必要があります。 - -**9.** 些細でない変更にはブランチを使用し、それらをサーバーに公開します。 - -**10.** 使われていないコードはリポジトリから削除します。 - - - -## ライブラリ {#libraries} - -**1.** C++20 標準ライブラリ(実験的な拡張も許可)に加えて、`boost` および `Poco` フレームワークを使用します。 - -**2.** OS パッケージに含まれるライブラリの使用は許可されません。事前にインストールされたライブラリの使用も許可されません。すべてのライブラリは `contrib` ディレクトリ内にソースコードの形で配置し、ClickHouse と一緒にビルドする必要があります。詳細については、[新しいサードパーティライブラリの追加に関するガイドライン](/development/contrib#adding-and-maintaining-third-party-libraries) を参照してください。 - -**3.** 既に利用されているライブラリが常に優先されます。 - - - -## 一般的な推奨事項 {#general-recommendations-1} - -**1.** 可能な限りコード量を減らすこと。 - -**2.** まずは最も単純な解決方法を試すこと。 - -**3.** そのコードがどのように動作し、インナーループがどのように機能するかを把握するまでは、コードを書かないこと。 - -**4.** 最も単純なケースでは、クラスや構造体の代わりに `using` を使用すること。 - -**5.** 可能であれば、コピーコンストラクタ、代入演算子、デストラクタ(クラスに少なくとも 1 つの仮想関数が含まれる場合の仮想デストラクタを除く)、ムーブコンストラクタ、ムーブ代入演算子は記述しないこと。言い換えると、コンパイラ生成の関数が正しく動作するようにしておくこと。`= default` を使用してよい。 - -**6.** コードの単純化を心がけること。可能な限りコードのサイズを削減すること。 - - - -## 追加の推奨事項 - -**1.** `stddef.h` に含まれる型に対して `std::` を明示的に指定すること - -は推奨しません。言い換えると、`std::size_t` ではなく `size_t` と書くことを推奨します。その方が短いからです。 - -もちろん、`std::` を付けても問題ありません。 - -**2.** 標準 C ライブラリの関数に対して `std::` を明示的に指定すること - -は推奨しません。言い換えると、`std::memcpy` ではなく `memcpy` と書いてください。 - -その理由は、`memmem` のような非標準の類似関数が存在するためです。これらの関数を使用することもありますが、`namespace std` には存在しません。 - -もしあらゆる箇所で `memcpy` の代わりに `std::memcpy` と書いた場合、`std::` を付けない `memmem` が不自然に見えてしまいます。 - -とはいえ、好みによって `std::` を使っても構いません。 - -**3.** 同じものが標準 C++ ライブラリにもある場合に、C の関数を使用すること。 - -より効率的であれば許容されます。 - -例えば、大きなメモリ領域をコピーする場合には、`std::copy` の代わりに `memcpy` を使用してください。 - -**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/i18n/jp/docusaurus-plugin-content-docs/current/development/tests.md b/i18n/jp/docusaurus-plugin-content-docs/current/development/tests.md deleted file mode 100644 index 6468d88f0b7..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/development/tests.md +++ /dev/null @@ -1,548 +0,0 @@ ---- -description: 'ClickHouse のテスト方法とテストスイートの実行ガイド' -sidebar_label: 'テスト' -sidebar_position: 40 -slug: /development/tests -title: 'ClickHouse のテスト' -doc_type: 'guide' ---- - - - -# ClickHouse のテスト - - - -## 機能テスト - -機能テストは最もシンプルで扱いやすいテストです。 -ClickHouse の機能のほとんどは機能テストで検証でき、この方法でテスト可能な ClickHouse のコード変更については、機能テストの実行が必須です。 - -各機能テストは、起動中の ClickHouse サーバーに 1 つまたは複数のクエリを送信し、その結果を期待される参照結果と比較します。 - -テストは `./tests/queries` ディレクトリに配置されています。 - -各テストは `.sql` と `.sh` の 2 種類のいずれかです。 - -* `.sql` テストは、`clickhouse-client` にパイプされる単純な SQL スクリプトです。 -* `.sh` テストは、単体で実行されるスクリプトです。 - -一般的には、`.sh` テストよりも SQL テストを使用することを推奨します。 -SQL だけでは検証できない機能、たとえば入力データを `clickhouse-client` にパイプする場合や `clickhouse-local` をテストする場合などにのみ、`.sh` テストを使用してください。 - -:::note -`DateTime` および `DateTime64` のデータ型をテストする際のよくある誤りは、サーバーが特定のタイムゾーン(例: "UTC")を使用していると想定してしまうことです。実際にはそうではなく、CI テスト実行時のタイムゾーンは意図的にランダム化されています。最も簡単な回避策は、テスト値に対してタイムゾーンを明示的に指定することです。例: `toDateTime64(val, 3, 'Europe/Amsterdam')`。 -::: - -### ローカルでテストを実行する - -ClickHouse サーバーをローカルで起動し、デフォルトポート(9000)で待ち受けるようにします。 -たとえばテスト `01428_hash_set_nan_key` を実行するには、リポジトリのフォルダーに移動して次のコマンドを実行します。 - -```sh -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` に書き出されます)。 - -`clickhouse-test` の全オプションについては `tests/clickhouse-test --help` を参照してください。 -すべてのテストを実行することも、テスト名に対するフィルターを指定して一部のテストのみを実行することもできます: `./clickhouse-test substring`。 -テストを並列で実行したり、ランダムな順序で実行したりするオプションもあります。 - -### 新しいテストの追加 - -新しいテストを追加するには、まず `queries/0_stateless` ディレクトリに `.sql` または `.sh` ファイルを作成します。 -次に、`clickhouse-client < 12345_test.sql > 12345_test.reference` または `./12345_test.sh > ./12345_test.reference` を使用して、対応する `.reference` ファイルを生成します。 - -テストでは、事前に自動的に作成されるデータベース `test` 内のテーブルに対してのみ、作成、削除、SELECT などの操作を行うようにしてください。 -一時テーブルを使用しても問題ありません。 - -CI と同じ環境をローカルでセットアップするには、テスト用の設定をインストールしてください(これらは Zookeeper のモック実装を使用し、いくつかの設定を調整します)。 - -```sh -cd /tests/config -sudo ./install.sh -``` - -:::note -テストは次のようであるべきです - -* 最小限であること: 必要最小限のテーブル・カラムおよび複雑さのみを作成すること -* 高速であること: 数秒以内(望ましくは 1 秒未満)で完了すること -* 正確かつ決定的であること: テスト対象の機能が動作していない場合にのみ失敗すること -* 分離されステートレスであること: 実行環境やタイミングに依存しないこと -* 網羅的であること: 0、null、空集合、例外(負のテストには `-- { serverError xyz }` および `-- { clientError xyz }` 構文を使用)などのコーナーケースをカバーすること -* テストの最後にテーブルをクリーンアップすること(取り残しがある場合に備えて) -* 他のテストが同じ内容をテストしていないことを確認すること(つまり、まず grep して確認する) - ::: - -### テスト実行の制限 - -テストには 0 個以上の *タグ* を付けることができ、CI 上でどのコンテキストで実行されるかを制御できます。 - -`.sql` テストでは、タグは 1 行目に SQL コメントとして記述します: - -```sql --- Tags: no-fasttest, no-replicated-database --- no-fasttest: <このタグの理由をここに記載してください> --- no-replicated-database: <理由をここに記載してください> - -SELECT 1 -``` - -`.sh` のテストでは、タグは 2 行目のコメントとして記述します。 - - -```bash -#!/usr/bin/env bash -# Tags: no-fasttest, no-replicated-database -# - no-fasttest: <ここにタグの理由を記載> -# - no-replicated-database: <ここに理由を記載> -``` - -利用可能なタグの一覧は次のとおりです: - -| Tag name | What it does | Usage example | -| --------------------------------- | ---------------------------------------------------------- | ------------------------------------------------ | -| `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` | [Fast test](continuous-integration.md#fast-test) では実行されません | テストで Fast test では無効化されている `MySQL` テーブルエンジンを使用します | -| `fasttest-only` | [Fast test](continuous-integration.md#fast-test) のみで実行されます | | -| `no-[asan, tsan, msan, ubsan]` | [sanitizers](#sanitizers) を有効にしたビルドではテストを実行しません | テストは 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` テストでは、制限はタグの隣の行、またはタグが指定されていない場合は 2 行目のコメントとして記述します: - - -```bash -#!/usr/bin/env bash -# Tags: no-fasttest -# ランダム設定の制限: max_block_size=(1000, 10000); index_granularity=(100, None) -``` - -`.sql` テストでは、タグは対象行の直後の行か、先頭行に SQL コメントとして記述します。 - -```sql --- Tags: no-fasttest --- ランダム設定の制限: max_block_size=(1000, 10000); index_granularity=(100, None) -SELECT 1 -``` - -片方の上限だけを指定する場合は、もう一方には `None` を指定できます。 - -### テスト名の決め方 - -テストの名前は、`00422_hash_function_constexpr.sql` のように、5桁のプレフィックスの後に内容を表す名前を付けます。 -プレフィックスを決めるには、ディレクトリ内で既に存在する最大のプレフィックスを確認し、その値に 1 を加えてください。 - -```sh -ls tests/queries/0_stateless/[0-9]*.reference | tail -n 1 -``` - -その間に、同じ数値プレフィックスを持つ別のテストが追加されることもありますが、それでも問題はなく、そのままで構いません。後から変更する必要はありません。 - -### 必ず発生するエラーの確認 - -誤ったクエリに対してサーバーエラーが発生することを確認したい場合があります。そのために、SQL テストでは次の形式の特別なアノテーションをサポートしています。 - -```sql -SELECT x; -- { serverError 49 } -``` - -このテストは、サーバーが未知のカラム `x` に関するコード 49 のエラーを返すことを確認するものです。 -エラーが発生しない場合、または別のエラーが返ってきた場合、テストは失敗します。 -クライアント側でエラーが発生することを確認したい場合は、代わりに `clientError` アノテーションを使用してください。 - -エラーメッセージの特定の文言はチェックしないでください。将来変更される可能性があり、そのたびにテストが不要に壊れてしまいます。 -エラーコードのみを確認してください。 -既存のエラーコードが要件に対して十分に厳密でない場合は、新しいエラーコードの追加を検討してください。 - -### 分散クエリのテスト - -機能テストで分散クエリを使用したい場合、サーバー自身に対してクエリを実行するために、アドレス `127.0.0.{1..2}` を指定した `remote` テーブル関数を利用できます。または、サーバー設定ファイル内であらかじめ定義された `test_shard_localhost` のようなテスト用クラスタを使用することもできます。 -テスト名には必ず `shard` または `distributed` という単語を含めてください。そうすることで、サーバーが分散クエリをサポートするように設定されている正しい構成で、CI 上でテストが実行されるようになります。 - -### 一時ファイルの扱い - -シェルテストの中で、その場でファイルを作成して利用する必要が生じる場合があります。 -一部の CI チェックではテストが並列に実行されることに注意してください。そのため、一意ではない名前でスクリプト内から一時ファイルを作成または削除していると、`Flaky` などの CI チェックが失敗する原因になります。 -これを回避するには、環境変数 `$CLICKHOUSE_TEST_UNIQUE_NAME` を使用して、一時ファイルに実行中のテストに固有の名前を付けてください。 -そうすることで、セットアップ中に作成したりクリーンアップ中に削除したりしているファイルが、そのテストだけで使用されているものであり、並列で実行中の他のテストで使用されているファイルではないことを保証できます。 - - -## 既知のバグ {#known-bugs} - -機能テストで簡単に再現できる既知のバグがある場合、そのバグに対応する機能テストを `tests/queries/bugs` ディレクトリに配置します。 -これらのテストは、バグが修正され次第 `tests/queries/0_stateless` に移動されます。 - - - -## 統合テスト {#integration-tests} - -統合テストでは、クラスタ構成での ClickHouse のテストや、MySQL、Postgres、MongoDB など他のサーバーとの ClickHouse の連携をテストできます。 -ネットワーク分断やパケットロスなどをエミュレートするのに有用です。 -これらのテストは Docker 上で実行され、さまざまなソフトウェアを含む複数のコンテナを作成します。 - -これらのテストの実行方法については `tests/integration/README.md` を参照してください。 - -なお、ClickHouse とサードパーティ製ドライバーの連携はテスト対象に含まれていません。 -また、現時点では公式 JDBC / ODBC ドライバーとの連携に関する統合テストもありません。 - - - -## ユニットテスト - -ユニットテストは、ClickHouse 全体ではなく、特定のライブラリやクラス単体をテストしたい場合に有用です。 -テストのビルドは、`ENABLE_TESTS` という CMake オプションで有効または無効にできます。 -ユニットテスト(およびその他のテストプログラム)は、コード内の `tests` サブディレクトリに配置されています。 -ユニットテストを実行するには、`ninja test` と入力します。 -一部のテストは `gtest` を使用しますが、単にテスト失敗時に非ゼロの終了コードを返すだけのプログラムもあります。 - -コードがすでに機能テストでカバーされている場合は、必ずしもユニットテストを用意する必要はありません(機能テストの方が、通常ははるかに簡単に扱えます)。 - -個別の gtest チェックは、実行ファイルを直接呼び出すことで実行できます。例えば、次のようにします。 - -```bash -$ ./src/unit_tests_dbms --gtest_filter=LocalAddress* -``` - - -## パフォーマンステスト {#performance-tests} - -パフォーマンステストを使用すると、ClickHouse の一部の要素を切り出し、シンセティックなクエリに対するパフォーマンスを測定・比較できます。 -パフォーマンステストは `tests/performance/` に配置されています。 -各テストは、テストケースの説明を含む `.xml` ファイルで表されます。 -テストは `docker/test/performance-comparison` ツールで実行します。実行方法については README ファイルを参照してください。 - -各テストでは、1つまたは複数のクエリ(パラメータの組み合わせを含む場合があります)をループで実行します。 - -特定のシナリオで 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) に似ています。その後、このテストは、ACK されたすべての挿入が書き込まれており、拒否されたすべての挿入が書き込まれていないことを検証します。 - -クォーラムテストは、ClickHouse がオープンソース化される前に別のチームによって作成されました。 -このチームは現在 ClickHouse に関わっていません。 -テストは不運にも Java で実装されています。 -これらの理由により、クォーラムテストは書き直してインテグレーションテストに移動する必要があります。 - - - -## 手動テスト - -新しい機能を開発した場合、その機能を手動でもテストするのは妥当です。 -次の手順で行うことができます。 - -ClickHouse をビルドします。ターミナルから ClickHouse を実行するには、`programs/clickhouse-server` ディレクトリに移動し、`./clickhouse-server` を実行します。デフォルトでは、カレントディレクトリ内の設定ファイル(`config.xml`、`users.xml`、および `config.d` と `users.d` ディレクトリ内のファイル)を使用します。ClickHouse サーバーに接続するには、`programs/clickhouse-client/clickhouse-client` を実行します。 - -すべての clickhouse ツール(server、client など)は、`clickhouse` という名前の 1 つのバイナリへのシンボリックリンクであることに注意してください。 -このバイナリは `programs/clickhouse` にあります。 -すべてのツールは `clickhouse-tool` の代わりに `clickhouse tool` として呼び出すこともできます。 - -別の方法として、ClickHouse パッケージをインストールすることもできます。ClickHouse リポジトリから安定版リリースをインストールするか、ClickHouse ソースのルートで `./release` を実行して自分でパッケージをビルドします。 -その後、`sudo clickhouse start` でサーバーを起動します(`sudo clickhouse stop` で停止します)。 -ログは `/etc/clickhouse-server/clickhouse-server.log` を確認してください。 - -既にシステムに ClickHouse がインストールされている場合は、新しい `clickhouse` バイナリをビルドして、既存のバイナリを置き換えることができます。 - -```bash -$ sudo clickhouse stop -$ sudo cp ./clickhouse /usr/bin/ -$ sudo clickhouse start -``` - -また、システムの clickhouse-server サービスを停止し、同じ設定を用いつつログをターミナルに出力するようにした 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.xml` 内のポート番号を変更する(または `config.d` ディレクトリ内のファイルで上書きする)ことで、適切なデータパスを指定したうえで起動できます。 - -`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 で正常に読み取れるかどうか。 -- 異なる ClickHouse バージョンが混在するクラスタで分散クエリが正しく動作するかどうか。 - - - -## コンパイラからの助け {#help-from-the-compiler} - -メインの ClickHouse コード(`src` ディレクトリ内にあるもの)は、`-Wall -Wextra -Werror` に加えて、いくつかの追加の警告を有効にしてビルドされています。 -ただし、これらのオプションはサードパーティライブラリには有効化されていません。 - -Clang にはさらに有用な警告が多数あり、`-Weverything` を指定して一覧を確認し、その中からデフォルトビルドで有効にするものを選ぶことができます。 - -ClickHouse のビルドには、開発環境・本番環境のどちらでも常に clang を使用します。 -自分のマシンでは(ノート PC のバッテリーを節約するために)デバッグモードでビルドしてかまいませんが、制御フローや関数間解析がより最適化されるため、`-O3` でビルドしたほうがコンパイラはより多くの警告を生成できることに注意してください。 -clang でデバッグモードのビルドを行う場合、実行時により多くのエラーを検出できるように、`libc++` のデバッグ版が使用されます。 - - - -## サニタイザ {#sanitizers} - -:::note -ローカルで実行した際にプロセス(ClickHouse サーバーまたはクライアント)が起動時にクラッシュする場合、アドレス空間配置のランダム化を無効にする必要があるかもしれません: `sudo sysctl kernel.randomize_va_space=0` -::: - -### Address sanitizer {#address-sanitizer} - -ASan を有効にして、機能テスト・結合テスト・ストレステスト・ユニットテストをコミットごとに実行しています。 - -### Thread sanitizer {#thread-sanitizer} - -TSan を有効にして、機能テスト・結合テスト・ストレステスト・ユニットテストをコミットごとに実行しています。 - -### Memory sanitizer {#memory-sanitizer} - -MSan を有効にして、機能テスト・結合テスト・ストレステスト・ユニットテストをコミットごとに実行しています。 - -### Undefined behaviour sanitizer {#undefined-behaviour-sanitizer} - -UBSan を有効にして、機能テスト・結合テスト・ストレステスト・ユニットテストをコミットごとに実行しています。 -一部のサードパーティライブラリのコードは、UB サニタイズの対象になっていません。 - -### Valgrind (memcheck) {#valgrind-memcheck} - -以前は Valgrind を使って機能テストを一晩かけて実行していましたが、現在は行っていません。 -この処理には数時間を要します。 -現在、`re2` ライブラリに 1 件の既知の誤検知があり、[この記事](https://research.swtch.com/sparse)を参照してください。 - - - -## ファジング {#fuzzing} - -ClickHouse のファジングは、[libFuzzer](https://llvm.org/docs/LibFuzzer.html) とランダムな SQL クエリの両方を用いて実装されています。 -すべてのファジングテストは、サニタイザ(Address と Undefined)を有効にした状態で実行する必要があります。 - -LibFuzzer は、ライブラリコードに対する個別のファジングテスト(fuzzer)に使用されます。 -fuzzer はテストコードの一部として実装されており、名前に "_fuzzer" という接尾辞が付きます。 -fuzzer の例は `src/Parsers/fuzzers/lexer_fuzzer.cpp` にあります。 -LibFuzzer 固有の設定、辞書、およびコーパスは `tests/fuzz` に保存されています。 -ユーザー入力を扱うすべての機能について、ファジングテストを作成することを推奨します。 - -fuzzer はデフォルトではビルドされません。 -fuzzer をビルドするには、`-DENABLE_FUZZING=1` と `-DENABLE_TESTS=1` の両方のオプションを指定する必要があります。 -fuzzer をビルドするときは Jemalloc を無効にすることを推奨します。 -ClickHouse のファジングを Google OSS-Fuzz に統合するための設定は `docker/fuzz` にあります。 - -また、単純なファジングテストを用いてランダムな SQL クエリを生成し、サーバーがそれらを実行してもクラッシュしないことを確認しています。 -これは `00746_sql_fuzzy.pl` にあります。 -このテストは継続的に(夜通し、あるいはそれ以上の期間)実行する必要があります。 - -さらに、多数のコーナーケースを検出できる、高度な AST ベースのクエリ fuzzer も使用しています。 -これはクエリの AST に対してランダムな順列および置換を行います。 -以前のテストから AST ノードを記憶しておき、それらを後続テストのファジングに使用しつつ、ランダムな順序で処理します。 -この fuzzer の詳細については、[このブログ記事](https://clickhouse.com/blog/fuzzing-click-house)を参照してください。 - - - -## ストレステスト {#stress-test} - -ストレステストは、ファジングの一種です。 -単一のサーバー上で、すべての機能テストをランダムな順序で並列に実行します。 -テスト結果そのものは検証しません。 - -次の点が検証されます: -- サーバーがクラッシュせず、デバッグ用トラップやサニタイザーのトラップが発生しないこと。 -- デッドロックが発生しないこと。 -- データベース構造の整合性が保たれていること。 -- テスト後にサーバーが正常に停止でき、その後も例外なく再起動できること。 - -Debug、ASan、TSan、MSan、UBSan の 5 種類の実行形態があります。 - - - -## スレッドファザー {#thread-fuzzer} - -Thread Fuzzer(Thread Sanitizer と混同しないでください)は、スレッドの実行順序をランダム化する別種のファジング手法です。 -これにより、さらに多くの特殊なケースを検出するのに役立ちます。 - - - -## セキュリティ監査 {#security-audit} - -当社のセキュリティチームは、セキュリティの観点から ClickHouse の機能について基本的な評価を実施しました。 - - - -## 静的解析ツール {#static-analyzers} - -`clang-tidy` を各コミットごとに実行しています。 -`clang-static-analyzer` のチェックも有効にしています。 -`clang-tidy` は一部のスタイルチェックにも使用しています。 - -`clang-tidy`、`Coverity`、`cppcheck`、`PVS-Studio`、`tscancode`、`CodeQL` を評価済みです。 -使用方法については `tests/instructions/` ディレクトリを参照してください。 - -IDE として `CLion` を使用している場合は、一部の `clang-tidy` チェックをそのまま利用できます。 - -シェルスクリプトの静的解析には `shellcheck` も使用しています。 - - - -## ハードニング {#hardening} - -デバッグビルドでは、ユーザーレベルのメモリアロケーションに対して ASLR を行うカスタムアロケータを使用しています。 - -また、割り当て後に読み取り専用であることが想定されるメモリ領域を手動で保護しています。 - -デバッグビルドでは、さらに「有害」(古い・安全でない・スレッドセーフでない)関数が呼び出されないことを保証する、`libc` のカスタマイズも行っています。 - -デバッグアサーションを広範に使用しています。 - -デバッグビルドでは、「logical error」コード(バグを意味する)を持つ例外がスローされた場合、プログラムを即座に異常終了させます。 -これにより、リリースビルドでは例外を使用しつつ、デバッグビルドではそれをアサーションとして扱うことができます。 - -デバッグビルドでは、`jemalloc` のデバッグ版を使用しています。 -デバッグビルドでは、`libc++` のデバッグ版を使用しています。 - - - -## 実行時の整合性チェック {#runtime-integrity-checks} - -ディスク上に保存されるデータにはチェックサムが計算されています。 -MergeTree テーブル内のデータは、3 つの方法(圧縮されたデータブロック、非圧縮のデータブロック、ブロック全体にわたる合計チェックサム)で同時にチェックサムが計算されます*。 -クライアントとサーバー間、あるいはサーバー間でネットワーク経由で転送されるデータにもチェックサムが計算されています。 -レプリケーションにより、レプリカ間でビットレベルまで同一のデータが保証されます。 - -こうした仕組みは、故障したハードウェアからデータを保護するために不可欠です(ストレージ媒体上でのビットロット、サーバーの RAM におけるビット反転、ネットワークコントローラーの RAM におけるビット反転、ネットワークスイッチの RAM におけるビット反転、クライアントの RAM におけるビット反転、通信線上でのビット反転など)。 -ビット反転はよく発生する現象であり、ECC RAM を使用していても、また TCP チェックサムが存在していても発生し得ることに注意してください(毎日ペタバイト級のデータを処理するサーバーを何千台も運用している場合など)。 -[動画(ロシア語)はこちら](https://www.youtube.com/watch?v=ooBAQIe0KlQ)。 - -ClickHouse は、運用担当エンジニアが故障したハードウェアを特定するのに役立つ診断機能を提供します。 - -\* しかも遅くありません。 - - - -## コードスタイル {#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 を対象とするものに限って計測しています。 -これは日次で実施しています。 - - - -## テスト用のテスト {#tests-for-tests} - -不安定なテストを検出するための自動チェックが行われます。 -すべての新しいテストは、機能テストの場合は 100 回、統合テストの場合は 10 回実行されます。 -少なくとも 1 回でも失敗したテストは、不安定なテスト(flaky)と見なされます。 - - - -## テストの自動化 {#test-automation} - -[GitHub Actions](https://github.com/features/actions) を使ってテストを実行しています。 - -ビルドジョブとテストは、各コミットごとにサンドボックス環境で実行されます。 -生成されたパッケージとテスト結果は GitHub に公開され、直接リンクからダウンロードできます。 -アーティファクトは数か月間保存されます。 -GitHub でプルリクエストを送信すると、それに「can be tested」というタグを付け、CI システムが ClickHouse パッケージ(release、debug、address sanitizer 有効版など)をビルドします。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/dictionary/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/dictionary/index.md index 3ffaa3a0a60..3d011e40c2d 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/dictionary/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/dictionary/index.md @@ -1,8 +1,8 @@ --- slug: /dictionary -title: '辞書' -keywords: ['辞書', '辞書型'] -description: '辞書は、高速なルックアップのためにデータをキーと値のペアで表現する構造です。' +title: 'Dictionary' +keywords: ['dictionary', 'dictionaries'] +description: 'Dictionary は、高速なルックアップのためのキー値型データ表現を提供します。' doc_type: 'reference' --- @@ -11,36 +11,35 @@ import dictionaryLeftAnyJoin from '@site/static/images/dictionary/dictionary-lef import Image from '@theme/IdealImage'; -# Dictionary +# Dictionary {#dictionary} -ClickHouse における Dictionary は、さまざまな[内部および外部ソース](/sql-reference/dictionaries#dictionary-sources)からのデータをメモリ上の [key-value](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) 形式で表現し、きわめて低レイテンシなルックアップクエリ向けに最適化したものです。 +ClickHouse における Dictionary は、さまざまな[内部および外部ソース](/sql-reference/dictionaries#dictionary-sources)からのデータをインメモリの[キー・バリュー](https://en.wikipedia.org/wiki/Key%E2%80%93value_database)形式で表現し、超低レイテンシーなルックアップクエリのために最適化されたものです。 -Dictionary は次のような用途に役立ちます: -- 特に `JOIN` と組み合わせて使用する場合に、クエリのパフォーマンスを向上させる -- インジェスト処理を低速化させることなく、その場でインジェストされたデータを拡充する - -ClickHouse における Dictionary のユースケース +Dictionary は次の用途に有用です: +- 特に `JOIN` を使用する場合に、クエリのパフォーマンスを向上させる +- インジェスト処理を低速化することなく、取り込むデータをオンザフライで拡充する +ClickHouse における Dictionary のユースケース -## Dictionary を使用した JOIN の高速化 +## Dictionary を使用した結合の高速化 {#speeding-up-joins-using-a-dictionary} -Dictionary は、特定タイプの `JOIN`、すなわち結合キーが基礎となるキー・バリュー型ストレージのキー属性と一致する必要がある [`LEFT ANY` 型](/sql-reference/statements/select/join#supported-types-of-join) を高速化するために利用できます。 +Dictionary は、特定の種類の `JOIN`、すなわち結合キーが基盤となるキー・バリュー型ストレージのキー属性と一致している必要がある [`LEFT ANY` 型](/sql-reference/statements/select/join#supported-types-of-join) を高速化するために利用できます。 -LEFT ANY JOIN で Dictionary を使用する +LEFT ANY JOIN で Dictionary を使用する -この条件が満たされる場合、ClickHouse は Dictionary を利用して [Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join) を実行できます。これは ClickHouse における最速の JOIN アルゴリズムであり、右側のテーブルに対して使用されている [table engine](/engines/table-engines) が低レイテンシなキー・バリュー要求をサポートしている場合に適用可能です。ClickHouse にはこれに対応する table engine が 3 種類あります: [Join](/engines/table-engines/special/join)(事前計算済みのハッシュテーブルに相当)、[EmbeddedRocksDB](/engines/table-engines/integrations/embedded-rocksdb)、および [Dictionary](/engines/table-engines/special/dictionary) です。ここでは Dictionary ベースのアプローチについて説明しますが、仕組み自体は 3 つのエンジンで共通です。 +この条件を満たす場合、ClickHouse は Dictionary を利用して [Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join) を実行できます。これは ClickHouse で最も高速な結合アルゴリズムであり、右側のテーブルの基盤となる [table engine](/engines/table-engines) が低レイテンシーのキー・バリュー要求をサポートしている場合に適用可能です。ClickHouse にはこれを提供するテーブルエンジンが 3 つあります。[Join](/engines/table-engines/special/join)(事前計算済みハッシュテーブルに相当)、[EmbeddedRocksDB](/engines/table-engines/integrations/embedded-rocksdb)、および [Dictionary](/engines/table-engines/special/dictionary) です。ここでは Dictionary ベースのアプローチについて説明しますが、仕組みは 3 つのエンジンで共通です。 -Direct Join アルゴリズムでは、右側のテーブルが Dictionary をバックエンドとして持っている必要があります。これにより、そのテーブルから結合対象となるデータが、低レイテンシなキー・バリュー型データ構造としてすでにメモリ上に存在している状態になります。 +Direct Join アルゴリズムでは、右側のテーブルが Dictionary をバックエンドとして使用しており、そのテーブルから結合対象となるデータが、低レイテンシーのキー・バリュー型データ構造として、すでにメモリ上に存在している必要があります。 -### 例 +### 例 {#example} -Stack Overflow データセットを使用して、次の疑問に答えてみます: -*Hacker News において、SQL に関する最も「物議を醸した」投稿はどれか?* +[Stack Overflow データセット](/getting-started/example-datasets/stackoverflow)を使って、次の質問に答えてみましょう: +*Hacker News 上で、SQL に関して最も物議を醸している投稿はどれか?* -ここでは「物議を醸した」を、賛成票と反対票の数が近い投稿と定義します。この絶対差を計算し、値が 0 に近いほど議論を呼んでいるとみなします。また、投稿には少なくとも 10 件以上の賛成票と反対票があるものに限定します — そもそもほとんど投票されていない投稿は、あまり物議を醸しているとはいえないためです。 +ここでは、賛成票と反対票の数が近い投稿を「物議を醸している」と定義します。この絶対差を計算し、値が 0 に近いほど物議の度合いが高いとみなします。また、投稿には少なくとも賛成票と反対票がそれぞれ 10 件以上あるものと仮定します — ほとんど投票されない投稿は、あまり物議を醸しているとは言えないためです。 -データが正規化されている前提では、このクエリには現在、`posts` テーブルと `votes` テーブルを用いた `JOIN` が必要です: +データを正規化した状態では、このクエリでは現在、`posts` テーブルと `votes` テーブルを使った `JOIN` が必要です。 ```sql WITH PostIds AS @@ -79,18 +78,18 @@ UpVotes: 13 DownVotes: 13 Controversial_ratio: 0 -1行を取得しました。経過時間: 1.283秒。処理行数: 4億1844万行、7.23 GB (3億2607万行/秒、5.63 GB/秒) +1 行が返されました。経過時間: 1.283秒。処理された行数: 4億1844万行、7.23 GB (3億2607万行/秒、5.63 GB/秒) ピークメモリ使用量: 3.18 GiB。 ``` -> **`JOIN` の右側にはより小さいデータセットを使用する**: このクエリでは、外側とサブクエリの両方で `PostId` をフィルタリングしているため、必要以上に冗長に見えるかもしれません。これは、クエリの応答時間を高速に保つためのパフォーマンス最適化です。最適なパフォーマンスを得るには、常に `JOIN` の右側がより小さな集合となるようにし、可能な限り小さく保ってください。`JOIN` のパフォーマンス最適化や利用可能なアルゴリズムの理解に関するヒントとしては、[このブログ記事シリーズ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)を参照することを推奨します。 +> **`JOIN` の右側には小さいデータセットを使用する**: このクエリでは、外側とサブクエリの両方で `PostId` によるフィルタリングを行っているため、必要以上に冗長に見えるかもしれません。これはクエリの応答時間を短く保つためのパフォーマンス最適化です。最適なパフォーマンスを得るには、常に `JOIN` の右側がより小さな集合となるようにし、可能な限り小さく保ってください。JOIN のパフォーマンス最適化のコツや利用可能なアルゴリズムの理解については、[このブログ記事シリーズ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1) を参照することをおすすめします。 -このクエリは高速ですが、良好なパフォーマンスを得るには `JOIN` を慎重に記述する必要があります。本来であれば、まず投稿を「SQL」を含むものだけにフィルタリングし、その後で対象となる一部のブログについて `UpVote` と `DownVote` の数を確認してメトリクスを計算したいところです。 +このクエリは高速ですが、良好なパフォーマンスを得るには `JOIN` を慎重に記述する必要があります。本来であれば、「SQL」を含む投稿だけに単純にフィルタリングし、その投稿のサブセットに対して `UpVote` と `DownVote` のカウントを確認してメトリクスを計算できるのが理想的です。 -#### 辞書の適用 -これらの概念を示すために、投票データに辞書を使用します。辞書は通常メモリ上に保持されるため(例外は [ssd_cache](/sql-reference/dictionaries#ssd_cache))、ユーザーはデータサイズを意識する必要があります。次に `votes` テーブルのサイズを確認します: +#### Dictionary の適用 {#applying-a-dictionary} +これらの概念を示すために、投票データに対して Dictionary を使用します。Dictionary は通常メモリ上に保持されるため([ssd_cache](/sql-reference/dictionaries#ssd_cache) は例外)、ユーザーはデータサイズに留意しておく必要があります。ここで、`votes` テーブルのサイズを確認します: ```sql SELECT table, @@ -106,11 +105,11 @@ GROUP BY table └─────────────────┴─────────────────┴───────────────────┴───────┘ ``` -データはディクショナリ内に非圧縮のまま保存されるため、すべてのカラム(実際にはそうしません)をディクショナリに保存すると仮定すると、少なくとも 4GB のメモリが必要になります。ディクショナリはクラスター全体にレプリケートされるため、このメモリ量は *ノードごとに* 確保する必要があります。 +データは Dictionary 内で非圧縮のまま保存されるため、すべてのカラム(実際にはそうしません)を Dictionary に保存すると仮定すると、少なくとも 4GB のメモリが必要になります。Dictionary はクラスター全体でレプリケートされるため、このメモリ量は *ノードごとに* 確保しておく必要があります。 -> 以下の例では、ディクショナリ用のデータは ClickHouse テーブルに由来しています。これはディクショナリの最も一般的なソースですが、ファイル、HTTP、[Postgres](/sql-reference/dictionaries#postgresql) を含むデータベースなど、[多数のソース](/sql-reference/dictionaries#dictionary-sources) がサポートされています。後述するように、ディクショナリは自動的に更新できるため、頻繁に変更される小さなデータセットを直接結合で利用可能にする理想的な方法となります。 +> 以下の例では、Dictionary 用のデータは ClickHouse テーブルを起点としています。これは最も一般的な Dictionary のソースですが、ファイル、HTTP、さらには [Postgres](/sql-reference/dictionaries#postgresql) を含むデータベースなど、[複数のソース](/sql-reference/dictionaries#dictionary-sources) がサポートされています。後ほど示すように、Dictionary は自動更新が可能であり、頻繁に変更が発生する小規模なデータセットをダイレクトに JOIN で参照可能にする理想的な手段です。 -ディクショナリには、ルックアップを行うための主キーが必要です。これは概念的にはトランザクションデータベースの主キーと同様であり、一意である必要があります。上記のクエリでは、結合キー `PostId` に対するルックアップが必要です。ディクショナリには、`votes` テーブルから各 `PostId` について賛成票と反対票の合計値が格納されている必要があります。以下が、このディクショナリデータを取得するためのクエリです: +Dictionary には、ルックアップを行うためのプライマリキーが必要です。これは概念的にはトランザクションデータベースのプライマリキーと同じで、一意である必要があります。上記のクエリでは、JOIN キーである `PostId` に対してルックアップを行います。Dictionary には、`votes` テーブルから `PostId` ごとの賛成票と反対票の合計が格納されている必要があります。以下は、この Dictionary 用データを取得するクエリです。 ```sql SELECT PostId, @@ -120,7 +119,7 @@ FROM votes GROUP BY PostId ``` -このディクショナリを作成するには、次の DDL が必要です。ここで、先ほどのクエリを使用している点に注意してください。 +Dictionary を作成するには、以下の DDL を実行します。先ほどのクエリが使われている点に注目してください。 ```sql CREATE DICTIONARY votes_dict @@ -137,9 +136,9 @@ LAYOUT(HASHED()) 0 rows in set. Elapsed: 36.063 sec. ``` -> 自己管理の OSS 環境では、上記のコマンドをすべてのノードで実行する必要があります。ClickHouse Cloud では、ディクショナリはすべてのノードに自動的にレプリケートされます。上記の処理は、RAM 64GB の ClickHouse Cloud ノード上で実行しており、ロードに 36 秒を要しました。 +> セルフマネージドの OSS では、上記のコマンドをすべてのノードで実行する必要があります。ClickHouse Cloud では、Dictionary はすべてのノードに自動的にレプリケートされます。上記は 64GB の RAM を搭載した ClickHouse Cloud ノード上で実行しており、ロードには 36 秒かかりました。 -ディクショナリが消費しているメモリ量を確認するには、次のようにします。 +Dictionary によって消費されているメモリを確認するには: ```sql SELECT formatReadableSize(bytes_allocated) AS size @@ -151,7 +150,8 @@ WHERE name = 'votes_dict' └──────────┘ ``` -特定の `PostId` に対する賛成票と反対票は、シンプルな `dictGet` 関数で取得できるようになりました。以下の例では、投稿 `11227902` の値を取得しています。 +特定の`PostId`に対する賛成票数と反対票数は、シンプルな`dictGet`関数で取得できるようになりました。以下の例では、投稿`11227902`の値を取得しています。 + ```sql SELECT dictGet('votes_dict', ('UpVotes', 'DownVotes'), '11227902') AS votes @@ -160,7 +160,7 @@ SELECT dictGet('votes_dict', ('UpVotes', 'DownVotes'), '11227902') AS votes │ (34999,32) │ └────────────┘ -これを先ほどのクエリに適用することで、JOINを削除できます: +これを先ほどのクエリに適用することで、JOINを削除できます: WITH PostIds AS ( @@ -177,16 +177,16 @@ WHERE (Id IN (PostIds)) AND (UpVotes > 10) AND (DownVotes > 10) ORDER BY Controversial_ratio ASC LIMIT 3 -3行のセット。経過時間: 0.551秒。処理: 1億1964万行、3.29 GB (毎秒2億1696万行、毎秒5.97 GB)。 -ピークメモリ使用量: 552.26 MiB。 +3行のセット。経過時間:0.551秒。処理:1億1964万行、3.29 GB(2億1696万行/秒、5.97 GB/秒) +ピークメモリ使用量:552.26 MiB。 ``` -このクエリははるかに単純なだけでなく、実行速度も2倍以上高速です! さらに最適化するには、賛成票と反対票の合計が10を超える投稿だけを辞書に読み込み、あらかじめ計算した「controversial」値だけを保存するようにします。 +このクエリははるかに単純なだけでなく、実行速度も2倍以上速くなります。さらに、Dictionary には賛成票・反対票がそれぞれ 10 を超える投稿だけを読み込み、あらかじめ計算しておいた物議度の値だけを保持するようにすれば、より最適化できます。 -## クエリ時の拡張 +## クエリ時のエンリッチメント {#query-time-enrichment} -辞書は、クエリ実行時に値を参照するために使用できます。これらの値は結果として返したり、集約処理で使用したりできます。たとえば、ユーザー ID をロケーションに対応付ける辞書を作成するとします。 +Dictionary はクエリ実行時に値を参照するために使用できます。これらの値は結果として返したり、集約で利用したりできます。たとえば、ユーザー ID を所在地にマッピングする Dictionary を作成するとします。 ```sql CREATE DICTIONARY users_dict @@ -200,7 +200,7 @@ LIFETIME(MIN 600 MAX 900) LAYOUT(HASHED()) ``` -この辞書を使用して、POST の結果に情報を付加できます。 +この Dictionary を使用して、投稿の結果を充実させることができます。 ```sql SELECT @@ -213,18 +213,18 @@ LIMIT 5 FORMAT PrettyCompactMonoBlock ┌───────Id─┬─Title─────────────────────────────────────────────────────────┬─Location──────────────┐ -│ 52296928 │ ClickHouseにおける2つの文字列の比較 │ Spain │ -│ 52345137 │ ファイルを使用してMySQLからClickHouseにデータを移行する方法 │ 中国江苏省Nanjing Shi │ -│ 61452077 │ ClickHouseでPARTITIONを変更する方法 │ Guangzhou, 广东省中国 │ -│ 55608325 │ ClickHouseでmax()を使わずにテーブルの最後のレコードを選択 │ Moscow, Russia │ -│ 55758594 │ ClickHouseで一時テーブルを作成 │ Perm', Russia │ +│ 52296928 │ Comparison 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行を取得しました。経過時間: 0.033秒。処理行数: 425万行、82.84 MB (1億3062万行/秒、2.55 GB/秒) +5行が返されました。経過時間: 0.033秒。処理された行数: 425万行、82.84 MB (1億3062万行/秒、2.55 GB/秒) ピークメモリ使用量: 249.32 MiB。 ``` -先ほどの結合の例と同様に、同じ辞書を使って、投稿のおもな発信元を効率的に判定できます。 +上記の結合例と同様に、同じ Dictionary を使用して、ほとんどの投稿がどこから投稿されているのかを効率的に判定できます。 ```sql SELECT @@ -249,13 +249,13 @@ Peak memory usage: 248.84 MiB. ``` -## インデックス時のエンリッチメント +## インデックス時のエンリッチメント {#index-time-enrichment} -上記の例では、クエリ時に辞書を使用して結合を排除しました。辞書は、挿入時に行をエンリッチするためにも使用できます。これは通常、エンリッチに用いる値が変わらず、かつ辞書を埋めるために利用できる外部ソースに存在する場合に適しています。この場合、挿入時に行をエンリッチしておけば、クエリ時の辞書ルックアップを回避できます。 +上記の例では、クエリ時に Dictionary を使用して結合を回避しました。Dictionary は、挿入時に行をエンリッチするためにも使用できます。これは通常、エンリッチに用いる値が変化せず、Dictionary を埋めるために利用できる外部ソースに存在する場合に適しています。この場合、行を挿入時にエンリッチしておくことで、クエリ時に Dictionary を参照してルックアップする必要を回避できます。 -Stack Overflow におけるユーザーの `Location` が決して変わらないと仮定します(実際には変わります)— 具体的には、`users` テーブルの `Location` 列です。投稿テーブルをロケーション別に分析するクエリを実行したいとします。このテーブルには `UserId` が含まれています。 +Stack Overflow におけるユーザーの `Location` が決して変わらない(実際には変わりますが)と仮定してみましょう。具体的には、`users` テーブルの `Location` カラムです。`posts` テーブルに対して Location ごとの分析クエリを実行したいとします。このテーブルには `UserId` が含まれています。 -辞書は、`users` テーブルをデータソースとして、ユーザー ID からロケーションへのマッピングを提供します。 +Dictionary は、`users` テーブルをデータソースとして、ユーザー ID から Location へのマッピングを提供します。 ```sql CREATE DICTIONARY users_dict @@ -269,9 +269,9 @@ LIFETIME(MIN 600 MAX 900) LAYOUT(HASHED()) ``` -> `Hashed` 辞書型を使用できるようにするため、`Id < 0` のユーザーを除外しています。`Id < 0` のユーザーはシステムユーザーです。 +> `Hashed` 型の Dictionary を使用できるようにするため、`Id < 0` のユーザーを除外しています。`Id < 0` のユーザーはシステムユーザーです。 -この辞書を posts テーブルへの挿入時に利用するには、スキーマを変更する必要があります。 +posts テーブルの挿入時にこの Dictionary を活用するには、スキーマを変更する必要があります。 ```sql CREATE TABLE posts_with_location @@ -285,9 +285,9 @@ ENGINE = MergeTree ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) ``` -上記の例では、`Location` は `MATERIALIZED` カラムとして宣言されています。これは、値を `INSERT` クエリの一部として指定することもできますが、その値に関わらず常に計算されることを意味します。 +上記の例では、`Location` は `MATERIALIZED` カラムとして宣言されています。これは、値を `INSERT` クエリの一部として指定することもできますが、常に計算された値が使用されることを意味します。 -> ClickHouse は [`DEFAULT` カラム](/sql-reference/statements/create/table#default_values) もサポートしています(値を明示的に挿入することも、指定されていない場合に計算させることもできます)。 +> ClickHouse は、[`DEFAULT` columns](/sql-reference/statements/create/table#default_values)(値を挿入することも、指定されていない場合に計算させることもできるカラム)もサポートしています。 テーブルにデータを投入するには、通常どおり S3 からの `INSERT INTO SELECT` を使用できます。 @@ -297,7 +297,7 @@ INSERT INTO posts_with_location SELECT Id, PostTypeId::UInt8, AcceptedAnswerId, 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 @@ -319,24 +319,24 @@ Peak memory usage: 666.82 MiB. ``` -## 辞書に関する高度なトピック {#advanced-dictionary-topics} +## Dictionary の高度なトピック {#advanced-dictionary-topics} -### 辞書の `LAYOUT` の選択 {#choosing-the-dictionary-layout} +### Dictionary の `LAYOUT` を選択する {#choosing-the-dictionary-layout} -`LAYOUT` 句は、辞書の内部データ構造を制御します。利用可能なオプションはいくつかあり、その内容は[こちら](/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory)に記載されています。適切なレイアウトを選択するためのヒントは[こちら](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout)にあります。 +`LAYOUT` 句は、Dictionary の内部データ構造を決定します。複数のオプションがあり、その詳細は[こちら](/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory)に記載されています。適切なレイアウトを選択するためのヒントは[こちら](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout)で確認できます。 -### 辞書の更新 {#refreshing-dictionaries} +### Dictionary の更新 {#refreshing-dictionaries} -辞書の `LIFETIME` として `MIN 600 MAX 900` を指定しました。LIFETIME は辞書の更新間隔であり、ここで指定した値により 600~900 秒のランダムな間隔で定期的に再読み込みが行われます。このランダムな間隔は、多数のサーバーで更新を行う際に辞書のソースへの負荷を分散するために必要です。更新中でも、古いバージョンの辞書には引き続きクエリを実行できます。初回の読み込みのみがクエリをブロックします。`(LIFETIME(0))` を設定すると、辞書は更新されなくなる点に注意してください。 -辞書は `SYSTEM RELOAD DICTIONARY` コマンドを使用して強制的に再読み込みできます。 +`LIFETIME` を `MIN 600 MAX 900` として Dictionary に指定しています。LIFETIME は Dictionary の更新間隔を表し、ここで指定した値により 600~900 秒のランダムな間隔で定期的に再読み込みが行われます。このランダムな間隔は、多数のサーバーで更新を行う際に、Dictionary のソースへの負荷を分散するために必要です。更新中も Dictionary の旧バージョンに対するクエリは引き続き実行可能であり、クエリがブロックされるのは初回ロード時のみです。`(LIFETIME(0))` を設定すると、Dictionary が更新されなくなる点に注意してください。 +Dictionary は `SYSTEM RELOAD DICTIONARY` コマンドを使用して強制的に再読み込みできます。 -ClickHouse や Postgres のようなデータベースソースでは、一定間隔ではなく、実際に変更があった場合にのみ辞書を更新するクエリを設定できます(クエリの応答結果によって更新の要否が決まります)。詳細は[こちら](/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime)を参照してください。 +ClickHouse や Postgres のようなデータベースソースの場合、クエリのレスポンスに基づいて実際に変更があった場合にのみ Dictionary を更新するように設定でき、一定間隔での更新に代えてこの方式を利用できます。詳細は[こちら](/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime)を参照してください。 -### その他の辞書タイプ {#other-dictionary-types} +### その他の Dictionary タイプ {#other-dictionary-types} -ClickHouse は [階層型](/sql-reference/dictionaries#hierarchical-dictionaries)、[Polygon](/sql-reference/dictionaries#polygon-dictionaries)、[正規表現](/sql-reference/dictionaries#regexp-tree-dictionary) 辞書もサポートしています。 +ClickHouse では、[Hierarchical](/sql-reference/dictionaries#hierarchical-dictionaries)、[Polygon](/sql-reference/dictionaries#polygon-dictionaries)、および [Regular Expression](/sql-reference/dictionaries#regexp-tree-dictionary) の各 Dictionary もサポートしています。 -### 参考資料 {#more-reading} +### 参考情報 {#more-reading} -- [Using Dictionaries to Accelerate Queries](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) -- [Advanced Configuration for Dictionaries](/sql-reference/dictionaries) +- [辞書を利用してクエリを高速化する](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) +- [辞書の高度な設定](/sql-reference/dictionaries) \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md deleted file mode 100644 index a5893eaab15..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -description: '`Atomic` エンジンは、非ブロッキングな `DROP TABLE` および `RENAME TABLE` クエリと、アトミックな `EXCHANGE TABLES` クエリをサポートします。`Atomic` データベースエンジンはデフォルトで使用されます。' -sidebar_label: 'Atomic' -sidebar_position: 10 -slug: /engines/database-engines/atomic -title: 'Atomic' -doc_type: 'reference' ---- - - - -# Atomic - -`Atomic` エンジンは、ノンブロッキングな [`DROP TABLE`](#drop-detach-table) および [`RENAME TABLE`](#rename-table) クエリに加え、アトミックな [`EXCHANGE TABLES`](#exchange-tables) クエリをサポートします。`Atomic` データベースエンジンは、オープンソース版の ClickHouse でデフォルトとして使用されています。 - -:::note -ClickHouse Cloud では、デフォルトで [`Shared` データベースエンジン](/cloud/reference/shared-catalog#shared-database-engine) が使用されており、上記の操作もサポートしています。 -::: - - - -## データベースの作成 - -```sql -CREATE DATABASE test [ENGINE = Atomic] [SETTINGS disk=...]; -``` - - -## 詳細と推奨事項 - -### テーブル UUID - -`Atomic` データベース内の各テーブルには永続的な [UUID](../../sql-reference/data-types/uuid.md) が付与されており、そのデータは以下のディレクトリに保存されます。 - -```text -/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`](../../sql-reference/statements/rename.md) クエリは UUID を変更せず、テーブルデータも移動しません。これらのクエリは即座に実行され、そのテーブルを使用している他のクエリの完了を待ちません。 - -### 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`](../../sql-reference/statements/exchange.md) クエリは、テーブルやディクショナリをアトミックに入れ替えます。たとえば、次のような非アトミックな操作の代わりに使用できます。 - -```sql title="Non-atomic" -RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table; -``` - -アトミックなものも利用できます: - -```sql title="Atomic" -EXCHANGE TABLES new_table AND old_table; -``` - -### atomic データベースにおける ReplicatedMergeTree - -[`ReplicatedMergeTree`](/engines/table-engines/mergetree-family/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 内でテーブルごとに一意なパスが自動的に生成されます。 - -### メタデータディスク - -`SETTINGS` 内で `disk` が指定されている場合、そのディスクはテーブルのメタデータファイルの保存に使用されます。 -例えば次のとおりです。 - -```sql -CREATE TABLE db (n UInt64) ENGINE = Atomic SETTINGS disk=disk(type='local', path='/var/lib/clickhouse-disks/db_disk'); -``` - -未指定の場合は、`database_disk.disk` で定義されたディスクがデフォルトで使用されます。 - - -## 関連項目 {#see-also} - -- [system.databases](../../operations/system-tables/databases.md) システムテーブル diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md deleted file mode 100644 index 917606ca327..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -description: 'バックアップからテーブルやデータベースを読み取り専用モードで即座にアタッチできる。' -sidebar_label: 'バックアップ' -sidebar_position: 60 -slug: /engines/database-engines/backup -title: 'バックアップ' -doc_type: 'reference' ---- - - - -# バックアップ - -データベースのバックアップ機能を使用すると、[バックアップ](../../operations/backup) からテーブルやデータベースを読み取り専用モードで即座にアタッチできます。 - -データベースのバックアップは、増分バックアップと非増分バックアップの両方に対応しています。 - - - -## データベースの作成 - -```sql -CREATE DATABASE backup_database -ENGINE = Backup('database_name_inside_backup', 'backup_destination') -``` - -バックアップ先には、`Disk`、`S3`、`File` などの有効なバックアップ[先](../../operations/backup#configure-a-backup-destination)を指定できます。 - -バックアップ先が `Disk` の場合、バックアップからデータベースを作成するクエリは次のようになります。 - -```sql -CREATE DATABASE backup_database -ENGINE = Backup('database_name_inside_backup', Disk('disk_name', 'backup_name')) -``` - -**エンジンパラメータ** - -* `database_name_inside_backup` — バックアップ内のデータベースの名前。 -* `backup_destination` — バックアップ先。 - - -## 使用例 - -`Disk` バックアップ先を使った例を見てみましょう。まずは `storage.xml` でバックアップ用ディスクを設定します: - -```xml - - - - local - /home/ubuntu/ClickHouseWorkDir/backups/ - - - - - backups - /home/ubuntu/ClickHouseWorkDir/backups/ - -``` - -使用例を示します。テスト用のデータベースとテーブルを作成し、いくつかデータを挿入してからバックアップを作成します。 - -```sql -CREATE DATABASE test_database; - -CREATE TABLE test_database.test_table_1 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_1 VALUES (0, 'test_database.test_table_1'); - -CREATE TABLE test_database.test_table_2 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_2 VALUES (0, 'test_database.test_table_2'); - -CREATE TABLE test_database.test_table_3 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_3 VALUES (0, 'test_database.test_table_3'); - -BACKUP DATABASE test_database TO Disk('backups', 'test_database_backup'); -``` - -これで `test_database_backup` バックアップが用意できたので、データベース `Backup` を作成しましょう。 - -```sql -CREATE DATABASE test_database_backup ENGINE = Backup('test_database', Disk('backups', 'test_database_backup')); -``` - -これで、データベース内の任意のテーブルに対してクエリを実行できます。 - -```sql -SELECT id, value FROM test_database_backup.test_table_1; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_1 │ -└────┴────────────────────────────┘ - -SELECT id, value FROM test_database_backup.test_table_2; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_2 │ -└────┴────────────────────────────┘ - -SELECT id, value FROM test_database_backup.test_table_3; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_3 │ -└────┴────────────────────────────┘ -``` - -このバックアップしたデータベースは、通常のデータベースと同様に扱うこともできます。たとえば、その中のテーブルに対してクエリを実行できます。 - -```sql -SELECT database, name FROM system.tables WHERE database = 'test_database_backup': - -┌─database─────────────┬─name─────────┐ -│ test_database_backup │ test_table_1 │ -│ test_database_backup │ test_table_2 │ -│ test_database_backup │ test_table_3 │ -└──────────────────────┴──────────────┘ -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md deleted file mode 100644 index c24b3bd2eb4..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -description: 'DataLakeCatalog データベースエンジンを使用すると、ClickHouse を外部のデータカタログに接続し、オープンテーブルフォーマットのデータをクエリできます' -sidebar_label: 'DataLakeCatalog' -slug: /engines/database-engines/datalakecatalog -title: 'DataLakeCatalog' -doc_type: 'reference' ---- - - - -# DataLakeCatalog - -`DataLakeCatalog` データベースエンジンを使用すると、ClickHouse を外部の -データカタログに接続し、データを複製することなくオープンテーブルフォーマットのデータをクエリできます。 -これにより、ClickHouse は既存のデータレイクインフラストラクチャとシームレスに連携する -強力なクエリエンジンになります。 - - - -## サポートされているカタログ {#supported-catalogs} - -`DataLakeCatalog` エンジンは、次のデータカタログをサポートします。 - -- **AWS Glue Catalog** - AWS 環境での Iceberg テーブル向け -- **Databricks Unity Catalog** - Delta Lake および Iceberg テーブル向け -- **Hive Metastore** - 従来の Hadoop エコシステム向けカタログ -- **REST Catalogs** - Iceberg REST 仕様に準拠した任意のカタログ - - - -## データベースの作成 - -`DataLakeCatalog` エンジンを使用するには、以下の必要な設定を有効にする必要があります。 - -```sql -SET allow_experimental_database_iceberg = 1; -SET allow_experimental_database_unity_catalog = 1; -SET allow_experimental_database_glue_catalog = 1; -SET allow_experimental_database_hms_catalog = 1; -``` - -`DataLakeCatalog` エンジンを利用するデータベースは、次の構文で作成できます。 - -```sql -CREATE DATABASE database_name -ENGINE = DataLakeCatalog(catalog_endpoint[, user, password]) -SETTINGS -catalog_type, -[...] -``` - -サポートされている設定は次のとおりです: - -| Setting | Description | -| ----------------------- | ------------------------------------------------------------------------------- | -| `catalog_type` | カタログの種類: `glue`, `unity` (Delta), `rest` (Iceberg), `hive`, `onelake` (Iceberg) | -| `warehouse` | カタログ内で使用する warehouse / データベース名 | -| `catalog_credential` | カタログの認証情報(例: API キーまたはトークン) | -| `auth_header` | カタログサービスとの認証に使用するカスタム HTTP ヘッダー | -| `auth_scope` | 認証用の OAuth2 スコープ(OAuth を使用する場合) | -| `storage_endpoint` | バックエンドストレージのエンドポイント URL | -| `oauth_server_uri` | 認証に使用する OAuth2 認可サーバーの URI | -| `vended_credentials` | vended credentials(AWS 固有)を使用するかどうかを示す真偽値 | -| `aws_access_key_id` | S3/Glue へのアクセス用 AWS アクセスキー ID(vended credentials を使用しない場合) | -| `aws_secret_access_key` | S3/Glue へのアクセス用 AWS シークレットアクセスキー(vended credentials を使用しない場合) | -| `region` | サービスの AWS リージョン(例: `us-east-1`) | - - -## 例 - -`DataLakeCatalog` エンジンの使用例については、以下のセクションを参照してください。 - -* [Unity Catalog](/use-cases/data-lake/unity-catalog) -* [Glue Catalog](/use-cases/data-lake/glue-catalog) -* OneLake Catalog\ - `allow_experimental_database_iceberg` または `allow_database_iceberg` を有効化することで利用できます。 - -```sql -CREATE DATABASE database_name -ENGINE = DataLakeCatalog(catalog_endpoint) -SETTINGS - catalog_type = 'onelake', - warehouse = warehouse, - onelake_tenant_id = tenant_id, - oauth_server_uri = server_uri, - auth_scope = auth_scope, - onelake_client_id = client_id, - onelake_client_secret = client_secret; -SHOW TABLES IN databse_name; -SELECT count() from database_name.table_name; -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/index.md deleted file mode 100644 index b6421800e80..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -description: 'データベースエンジンに関するドキュメント' -slug: /engines/database-engines/ -toc_folder_title: 'データベースエンジン' -toc_priority: 27 -toc_title: '概要' -title: 'データベースエンジン' -doc_type: 'landing-page' ---- - - - -# データベースエンジン - -データベースエンジンは、テーブルを操作するための仕組みです。デフォルトでは、ClickHouse は [Atomic](../../engines/database-engines/atomic.md) データベースエンジンを使用しており、これにより設定可能な[テーブルエンジン](../../engines/table-engines/index.md)と [SQL の方言](../../sql-reference/syntax.md)が提供されます。 - -利用可能なデータベースエンジンの一覧は次のとおりです。詳細については、各リンクを参照してください。 - -{/* このページの目次は、YAML フロントマターのフィールド slug、description、title から - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - によって自動生成されています。 - - 誤りを見つけた場合は、各ページの YML フロントマターを編集してください。 - */ } - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -| [Shared](/engines/database-engines/shared) | ClickHouse Cloud で利用可能な `Shared` データベースエンジンについて説明します。 | -| [Atomic](/engines/database-engines/atomic) | `Atomic` エンジンは、ブロックしない `DROP TABLE` および `RENAME TABLE` クエリと、アトミックな `EXCHANGE TABLES` クエリをサポートします。`Atomic` データベースエンジンはデフォルトで使用されます。 | -| [Lazy](/engines/database-engines/lazy) | 最終アクセスから `expiration_time_in_seconds` 秒間のみテーブルを RAM に保持します。Log 型テーブルでのみ使用できます。 | -| [Replicated](/engines/database-engines/replicated) | このエンジンは Atomic エンジンを基盤としています。ZooKeeper に書き込まれる DDL ログを介してメタデータのレプリケーションをサポートし、対象データベースのすべてのレプリカで実行されます。 | -| [PostgreSQL](/engines/database-engines/postgresql) | リモートの PostgreSQL サーバー上のデータベースに接続できます。 | -| [MySQL](/engines/database-engines/mysql) | リモートの MySQL サーバー上のデータベースに接続し、ClickHouse と MySQL 間でデータを交換するために `INSERT` および `SELECT` クエリを実行できます。 | -| [SQLite](/engines/database-engines/sqlite) | SQLite データベースに接続し、ClickHouse と SQLite 間でデータを交換するために `INSERT` および `SELECT` クエリを実行できます。 | -| [MaterializedPostgreSQL](/engines/database-engines/materialized-postgresql) | PostgreSQL データベース内のテーブルを用いて ClickHouse データベースを作成します。 | -| [Backup](/engines/database-engines/backup) | バックアップからテーブル/データベースを読み取り専用モードで即座にアタッチできます。 | -| [DataLakeCatalog](/engines/database-engines/datalakecatalog) | DataLakeCatalog データベースエンジンを使用すると、ClickHouse を外部データカタログに接続し、オープンテーブル形式のデータをクエリできます。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md deleted file mode 100644 index 216fe8f5698..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: '最後のアクセスから `expiration_time_in_seconds` 秒間だけテーブルをメモリ内に保持します。Log テーブルエンジンでのみ使用できます。' -sidebar_label: 'Lazy' -sidebar_position: 20 -slug: /engines/database-engines/lazy -title: 'Lazy' -doc_type: 'reference' ---- - - - -# Lazy - -テーブルを最後のアクセスから `expiration_time_in_seconds` 秒間だけ RAM 内に保持します。 \*Log テーブルでのみ使用できます。 - -アクセス間隔が長い多数の小さな \*Log テーブルを格納する用途に最適化されています。 - - - -## データベースを作成する - -```sql -CREATE DATABASE testlazy -ENGINE = Lazy(expiration_time_in_seconds); -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md deleted file mode 100644 index 0dfe9d79b00..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md +++ /dev/null @@ -1,309 +0,0 @@ ---- -description: 'PostgreSQL データベースのテーブルから ClickHouse データベースを作成します。' -sidebar_label: 'MaterializedPostgreSQL' -sidebar_position: 60 -slug: /engines/database-engines/materialized-postgresql -title: 'MaterializedPostgreSQL' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MaterializedPostgreSQL - - - - - -:::note -ClickHouse Cloud ユーザーには、PostgreSQL から ClickHouse へのレプリケーションには [ClickPipes](/integrations/clickpipes) の利用を推奨します。ClickPipes は PostgreSQL 向けに高性能な Change Data Capture(CDC)をネイティブにサポートします。 -::: - -PostgreSQL データベースのテーブルに基づいて ClickHouse データベースを作成します。まず、`MaterializedPostgreSQL` エンジンを持つデータベースが PostgreSQL データベースのスナップショットを作成し、必要なテーブルをロードします。必要なテーブルには、指定したデータベース内の任意のスキーマおよびテーブルの任意のサブセットを含めることができます。スナップショットと同時にデータベースエンジンは LSN を取得し、テーブルの初回ダンプが完了すると、WAL から更新の取得を開始します。データベース作成後に PostgreSQL データベースへ新規に追加されたテーブルは、自動的にはレプリケーションに追加されません。これらは `ATTACH TABLE db.table` クエリを用いて手動で追加する必要があります。 - -レプリケーションは PostgreSQL Logical Replication Protocol で実装されており、DDL のレプリケーションはできませんが、レプリケーションを破綻させる変更(カラム型の変更、カラムの追加/削除)が発生したかどうかは検出できます。このような変更が検出されると、該当するテーブルは更新の受信を停止します。この場合、`ATTACH` / `DETACH PERMANENTLY` クエリを使用してテーブルを完全に再読み込みする必要があります。DDL がレプリケーションを破綻させない場合(例: カラム名の変更)には、テーブルは引き続き更新を受信します(挿入は位置に基づいて行われます)。 - -:::note -このデータベースエンジンは実験的なものです。使用するには、設定ファイルで `allow_experimental_database_materialized_postgresql` を 1 に設定するか、`SET` コマンドを使用して設定します: - -```sql -SET allow_experimental_database_materialized_postgresql=1 -``` - -::: - - -## データベースの作成 - -```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` — ユーザーのパスワード。 - - -## 使用例 - -```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; -``` - - -## レプリケーションへの新しいテーブルの動的追加 - -`MaterializedPostgreSQL` データベースが作成された後は、対応する PostgreSQL データベース内の新しいテーブルは自動的には検出されません。こうしたテーブルは手動で追加できます。 - -```sql -ATTACH TABLE postgres_database.new_table; -``` - -:::warning -バージョン 22.1 より前では、レプリケーションにテーブルを追加すると、削除されない一時レプリケーションスロット(名前は `{db_name}_ch_replication_slot_tmp`)が残っていました。ClickHouse のバージョン 22.1 より前でテーブルをアタッチする場合は、それを手動で削除してください(`SELECT pg_drop_replication_slot('{db_name}_ch_replication_slot_tmp')`)。そうしないとディスク使用量が増加します。この問題は 22.1 で修正されています。 -::: - - -## レプリケーションからテーブルを動的に除外する - -特定のテーブルをレプリケーション対象から除外することができます。 - -```sql -DETACH TABLE postgres_database.table_to_remove PERMANENTLY; -``` - - -## PostgreSQL スキーマ - -PostgreSQL の [スキーマ](https://www.postgresql.org/docs/9.1/ddl-schemas.html) は、3 通りの方法で設定できます(バージョン 21.12 以降)。 - -1. 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. 1つの `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. 1 つの `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`; -``` - -警告: このケースでは、テーブル名にピリオド(.)を含めることはできません。 - - -## 要件 - -1. PostgreSQL の設定ファイルにおいて、[wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) 設定は `logical` にし、`max_replication_slots` パラメータは少なくとも `2` に設定する必要があります。 - -2. 各レプリケーション対象テーブルには、次のいずれかの [replica identity](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; -``` - -常に最初に確認されるのは主キーです。主キーが存在しない場合は、レプリカ ID として定義されたインデックスが確認されます。 -インデックスがレプリカ ID として使用される場合、そのようなインデックスはテーブル内に 1 つだけ存在している必要があります。 -特定のテーブルでどのタイプが使用されているかは、次のコマンドで確認できます。 - -```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) 値のレプリケーションはサポートされていません。データ型に対して定義されたデフォルト値が使用されます。 -::: - - -## 設定 - -### `materialized_postgresql_tables_list` - -[MaterializedPostgreSQL](../../engines/database-engines/materialized-postgresql.md) データベースエンジンによって複製される、PostgreSQL データベースのテーブルのコンマ区切りリストを設定します。 - -各テーブルでは、複製するカラムのサブセットを角括弧で囲んで指定できます。カラムのサブセットを省略した場合、そのテーブルのすべてのカラムが複製されます。 - -```sql -materialized_postgresql_tables_list = 'table1(co1, col2),table2,table3(co3, col5, col7) -``` - -デフォルト値: 空リスト。空リストの場合、PostgreSQL データベース全体がレプリケートされます。 - -### `materialized_postgresql_schema` - -デフォルト値: 空文字列(デフォルトスキーマが使用されます)。 - -### `materialized_postgresql_schema_list` - -デフォルト値: 空リスト(デフォルトスキーマが使用されます)。 - -### `materialized_postgresql_max_block_size` - -PostgreSQL データベースのテーブルにデータをフラッシュする前に、メモリ内に蓄積する行数を設定します。 - -取りうる値: - -* 正の整数。 - -デフォルト値: `65536`。 - -### `materialized_postgresql_replication_slot` - -ユーザーが作成したレプリケーションスロットです。`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` - -レプリケーション用に一意のレプリケーションコンシューマ識別子を使用します。デフォルト: `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. ClickHouse DB へのレプリケーションが確認できたら、PostgreSQL のトランザクションを終了します。フェイルオーバー後もレプリケーションが継続していることを検証します: - - ```bash - kubectl exec acid-demo-cluster-0 -c postgres -- su postgres -c 'patronictl failover --candidate acid-demo-cluster-1 --force' - ``` - -### 必要な権限 {#required-permissions} - -1. [CREATE PUBLICATION](https://postgrespro.ru/docs/postgresql/14/sql-createpublication) -- CREATE PUBLICATION を実行する権限。 - -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) -- publication のオーナー(MaterializedPostgreSQL エンジン内の `username`)。 - -`2` および `3` のコマンドを実行せず、それらの権限を持たないようにすることも可能です。その場合は `materialized_postgresql_replication_slot` および `materialized_postgresql_snapshot` 設定を使用します。ただし、その際は細心の注意を払ってください。 - -次のテーブルへのアクセス権が必要です: - -1. pg_publication - -2. pg_replication_slots - -3. pg_publication_tables diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md deleted file mode 100644 index 0d96fca92b6..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -description: 'リモートのMySQLサーバー上のデータベースに接続し、`INSERT` および `SELECT` クエリを実行して、ClickHouse と MySQL 間でデータを交換することを可能にします。' -sidebar_label: 'MySQL' -sidebar_position: 50 -slug: /engines/database-engines/mysql -title: 'MySQL' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MySQL データベースエンジン - - - -リモートの MySQL サーバー上のデータベースに接続し、ClickHouse と MySQL 間でデータをやり取りするために `INSERT` および `SELECT` クエリを実行できます。 - -`MySQL` データベースエンジンはクエリを MySQL サーバー向けに変換するため、`SHOW TABLES` や `SHOW CREATE TABLE` などの操作を実行できます。 - -次のクエリは実行できません。 - -- `RENAME` -- `CREATE TABLE` -- `ALTER` - - - -## データベースの作成 - -```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) をサポートします。 - - - -## グローバル変数のサポート - -互換性を高めるために、グローバル変数を MySQL 互換の `@@identifier` 形式で参照できます。 - -次の変数がサポートされています: - -* `version` -* `max_allowed_packet` - -:::note -現時点では、これらの変数はスタブであり、実際には何も参照していません。 -::: - -例: - -```sql -SELECT @@version; -``` - - -## 使用例 - -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/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md deleted file mode 100644 index 83bb0870368..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -description: 'リモート PostgreSQL サーバー上のデータベースへの接続を可能にします。' -sidebar_label: 'PostgreSQL' -sidebar_position: 40 -slug: /engines/database-engines/postgresql -title: 'PostgreSQL' -doc_type: 'guide' ---- - - - -# PostgreSQL - -リモート [PostgreSQL](https://www.postgresql.org) サーバー上のデータベースに接続できます。ClickHouse と PostgreSQL 間でデータをやり取りするために、読み取りおよび書き込み操作(`SELECT` および `INSERT` クエリ)をサポートします。 - -`SHOW TABLES` および `DESCRIBE TABLE` クエリを利用して、リモート PostgreSQL 上のテーブル一覧およびテーブル構造にリアルタイムでアクセスできます。 - -テーブル構造の変更(`ALTER TABLE ... ADD|DROP COLUMN`)をサポートします。`use_table_cache` パラメータ(後述の Engine パラメータを参照)が `1` に設定されている場合、テーブル構造はキャッシュされ、変更されているかどうかのチェックは行われませんが、`DETACH` および `ATTACH` クエリで更新できます。 - - - -## データベースの作成 - -```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) | - - - -## 利用例 - -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) │ -└────────┴───────────────────┘ -``` - - -## 関連コンテンツ {#related-content} - -- ブログ: [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/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md deleted file mode 100644 index 11660d30875..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -description: "このエンジンは Atomic エンジンに基づいています。ZooKeeper に書き込まれる DDL ログを介してメタデータのレプリケーションを行い、あるデータベースに属するすべてのレプリカで実行されます。" -sidebar_label: "Replicated" -sidebar_position: 30 -slug: /engines/database-engines/replicated -title: "Replicated" -doc_type: "reference" ---- - - - -# Replicated - -このエンジンは [Atomic](../../engines/database-engines/atomic.md) エンジンをベースとしています。ZooKeeper に書き込まれる DDL ログを介したメタデータのレプリケーションをサポートしており、特定のデータベースに対するすべてのレプリカで実行されます。 - -1 つの ClickHouse サーバー上で、複数のレプリケートされたデータベースを同時に稼働させて更新することができます。ただし、同じレプリケートされたデータベースのレプリカを、1 つの ClickHouse サーバー上に複数置くことはできません。 - - - -## データベースの作成 - -```sql -CREATE DATABASE testdb [UUID '...'] ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...] -``` - -**エンジンパラメータ** - -* `zoo_path` — ZooKeeper のパス。同じ ZooKeeper パスは同じデータベースに対応します。 -* `shard_name` — シャード名。データベースレプリカは `shard_name` によってシャードにグループ化されます。 -* `replica_name` — レプリカ名。同一シャード内のすべてのレプリカで `replica_name` は異なる必要があります。 - -パラメータは省略可能です。省略した場合、指定されなかったパラメータにはデフォルト値が使用されます。 - -`zoo_path` にマクロ `{uuid}` が含まれている場合は、明示的な UUID を指定するか、すべてのレプリカがこのデータベースに対して同じ UUID を使用することを保証するために、CREATE 文に [ON CLUSTER](../../sql-reference/distributed-ddl.md) を追加する必要があります。 - -[ReplicatedMergeTree](/engines/table-engines/mergetree-family/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) システムテーブルには、レプリケートされたデータベースと同名のクラスターが含まれており、そのクラスターはデータベースのすべてのレプリカで構成されています。このクラスターはレプリカの作成・削除時に自動的に更新され、[Distributed](/engines/table-engines/special/distributed) テーブルとして利用できます。 - -新しいデータベースレプリカを作成する際、このレプリカは自身でテーブルを作成します。レプリカが長時間利用不能でレプリケーションログから大きく遅延している場合には、自身のローカルメタデータを ZooKeeper の現在のメタデータと照合し、余分なテーブルとそのデータを(不要なものを誤って削除しないように)別の非レプリケートデータベースに移動し、欠けているテーブルを作成し、テーブル名が変更されている場合はテーブル名を更新します。データは `ReplicatedMergeTree` レベルでレプリケートされます。つまり、テーブルが Replicated 系のテーブルエンジンを使用していない場合、そのデータはレプリケートされません(データベースはメタデータのみを担当します)。 - -[`ALTER TABLE FREEZE|ATTACH|FETCH|DROP|DROP DETACHED|DETACH PARTITION|PART`](../../sql-reference/statements/alter/partition.md) クエリは許可されていますが、レプリケートはされません。データベースエンジンは現在のレプリカに対してのみパーティション/パートの追加・取得・削除を行います。ただし、テーブル自体が Replicated 系のテーブルエンジンを使用している場合は、`ATTACH` を使用した後にデータがレプリケートされます。 - -テーブルレプリケーションを維持せずにクラスターのみを構成する必要がある場合は、[Cluster Discovery](../../operations/cluster-discovery.md) 機能を参照してください。 - - - -## 使用例 - -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}'); -``` - -暗黙的パラメータを使用してクラスタ上にデータベースを作成する: - -```sql -CREATE DATABASE r ON CLUSTER default ENGINE=Replicated; -``` - -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] │ -└───────┴───────────────┘ -``` - -別のホストにレプリカを追加する: - -```sql -node4 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','r2'); -``` - -`zoo_path` でマクロ `{uuid}` を使用している場合に、さらに 1 台のホストにレプリカを追加するには: - -```sql -node1 :) SELECT uuid FROM system.databases WHERE database='r'; -node4 :) CREATE DATABASE r UUID '<前のクエリのuuid>' ENGINE=Replicated('some/path/{uuid}','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] │ -└───────┴───────────────┘ -``` - - -## 設定 - -サポートされている設定は次のとおりです: - -| Setting | Default | Description | -| ---------------------------------------------------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------- | -| `max_broken_tables_ratio` | 1 | 停止状態(stale)のテーブル数と全テーブル数の比率がこの値より大きい場合、レプリカを自動復旧しない | -| `max_replication_lag_to_enqueue` | 50 | レプリケーション遅延がこの値より大きい場合、レプリカはクエリを実行しようとすると例外をスローする | -| `wait_entry_commited_timeout_sec` | 3600 | タイムアウトを超過した場合、イニシエータホストがまだそのクエリを実行していなければ、レプリカはそのクエリのキャンセルを試みる | -| `collection_name` | | クラスタ認証に関するすべての情報が定義されている、サーバー設定内のコレクションの名前 | -| `check_consistency` | true | ローカルメタデータと Keeper 内のメタデータの整合性をチェックし、不整合がある場合はレプリカの復旧を行う | -| `max_retries_before_automatic_recovery` | 10 | レプリカを失われたものとしてマークしスナップショットから復旧する前に、キューエントリの実行を試行する最大回数(0 は無制限を意味する) | -| `allow_skipping_old_temporary_tables_ddls_of_refreshable_materialized_views` | false | 有効にすると、Replicated データベースで DDL を処理する際、可能な場合はリフレッシュ可能なマテリアライズドビューの一時テーブルの DDL の作成と交換をスキップする | -| `logs_to_keep` | 1000 | Replicated データベースに対して ZooKeeper に保持するログのデフォルト件数。 | -| `default_replica_path` | `/clickhouse/databases/{uuid}` | ZooKeeper におけるデータベースへのパス。データベース作成時に引数が省略された場合に使用される。 | -| `default_replica_shard_name` | `{shard}` | データベース内のレプリカのシャード名。データベース作成時に引数が省略された場合に使用される。 | -| `default_replica_name` | `{replica}` | データベース内のレプリカ名。データベース作成時に引数が省略された場合に使用される。 | - -デフォルト値は設定ファイルで上書きできます。 - -```xml - - - 0.75 - 100 - 1800 - postgres1 - false - 5 - /clickhouse/databases/{uuid} - {shard} - {replica} - - -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md deleted file mode 100644 index 949076750dc..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: 'ClickHouse Cloud で利用可能な `Shared` データベースエンジンに関するページ' -sidebar_label: 'Shared' -sidebar_position: 10 -slug: /engines/database-engines/shared -title: 'Shared' -doc_type: 'reference' ---- - -import CloudOnlyBadge from '@theme/badges/CloudOnlyBadge'; - - - - -# Shared データベースエンジン - -`Shared` データベースエンジンは、Shared Catalog と連携して、[`SharedMergeTree`](/cloud/reference/shared-merge-tree) などのステートレスなテーブルエンジンを使用するデータベースを管理します。 -これらのテーブルエンジンは永続的な状態をディスクに書き込まず、動的なコンピュート環境と互換性があります。 - -ClickHouse Cloud における `Shared` データベースエンジンは、ローカルディスクへの依存関係を取り除きます。 -これは純粋なインメモリ エンジンであり、必要とするのは CPU とメモリだけです。 - - - -## どのように動作するのか {#how-it-works} - -`Shared` データベースエンジンは、すべてのデータベースおよびテーブル定義を、Keeper をバックエンドとした中央の Shared Catalog に保存します。ローカルディスクへ書き込む代わりに、すべてのコンピュートノード間で共有される、単一のバージョン管理されたグローバルな状態を維持します。 - -各ノードは最後に適用したバージョンのみを追跡し、起動時にローカルファイルや手動でのセットアップを必要とせずに最新の状態を取得します。 - - - -## 構文 - -エンドユーザーが Shared Catalog と Shared データベースエンジンを利用する際に、特別な設定は必要ありません。データベースの作成手順は従来どおりです。 - -```sql -CREATE DATABASE my_database; -``` - -ClickHouse Cloud は、データベースに Shared database engine を自動的に割り当てます。そのようなデータベース内で stateless engines を使用して作成されたテーブルは、Shared Catalog のレプリケーションおよび調整機能の恩恵を自動的に受けます。 - -:::tip -Shared Catalog とその利点の詳細については、Cloud リファレンス セクションの ["Shared catalog and shared database engine"](/cloud/reference/shared-catalog) を参照してください。 -::: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md deleted file mode 100644 index ec3f790a4fe..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -description: 'SQLite データベースに接続し、ClickHouse と SQLite 間でデータを交換するために `INSERT` および `SELECT` - クエリを実行できます。' -sidebar_label: 'SQLite' -sidebar_position: 55 -slug: /engines/database-engines/sqlite -title: 'SQLite' -doc_type: 'reference' ---- - - - -# SQLite - -[SQLite](https://www.sqlite.org/index.html) データベースに接続し、`INSERT` および `SELECT` クエリを実行して、ClickHouse と SQLite 間でデータを交換できるようにします。 - - - -## データベースの作成 - -```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 は、データベース全体(定義、テーブル、インデックス、および実データ)をホストマシン上の 1 つのクロスプラットフォームファイルとして保存します。書き込み中、SQLite はデータベースファイル全体をロックするため、書き込み操作は逐次的に実行されます。一方で、読み取り操作は並行して実行できます。 -SQLite には、サービスとしての管理(起動スクリプトなど)や、`GRANT` やパスワードに基づくアクセス制御は必要ありません。アクセス制御は、データベースファイル自体に付与されたファイルシステムのパーミッションによって行われます。 - - - -## 使用例 - -SQLite に接続された ClickHouse のデータベース: - -```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/i18n/jp/docusaurus-plugin-content-docs/current/engines/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/index.md deleted file mode 100644 index bda68aa7472..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -description: 'エンジンの目次ページ' -slug: /engines -title: 'エンジン' -doc_type: 'landing-page' ---- - -| Page | Description | -|----------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Database Engines](../engines/database-engines/index.md) | ClickHouse のデータベースエンジンは、テーブルの扱い方やデータの保存・管理方法を決定する役割を持ちます。ClickHouse で利用可能なさまざまなデータベースエンジンについて詳しく学ぶことができます。 | -| [Table Engines](../engines/table-engines/index.md) | ClickHouse のテーブルエンジンは、データの保存、書き込み、読み取り方法を決定する基本概念です。ClickHouse で利用可能なさまざまなテーブルエンジンについて詳しく学ぶことができます。 | \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/index.md deleted file mode 100644 index 2923e5a08cb..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/index.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -description: 'テーブルエンジンのドキュメント' -slug: /engines/table-engines/ -toc_folder_title: 'テーブルエンジン' -toc_priority: 26 -toc_title: '概要' -title: 'テーブルエンジン' -doc_type: 'reference' ---- - - - -# テーブルエンジン - -テーブルエンジン(テーブルの種類)は、次の点を決定します。 - -- データの保存方法と保存場所、書き込み先および読み取り元。 -- どのクエリがどのようにサポートされるか。 -- データへの同時アクセス。 -- インデックスが存在する場合の利用方法。 -- リクエストをマルチスレッドで実行できるかどうか。 -- データレプリケーションの設定。 - - - -## エンジンファミリー {#engine-families} - -### MergeTree {#mergetree} - -高負荷ワークロード向けの、最も汎用的かつ高機能なテーブルエンジンです。これらのエンジンに共通する特性は、高速なデータ挿入と、その後のバックグラウンドでのデータ処理です。`MergeTree` ファミリーのエンジンは、データレプリケーション(エンジンの [Replicated\*](/engines/table-engines/mergetree-family/replication) バージョンによる)、パーティショニング、セカンダリのデータスキップインデックス、その他のエンジンではサポートされない機能をサポートします。 - -このファミリーに含まれるエンジン: - -| MergeTree エンジン | -|-------------------------------------------------------------------------------------------------------------------------------------------| -| [MergeTree](/engines/table-engines/mergetree-family/mergetree) | -| [ReplacingMergeTree](/engines/table-engines/mergetree-family/replacingmergetree) | -| [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree) | -| [AggregatingMergeTree](/engines/table-engines/mergetree-family/aggregatingmergetree) | -| [CollapsingMergeTree](/engines/table-engines/mergetree-family/collapsingmergetree) | -| [VersionedCollapsingMergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) | -| [GraphiteMergeTree](/engines/table-engines/mergetree-family/graphitemergetree) | -| [CoalescingMergeTree](/engines/table-engines/mergetree-family/coalescingmergetree) | - -### Log {#log} - -最小限の機能を持つ軽量な [エンジン](../../engines/table-engines/log-family/index.md) です。多数の小さなテーブル(最大で約 100 万行)をすばやく書き込み、その後にテーブル全体をまとめて読み出す必要がある場合に最も効果的です。 - -このファミリーに含まれるエンジン: - -| Log エンジン | -|----------------------------------------------------------------------------| -| [TinyLog](/engines/table-engines/log-family/tinylog) | -| [StripeLog](/engines/table-engines/log-family/stripelog) | -| [Log](/engines/table-engines/log-family/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} - -このファミリーに含まれるエンジン: - - - -| 特殊エンジン | -|---------------------------------------------------------------| -| [Distributed](/engines/table-engines/special/distributed) | -| [Dictionary](/engines/table-engines/special/dictionary) | -| [Merge](/engines/table-engines/special/merge) | -| [Executable](/engines/table-engines/special/executable) | -| [File](/engines/table-engines/special/file) | -| [Null](/engines/table-engines/special/null) | -| [Set](/engines/table-engines/special/set) | -| [Join](/engines/table-engines/special/join) | -| [URL](/engines/table-engines/special/url) | -| [View](/engines/table-engines/special/view) | -| [Memory](/engines/table-engines/special/memory) | -| [Buffer](/engines/table-engines/special/buffer) | -| [External Data](/engines/table-engines/special/external-data) | -| [GenerateRandom](/engines/table-engines/special/generate) | -| [KeeperMap](/engines/table-engines/special/keeper-map) | -| [FileLog](/engines/table-engines/special/filelog) | - - - -## 仮想列 {#table_engines-virtual_columns} - -仮想列は、テーブルエンジンのソースコード内で定義されている、そのテーブルエンジンに本質的な属性です。 - -`CREATE TABLE` クエリで仮想列を指定してはならず、`SHOW CREATE TABLE` や `DESCRIBE TABLE` クエリの結果にも表示されません。仮想列は読み取り専用であり、仮想列にデータを挿入することはできません。 - -仮想列からデータを取得するには、その名前を `SELECT` クエリで指定する必要があります。`SELECT *` では仮想列の値は返されません。 - -テーブルの仮想列の 1 つと同じ名前の列を定義してテーブルを作成した場合、その仮想列にはアクセスできなくなります。このような構成は推奨されません。競合を避けるため、仮想列の名前には通常アンダースコアが接頭辞として付けられます。 - -- `_table` — データが読み取られたテーブル名を含みます。型: [String](../../sql-reference/data-types/string.md)。 - - 使用されているテーブルエンジンに関係なく、各テーブルには `_table` という名前の汎用仮想列が含まれています。 - - マージテーブルエンジンを使用するテーブルに対してクエリを実行する場合、`WHERE` / `PREWHERE` 句で `_table` に対する定数条件を設定できます(例: `WHERE _table='xyz'`)。この場合、読み取り処理は `_table` に対する条件が満たされるテーブルに対してのみ実行されるため、`_table` 列はインデックスとして機能します。 - - `SELECT ... FROM (... UNION ALL ...)` のような形式のクエリを使用する場合、`_table` 列を指定することで、返された行がどの実テーブルに由来するかを判別できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md deleted file mode 100644 index c0b4b97b07e..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: '`ExternalDistributed` エンジンを使用すると、リモートサーバー上の MySQL または PostgreSQL データベースに保存されているデータに対して `SELECT` クエリを実行できます。MySQL または PostgreSQL エンジンを引数として受け取れるため、シャーディングが可能です。' -sidebar_label: 'ExternalDistributed' -sidebar_position: 55 -slug: /engines/table-engines/integrations/ExternalDistributed -title: 'ExternalDistributed テーブルエンジン' -doc_type: 'reference' ---- - - - -# ExternalDistributed テーブルエンジン - -`ExternalDistributed` エンジンを使用すると、リモートサーバー上の MySQL または PostgreSQL データベースに保存されているデータに対して `SELECT` クエリを実行できます。引数として [MySQL](../../../engines/table-engines/integrations/mysql.md) または [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md) エンジンを指定できるため、シャーディングが可能です。 - - - -## テーブルを作成する - -```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) クエリの詳細について参照してください。 - -テーブル構造は元のテーブル構造と異なっていてもかまいません。 - -* 列名は元のテーブルと同じである必要がありますが、その一部のみを任意の順序で使用できます。 -* 列型は元のテーブルと異なっていてもかまいません。ClickHouse は、値を ClickHouse のデータ型に[キャスト](/sql-reference/functions/type-conversion-functions#cast)しようとします。 - -**エンジンパラメータ** - -* `engine` — テーブルエンジン。`MySQL` または `PostgreSQL` を指定します。 -* `host:port` — MySQL または PostgreSQL サーバーのアドレス。 -* `database` — リモートデータベース名。 -* `table` — リモートテーブル名。 -* `user` — ユーザー名。 -* `password` — ユーザーのパスワード。 - - -## 実装の詳細 - -複数レプリカ構成をサポートしており、レプリカは `|` で、シャードは `,` で区切って列挙する必要があります。例えば次のようになります。 - -```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'); -``` - -レプリカ数を指定すると、読み取り時には各シャードに対して利用可能なレプリカのうち 1 つが選択されます。接続に失敗した場合は次のレプリカが選択され、すべてのレプリカについて同様に処理されます。すべてのレプリカへの接続試行が失敗した場合は、同じ手順で複数回再試行されます。 - -任意の数のシャードと、各シャードに対する任意の数のレプリカを指定できます。 - -**関連項目** - -* [MySQL table engine](../../../engines/table-engines/integrations/mysql.md) -* [PostgreSQL table engine](../../../engines/table-engines/integrations/postgresql.md) -* [Distributed table engine](../../../engines/table-engines/special/distributed.md) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md deleted file mode 100644 index 339f3533e35..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -description: 'このエンジンを使用すると、Apache Arrow Flight 経由でリモートデータセットにクエリを実行できます。' -sidebar_label: 'ArrowFlight' -sidebar_position: 186 -slug: /engines/table-engines/integrations/arrowflight -title: 'ArrowFlight テーブルエンジン' -doc_type: 'reference' ---- - - - -# ArrowFlight テーブルエンジン - -ArrowFlight テーブルエンジンを使用すると、ClickHouse は [Apache Arrow Flight](https://arrow.apache.org/docs/format/Flight.html) プロトコル経由でリモートのデータセットに対してクエリを実行できます。 -この統合により、ClickHouse は外部の Flight 対応サーバーから、列指向の Arrow 形式で高いパフォーマンスでデータを取得できます。 - - - -## テーブルを作成する - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name (name1 [type1], name2 [type2], ...) - ENGINE = ArrowFlight('host:port', 'dataset_name' [, 'username', 'password']); -``` - -**エンジンパラメータ** - -* `host:port` — リモート Arrow Flight サーバーのアドレス。 -* `dataset_name` — Flight サーバー上のデータセットの識別子。 -* `username` - HTTP ベーシック認証で使用するユーザー名。 -* `password` - HTTP ベーシック認証で使用するパスワード。 - `username` と `password` が指定されていない場合は認証を行わないことを意味します - (その場合、Arrow Flight サーバー側で未認証アクセスが許可されている必要があります)。 - - -## 使用例 - -この例では、リモートの Arrow Flight サーバーからデータを読み込むテーブルを作成する方法を示します。 - -```sql -CREATE TABLE remote_flight_data -( - id UInt32, - name String, - value Float64 -) ENGINE = ArrowFlight('127.0.0.1:9005', 'sample_dataset'); -``` - -リモートデータに対して、ローカルテーブルと同じようにクエリを実行します: - -```sql -SELECT * FROM remote_flight_data ORDER BY id; -``` - -```text -┌─id─┬─name────┬─value─┐ -│ 1 │ foo │ 42.1 │ -│ 2 │ bar │ 13.3 │ -│ 3 │ baz │ 77.0 │ -└────┴─────────┴───────┘ -``` - - -## 注意事項 {#notes} - -* ClickHouseで定義されたスキーマは、Flight サーバーによって返されるスキーマと一致している必要があります。 -* このエンジンは、フェデレーションクエリ、データ仮想化、ストレージとコンピュートの分離に適しています。 - - - -## 関連情報 {#see-also} - -* [Apache Arrow Flight SQL](https://arrow.apache.org/docs/format/FlightSql.html) -* [ClickHouse における Arrow フォーマットの統合](/interfaces/formats/Arrow) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md deleted file mode 100644 index 1fe1381f930..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -description: 'このエンジンは Azure Blob Storage エコシステムとの統合を提供し、ストリーミングデータの取り込みを可能にします。' -sidebar_label: 'AzureQueue' -sidebar_position: 181 -slug: /engines/table-engines/integrations/azure-queue -title: 'AzureQueue テーブルエンジン' -doc_type: 'reference' ---- - - - -# 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)を参照してください。 - -[AzureBlobStorage](/engines/table-engines/integrations/azureBlobStorage)テーブルエンジンと同様に、ローカルでのAzure Storage開発にはAzuriteエミュレータを使用できます。詳細については[こちら](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=docker-hub%2Cblob-storage)を参照してください。 - -**例** - -```sql -CREATE TABLE azure_queue_engine_table -( - `key` UInt64, - `data` String -) -ENGINE = AzureQueue('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', 'testcontainer', '*', 'CSV') -SETTINGS mode = 'unordered' -``` - - -## 設定 {#settings} - -サポートされている設定は`S3Queue`テーブルエンジンと同じですが、`s3queue_`プレフィックスは付きません。[設定の完全なリスト](../../../engines/table-engines/integrations/s3queue.md#settings)を参照してください。 -テーブルに設定されている設定のリストを取得するには、`system.azure_queue_settings`テーブルを使用します。`24.10`から利用可能です。 - - -## Description {#description} - -`SELECT`はストリーミングインポートにはあまり有用ではありません(デバッグを除く)。各ファイルは一度しかインポートできないためです。[マテリアライズドビュー](../../../sql-reference/statements/create/view.md)を使用してリアルタイム処理を作成する方が実用的です。これを行うには: - -1. エンジンを使用してS3の指定されたパスから読み取るテーブルを作成し、それをデータストリームとして扱います。 -2. 必要な構造を持つテーブルを作成します。 -3. エンジンからデータを変換し、事前に作成したテーブルに格納するマテリアライズドビューを作成します。 - -`MATERIALIZED VIEW`がエンジンに接続されると、バックグラウンドでデータの収集が開始されます。 - -例: - -```sql -CREATE TABLE azure_queue_engine_table (key UInt64, data String) - ENGINE=AzureQueue('', 'CSV', 'gzip') - SETTINGS - mode = 'unordered'; - -CREATE TABLE stats (key UInt64, data String) - ENGINE = MergeTree() ORDER BY key; - -CREATE MATERIALIZED VIEW consumer TO stats - AS SELECT key, data FROM azure_queue_engine_table; - -SELECT * FROM stats ORDER BY key; -``` - - -## 仮想カラム {#virtual-columns} - -- `_path` — ファイルへのパス -- `_file` — ファイル名 - -仮想カラムの詳細については、[こちら](../../../engines/table-engines/index.md#table_engines-virtual_columns)を参照してください。 - - -## イントロスペクション {#introspection} - -テーブル設定 `enable_logging_to_queue_log=1` でテーブルのログ記録を有効にします。 - -イントロスペクション機能は [S3Queueテーブルエンジン](/engines/table-engines/integrations/s3queue#introspection) と同じですが、いくつかの相違点があります: - -1. サーババージョン >= 25.1 では、キューのインメモリ状態に `system.azure_queue` を使用します。それ以前のバージョンでは `system.s3queue` を使用します(`azure` テーブルの情報も含まれます)。 -2. メインのClickHouse設定で `system.azure_queue_log` を有効にします。例: - -```xml - - system - azure_queue_log
-
-``` - -この永続テーブルは `system.s3queue` と同じ情報を持ちますが、処理済みおよび失敗したファイルに関するものです。 - -テーブルは以下の構造を持ちます: - -```sql - -CREATE TABLE system.azure_queue_log -( - `hostname` LowCardinality(String) COMMENT 'ホスト名', - `event_date` Date COMMENT 'このログ行を書き込んだイベント日付', - `event_time` DateTime COMMENT 'このログ行を書き込んだイベント時刻', - `database` String COMMENT '現在のS3Queueテーブルが存在するデータベースの名前', - `table` String COMMENT 'S3Queueテーブルの名前', - `uuid` String COMMENT 'S3QueueテーブルのUUID', - `file_name` String COMMENT '処理ファイルのファイル名', - `rows_processed` UInt64 COMMENT '処理された行数', - `status` Enum8('Processed' = 0, 'Failed' = 1) COMMENT '処理ファイルのステータス', - `processing_start_time` Nullable(DateTime) COMMENT 'ファイル処理の開始時刻', - `processing_end_time` Nullable(DateTime) COMMENT 'ファイル処理の終了時刻', - `exception` String COMMENT '発生した例外メッセージ' -) -ENGINE = MergeTree -PARTITION BY toYYYYMM(event_date) -ORDER BY (event_date, event_time) -SETTINGS index_granularity = 8192 -COMMENT 'S3Queueエンジンによって処理されたファイルの情報を含むログエントリを格納します。' - -``` - -例: - -```sql -SELECT * -FROM system.azure_queue_log -LIMIT 1 -FORMAT Vertical - -Row 1: -────── -hostname: clickhouse -event_date: 2024-12-16 -event_time: 2024-12-16 13:42:47 -database: default -table: azure_queue_engine_table -uuid: 1bc52858-00c0-420d-8d03-ac3f189f27c8 -file_name: test_1.csv -rows_processed: 3 -status: Processed -processing_start_time: 2024-12-16 13:42:47 -processing_end_time: 2024-12-16 13:42:47 -exception: - -1 row in set. Elapsed: 0.002 sec. - -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md deleted file mode 100644 index c07db77f886..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -description: 'このエンジンは Azure Blob Storage エコシステムとの連携機能を提供します。' -sidebar_label: 'Azure Blob Storage' -sidebar_position: 10 -slug: /engines/table-engines/integrations/azureBlobStorage -title: 'AzureBlobStorage テーブルエンジン' -doc_type: 'reference' ---- - - - -# 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_strategy, partition_columns_in_data_file, extra_credentials(client_id=, tenant_id=)]) - [PARTITION BY expr] - [SETTINGS ...] -``` - -### エンジンパラメータ - -* `endpoint` — コンテナおよびプレフィックスを含む Azure Blob Storage のエンドポイント URL。使用する認証方式で必要な場合は、任意で account_name を含めることもできます(`http://azurite1:{port}/[account_name]{container_name}/{data_prefix}`)。あるいは、これらのパラメータを storage_account_url、account_name、container を用いて個別に指定することもできます。プレフィックスを指定する場合は、endpoint を使用する必要があります。 -* `endpoint_contains_account_name` - endpoint に 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` — ファイルの[フォーマット](/interfaces/formats.md)。 -* `compression` — サポートされる値: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`。デフォルトでは、ファイル拡張子から圧縮形式を自動検出します(`auto` を設定した場合と同じです)。 -* `partition_strategy` – オプション: `WILDCARD` または `HIVE`。`WILDCARD` はパス内に `{_partition_id}` を必要とし、これはパーティションキーに置き換えられます。`HIVE` はワイルドカードを許可せず、パスをテーブルルートとみなし、Snowflake ID をファイル名、ファイルフォーマットを拡張子とする Hive 形式のパーティションディレクトリを生成します。デフォルトは `WILDCARD` です。 -* `partition_columns_in_data_file` - `HIVE` パーティション戦略でのみ使用されます。ClickHouse がパーティションカラムもデータファイル内に書き込むことを想定すべきかどうかを指定します。デフォルトは `false` です。 -* `extra_credentials` - 認証には `client_id` および `tenant_id` を使用します。extra_credentials が指定されている場合、`account_name` および `account_key` よりも優先されます。 - -**Example** - -ユーザーはローカルの Azure Storage 開発用に Azurite エミュレーターを使用できます。詳細は[こちら](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=docker-hub%2Cblob-storage)を参照してください。ローカルインスタンスの Azurite を使用する場合、以下のコマンドでは Azurite がホスト `azurite1` で利用可能であると仮定しているため、`http://azurite1:10000` を `http://localhost:10000` に置き換える必要がある場合があります。 - -```sql -CREATE TABLE test_table (key UInt64, data String) - ENGINE = AzureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', 'testcontainer', '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` — ファイルへのパス。型: `LowCardinality(String)`。 -- `_file` — ファイル名。型: `LowCardinality(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 内に '?' が含まれていることで識別されます。例については [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage#using-shared-access-signatures-sas-sas-tokens) を参照してください。 -* `Workload Identity` — `endpoint` または `storage_account_url` を指定することで利用できます。設定で `use_workload_identity` パラメータが指定されている場合、認証には [workload identity](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#authenticate-azure-hosted-applications) が使用されます。 - -### データキャッシュ - -`Azure` テーブルエンジンはローカルディスク上でのデータキャッシュをサポートします。 -ファイルシステムキャッシュの設定オプションと利用方法については、この [セクション](/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/;', 'testcontainer', 'test_table', 'CSV') -SETTINGS filesystem_cache_name = 'cache_for_azure', enable_filesystem_cache = 1; -``` - -1. ClickHouse の設定ファイルに以下のセクションを追加します: - -```xml - - - - キャッシュディレクトリへのパス - 10Gi - - - -``` - -2. ClickHouse の `storage_configuration` セクションで定義されたキャッシュ設定(およびキャッシュストレージ)を再利用します。詳細は[こちら](/operations/storing-data.md/#using-local-cache)を参照してください。 - -### PARTITION BY - -`PARTITION BY` — 任意です。ほとんどの場合、パーティションキーは不要であり、必要な場合でも月単位より細かいパーティションキーが必要になることは通常ありません。パーティショニングは(ORDER BY 式とは対照的に)クエリの高速化には寄与しません。パーティションを細かくし過ぎてはいけません。データをクライアント識別子やクライアント名でパーティション分割しないでください(代わりに、クライアント識別子または名前を ORDER BY 式の先頭のカラムにします)。 - -月単位でパーティショニングするには、`toYYYYMM(date_column)` 式を使用します。ここで `date_column` は型が [Date](/sql-reference/data-types/date.md) の日付カラムです。ここでのパーティション名は `"YYYYMM"` 形式になります。 - -#### パーティション戦略 - -`WILDCARD`(デフォルト):ファイルパス内の `{_partition_id}` ワイルドカードを実際のパーティションキーに置き換えます。読み取りはサポートされていません。 - -`HIVE` は読み取りと書き込みのための Hive スタイルのパーティショニングを実装します。読み取りは再帰的なグロブパターンを用いて行われます。書き込みでは、次の形式でファイルを生成します: `//.`。 - -注意: `HIVE` パーティション戦略を使用する場合、`use_hive_partitioning` 設定は影響しません。 - -`HIVE` パーティション戦略の例: - -```sql -arthur :) create table azure_table (year UInt16, country String, counter UInt8) ENGINE=AzureBlobStorage(account_name='devstoreaccount1', account_key='Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==', storage_account_url = 'http://localhost:30000/devstoreaccount1', container='cont', blob_path='hive_partitioned', format='Parquet', compression='auto', partition_strategy='hive') PARTITION BY (year, country); - -arthur :) insert into azure_table values (2020, 'Russia', 1), (2021, 'Brazil', 2); - -arthur :) select _path, * from azure_table; -``` - - -┌─_path──────────────────────────────────────────────────────────────────────┬─年─┬─国─┬─カウンタ─┐ - -1. │ cont/hive_partitioned/year=2020/country=Russia/7351305360873664512.parquet │ 2020 │ Russia │ 1 │ -2. │ cont/hive_partitioned/year=2021/country=Brazil/7351305360894636032.parquet │ 2021 │ Brazil │ 2 │ - └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘ - -``` -``` - - -## 関連項目 {#see-also} - -[Azure Blob Storage テーブル関数](/sql-reference/table-functions/azureBlobStorage) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md deleted file mode 100644 index ced4221a56e..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -description: 'このエンジンは、Amazon S3 上にある既存の Delta Lake テーブルへの読み取り専用統合を提供します。' -sidebar_label: 'DeltaLake' -sidebar_position: 40 -slug: /engines/table-engines/integrations/deltalake -title: 'DeltaLake テーブルエンジン' -doc_type: 'reference' ---- - - - -# 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](/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') -``` - -名前付きコレクションの使用: - -```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') -``` - -### データキャッシュ - -`Iceberg` テーブルエンジンおよびテーブル関数は、`S3`、`AzureBlobStorage`、`HDFS` ストレージと同様に、データキャッシュをサポートします。詳細は[こちら](../../../engines/table-engines/integrations/s3.md#data-cache)を参照してください。 - - -## 関連項目 {#see-also} - -- [deltaLake テーブル関数](../../../sql-reference/table-functions/deltalake.md) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md deleted file mode 100644 index b4bcbbdefcf..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md +++ /dev/null @@ -1,239 +0,0 @@ ---- -description: 'このエンジンは ClickHouse を RocksDB と統合します' -sidebar_label: 'EmbeddedRocksDB' -sidebar_position: 50 -slug: /engines/table-engines/integrations/embedded-rocksdb -title: 'EmbeddedRocksDB テーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# EmbeddedRocksDB テーブルエンジン - - - -このエンジンを使用すると、ClickHouse を [RocksDB](http://rocksdb.org/) と統合できます。 - - - -## テーブルの作成 - -```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` - 値の有効期間(time to live)。TTL は秒単位で指定します。TTL が 0 の場合は、通常の RocksDB インスタンスが使用されます(TTL なし)。 -* `rocksdb_dir` - 既存の RocksDB のディレクトリパス、または作成される RocksDB の出力先ディレクトリパスを指定します。指定された `rocksdb_dir` を用いてテーブルを開きます。 -* `read_only` - `read_only` が true に設定されている場合、読み取り専用モードが使用されます。TTL 付きのストレージでは、コンパクション(手動・自動ともに)はトリガーされず、期限切れのエントリは削除されません。 -* `primary_key_name` – カラムリスト内の任意のカラム名。 -* `primary key` は必ず指定する必要があり、プライマリキーには 1 つのカラムのみを指定できます。プライマリキーはバイナリ形式で `rocksdb key` としてシリアライズされます。 -* プライマリキー以外のカラムは、対応する順序でバイナリ形式の `rocksdb` value としてシリアライズされます。 -* キーに対する `equals` または `in` フィルタリングを用いたクエリは、`rocksdb` からの複数キーのルックアップに最適化されます。 - -エンジン設定: - -* `optimize_for_bulk_insert` – テーブルをバルクインサート向けに最適化します(INSERT パイプラインは memtable への書き込みではなく SST ファイルを作成して 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 -``` - - -## メトリクス - -RocksDB の統計情報を提供する `system.rocksdb` というテーブルもあります。 - -```sql -SELECT - name, - value -FROM system.rocksdb - -┌─name──────────────────────┬─value─┐ -│ no.file.opens │ 1 │ -│ number.block.decompressed │ 1 │ -└───────────────────────────┴───────┘ -``` - - -## 設定 - -`config` を使用して、[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` の近似値を表示するには、この設定を有効にしておく必要があります。 - - -## サポートされている操作 - -### 挿入 - -新しい行が `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 -テーブル test の全データを削除; -``` - -### 更新 - -値は `ALTER TABLE` クエリを使用して更新できます。主キーは変更できません。 - -```sql -ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1; -``` - -### 結合 - -EmbeddedRocksDB テーブルでは、特殊な `direct` 結合がサポートされています。 -この `direct` 結合ではメモリ内にハッシュテーブルを構築せず、 -EmbeddedRocksDB からデータへ直接アクセスします。 - -大規模な結合では、ハッシュテーブルが作成されないため、 -`direct` 結合を使用することでメモリ使用量が大幅に少なくなる場合があります。 - -`direct` 結合を有効にするには、次のようにします。 - -```sql -SET join_algorithm = 'direct, hash' -``` - -:::tip -`join_algorithm` が `direct, hash` に設定されている場合、可能なときは direct join が使用され、それ以外の場合は hash join が使用されます。 -::: - -#### 例 - -##### 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); -``` - -##### `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 の詳細情報 - -* [`join_algorithm` 設定](/operations/settings/settings.md#join_algorithm) -* [JOIN 句](/sql-reference/statements/select/join.md) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md deleted file mode 100644 index c5cc68f30aa..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md +++ /dev/null @@ -1,266 +0,0 @@ ---- -description: 'このエンジンは、ClickHouse 経由で HDFS 上のデータを管理できるようにすることで、Apache Hadoop エコシステムとの統合を実現します。このエンジンは File エンジンおよび URL エンジンに似ていますが、Hadoop 固有の機能を備えています。' -sidebar_label: 'HDFS' -sidebar_position: 80 -slug: /engines/table-engines/integrations/hdfs -title: 'HDFS テーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# HDFS テーブルエンジン - - - -このエンジンは、ClickHouse から [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) 上のデータを管理できるようにすることで、[Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop) エコシステムとの統合を提供します。このエンジンは [File](/engines/table-engines/special/file) エンジンや [URL](/engines/table-engines/special/url) エンジンと似ていますが、Hadoop 固有の機能を提供します。 - -この機能は ClickHouse のエンジニアによる公式サポート対象ではなく、その品質には問題があることが知られています。問題が発生した場合は、ご自身で修正し、pull request を送信してください。 - - - -## 使用方法 - -```sql -ENGINE = HDFS(URI, format) -``` - -**エンジンパラメータ** - -* `URI` - HDFS 内のファイル全体を指す URI。`URI` のパス部分にはグロブパターンを含めることができます。この場合、テーブルは読み取り専用になります。 -* `format` - 利用可能なファイルフォーマットの 1 つを指定します。 - `SELECT` クエリを実行するには、そのフォーマットが入力用としてサポートされている必要があり、`INSERT` クエリを実行するには出力用としてサポートされている必要があります。利用可能なフォーマットは - [Formats](/sql-reference/formats#formats-overview) セクションに一覧されています。 -* [PARTITION BY expr] - -### PARTITION BY - -`PARTITION BY` — 任意です。ほとんどの場合、パーティションキーは不要であり、必要な場合でも、一般的には月単位より細かいパーティションキーは不要です。パーティショニングは(ORDER BY 式とは対照的に)クエリを高速化しません。細かすぎるパーティショニングは決して行うべきではありません。クライアント ID や名前でデータをパーティションしないでください(代わりに、ORDER BY 式の先頭のカラムとしてクライアント ID または名前を指定してください)。 - -月単位でパーティショニングするには、`toYYYYMM(date_column)` 式を使用します。ここで、`date_column` は [Date](/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 │ -└──────┴───────┘ -``` - - -## 実装の詳細 - -* 読み取りと書き込みは並列に実行できます。 -* 次の機能はサポートされません: - - * `ALTER` および `SELECT...SAMPLE` の操作。 - * インデックス。 - * [Zero-copy](../../../operations/storing-data.md#zero-copy) レプリケーションは利用可能ですが、推奨されません。 - - :::note Zero-copy replication は本番利用には準備ができていません - Zero-copy レプリケーションは ClickHouse バージョン 22.8 以降ではデフォルトで無効化されています。この機能は本番環境での使用は推奨されません。 - ::: - -**パス内のグロブ** - -複数のパス要素でグロブを使用できます。処理対象となるには、ファイルが存在し、パス全体のパターンに一致している必要があります。ファイルの一覧は `SELECT` 実行時に決定されます(`CREATE` 時点ではありません)。 - -* `*` — 空文字列を含め、`/` 以外の任意の文字列(任意個の文字)にマッチします。 -* `?` — 任意の 1 文字にマッチします。 -* `{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. HDFS 上に、次の URI を持つ TSV 形式のファイルが複数あるとします: - - * '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. これら 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') -``` - -## 設定 - -GraphiteMergeTree と同様に、HDFS エンジンでは ClickHouse の設定ファイルを用いた拡張的な設定が可能です。使用できる設定キーは 2 種類あり、グローバル (`hdfs`) とユーザーレベル (`hdfs_*`) です。最初にグローバル設定が適用され、その後に(存在する場合は)ユーザーレベルの設定が適用されます。 - -```xml - - - /tmp/keytab/clickhouse.keytab - clickuser@TEST.CLICKHOUSE.TECH - kerberos - - - - - root@TEST.CLICKHOUSE.TECH - -``` - -### 設定オプション - -#### libhdfs3 がサポートする項目 - - -| **parameter** | **default value** | -| - | - | -| 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} - -| **parameter** | **default value** | -| - | - | -|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 サポート - -libhdfs3 は HDFS NameNode の HA をサポートします。 - -* HDFS ノードから `hdfs-site.xml` を `/etc/clickhouse-server/` にコピーします。 -* 次の内容を ClickHouse の設定ファイルに追加します。 - -```xml - - /etc/clickhouse-server/hdfs-site.xml - -``` - -* 次に、HDFS URI 内の名前ノードのアドレスとして、`hdfs-site.xml` の `dfs.nameservices` タグの値を使用します。たとえば、`hdfs://appadmin@192.168.101.11:8020/abc/` を `hdfs://appadmin@my_nameservice/abc/` に置き換えます。 - - -## 仮想カラム {#virtual-columns} - -- `_path` — ファイルへのパス。型: `LowCardinality(String)`。 -- `_file` — ファイル名。型: `LowCardinality(String)`。 -- `_size` — ファイルサイズ(バイト単位)。型: `Nullable(UInt64)`。サイズが不明な場合、値は `NULL` となります。 -- `_time` — ファイルの最終更新時刻。型: `Nullable(DateTime)`。時刻が不明な場合、値は `NULL` となります。 - - - -## ストレージ設定 {#storage-settings} - -- [hdfs_truncate_on_insert](/operations/settings/settings.md#hdfs_truncate_on_insert) - 挿入前にファイルを切り詰められるようにします。デフォルトでは無効です。 -- [hdfs_create_new_file_on_insert](/operations/settings/settings.md#hdfs_create_new_file_on_insert) - フォーマットにサフィックスがある場合、挿入ごとに新しいファイルを作成できるようにします。デフォルトでは無効です。 -- [hdfs_skip_empty_files](/operations/settings/settings.md#hdfs_skip_empty_files) - 読み取り時に空のファイルを読み飛ばせるようにします。デフォルトでは無効です。 - -**関連項目** - -- [仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md deleted file mode 100644 index 40d5b433858..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md +++ /dev/null @@ -1,439 +0,0 @@ ---- -description: 'Hive エンジンを使用すると、HDFS 上の Hive テーブルに対して `SELECT` クエリを実行できます。' -sidebar_label: 'Hive' -sidebar_position: 84 -slug: /engines/table-engines/integrations/hive -title: 'Hive テーブルエンジン' -doc_type: 'guide' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Hive テーブルエンジン - - - -Hive エンジンを使用すると、HDFS 上の Hive テーブルに対して `SELECT` クエリを実行できます。現在、以下の入力フォーマットをサポートしています。 - -- Text: `binary` を除く単純なスカラー列型のみをサポート - -- ORC: `char` を除く単純なスカラー列型をサポートし、複合型は `array` のみサポート - -- Parquet: すべての単純なスカラー列型をサポートし、複合型は `array` のみサポート - - - -## テーブルを作成する - -```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) クエリの詳細な説明を参照してください。 - -テーブル構造は、元の Hive テーブル構造と異なる場合があります。 - -* 列名は元の Hive テーブルと同じである必要がありますが、その一部の列だけを任意の順序で使用できます。また、他の列から計算されたエイリアス列を使用することもできます。 -* 列の型は元の Hive テーブルのものと同じである必要があります。 -* `PARTITION BY` 句の式は元の Hive テーブルと整合している必要があり、`PARTITION BY` 句で使用される列はテーブル構造内に含まれていなければなりません。 - -**エンジンパラメータ** - -* `thrift://host:port` — Hive Metastore のアドレス - -* `database` — リモートデータベース名。 - -* `table` — リモートテーブル名。 - - -## 使用例 - -### HDFS ファイルシステムでローカルキャッシュを使用する方法 - -リモートファイルシステムに対しては、ローカルキャッシュを有効にすることを強く推奨します。ベンチマークでは、キャッシュありの場合はほぼ 2 倍高速になることが示されています。 - -キャッシュを使用する前に、`config.xml` に設定を追加します。 - -```xml - - true - local_cache - 559096952 - 1048576 - -``` - -* enable: true の場合、ClickHouse は起動後にリモートファイルシステム (HDFS) 用のローカルキャッシュを保持します。 -* root_dir: 必須。リモートファイルシステム用のローカルキャッシュファイルを保存するルートディレクトリです。 -* limit_size: 必須。ローカルキャッシュファイルの最大サイズ (バイト単位) です。 -* bytes_read_before_flush: リモートファイルシステムからファイルをダウンロードする際に、ローカルファイルシステムへフラッシュするまでの読み取りバイト数を制御します。デフォルト値は 1MB です。 - -### 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 でテーブルを作成 - - -次の ClickHouse テーブルは、上で作成した Hive テーブルからデータを取得します: - -```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 -処理時間: 36.025秒 - -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 -処理時間: 0.766秒, 取得件数: 1 行 - -```` - -#### 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行が結果セットに含まれています。経過時間: 0.357秒 -``` - -### 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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md deleted file mode 100644 index 727502e2e99..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -description: 'このエンジンは、Amazon S3 に既に存在する Apache Hudi テーブルとの読み取り専用の統合を提供します。' -sidebar_label: 'Hudi' -sidebar_position: 86 -slug: /engines/table-engines/integrations/hudi -title: 'Hudi テーブルエンジン' -doc_type: 'reference' ---- - - - -# 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](/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') -``` - -名前付きコレクションの使用: - -```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') -``` - - -## 関連項目 {#see-also} - -- [hudi テーブル関数](/sql-reference/table-functions/hudi.md) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md deleted file mode 100644 index 406ce597883..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md +++ /dev/null @@ -1,325 +0,0 @@ ---- -description: 'このエンジンは、Amazon S3、Azure、HDFS、およびローカルに保存された既存の Apache Iceberg テーブルと読み取り専用で統合します。' -sidebar_label: 'Iceberg' -sidebar_position: 90 -slug: /engines/table-engines/integrations/iceberg -title: 'Iceberg テーブルエンジン' -doc_type: 'reference' ---- - - - -# Iceberg テーブルエンジン {#iceberg-table-engine} - -:::warning -ClickHouse で Iceberg データを扱う場合は、[Iceberg Table Function](/sql-reference/table-functions/iceberg.md) の使用を推奨します。Iceberg Table Function は現在、Iceberg テーブルに対する読み取り専用の一部機能に限られたインターフェースを提供しますが、現時点では十分な機能を備えています。 - -Iceberg Table Engine も利用可能ですが、いくつかの制限があります。ClickHouse はもともと外部でスキーマが変更されるテーブルをサポートするように設計されていないため、この特性が Iceberg Table Engine の機能に影響することがあります。その結果、通常のテーブルで動作する一部の機能が利用できなかったり、特に旧アナライザーを使用している場合に正しく動作しなかったりする可能性があります。 - -可能な限り高い互換性を確保するため、Iceberg Table Engine のサポートを継続的に改善している間は、Iceberg Table Function の使用を推奨します。 -::: - -このエンジンは、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') -``` - -名前付きコレクションの使用: - -```xml - - - - http://test.s3.amazonaws.com/clickhouse-bucket/ - test - test - - - -``` - -```sql -CREATE TABLE iceberg_table ENGINE=IcebergS3(iceberg_conf, filename = 'test_table') - -``` - - -## エイリアス {#aliases} - -テーブルエンジン `Iceberg` は、現在は `IcebergS3` のエイリアスになっています。 - - - -## スキーマの進化 {#schema-evolution} -現時点では、CH を用いることで、時間の経過とともにスキーマが変更された Iceberg テーブルを読み取ることができます。現在サポートしているのは、カラムの追加・削除が行われたり、その順序が変更されたテーブルの読み取りです。また、値が必須だったカラムを、NULL を許容するカラムに変更することもできます。加えて、単純型に対しては、以下の許可されている型変換をサポートしています: -* int -> long -* float -> double -* decimal(P, S) -> decimal(P', S)(P' > P の場合) - -現時点では、ネストされた構造や、配列およびマップ内の要素の型を変更することはできません。 - -作成後にスキーマが変更されたテーブルを動的スキーマ推論で読み取るには、テーブル作成時に `allow_dynamic_metadata_for_data_lakes = true` を設定してください。 - - - -## パーティションプルーニング {#partition-pruning} - -ClickHouse は Iceberg テーブルに対する SELECT クエリの実行時にパーティションプルーニングをサポートしており、関係のないデータファイルをスキップすることでクエリパフォーマンスを最適化できます。パーティションプルーニングを有効にするには、`use_iceberg_partition_pruning = 1` を設定します。Iceberg におけるパーティションプルーニングの詳細については https://iceberg.apache.org/spec/#partitioning を参照してください。 - - - -## タイムトラベル {#time-travel} - -ClickHouse は Iceberg テーブルに対するタイムトラベルをサポートしており、特定のタイムスタンプまたはスナップショット ID を指定して過去のデータをクエリできます。 - - - -## 削除行を含むテーブルの処理 - -現在サポートされているのは、[position deletes](https://iceberg.apache.org/spec/#position-delete-files) を使用する Iceberg テーブルのみです。 - -次の削除方式は**サポートされていません**: - -* [Equality deletes](https://iceberg.apache.org/spec/#equality-delete-files) -* [Deletion vectors](https://iceberg.apache.org/spec/#deletion-vectors)(v3 で導入) - -### 基本的な使用方法 - -```sql -SELECT * FROM example_table ORDER BY 1 -SETTINGS iceberg_timestamp_ms = 1714636800000 -``` - -```sql -SELECT * FROM example_table ORDER BY 1 -SETTINGS iceberg_snapshot_id = 3547395809148285433 -``` - -注意: 同じクエリ内で `iceberg_timestamp_ms` パラメータと `iceberg_snapshot_id` パラメータを同時に指定することはできません。 - -### 重要な考慮事項 - -* **スナップショット** は通常、次のタイミングで作成されます: - * 新しいデータがテーブルに書き込まれたとき - * 何らかのデータコンパクションが実行されたとき - -* **スキーマ変更によってスナップショットが作成されることは通常ない** — このため、スキーマ進化を行ったテーブルでタイムトラベルを使用する場合に特有の挙動が発生します。 - -### シナリオ例 - -すべてのシナリオは Spark を用いて記述されています。これは、CH がまだ Iceberg テーブルへの書き込みをサポートしていないためです。 - -#### シナリオ 1: 新しいスナップショットを伴わないスキーマ変更 - -次の一連の操作を考えてみます: - -```sql --- 2つの列を持つテーブルを作成 - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2') - --- テーブルにデータを挿入する - INSERT INTO spark_catalog.db.time_travel_example VALUES - (1, 'Mars') - - ts1 = now() // 疑似コードの一例 - --- テーブルを変更して新しい列を追加する - ALTER TABLE spark_catalog.db.time_travel_example ADD COLUMN (price double) - - ts2 = now() - --- テーブルにデータを挿入する - INSERT INTO spark_catalog.db.time_travel_example VALUES (2, 'Venus', 100) - - ts3 = now() - --- 各タイムスタンプ時点でテーブルを問い合わせる - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts1; - -+------------+------------+ -|order_number|product_code| -+------------+------------+ -| 1| Mars| -+------------+------------+ - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts2; - -+------------+------------+ -|order_number|product_code| -+------------+------------+ -| 1| Mars| -+------------+------------+ - - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts3; - -+------------+------------+-----+ -|order_number|product_code|price| -+------------+------------+-----+ -| 1| Mars| NULL| -| 2| Venus|100.0| -+------------+------------+-----+ -``` - -異なるタイムスタンプにおけるクエリ結果: - -* ts1 と ts2 の時点: 元の 2 列のみが表示される -* ts3 の時点: 3 列すべてが表示され、1 行目の price 列は NULL になる - -#### シナリオ 2: 履歴スキーマと現在のスキーマの差異 - -現在時点を指定したタイムトラベルクエリでは、現在のテーブルとは異なるスキーマが表示される場合があります: - -```sql --- テーブルを作成する - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example_2 ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2') - --- テーブルに初期データを挿入する - INSERT INTO spark_catalog.db.time_travel_example_2 VALUES (2, 'Venus'); - --- テーブルを変更して新しい列を追加する - ALTER TABLE spark_catalog.db.time_travel_example_2 ADD COLUMN (price double); - - ts = now(); - --- タイムスタンプ構文を使用して現在時点のテーブルをクエリする - - SELECT * FROM spark_catalog.db.time_travel_example_2 TIMESTAMP AS OF ts; - - +------------+------------+ - |order_number|product_code| - +------------+------------+ - | 2| Venus| - +------------+------------+ - --- 現在時点のテーブルをクエリする - SELECT * FROM spark_catalog.db.time_travel_example_2; - +------------+------------+-----+ - |order_number|product_code|price| - +------------+------------+-----+ - | 2| Venus| NULL| - +------------+------------+-----+ -``` - -これは、`ALTER TABLE` が新しいスナップショットを作成せず、現在のテーブルについては Spark がスナップショットではなく最新のメタデータファイルから `schema_id` の値を取得するために発生します。 - - -#### シナリオ 3: 過去と現在のスキーマの差異 - -2つ目の制約は、タイムトラベルを行っても、テーブルに最初のデータが書き込まれる前の状態は取得できないという点です。 - -```sql --- テーブルを作成 - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example_3 ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2'); - - ts = now(); - --- 特定のタイムスタンプ時点でテーブルをクエリする - SELECT * FROM spark_catalog.db.time_travel_example_3 TIMESTAMP AS OF ts; -- エラーで終了: ts より古いスナップショットが見つかりません -``` - -ClickHouse における挙動は Spark と同じです。概念的には Spark の SELECT クエリを ClickHouse の SELECT クエリに置き換えて考えれば、同じように動作します。 - - -## メタデータファイルの解決 - -ClickHouse で `Iceberg` テーブルエンジンを使用する場合、システムは Iceberg テーブル構造を記述する適切な metadata.json ファイルを特定する必要があります。以下は、この解決プロセスの概要です。 - -### 候補の検索 - -1. **パスの直接指定**: - -* `iceberg_metadata_file_path` を設定した場合、システムは Iceberg テーブルディレクトリパスにこれを結合したパスをそのまま使用します。 -* この設定が指定されている場合、他の解決用設定はすべて無視されます。 - -2. **テーブル UUID の一致**: - -* `iceberg_metadata_table_uuid` が指定されている場合、システムは次のように動作します: - * `metadata` ディレクトリ内の `.metadata.json` ファイルのみを参照する - * 指定された UUID と一致する `table-uuid` フィールドを含むファイルをフィルタリングする(大文字小文字は区別しない) - -3. **デフォルト検索**: - -* 上記いずれの設定も指定されていない場合、`metadata` ディレクトリ内のすべての `.metadata.json` ファイルが候補になります - -### 最新のファイルの選択 - -上記のルールで候補ファイルを特定した後、システムはその中で最も新しいものを決定します: - -* `iceberg_recent_metadata_file_by_last_updated_ms_field` が有効な場合: - * `last-updated-ms` の値が最大のファイルが選択されます - -* それ以外の場合: - * バージョン番号が最も高いファイルが選択されます - * (バージョンは `V.metadata.json` または `V-uuid.metadata.json` 形式のファイル名中の `V` として表現されます) - -**Note**: 上記で言及した設定はすべてエンジンレベルの設定であり、以下に示すようにテーブル作成時に指定する必要があります。 - -```sql -CREATE TABLE example_table ENGINE = Iceberg( - 's3://bucket/path/to/iceberg_table' -) SETTINGS iceberg_metadata_table_uuid = '6f6f6407-c6a5-465f-a808-ea8900e35a38'; -``` - -**注**: 通常は Iceberg Catalog がメタデータの解決を担当しますが、ClickHouse の `Iceberg` テーブルエンジンは S3 に保存されたファイルを Iceberg テーブルとして直接解釈します。そのため、これらの解決ルールを理解しておくことが重要です。 - - -## データキャッシュ {#data-cache} - -`Iceberg` テーブルエンジンおよびテーブル関数は、`S3`、`AzureBlobStorage`、`HDFS` ストレージと同様にデータキャッシュをサポートします。詳細は[こちら](../../../engines/table-engines/integrations/s3.md#data-cache)を参照してください。 - - - -## メタデータキャッシュ {#metadata-cache} - -`Iceberg` テーブルエンジンおよびテーブル関数は、マニフェストファイル、マニフェストリスト、メタデータ JSON の情報を格納するメタデータキャッシュをサポートしています。キャッシュはメモリ内に保存されます。この機能は `use_iceberg_metadata_files_cache` 設定によって制御され、デフォルトで有効になっています。 - - - -## 関連項目 {#see-also} - -- [Iceberg テーブル関数](/sql-reference/table-functions/iceberg.md) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md deleted file mode 100644 index 1723df5a009..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: '統合向けテーブルエンジンのドキュメント' -sidebar_label: '統合' -sidebar_position: 40 -slug: /engines/table-engines/integrations/ -title: '統合向けテーブルエンジン' -doc_type: 'reference' ---- - - - -# 連携向けテーブルエンジン - -ClickHouse は、テーブルエンジンを含むさまざまな手段で外部システムと連携できます。他のすべてのテーブルエンジンと同様に、設定は `CREATE TABLE` または `ALTER TABLE` クエリを使って行います。ユーザーの視点から見ると、設定された連携は通常のテーブルのように見えますが、そのテーブルへのクエリは外部システムにプロキシされます。この透過的なクエリ実行は、辞書やテーブル関数のような代替的な連携方法に比べた、このアプローチの主な利点の 1 つです。代替方法では、利用のたびにカスタムクエリ手法を用いる必要があります。 - -{/* このページの目次テーブルは、YAML フロントマターのフィールド slug、description、title から - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - によって自動生成されます。 - - 誤りを見つけた場合は、対象ページの YAML フロントマターを編集してください。 - */ } - - -{/*AUTOGENERATED_START*/ } - -| ページ | 概要 | -| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -| [AzureBlobStorage テーブルエンジン](/engines/table-engines/integrations/azureBlobStorage) | このエンジンは、Azure Blob Storage エコシステムとの統合機能を提供します。 | -| [DeltaLake テーブルエンジン](/engines/table-engines/integrations/deltalake) | このエンジンにより、Amazon S3 上の既存の Delta Lake テーブルと読み取り専用で連携できます。 | -| [EmbeddedRocksDB テーブルエンジン](/engines/table-engines/integrations/embedded-rocksdb) | このエンジンを使用すると、ClickHouse と RocksDB を統合できます | -| [ExternalDistributed テーブルエンジン](/engines/table-engines/integrations/ExternalDistributed) | `ExternalDistributed` エンジンを使用すると、リモートサーバー上の MySQL または PostgreSQL に格納されたデータに対して `SELECT` クエリを実行できます。MySQL または PostgreSQL エンジンを引数として受け取るため、シャーディングが可能です。 | -| [TimeSeries テーブルエンジン](/engines/table-engines/special/time_series) | タイムスタンプおよびタグ(またはラベル)に関連付けられた値の集合としての時系列データを格納するテーブルエンジン。 | -| [HDFS テーブルエンジン](/engines/table-engines/integrations/hdfs) | このエンジンは、ClickHouse 経由で HDFS 上のデータを管理できるようにすることで、Apache Hadoop エコシステムとの統合を実現します。このエンジンは File エンジンおよび URL エンジンに類似していますが、Hadoop 固有の機能を提供します。 | -| [Hive テーブルエンジン](/engines/table-engines/integrations/hive) | Hive エンジンを使用すると、HDFS 上の Hive テーブルに対して `SELECT` クエリを実行できます。 | -| [Hudi テーブルエンジン](/engines/table-engines/integrations/hudi) | このエンジンは、Amazon S3 上の既存の Apache Hudi テーブルとの読み取り専用統合を提供します。 | -| [Iceberg テーブルエンジン](/engines/table-engines/integrations/iceberg) | このエンジンは、Amazon S3、Azure、HDFS およびローカルに保存された既存の Apache Iceberg テーブルと読み取り専用で連携します。 | -| [JDBC テーブルエンジン](/engines/table-engines/integrations/jdbc) | ClickHouse が JDBC を介して外部データベースに接続できるようにします。 | -| [Kafka テーブルエンジン](/engines/table-engines/integrations/kafka) | Kafka Table Engine は Apache Kafka と連携して使用でき、データフローの公開および購読、耐障害性のあるストレージの構成、そしてストリームが利用可能になり次第その処理を行うことができます。 | -| [MaterializedPostgreSQL テーブルエンジン](/engines/table-engines/integrations/materialized-postgresql) | PostgreSQL テーブルのデータを初期ダンプして ClickHouse テーブルを作成し、レプリケーションを開始します。 | -| [MongoDB テーブルエンジン](/engines/table-engines/integrations/mongodb) | MongoDB エンジンは、リモートのコレクションからデータを読み出すための読み取り専用テーブルエンジンです。 | -| [MySQL テーブルエンジン](/engines/table-engines/integrations/mysql) | MySQL テーブルエンジンに関するドキュメント | -| [NATS テーブルエンジン](/engines/table-engines/integrations/nats) | このエンジンを使用すると、ClickHouse を NATS と連携させてメッセージのサブジェクトを公開・購読し、新着メッセージを利用可能になり次第処理できます。 | -| [ODBC テーブルエンジン](/engines/table-engines/integrations/odbc) | ClickHouse が ODBC 経由で外部データベースに接続できるようにします。 | -| [PostgreSQL テーブルエンジン](/engines/table-engines/integrations/postgresql) | PostgreSQL エンジンを使用すると、リモートの PostgreSQL サーバー上に保存されたデータに対して `SELECT` および `INSERT` クエリを実行できます。 | -| [RabbitMQ テーブルエンジン](/engines/table-engines/integrations/rabbitmq) | このエンジンを使用すると、ClickHouse を RabbitMQ と統合できます。 | -| [Redis テーブルエンジン](/engines/table-engines/integrations/redis) | このエンジンを使用すると、ClickHouse を Redis と統合できます。 | -| [S3 テーブルエンジン](/engines/table-engines/integrations/s3) | このエンジンは Amazon S3 エコシステムとの統合を提供します。HDFS エンジンに似ていますが、S3 に特化した機能も備えています。 | -| [S3Queue テーブルエンジン](/engines/table-engines/integrations/s3queue) | このエンジンは Amazon S3 エコシステムと統合されており、ストリーミングによるインポートをサポートします。Kafka や RabbitMQ エンジンと同様ですが、S3 固有の機能を備えています。 | -| [AzureQueue テーブルエンジン](/engines/table-engines/integrations/azure-queue) | このエンジンは Azure Blob Storage エコシステムと統合されており、ストリーミングによるデータ取り込みをサポートします。 | -| [YTsaurus テーブルエンジン](/engines/table-engines/integrations/ytsaurus) | YTsaurus クラスターからデータをインポートするためのテーブルエンジン。 | -| [SQLite テーブルエンジン](/engines/table-engines/integrations/sqlite) | このエンジンでは、SQLite との間でデータのインポートおよびエクスポートを行え、ClickHouse から SQLite のテーブルに対して直接クエリを実行できます。 | -| [ArrowFlight テーブルエンジン](/engines/table-engines/integrations/arrowflight) | このエンジンは、Apache Arrow Flight を介してリモートデータセットに対してクエリを実行できます。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md deleted file mode 100644 index 84e338b3832..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -description: 'ClickHouseが JDBC を介して外部データベースへ接続できるようにします。' -sidebar_label: 'JDBC' -sidebar_position: 100 -slug: /engines/table-engines/integrations/jdbc -title: 'JDBCテーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# 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) データ型をサポートします。 - - - -## テーブルを作成する - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name -( - columns list... -) -ENGINE = JDBC(datasource, external_database, external_table) -``` - -**エンジンのパラメータ** - -* `datasource` — 外部 DBMS の URI または名前。 - - URI 形式: `jdbc:://:/?user=&password=`。 - MySQL の例: `jdbc:mysql://localhost:3306/?user=root&password=root`。 - -* `external_database` — 外部 DBMS 内のデータベース名、または代わりに明示的に定義されたテーブルスキーマ(例を参照)。 - -* `external_table` — 外部データベース内のテーブル名、または `select * from table1 where column1=1` のような select クエリ。 - -* これらのパラメータは、[名前付きコレクション](operations/named-collections.md)を使用して指定することもできます。 - - -## 使用例 - -コンソールクライアントから 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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md deleted file mode 100644 index 591f990a11d..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md +++ /dev/null @@ -1,315 +0,0 @@ ---- -description: 'Kafka テーブルエンジンは Apache Kafka と連携して使用でき、データフローへの publish/subscribe、フォールトトレラントなストレージの構成、およびストリームが利用可能になったタイミングでの順次処理を可能にします。' -sidebar_label: 'Kafka' -sidebar_position: 110 -slug: /engines/table-engines/integrations/kafka -title: 'Kafka テーブルエンジン' -keywords: ['Kafka', 'table engine'] -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# Kafka テーブルエンジン - -:::tip -ClickHouse Cloud をご利用の場合は、代わりに [ClickPipes](/integrations/clickpipes) の利用を推奨します。ClickPipes は、プライベートネットワーク接続のネイティブサポート、インジェスト処理とクラスタリソースを独立してスケールさせる機能、そして Kafka のストリーミングデータを ClickHouse に取り込むための包括的なモニタリング機能を提供します。 -::: - -- データフローの publish および subscribe。 -- フォールトトレラントなストレージの構成。 -- ストリームを利用可能になり次第処理。 - -## テーブルを作成する - -```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_security_protocol = '',] - [kafka_sasl_mechanism = '',] - [kafka_sasl_username = '',] - [kafka_sasl_password = '',] - [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_compression_codec = '',] - [kafka_compression_level = -1]; -``` - -必須パラメータ: - -* `kafka_broker_list` — ブローカーのカンマ区切りリスト(例: `localhost:9092`)。 -* `kafka_topic_list` — Kafka トピックのリスト。 -* `kafka_group_name` — Kafka コンシューマのグループ。読み取りオフセットはグループごとに個別に追跡されます。クラスター内でメッセージが重複しないようにするには、同じグループ名を一貫して使用してください。 -* `kafka_format` — メッセージ形式。SQL の `FORMAT` 関数と同じ表記(`JSONEachRow` など)を使用します。詳細は [Formats](../../../interfaces/formats.md) セクションを参照してください。 - -オプションパラメータ: - - -- `kafka_security_protocol` - ブローカーとの通信に使用するプロトコル。指定可能な値: `plaintext`, `ssl`, `sasl_plaintext`, `sasl_ssl`。 -- `kafka_sasl_mechanism` - 認証に使用する SASL メカニズム。指定可能な値: `GSSAPI`, `PLAIN`, `SCRAM-SHA-256`, `SCRAM-SHA-512`, `OAUTHBEARER`。 -- `kafka_sasl_username` - `PLAIN` と `SASL-SCRAM-..` メカニズムで使用する SASL ユーザー名。 -- `kafka_sasl_password` - `PLAIN` と `SASL-SCRAM-..` メカニズムで使用する SASL パスワード。 -- `kafka_schema` — フォーマットがスキーマ定義を必要とする場合に必ず使用しなければならないパラメータ。たとえば [Cap'n Proto](https://capnproto.org/) では、スキーマファイルへのパスと、ルート `schema.capnp:Message` オブジェクトの名前が必要です。 -- `kafka_schema_registry_skip_bytes` — エンベロープヘッダー付きのスキーマレジストリを使用する際に、各メッセージの先頭からスキップするバイト数(例: 19 バイトのエンベロープを含む AWS Glue Schema Registry)。範囲: `[0, 255]`。デフォルト: `0`。 -- `kafka_num_consumers` — テーブルごとのコンシューマー数。1 つのコンシューマーのスループットが不十分な場合は、より多くのコンシューマーを指定します。総コンシューマー数はトピック内のパーティション数を超えてはなりません。これは 1 つのパーティションには 1 つのコンシューマーしか割り当てられないためであり、さらに ClickHouse がデプロイされているサーバーの物理コア数を超えてはなりません。デフォルト: `1`。 -- `kafka_max_block_size` — poll における最大バッチサイズ(メッセージ数)。デフォルト: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 -- `kafka_skip_broken_messages` — 1 ブロックあたりのスキーマ非互換メッセージに対する Kafka メッセージパーサーの許容数。`kafka_skip_broken_messages = N` の場合、エンジンはパースできない Kafka メッセージを *N* 件スキップします(メッセージは 1 行のデータに相当)。デフォルト: `0`。 -- `kafka_commit_every_batch` — ブロック全体を書き込んだ後に 1 回だけコミットする代わりに、消費および処理された各バッチごとにコミットします。デフォルト: `0`。 -- `kafka_client_id` — クライアント識別子。デフォルトは空。 -- `kafka_poll_timeout_ms` — Kafka からの単一 poll のタイムアウト。デフォルト: [stream_poll_timeout_ms](../../../operations/settings/settings.md#stream_poll_timeout_ms)。 -- `kafka_poll_max_batch_size` — 1 回の Kafka poll で取得されるメッセージの最大数。デフォルト: [max_block_size](/operations/settings/settings#max_block_size)。 -- `kafka_flush_interval_ms` — Kafka からのデータをフラッシュするまでのタイムアウト。デフォルト: [stream_flush_interval_ms](/operations/settings/settings#stream_flush_interval_ms)。 -- `kafka_thread_per_consumer` — 各コンシューマーに独立したスレッドを割り当てます。有効にすると、各コンシューマーはデータを独立して並列にフラッシュします(無効な場合は、複数コンシューマーからの行が 1 ブロックにまとめられます)。デフォルト: `0`。 -- `kafka_handle_error_mode` — Kafka エンジンのエラー処理方法。指定可能な値: `default`(メッセージのパースに失敗した場合に例外を投げる)、`stream`(例外メッセージと生のメッセージを仮想列 `_error` および `_raw_message` に保存する)、`dead_letter_queue`(エラー関連データを `system.dead_letter_queue` に保存する)。 -- `kafka_commit_on_select` — `SELECT` クエリが実行されたときにメッセージをコミットします。デフォルト: `false`。 -- `kafka_max_rows_per_message` — 行ベースフォーマットにおいて、1 つの Kafka メッセージに書き込まれる最大行数。デフォルト: `1`。 -- `kafka_compression_codec` — メッセージ生成に使用される圧縮コーデック。サポートされる値: 空文字列、`none`, `gzip`, `snappy`, `lz4`, `zstd`。空文字列の場合、テーブル側では圧縮コーデックを設定しないため、設定ファイルで指定された値または `librdkafka` のデフォルト値が使用されます。デフォルト: 空文字列。 -- `kafka_compression_level` — `kafka_compression_codec` で選択されたアルゴリズムの圧縮レベルパラメータ。値を大きくすると、CPU 使用量と引き換えに圧縮率が向上します。利用可能な範囲はアルゴリズムに依存します: `gzip` 用 `[0-9]`、`lz4` 用 `[0-12]`、`snappy` は `0` のみ、`zstd` 用 `[0-12]`、`-1` = コーデック依存のデフォルト圧縮レベル。デフォルト: `-1`。 - -Examples: - -```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#default_values)を持つカラムをサポートしていません。デフォルト値を持つカラムが必要な場合は、マテリアライズドビュー側で追加できます(下記参照)。 -::: - - -## 説明 - -配信されたメッセージは自動的に追跡されるため、グループ内の各メッセージは 1 回だけカウントされます。データを 2 回取得したい場合は、別のグループ名でテーブルのコピーを作成してください。 - -グループは柔軟で、クラスタ内で同期されます。たとえば、クラスタ内に 10 個のトピックと 5 個のテーブルのコピーがある場合、各コピーは 2 個のトピックを受け持ちます。コピー数が変化すると、トピックはコピー間で自動的に再分配されます。詳細については [http://kafka.apache.org/intro](http://kafka.apache.org/intro) を参照してください。 - -各 Kafka トピックに専用のコンシューマーグループを用意し、トピックとグループの間で排他的な対応関係を維持することを推奨します。特に、テスト環境やステージング環境など、トピックが動的に作成および削除される可能性がある場合は重要です。 - -`SELECT` は、各メッセージが 1 回しか読み取れないため(デバッグ用途を除き)メッセージの読み取りにはあまり有用ではありません。代わりに、マテリアライズドビューを使ってリアルタイム処理フローを構築する方が実用的です。そのためには次のようにします。 - -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#stream_flush_interval_ms) ミリ秒以内にブロックが形成されなかった場合は、ブロックが完全であるかどうかにかかわらず、データはテーブルにフラッシュされます。 - -トピックデータの受信を停止するか変換ロジックを変更するには、マテリアライズドビューを DETACH します。 - -```sql - DETACH TABLE consumer; - ATTACH TABLE consumer; -``` - -`ALTER` を使用してターゲットテーブルを変更する場合は、ターゲットテーブルとビューからのデータとの不整合を避けるため、マテリアライズドビューを無効化することを推奨します。 - - -## 設定 - -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 サポート - -Kerberos 対応の Kafka を扱うには、`security_protocol` の子要素として `sasl_plaintext` を追加します。Kerberos のチケット授与チケット (TGT) が 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#max_block_size) によって制御できます。 - -## ClickHouse Keeper にコミット済みオフセットを保存するエンジン - - - -`allow_experimental_kafka_offsets_storage_in_keeper` が有効な場合、Kafka テーブルエンジンに対してさらに 2 つの設定を指定できます。 - -* `kafka_keeper_path` は ClickHouse Keeper 内のテーブルパスを指定します -* `kafka_replica_name` は ClickHouse Keeper 内のレプリカ名を指定します - -これら 2 つの設定は、両方とも指定するか、どちらも指定しないかのいずれかでなければなりません。両方とも指定された場合、新しい実験的な 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}/{uuid}', - kafka_replica_name = '{replica}' -SETTINGS allow_experimental_kafka_offsets_storage_in_keeper=1; -``` - - -### 既知の制限事項 {#known-limitations} - -新しいエンジンは実験的なものであり、まだ本番運用の準備ができていません。実装には、いくつか既知の制限があります。 - -- 最大の制限は、エンジンが直接読み取りをサポートしていないことです。マテリアライズドビューを使ってエンジンから読み取り、エンジンへ書き込むことはできますが、直接読み取りはできません。その結果、すべての直接的な `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#background_message_broker_schedule_pool_size) -- [system.kafka_consumers](../../../operations/system-tables/kafka_consumers.md) \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md deleted file mode 100644 index 9d30551efc8..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -description: 'PostgreSQL テーブルの初期データダンプを用いて ClickHouse テーブルを作成し、レプリケーション処理を開始します。' -sidebar_label: 'MaterializedPostgreSQL' -sidebar_position: 130 -slug: /engines/table-engines/integrations/materialized-postgresql -title: 'MaterializedPostgreSQL テーブルエンジン' -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MaterializedPostgreSQL テーブルエンジン - - - - - -:::note -ClickHouse Cloud のユーザーには、PostgreSQL から ClickHouse へのレプリケーションには [ClickPipes](/integrations/clickpipes) の利用を推奨します。これは PostgreSQL 向けの高性能な Change Data Capture(CDC)をネイティブにサポートします。 -::: - -PostgreSQL テーブルの初期データダンプを用いて ClickHouse テーブルを作成し、その後レプリケーション処理を開始します。具体的には、リモートの 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` 設定(将来的にはデータベースの `schema` も追加可能になる予定)を利用することを強く推奨します。これにより、CPU 使用量を抑えつつ、接続数およびリモート PostgreSQL データベース内のレプリケーションスロット数を減らすことができ、はるかに効率的になります。 - - -## テーブルを作成する - -```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` テーブルエンジンは、その実装で [pg_replication_slot_advance](https://pgpedia.info/p/pg_replication_slot_advance.html) PostgreSQL 関数を必要とするため、PostgreSQL バージョン 11 以上でのみ動作します。 - - - -## 仮想カラム - -* `_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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md deleted file mode 100644 index 56b79eb09f0..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md +++ /dev/null @@ -1,245 +0,0 @@ ---- -description: 'MongoDB エンジンは、リモートのコレクションからデータを読み出すことを可能にする読み取り専用のテーブルエンジンです。' -sidebar_label: 'MongoDB' -sidebar_position: 135 -slug: /engines/table-engines/integrations/mongodb -title: 'MongoDB テーブルエンジン' -doc_type: 'reference' ---- - - - -# MongoDB テーブルエンジン - -MongoDB エンジンは、リモートの [MongoDB](https://www.mongodb.com/) コレクションからデータを読み取るための、読み取り専用のテーブルエンジンです。 - -MongoDB v3.6 以降のサーバーのみがサポートされています。 -[シードリスト(`mongodb+srv`)](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-seed-list) は現在サポートされていません。 - - - -## テーブルを作成する - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name -( - name1 [type1], - name2 [type2], - ... -) ENGINE = MongoDB(host:port, database, collection, user, password[, options[, oid_columns]]); -``` - -**エンジンパラメータ** - -| Parameter | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `host:port` | MongoDB サーバーのアドレス。 | -| `database` | リモートデータベース名。 | -| `collection` | リモートコレクション名。 | -| `user` | MongoDB ユーザー。 | -| `password` | ユーザーのパスワード。 | -| `options` | オプション。URL 形式の文字列として指定する MongoDB 接続文字列の [options](https://www.mongodb.com/docs/manual/reference/connection-string-options/#connection-options)。例: `'authSource=admin&ssl=true'` | -| `oid_columns` | WHERE 句で `oid` として扱う列のカンマ区切りリスト。デフォルトは `_id`。 | - -:::tip -MongoDB Atlas のクラウドサービスを使用している場合、接続 URL は「Atlas SQL」オプションから取得できます。 -シードリスト(`mongodb+srv`)はまだサポートされていませんが、今後のリリースで追加される予定です。 -::: - -別の方法として、URI を渡すこともできます。 - -```sql -ENGINE = MongoDB(uri, collection[, oid_columns]); -``` - -**エンジンパラメータ** - -| パラメータ | 説明 | -| ------------- | ------------------------------------------------- | -| `uri` | MongoDB サーバーの接続 URI。 | -| `collection` | リモートコレクション名。 | -| `oid_columns` | WHERE 句で `oid` として扱う列をカンマ区切りで指定します。既定では `_id` です。 | - - -## 型マッピング - -| MongoDB | ClickHouse | -| ----------------------- | --------------------------------------------------- | -| bool, int32, int64 | *Decimals を除く任意の数値型*、Boolean、String | -| double | Float64、String | -| date | Date、Date32、DateTime、DateTime64、String | -| string | String、*正しくフォーマットされていれば任意の数値型 (Decimals を除く)* | -| document | String(JSON として) | -| array | Array、String(JSON として) | -| oid | String | -| binary | カラム内では String、配列または document 内では base64 エンコードされた文字列 | -| uuid (binary subtype 4) | UUID | -| *その他すべて* | String | - -キーが MongoDB ドキュメント内に存在しない場合 (たとえばカラム名が一致しない場合)、デフォルト値または (カラムが Nullable の場合は) `NULL` が挿入されます。 - -### OID - -WHERE 句で `String` を `oid` として扱いたい場合は、テーブルエンジンの最後の引数にそのカラム名を指定します。 -これは、MongoDB でデフォルトで `oid` 型を持つ `_id` カラムでレコードをクエリする際に必要になる場合があります。 -テーブル内の `_id` フィールドが、たとえば `uuid` のような別の型である場合は、空の `oid_columns` を指定しなければなりません。指定しない場合、このパラメータのデフォルト値である `_id` が使用されます。 - -```javascript -db.sample_oid.insertMany([ - {"another_oid_column": ObjectId()}, -]); - -db.sample_oid.find(); -[ - { - "_id": {"$oid": "67bf6cc44ebc466d33d42fb2"}, - "another_oid_column": {"$oid": "67bf6cc40000000000ea41b1"} - } -] -``` - -既定では、`_id` のみが `oid` 列として扱われます。 - -```sql -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('mongodb://user:pass@host/db', 'sample_oid'); - -SELECT count() FROM sample_oid WHERE _id = '67bf6cc44ebc466d33d42fb2'; --1を出力します。 -SELECT count() FROM sample_oid WHERE another_oid_column = '67bf6cc40000000000ea41b1'; --0を出力します。 -``` - -この場合、出力は `0` になります。ClickHouse は `another_oid_column` が `oid` 型であることを認識していないためです。では、次のように修正しましょう: - -```sql -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('mongodb://user:pass@host/db', 'sample_oid', '_id,another_oid_column'); - --- または - -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('host', 'db', 'sample_oid', 'user', 'pass', '', '_id,another_oid_column'); - -SELECT count() FROM sample_oid WHERE another_oid_column = '67bf6cc40000000000ea41b1'; -- 1が出力されます -``` - - -## サポートされている句 - -単純な式を含むクエリのみがサポートされます(例: `WHERE field = ORDER BY field2 LIMIT `)。 -このような式は MongoDB のクエリ言語に変換され、サーバー側で実行されます。 -[mongodb_throw_on_unsupported_query](../../../operations/settings/settings.md#mongodb_throw_on_unsupported_query) を使用して、これらの制限をすべて無効化できます。 -その場合、ClickHouse は可能な限り最善を尽くしてクエリを変換しようとしますが、テーブル全体のスキャンや ClickHouse 側での処理が発生する可能性があります。 - -:::note -MongoDB では厳密な型付きフィルタが必要となるため、リテラルの型を明示的に設定することを常に推奨します。\ -例えば、`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` の各型に適用されます。 - -::: - - -## 使用例 - -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より大きい「バック・トゥ・ザ・フューチャー」の続編をすべて検索 -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: 若い男性が友人のエメット・ブラウン博士が発明したタイムトラベル可能なデロリアンで誤って30年前の過去に送られ、自分の存在を守るために高校生時代の両親を結びつけなければならない。 -genres: ['Adventure','Comedy','Sci-Fi'] -directors: ['Robert Zemeckis'] -released: 1985-07-03 - -Row 2: -────── -title: Back to the Future Part II -plot: 2015年を訪れた後、マーティ・マクフライは1985年への壊滅的な変化を防ぐために、最初の旅行に干渉することなく1955年を再訪しなければならない。 -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 - ┌─タイトル───────────────┬─評価───┐ -1. │ ノーカントリー │ 8.1 │ -2. │ サンセット・リミテッド │ 7.4 │ -3. │ ザ・ロード │ 7.3 │ - └────────────────────────┴────────┘ -``` - - -## トラブルシューティング {#troubleshooting} -DEBUG レベルのログで生成された MongoDB クエリを確認できます。 - -実装の詳細については、[mongocxx](https://github.com/mongodb/mongo-cxx-driver) および [mongoc](https://github.com/mongodb/mongo-c-driver) のドキュメントを参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md deleted file mode 100644 index 1f74c72fd6f..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -description: 'MySQL テーブルエンジンのドキュメント' -sidebar_label: 'MySQL' -sidebar_position: 138 -slug: /engines/table-engines/integrations/mysql -title: 'MySQL テーブルエンジン' -doc_type: 'reference' ---- - - - -# MySQL テーブルエンジン - -MySQL エンジンを使用すると、リモートの MySQL サーバー上に保存されているデータに対して `SELECT` および `INSERT` クエリを実行できます。 - - - -## テーブルを作成する - -```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) クエリの詳細な説明については、参照してください。 - -テーブル構造は、元の MySQL テーブル構造と異なっていてもかまいません。 - -* カラム名は元の MySQL テーブルと同じである必要がありますが、そのうち一部のカラムだけを任意の順序で使用できます。 -* カラム型は元の MySQL テーブルと異なっていてもかまいません。ClickHouse は値を ClickHouse のデータ型に[キャスト](../../../engines/database-engines/mysql.md#data_types-support)しようとします。 -* [external_table_functions_use_nulls](/operations/settings/settings#external_table_functions_use_nulls) 設定は、Nullable カラムをどのように扱うかを定義します。デフォルト値: 1。0 の場合、テーブル関数は Nullable カラムを作成せず、null の代わりにデフォルト値を挿入します。これは配列内の NULL 値にも適用されます。 - -**エンジンパラメータ** - -* `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 は例外をスローします。 - -引数は [named collections](/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'); -``` - - -## 使用例 - -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`)); -クエリ OK, 0 行が影響しました (0.09 秒) - -mysql> insert into test (`int_id`, `float`) VALUES (1,2); -クエリ OK, 1 行が影響しました (0.00 秒) - -mysql> select * from test; -+------+----------+-----+----------+ -| int_id | int_nullable | float | float_nullable | -+------+----------+-----+----------+ -| 1 | NULL | 2 | NULL | -+------+----------+-----+----------+ -1 行取得 (0.00 秒) -``` - -通常の引数を使って ClickHouse にテーブルを作成する: - -```sql -CREATE TABLE mysql_table -( - `float_nullable` Nullable(Float32), - `int_id` Int32 -) -ENGINE = MySQL('localhost:3306', 'test', 'test', 'bayonet', '123') -``` - -または [named collections](/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} - -デフォルト設定は接続の再利用も行わないため、効率的とは言えません。以下の設定により、サーバーが 1 秒あたりに処理できるクエリ数を増やすことができます。 - -### `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) -- [MySQL を辞書のソースとして使用する](/sql-reference/dictionaries#mysql) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md deleted file mode 100644 index 7b24cf139ee..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md +++ /dev/null @@ -1,316 +0,0 @@ ---- -description: 'このエンジンを使用すると、ClickHouse を NATS と統合し、メッセージサブジェクトへのパブリッシュおよびサブスクライブを行い、新しいメッセージを到着次第処理できます。' -sidebar_label: 'NATS' -sidebar_position: 140 -slug: /engines/table-engines/integrations/nats -title: 'NATS テーブルエンジン' -doc_type: 'guide' ---- - - - -# NATS テーブルエンジン {#redisstreams-engine} - -このエンジンを使用すると、ClickHouse を [NATS](https://nats.io/) と統合できます。 - -`NATS` を使用すると、次のことができます。 - -- メッセージのサブジェクトをパブリッシュまたはサブスクライブする。 -- 新しいメッセージを、到着し次第処理する。 - - - -## テーブルを作成する - -```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` – host:port(例: `localhost:5672`)。 -* `nats_subjects` – NATS テーブルが購読/公開する subject のリスト。`foo.*.bar` や `baz.>` のようなワイルドカード subject をサポートします。 -* `nats_format` – メッセージ形式。SQL の `FORMAT` 関数と同じ表記を使用し、`JSONEachRow` などを指定します。詳細については、[Formats](../../../interfaces/formats.md) セクションを参照してください。 - -オプションパラメータ: - -* `nats_schema` – フォーマットがスキーマ定義を必要とする場合に使用する必要があるパラメータです。たとえば [Cap'n Proto](https://capnproto.org/) では、スキーマファイルへのパスと、ルート `schema.capnp:Message` オブジェクト名が必要です。 -* `nats_stream` – NATS JetStream に既に存在するストリームの名前。 -* `nats_consumer` – NATS JetStream に既に存在する永続的なプルコンシューマーの名前。 -* `nats_num_consumers` – テーブルごとのコンシューマー数。デフォルト: `1`。NATS Core のみで 1 つのコンシューマーのスループットが不十分な場合は、より多くのコンシューマーを指定します。 -* `nats_queue_group` – NATS サブスクライバーのキューグループ名。デフォルトはテーブル名です。 -* `nats_max_reconnect` – 非推奨であり効果はありません。再接続は `nats_reconnect_wait` タイムアウトを用いて永続的に実行されます。 -* `nats_reconnect_wait` – 各再接続試行の間にスリープする時間(ミリ秒)。デフォルト: `5000`。 -* `nats_server_list` - 接続用のサーバーリスト。NATS クラスターに接続するために指定できます。 -* `nats_skip_broken_messages` - ブロックごとのスキーマ非互換メッセージに対する NATS メッセージパーサーの許容数。デフォルト: `0`。`nats_skip_broken_messages = N` の場合、パースできない NATS メッセージを *N* 件スキップします(メッセージ 1 件はデータの行 1 件に相当します)。 -* `nats_max_block_size` - NATS からデータをフラッシュするためにポーリングで収集される行数。デフォルト: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 -* `nats_flush_interval_ms` - NATS から読み取ったデータをフラッシュするタイムアウト。デフォルト: [stream_flush_interval_ms](/operations/settings/settings#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 つの subject からのみ読み取る場合、任意の INSERT は同じ subject への publish になります。 -しかし、テーブルが複数の subject から読み取る場合は、どの subject に publish したいかを指定する必要があります。 -そのため、複数の subject を持つテーブルに INSERT する場合は、`stream_like_engine_insert_queue` の設定が必要です。 -テーブルが読み取っている subject の 1 つを選択し、そこにデータを publish できます。例えば、次のようになります: - -```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 - -``` - - -## 説明 - -各メッセージは一度しか読み取れないため、(デバッグを除いて)メッセージの読み取りに `SELECT` を使ってもあまり有用ではありません。代わりに、[マテリアライズドビュー](../../../sql-reference/statements/create/view.md) を使ってリアルタイムの処理フローを作成する方が実用的です。そのためには、次の手順を実行します。 - -1. エンジンを使用して NATS コンシューマを作成し、それをデータストリームとして扱います。 -2. 目的の構造(スキーマ)を持つテーブルを作成します。 -3. エンジンからのデータを変換し、あらかじめ作成したテーブルに書き込むマテリアライズドビューを作成します。 - -`MATERIALIZED VIEW` がエンジンにアタッチされると、バックグラウンドでデータの収集を開始します。これにより、NATS から継続的にメッセージを受信し、`SELECT` を使用して必要な形式に変換できます。 -1 つの NATS テーブルに対して、必要なだけ多くのマテリアライズドビューを作成できます。これらはテーブルから直接データを読み取るのではなく、新しいレコード(ブロック単位)を受け取ります。この方法により、異なる詳細度(グルーピング・集約あり/なし)の複数のテーブルに書き込むことができます。 - -例: - -```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; -``` - -ストリームデータの取り込みを停止する、または変換ロジックを変更するには、マテリアライズドビューをデタッチします。 - -```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#max_block_size) によって制御できます。 - - - -## JetStream の使用 - -NATS JetStream とともに NATS エンジンを使用する前に、NATS ストリームと永続プルコンシューマを作成する必要があります。これには、[NATS CLI](https://github.com/nats-io/natscli) パッケージに含まれる `nats` ユーティリティなどを使用できます。 - -
- ストリームの作成 - - ```bash - $ nats stream add - ? Stream Name stream_name - ? Subjects stream_subject - ? Storage file - ? Replication 1 - ? Retention Policy Limits - ? Discard Policy Old - ? Stream Messages Limit -1 - ? Per Subject Messages Limit -1 - ? Total Stream Size -1 - ? Message TTL -1 - ? Max Message Size -1 - ? Duplicate tracking time window 2m0s - ? Allow message Roll-ups No - ? Allow message deletion Yes - ? Allow purging subjects or the entire stream Yes - Stream stream_name was created - - Information for Stream stream_name created 2025-10-03 14:12:51 - - Subjects: stream_subject - Replicas: 1 - Storage: File - - Options: - - Retention: Limits - Acknowledgments: true - Discard Policy: Old - Duplicate Window: 2m0s - Direct Get: true - Allows Msg Delete: true - Allows Purge: true - Allows Per-Message TTL: false - Allows Rollups: false - - Limits: - - Maximum Messages: unlimited - Maximum Per Subject: unlimited - Maximum Bytes: unlimited - Maximum Age: unlimited - Maximum Message Size: unlimited - Maximum Consumers: unlimited - - State: - - Messages: 0 - Bytes: 0 B - First Sequence: 0 - Last Sequence: 0 - Active Consumers: 0 - ``` -
- -
- 永続プルコンシューマの作成 - - ```bash - $ nats consumer add - ? Select a Stream stream_name - ? Consumer name consumer_name - ? Delivery target (empty for Pull Consumers) - ? Start policy (all, new, last, subject, 1h, msg sequence) all - ? Acknowledgment policy explicit - ? Replay policy instant - ? Filter Stream by subjects (blank for all) - ? Maximum Allowed Deliveries -1 - ? Maximum Acknowledgments Pending 0 - ? Deliver headers only without bodies No - ? Add a Retry Backoff Policy No - Information for Consumer stream_name > consumer_name created 2025-10-03T14:13:51+03:00 - - Configuration: - - Name: consumer_name - Pull Mode: true - Deliver Policy: All - Ack Policy: Explicit - Ack Wait: 30.00s - Replay Policy: Instant - Max Ack Pending: 1,000 - Max Waiting Pulls: 512 - - State: - - Last Delivered Message: Consumer sequence: 0 Stream sequence: 0 - Acknowledgment Floor: Consumer sequence: 0 Stream sequence: 0 - Outstanding Acks: 0 out of maximum 1,000 - Redelivered Messages: 0 - Unprocessed Messages: 0 - Waiting Pulls: 0 of maximum 512 - ``` -
- -ストリームと永続プルコンシューマを作成したら、NATS エンジンを使用してテーブルを作成できます。このためには、`nats_stream`、`nats_consumer_name`、`nats_subjects` を初期化する必要があります。 - -```SQL -CREATE TABLE nats_jet_stream ( - key UInt64, - value UInt64 - ) ENGINE NATS - SETTINGS nats_url = 'localhost:4222', - nats_stream = 'stream_name', - nats_consumer_name = 'consumer_name', - nats_subjects = 'stream_subject', - nats_format = 'JSONEachRow'; -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md deleted file mode 100644 index 6bc95454554..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -description: 'ClickHouse が ODBC を介して外部データベースに接続できるようにします。' -sidebar_label: 'ODBC' -sidebar_position: 150 -slug: /engines/table-engines/integrations/odbc -title: 'ODBC テーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# 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) データ型をサポートします。 - - - -## テーブルを作成する - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] -( - name1 [type1], - name2 [type2], - ... -) -ENGINE = ODBC(datasource, external_database, external_table) -``` - -[CREATE TABLE](/sql-reference/statements/create/table) クエリの詳細な説明については、該当ページを参照してください。 - -テーブル構造は、ソーステーブルの構造と異なっていてもかまいません。 - -* 列名はソーステーブルと同じである必要がありますが、その一部の列だけを任意の順序で使用できます。 -* 列の型は、ソーステーブルとは異なっていてもかまいません。ClickHouse は値を ClickHouse のデータ型に[キャスト](/sql-reference/functions/type-conversion-functions#cast)しようとします。 -* [external_table_functions_use_nulls](/operations/settings/settings#external_table_functions_use_nulls) 設定は、Nullable 列をどのように扱うかを定義します。デフォルト値は 1 です。0 の場合、テーブル関数は Nullable 列を作成せず、null の代わりにデフォルト値を挿入します。これは配列内の NULL 値にも適用されます。 - -**エンジンパラメータ** - -* `datasource` — `odbc.ini` ファイル内の、接続設定が記述されたセクション名。 -* `external_database` — 外部 DBMS 内のデータベース名。 -* `external_table` — `external_database` 内のテーブル名。 - -これらのパラメータは、[named collections](operations/named-collections.md) を使用して指定することもできます。 - - -## 使用例 - -**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 -+-------------------------+ -| 接続に成功しました! | -| | -... -``` - -MySQL のテーブル: - -```text -mysql> CREATE DATABASE test; -クエリ OK, 1 行が影響を受けました (0,01 秒) - -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`)); -クエリ OK, 0 行が影響を受けました (0,09 秒) - -mysql> insert into test.test (`int_id`, `float`) VALUES (1,2); -クエリ OK, 1 行が影響を受けました (0,00 秒) - -mysql> select * from test.test; -+------+----------+-----+----------+ -| int_id | int_nullable | float | float_nullable | -+------+----------+-----+----------+ -| 1 | NULL | 2 | NULL | -+------+----------+-----+----------+ -1 行が取得されました (0,00 秒) -``` - -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 辞書](/sql-reference/dictionaries#mysql) -- [ODBC テーブル関数](../../../sql-reference/table-functions/odbc.md) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md deleted file mode 100644 index d781104c93a..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: 'PostgreSQL エンジンを使用すると、リモート PostgreSQL サーバー上に保存されたデータに対して `SELECT` および `INSERT` クエリを実行できます。' -sidebar_label: 'PostgreSQL' -sidebar_position: 160 -slug: /engines/table-engines/integrations/postgresql -title: 'PostgreSQL テーブルエンジン' -doc_type: 'guide' ---- - - - -# PostgreSQL テーブルエンジン - -PostgreSQLエンジンを使用すると、リモートのPostgreSQLサーバーに保存されたデータに対して `SELECT` および `INSERT` クエリを実行できます。 - -:::note -現在サポートされているのは、PostgreSQL 12以降のバージョンのみです。 -::: - -:::tip -ClickHouse Cloud ユーザーには、Postgres データを ClickHouse にストリーミングする際に [ClickPipes](/integrations/clickpipes) の利用を推奨します。これは、インジェストとクラスタリソースをそれぞれ独立してスケールさせることで責務を分離しつつ、高パフォーマンスなデータ挿入をネイティブにサポートします。 -::: - - - -## テーブルの作成 - -```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) クエリの詳細な説明を参照してください。 - -テーブルの構造は、元の PostgreSQL テーブル構造と異なる場合があります。 - -* 列名は元の PostgreSQL テーブルと同じである必要がありますが、そのうち一部の列だけを任意の順序で使用できます。 -* 列の型は元の PostgreSQL テーブルと異なっていてもかまいません。ClickHouse は値を ClickHouse のデータ型に[キャスト](../../../engines/database-engines/postgresql.md#data_types-support)しようとします。 -* [external_table_functions_use_nulls](/operations/settings/settings#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`。省略可能。注意: このオプションを追加すると、挿入が非効率になります。 - -本番環境では [Named collections](/operations/named-collections.md)(バージョン 21.11 以降で利用可能)を使用することを推奨します。以下はその例です。 - -```xml - - - localhost - 5432 - postgres - **** - schema1 - - -``` - -一部のパラメータは、キー値引数で上書きできます。 - -```sql -SELECT * FROM postgresql(postgres_creds, table='table1'); -``` - - -## 実装の詳細 - -PostgreSQL 側での `SELECT` クエリは、読み取り専用の PostgreSQL トランザクション内で `COPY (SELECT ...) TO STDOUT` として実行され、各 `SELECT` クエリの後にコミットされます。 - -`=`, `!=`, `>`, `>=`, `<`, `<=`, `IN` といった単純な `WHERE` 句は PostgreSQL サーバー上で実行されます。 - -すべての JOIN、集約、ソート、`IN [ array ]` 条件、および `LIMIT` によるサンプリング制約は、PostgreSQL へのクエリが完了した後にのみ ClickHouse 側で実行されます。 - -PostgreSQL 側での `INSERT` クエリは、PostgreSQL トランザクション内で `COPY "table_name" (field1, field2, ... fieldN) FROM STDIN` として実行され、各 `INSERT` 文の後に自動コミットされます。 - -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 の辞書ソースではレプリカの優先度指定がサポートされています。マップ内の数値が大きいほど優先度は低くなります。最も高い優先度は `0` です。 - -次の例では、レプリカ `example01-1` が最も高い優先度となります。 - -```xml - - 5432 - clickhouse - qwerty - - example01-1 - 1 - - - example01-2 - 2 - - db_name - table_name
- id=10 - SQL_QUERY -
- -``` - - -## 使用例 - -### 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 table engine](/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', 'postgres_user', 'postgres_password'); -``` - -### SELECT クエリを使用して PostgreSQL テーブルから ClickHouse テーブルへ初期データを挿入する - -[postgresql テーブル関数](/sql-reference/table-functions/postgresql.md) は PostgreSQL から ClickHouse へデータをコピーします。これは、多くの場合、PostgreSQL ではなく 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', 'postgres_user', 'postgres_password'); -``` - -### PostgreSQL テーブルから ClickHouse テーブルへの増分データ挿入 - -初回の挿入後に PostgreSQL テーブルと ClickHouse テーブルの間で継続的な同期を行う場合、ClickHouse 側で `WHERE` 句を使用して、タイムスタンプまたは一意のシーケンス ID に基づき、PostgreSQL に新たに追加されたデータのみを挿入できます。 - -これを実現するには、次のように、これまでに取り込んだ最大 ID またはタイムスタンプを追跡しておく必要があります。 - -```sql -SELECT max(`int_id`) AS maxIntID FROM default.postgresql_copy; -``` - -次に、PostgreSQL テーブルから最大値を超える値を挿入します - -```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 をディクショナリのソースとして使用する](/sql-reference/dictionaries#mysql) - - -## 関連コンテンツ {#related-content} - -- ブログ: [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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md deleted file mode 100644 index 056cf863842..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -description: 'このエンジンにより、ClickHouse と RabbitMQ を統合できます。' -sidebar_label: 'RabbitMQ' -sidebar_position: 170 -slug: /engines/table-engines/integrations/rabbitmq -title: 'RabbitMQ テーブルエンジン' -doc_type: 'guide' ---- - - - -# RabbitMQ テーブルエンジン - -このエンジンを使用すると、ClickHouse を [RabbitMQ](https://www.rabbitmq.com) と統合できます。 - -`RabbitMQ` を利用すると、次のことが可能です。 - -- データフローをパブリッシュまたはサブスクライブできる。 -- ストリームを、利用可能になったタイミングで処理できる。 - - - -## テーブルの作成 - -```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` – host:port(例: `localhost:5672`)。 -* `rabbitmq_exchange_name` – RabbitMQ のエクスチェンジ名。 -* `rabbitmq_format` – メッセージフォーマット。SQL の `FORMAT` 関数と同じ表記を使用します(例: `JSONEachRow`)。詳細は [Formats](../../../interfaces/formats.md) セクションを参照してください。 - -オプションのパラメータ: - - -- `rabbitmq_exchange_type` – RabbitMQ exchange の種類。`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` – テーブルごとの consumer 数。1 つの consumer のスループットが不十分な場合は、より多くの consumer を指定します。デフォルト: `1` -- `rabbitmq_num_queues` – キューの総数。この値を増やすとパフォーマンスを大幅に向上できる場合があります。デフォルト: `1`。 -- `rabbitmq_queue_base` - キュー名のヒントを指定します。この設定のユースケースは以下で説明します。 -- `rabbitmq_deadletter_exchange` - [dead letter exchange](https://www.rabbitmq.com/dlx.html) の名前を指定します。別のテーブルをこの exchange 名で作成し、メッセージが dead letter exchange に再パブリッシュされた場合にそれらのメッセージを収集できます。デフォルトでは dead letter exchange は指定されていません。 -- `rabbitmq_persistent` - 1 (true) に設定すると、INSERT クエリで delivery mode が 2 に設定され (メッセージが「persistent」としてマークされます)。デフォルト: `0`。 -- `rabbitmq_skip_broken_messages` – ブロックごとのスキーマ非互換メッセージに対する RabbitMQ メッセージパーサーの許容数。`rabbitmq_skip_broken_messages = N` の場合、パースできない RabbitMQ メッセージ *N* 件 (メッセージ 1 件はデータの 1 行に相当) をエンジンがスキップします。デフォルト: `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#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 のセットアップ (exchange、queue、binding の宣言) を行いません。デフォルト: `false`。 -- `rabbitmq_username` - RabbitMQ のユーザー名。 -- `rabbitmq_password` - RabbitMQ のパスワード。 -- `reject_unhandled_messages` - エラー発生時にメッセージを reject し (RabbitMQ に negative acknowledgement を送信)、処理しません。`rabbitmq_queue_settings_list` に `x-dead-letter-exchange` が定義されている場合、この設定は自動的に有効になります。 -- `rabbitmq_commit_on_select` - SELECT クエリが実行されたときにメッセージをコミットします。デフォルト: `false`。 -- `rabbitmq_max_rows_per_message` — 行ベースフォーマットで 1 件の RabbitMQ メッセージに書き込まれる最大行数。デフォルト: `1`。 -- `rabbitmq_empty_queue_backoff_start` — RabbitMQ キューが空の場合に再読み取りをスケジュールし直す際のバックオフ開始ポイント。 -- `rabbitmq_empty_queue_backoff_end` — RabbitMQ キューが空の場合に再読み取りをスケジュールし直す際のバックオフ終了ポイント。 -- `rabbitmq_handle_error_mode` — RabbitMQ エンジンにおけるエラーの処理方法。指定可能な値: `default` (メッセージのパースに失敗した場合に例外をスロー)、`stream` (例外メッセージと生メッセージを仮想カラム `_error` および `_raw_message` に保存)、`dead_letter_queue` (エラー関連データを system.dead_letter_queue に保存)。 - - * [ ] SSL connection: - -`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 - -``` - - -## 説明 - -各メッセージは一度しか読み取れないため、メッセージの読み取りに `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` - `x-match=all` または `x-match=any` の設定とともに、`key=value` の一致に基づいてルーティングします。テーブル側のキーリスト例: `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` 設定を使用する場合、これらのパラメータが同じであれば、キューの完全な一致が実現されます。 -* すべてのメッセージが正常に消費されなかった場合に、特定の永続キューからの読み取りを復元できるようにする場合。特定の 1 つのキューからの読み取りを再開するには、そのキュー名を `rabbitmq_queue_base` 設定に指定し、`rabbitmq_num_consumers` と `rabbitmq_num_queues` は指定しないでください(デフォルトは 1)。特定のテーブルに対して宣言されたすべてのキューからの読み取りを再開するには、同じ設定 `rabbitmq_queue_base`, `rabbitmq_num_consumers`, `rabbitmq_num_queues` を指定します。デフォルトでは、キュー名はテーブルごとに一意になります。 -* キューが durable で自動削除されないため、キューを再利用する場合。(任意の RabbitMQ CLI ツールから削除できます。) - -パフォーマンス向上のため、受信したメッセージは [max_insert_block_size](/operations/settings/settings#max_insert_block_size) のサイズのブロックにまとめられます。もしブロックが [stream_flush_interval_ms](../../../operations/server-configuration-parameters/settings.md) ミリ秒以内に形成されなかった場合は、ブロックが完全でなくてもデータはテーブルにフラッシュされます。 - -`rabbitmq_exchange_type` と一緒に `rabbitmq_num_consumers` および/または `rabbitmq_num_queues` 設定が指定されている場合: - -* `rabbitmq-consistent-hash-exchange` プラグインを有効化する必要があります。 -* 公開されるメッセージの `message_id` プロパティを指定する必要があります(メッセージ/バッチごとに一意)。 - -INSERT クエリでは、公開された各メッセージに対して追加されるメッセージメタデータ `messageID` と `republished` フラグ(複数回公開された場合は true)が用意されており、メッセージヘッダー経由でアクセスできます。 - -同じテーブルを INSERT とマテリアライズドビューの両方に使用しないでください。 - -例: - -```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` - 受信メッセージの timestamp。メッセージがパブリッシュされたときに設定されていれば非空。データ型: `UInt64`。 - -`rabbitmq_handle_error_mode='stream'` の場合の追加の仮想カラム: - -- `_raw_message` - 正常にパースできなかった生のメッセージ。データ型: `Nullable(String)`。 -- `_error` - パースに失敗した際に発生した例外メッセージ。データ型: `Nullable(String)`。 - -注意: `_raw_message` および `_error` 仮想カラムは、パース中に例外が発生した場合にのみ値が設定され、メッセージが正常にパースされた場合は常に `NULL` です。 - - - -## 注意事項 {#caveats} - -テーブル定義で [`DEFAULT`、`MATERIALIZED`、`ALIAS`] などの[デフォルトの列式](/sql-reference/statements/create/table.md/#default_values)を指定することはできますが、これらは無視されます。その代わり、各列には対応する型のデフォルト値が設定されます。 - - - -## データ形式のサポート {#data-formats-support} - -RabbitMQ エンジンは、ClickHouse がサポートしているすべての[フォーマット](../../../interfaces/formats.md)をサポートします。 -1 つの RabbitMQ メッセージ内の行数は、フォーマットが行ベースかブロックベースかによって異なります。 - -- 行ベースのフォーマットでは、1 つの RabbitMQ メッセージ内の行数は `rabbitmq_max_rows_per_message` の設定で制御できます。 -- ブロックベースのフォーマットではブロックをより小さな部分に分割することはできませんが、1 つのブロック内の行数は一般設定 [max_block_size](/operations/settings/settings#max_block_size) によって制御できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md deleted file mode 100644 index 57be2cf1b88..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -description: 'このエンジンにより、ClickHouse と Redis を統合できます。' -sidebar_label: 'Redis' -sidebar_position: 175 -slug: /engines/table-engines/integrations/redis -title: 'Redis テーブルエンジン' -doc_type: 'guide' ---- - - - -# Redis テーブルエンジン - -このエンジンにより、ClickHouse を [Redis](https://redis.io/) と連携させることができます。Redis はキー・バリュー(KV)モデルを採用しているため、`where k=xx` や `where k in (xx, xx)` のようなポイントアクセスのクエリに限定して利用することを強く推奨します。 - - - -## テーブルを作成する - -```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 サーバーのアドレス。`port` を省略した場合は、Redis のデフォルトポート 6379 が使用されます。 -* `db_index` — Redis の DB インデックス。範囲は 0〜15 で、デフォルトは 0 です。 -* `password` — ユーザーのパスワード。デフォルトは空文字列です。 -* `pool_size` — Redis の最大接続プールサイズ。デフォルトは 16 です。 -* `primary_key_name` - カラムリスト内の任意のカラム名。 - -:::note シリアライゼーション -`PRIMARY KEY` は 1 つのカラムのみをサポートします。プライマリキーは Redis のキーとしてバイナリ形式でシリアライズされます。 -プライマリキー以外のカラムは、対応する順序で Redis の値としてバイナリ形式でシリアライズされます。 -::: - -引数は [named collections](/operations/named-collections.md) を使って渡すこともできます。この場合、`host` と `port` は個別に指定する必要があります。この方法は本番環境での利用に推奨されます。現時点では、named collections を使って Redis に渡されるすべてのパラメータは必須です。 - -:::note フィルタリング -`key equals` または `in filtering` を含むクエリは、Redis からの複数キーのルックアップに最適化されます。フィルタリング用のキーを指定しないクエリではテーブル全体スキャンが発生し、高コストな処理になります。 -::: - - -## 使用例 - -単純な引数を用いて、`Redis` エンジンを使用する ClickHouse のテーブルを作成します: - -```sql -CREATE TABLE redis_table -( - `key` String, - `v1` UInt32, - `v2` String, - `v3` Float32 -) -ENGINE = Redis('redis1:6379') PRIMARY KEY(key); -``` - -または、[named collections](/operations/named-collections.md) を使用します: - -```xml - - - 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'; -``` - -Truncate: - -Redis のデータベースを非同期でフラッシュします。`Truncate` は同期(SYNC)モードにも対応しています。 - -```sql -TRUNCATE TABLE redis_table SYNC; -``` - -Join: - -他のテーブルと結合します。 - -```sql -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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md deleted file mode 100644 index 358736967cf..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md +++ /dev/null @@ -1,455 +0,0 @@ ---- -description: 'このエンジンは Amazon S3 エコシステムとの統合を提供します。HDFS エンジンに類似していますが、S3 固有の機能を備えています。' -sidebar_label: 'S3' -sidebar_position: 180 -slug: /engines/table-engines/integrations/s3 -title: 'S3 テーブルエンジン' -doc_type: 'reference' ---- - - - -# S3 table engine - -このエンジンは、[Amazon S3](https://aws.amazon.com/s3/) エコシステムと連携します。このエンジンは [HDFS](/engines/table-engines/integrations/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 │ -└──────┴───────┘ -``` - - -## テーブルの作成 - -```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_strategy], [partition_columns_in_data_file]) - [PARTITION BY expr] - [SETTINGS ...] -``` - -### エンジンパラメータ - -* `path` — ファイルへのパスを含むバケット URL。読み取り専用モードでは `*`、`**`、`?`、`{abc,def}`、`{N..M}` というワイルドカードをサポートします。ここで `N`、`M` は数値、`'abc'`、`'def'` は文字列です。詳細は[下記](#wildcards-in-path)を参照してください。 -* `NOSIGN` - 認証情報の代わりにこのキーワードが指定された場合、すべてのリクエストは署名されません。 -* `format` — ファイルの[フォーマット](/sql-reference/formats#formats-overview)。 -* `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`。パラメータは省略可能です。デフォルトではファイル拡張子から圧縮方式を自動検出します。 -* `partition_strategy` – オプション: `WILDCARD` または `HIVE`。`WILDCARD` では、パス内に `{_partition_id}` を含める必要があり、これがパーティションキーに置き換えられます。`HIVE` ではワイルドカードは使用できず、パスはテーブルのルートであるとみなし、Snowflake ID をファイル名、ファイルフォーマットを拡張子とする Hive スタイルのパーティションディレクトリを生成します。デフォルトは `WILDCARD` です。 -* `partition_columns_in_data_file` - `HIVE` パーティション戦略でのみ使用されます。データファイル内にパーティション列が書き込まれていることを ClickHouse が想定すべきかどうかを指定します。デフォルトは `false` です。 -* `storage_class_name` - オプション: `STANDARD` または `INTELLIGENT_TIERING`。 [AWS S3 Intelligent Tiering](https://aws.amazon.com/s3/storage-classes/intelligent-tiering/) を指定できます。 - -### データキャッシュ - -`S3` テーブルエンジンはローカルディスク上でのデータキャッシュをサポートします。 -ファイルシステムキャッシュの設定オプションと使用方法については、この[セクション](/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` セクションで設定されたキャッシュ構成(およびそれに伴うキャッシュストレージ)を再利用します。詳しくは[こちら](/operations/storing-data.md/#using-local-cache)を参照してください。 - -### PARTITION BY - -`PARTITION BY` — 省略可能です。ほとんどの場合、パーティションキーは不要であり、必要な場合でも月単位より細かいパーティションキーが求められることはほぼありません。パーティション分割は(ORDER BY 式とは対照的に)クエリを高速化しません。過度に細かいパーティション分割は避けてください。データをクライアント識別子や名前でパーティション分割しないでください(代わりに、ORDER BY 式の最初の列としてクライアント識別子または名前を指定してください)。 - -月単位でパーティション分割するには、`date_column` が型 [Date](/sql-reference/data-types/date.md) の日付を持つ列であるとき、`toYYYYMM(date_column)` 式を使用します。ここでのパーティション名は `"YYYYMM"` 形式になります。 - -#### パーティション戦略 - -`WILDCARD`(デフォルト): ファイルパス内の `{_partition_id}` ワイルドカードを実際のパーティションキーに置き換えます。読み取りはサポートされていません。 - - -`HIVE` は読み書きのために Hive スタイルのパーティショニングを実装しています。読み取りは再帰的なグロブパターンを使って行われ、`SELECT * FROM s3('table_root/**.parquet')` と同等です。 -書き込みでは、次の形式でファイルを生成します: `//.`。 - -注意: `HIVE` パーティション方式を使用する場合、`use_hive_partitioning` 設定は効果はありません。 - -`HIVE` パーティション方式の例: - -```sql -arthur :) CREATE TABLE t_03363_parquet (year UInt16, country String, counter UInt8) -ENGINE = S3(s3_conn, filename = 't_03363_parquet', format = Parquet, partition_strategy='hive') -PARTITION BY (year, country); - -arthur :) INSERT INTO t_03363_parquet VALUES - (2022, 'USA', 1), - (2022, 'Canada', 2), - (2023, 'USA', 3), - (2023, 'Mexico', 4), - (2024, 'France', 5), - (2024, 'Germany', 6), - (2024, 'Germany', 7), - (1999, 'Brazil', 8), - (2100, 'Japan', 9), - (2024, 'CN', 10), - (2025, '', 11); - -arthur :) select _path, * from t_03363_parquet; - - ┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐ - 1. │ test/t_03363_parquet/year=2100/country=Japan/7329604473272971264.parquet │ 2100 │ Japan │ 9 │ - 2. │ test/t_03363_parquet/year=2024/country=France/7329604473323302912.parquet │ 2024 │ France │ 5 │ - 3. │ test/t_03363_parquet/year=2022/country=Canada/7329604473314914304.parquet │ 2022 │ Canada │ 2 │ - 4. │ test/t_03363_parquet/year=1999/country=Brazil/7329604473289748480.parquet │ 1999 │ Brazil │ 8 │ - 5. │ test/t_03363_parquet/year=2023/country=Mexico/7329604473293942784.parquet │ 2023 │ Mexico │ 4 │ - 6. │ test/t_03363_parquet/year=2023/country=USA/7329604473319108608.parquet │ 2023 │ USA │ 3 │ - 7. │ test/t_03363_parquet/year=2025/country=/7329604473327497216.parquet │ 2025 │ │ 11 │ - 8. │ test/t_03363_parquet/year=2024/country=CN/7329604473310720000.parquet │ 2024 │ CN │ 10 │ - 9. │ test/t_03363_parquet/year=2022/country=USA/7329604473298137088.parquet │ 2022 │ USA │ 1 │ -10. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │ 6 │ -11. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │ 7 │ - └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘ -``` - -### パーティション化されたデータのクエリ実行 - -この例では、ClickHouse と MinIO を統合した [docker compose recipe](https://github.com/ClickHouse/examples/tree/5fdc6ff72f4e5137e23ea075c88d3f44b0202490/docker-compose-recipes/recipes/ch-and-minio-S3) を使用します。エンドポイントと認証情報の値を差し替えることで、S3 を使って同じクエリを再現できます。 - -`ENGINE` 設定内の S3 エンドポイントでは、S3 オブジェクト(ファイル名)の一部としてパラメータトークン `{_partition_id}` を使用しており、SELECT クエリはそれによって生成されるオブジェクト名(例: `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からの SELECT - -```sql -SELECT * -FROM s3('http://minio:10000/clickhouse//test_1.csv', 'minioadmin', 'minioadminpassword', 'CSV') -``` - -```response -┌─c1─┬─c2─┬─c3─┐ -│ 3 │ 2 │ 1 │ -└────┴────┴────┘ -``` - -#### パーティション45からのSELECT - -```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 -サーバーから例外を受信しました (バージョン 23.4.1): -Code: 48. DB::Exception: localhost:9000 から受信しました。DB::Exception: パーティション化されたS3ストレージからの読み取りはまだ実装されていません。(NOT_IMPLEMENTED) -``` - - -## データの挿入 {#inserting-data} - -行は新しいファイルにのみ挿入できる点に注意してください。マージ処理やファイル分割処理は行われません。いったんファイルが書き込まれると、その後の挿入は失敗します。これを回避するには、`s3_truncate_on_insert` および `s3_create_new_file_on_insert` の設定を使用できます。詳細は[こちら](/integrations/s3#inserting-data)を参照してください。 - - - -## 仮想列 {#virtual-columns} - -- `_path` — ファイルのパス。型: `LowCardinality(String)`。 -- `_file` — ファイル名。型: `LowCardinality(String)`。 -- `_size` — ファイルのサイズ(バイト単位)。型: `Nullable(UInt64)`。サイズが不明な場合、値は `NULL` です。 -- `_time` — ファイルの最終更新時刻。型: `Nullable(DateTime)`。時刻が不明な場合、値は `NULL` です。 -- `_etag` — ファイルの ETag。型: `LowCardinality(String)`。ETag が不明な場合、値は `NULL` です。 -- `_tags` — ファイルのタグ。型: `Map(String, String)`。タグが存在しない場合、値は空のマップ `{}'。 - -仮想列の詳細については [こちら](../../../engines/table-engines/index.md#table_engines-virtual_columns) を参照してください。 - - - -## 実装の詳細 {#implementation-details} - -- 読み取りと書き込みは並行して実行できます -- サポートされていない項目: - - `ALTER` と `SELECT...SAMPLE` の操作 - - インデックス - - [Zero-copy](../../../operations/storing-data.md#zero-copy) レプリケーションは実行可能ですが、サポート対象外です。 - - :::note Zero-copy レプリケーションは本番利用にはまだ準備ができていません - Zero-copy レプリケーションは ClickHouse バージョン 22.8 以降ではデフォルトで無効化されています。この機能は本番環境での使用は推奨されません。 - ::: - - - -## パスのワイルドカード - -`path` 引数では、bash 形式のワイルドカードを使用して複数ファイルを指定できます。処理対象となるには、ファイルが存在し、パスパターン全体に一致している必要があります。ファイルの一覧は `SELECT` 実行時に決定されます(`CREATE` 時点ではありません)。 - -* `*` — `/` を除く任意の文字列(空文字列も含む)に 0 文字以上マッチします。 -* `**` — `/` を含む任意の文字列(空文字列も含む)に 0 文字以上マッチします。 -* `?` — 任意の 1 文字にマッチします。 -* `{some_string,another_string,yet_another_one}` — 文字列 `'some_string', 'another_string', 'yet_another_one'` のいずれか 1 つにマッチします。 -* `{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 上に、次の URI を持つ CSV 形式のファイルが複数あるとします: - -* '[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_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_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/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_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_2.csv)' -* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.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](/operations/settings/settings.md#s3_truncate_on_insert) - 挿入前にファイルを切り詰められるようにします。デフォルトでは無効です。 -- [s3_create_new_file_on_insert](/operations/settings/settings.md#s3_create_new_file_on_insert) - フォーマットにサフィックスが付いている場合、挿入のたびに新しいファイルを作成できるようにします。デフォルトでは無効です。 -- [s3_skip_empty_files](/operations/settings/settings.md#s3_skip_empty_files) - 読み取り時に空のファイルをスキップできるようにします。デフォルトでは有効です。 - - - -## S3 関連の設定 {#settings} - -以下の設定は、クエリ実行前に指定するか、設定ファイルに記述できます。 - -- `s3_max_single_part_upload_size` — S3 への単一パートアップロードでアップロードするオブジェクトの最大サイズ。デフォルト値は `32Mb`。 -- `s3_min_upload_part_size` — [S3 Multipart upload](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` — 1 秒あたりの上限に達する前に同時に発行できるリクエストの最大数。デフォルト値(`0` の場合)は `s3_max_put_rps` と同じ。 -- `s3_max_get_rps` — レート制限(スロットリング)が行われる前の 1 秒あたりの最大 GET リクエスト数。デフォルト値は `0`(無制限)。 -- `s3_max_get_burst` — 1 秒あたりの上限に達する前に同時に発行できるリクエストの最大数。デフォルト値(`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` を参照してください。デフォルト設定では、1 つのアップロード済みファイルは、サイズが `8G` 未満のファイルであれば最大でも `320Mb` しか消費しません。より大きなファイルでは消費量は増加します。 - -セキュリティ上の考慮事項: 悪意あるユーザーが任意の S3 URL を指定できる場合、[SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) 攻撃を回避するために `s3_max_redirects` を 0 に設定する必要があります。あるいは、サーバー設定で `remote_host_filter` を指定する必要があります。 - - - -## エンドポイント単位の設定 - -次の設定は、特定のエンドポイント用に設定ファイル内で指定できます(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-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-11.csv.zip)' -* '[https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.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'); -``` - - -## パフォーマンスの最適化 {#optimizing-performance} - -`s3` 関数のパフォーマンス最適化の詳細については、[詳細ガイド](/integrations/s3/performance)を参照してください。 - - - -## 関連項目 {#see-also} - -- [S3 テーブル関数](../../../sql-reference/table-functions/s3.md) -- [ClickHouse との S3 連携](/integrations/s3) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md deleted file mode 100644 index 7c2d73bb4c7..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md +++ /dev/null @@ -1,441 +0,0 @@ ---- -description: 'このエンジンは Amazon S3 エコシステムとの統合を提供し、ストリーミングによるインポートを可能にします。Kafka エンジンや RabbitMQ エンジンと類似していますが、S3 固有の機能も備えています。' -sidebar_label: 'S3Queue' -sidebar_position: 181 -slug: /engines/table-engines/integrations/s3queue -title: 'S3Queue テーブルエンジン' -doc_type: 'reference' ---- - -import ScalePlanFeatureBadge from '@theme/badges/ScalePlanFeatureBadge' - - -# S3Queue テーブルエンジン - -このエンジンは [Amazon S3](https://aws.amazon.com/s3/) エコシステムとの統合を提供し、ストリーミングによるインポートを可能にします。このエンジンは [Kafka](../../../engines/table-engines/integrations/kafka.md)、[RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) エンジンに似ていますが、S3 固有の機能を備えています。 - -[S3Queue 実装の元となった PR](https://github.com/ClickHouse/ClickHouse/pull/49086/files#diff-e1106769c9c8fbe48dd84f18310ef1a250f2c248800fde97586b3104e9cd6af8R183) にある次の注意事項を理解しておくことが重要です。`MATERIALIZED VIEW` がこのエンジンに紐付けられると、S3Queue テーブルエンジンはバックグラウンドでデータの収集を開始します。 - - - -## テーブルの作成 {#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], [headers]) - [SETTINGS] - [mode = '',] - [after_processing = 'keep',] - [keeper_path = '',] - [loading_retries = 0,] - [processing_threads_num = 16,] - [parallel_inserts = false,] - [enable_logging_to_queue_log = true,] - [last_processed_path = "",] - [tracked_files_limit = 1000,] - [tracked_file_ttl_sec = 0,] - [polling_min_timeout_ms = 1000,] - [polling_max_timeout_ms = 10000,] - [polling_backoff_ms = 0,] - [cleanup_interval_min_ms = 10000,] - [cleanup_interval_max_ms = 30000,] - [buckets = 0,] - [list_objects_batch_size = 1000,] - [enable_hash_ring_filtering = 0,] - [max_processed_files_before_commit = 100,] - [max_processed_rows_before_commit = 0,] - [max_processed_bytes_before_commit = 0,] - [max_processing_time_sec_before_commit = 0,] -``` - -:::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} - -指定可能な値: - -- 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`モードにのみ適用されます。 - -デフォルト値: CPUの数または16。 - -### `s3queue_parallel_inserts` {#parallel_inserts} - -デフォルトでは、`processing_threads_num`は1つの`INSERT`を生成するため、複数のスレッドでファイルのダウンロードと解析のみを行います。 -しかし、これは並列性を制限するため、より高いスループットを得るには`parallel_inserts=true`を使用してください。これによりデータを並列に挿入できます(ただし、MergeTreeファミリーでは生成されるデータパーツの数が増加することに注意してください)。 - -:::note -`INSERT`は`max_process*_before_commit`設定に従って生成されます。 -::: - -デフォルト値: `false`。 - -### `s3queue_enable_logging_to_s3queue_log` {#enable_logging_to_s3queue_log} - -`system.s3queue_log`へのログ記録を有効にします。 - -デフォルト値: `0`。 - -### `s3queue_polling_min_timeout_ms` {#polling_min_timeout_ms} - -次のポーリング試行を行う前にClickHouseが待機する最小時間をミリ秒単位で指定します。 - -指定可能な値: - -- 正の整数。 - -デフォルト値: `1000`。 - -### `s3queue_polling_max_timeout_ms` {#polling_max_timeout_ms} - -次のポーリング試行を開始する前にClickHouseが待機する最大時間をミリ秒単位で定義します。 - -指定可能な値: - -- 正の整数。 - -デフォルト値: `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テーブルの複数のレプリカが存在し、それぞれがkeeperの同じメタデータディレクトリで動作している場合、`s3queue_buckets`の値は少なくともレプリカ数以上である必要があります。`s3queue_processing_threads`設定も併用する場合は、`s3queue_buckets`設定の値をさらに増やすことが推奨されます。これは`S3Queue`処理の実際の並列度を定義するためです。 - -### `use_persistent_processing_nodes` {#use_persistent_processing_nodes} - -デフォルトでは、S3Queueテーブルは常にエフェメラル処理ノードを使用しています。これにより、S3Queueが処理を開始した後、処理済みファイルをzookeeperにコミットする前にzookeeperセッションが期限切れになった場合、データの重複が発生する可能性があります。この設定により、keeperセッションが期限切れになった場合でも重複の可能性を排除します。 - -### `persistent_processing_nodes_ttl_seconds` {#persistent_processing_nodes_ttl_seconds} - -サーバーが正常終了しなかった場合、`use_persistent_processing_nodes`が有効になっていると、削除されていない処理ノードが残る可能性があります。この設定は、これらの処理ノードを安全にクリーンアップできる期間を定義します。 - -デフォルト値: `3600`(1時間)。 - - -## S3関連の設定 {#s3-settings} - -このエンジンはすべてのS3関連設定をサポートしています。S3設定の詳細については、[こちら](../../../engines/table-engines/integrations/s3.md)を参照してください。 - - -## S3ロールベースアクセス {#s3-role-based-access} - - - -s3Queueテーブルエンジンは、ロールベースアクセスをサポートしています。 -バケットへのアクセスに必要なロールの設定手順については、[こちら](/cloud/data-sources/secure-s3)のドキュメントを参照してください。 - -ロールの設定が完了したら、以下のように`extra_credentials`パラメータを使用して`roleARN`を指定できます: - -```sql -CREATE TABLE s3_table -( - ts DateTime, - value UInt64 -) -ENGINE = S3Queue( - 'https:///*.csv', - extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/') - ,'CSV') -SETTINGS - ... -``` - - -## 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`の積に等しくすることです。 - -`(s3queue_)processing_threads_num`設定は、バージョン`24.6`より前での使用は推奨されません。 - -`(s3queue_)buckets`設定は、バージョン`24.6`以降で利用可能です。 - - -## Description {#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` — ファイル名。 -- `_size` — ファイルのサイズ。 -- `_time` — ファイルの作成時刻。 - -仮想カラムの詳細については、[こちら](../../../engines/table-engines/index.md#table_engines-virtual_columns)を参照してください。 - - -## パス内のワイルドカード {#wildcards-in-path} - -`path` 引数では、bashライクなワイルドカードを使用して複数のファイルを指定できます。処理されるファイルは存在し、パスパターン全体に一致している必要があります。ファイルのリストは `SELECT` 実行時に決定されます(`CREATE` 時ではありません)。 - -- `*` — `/` を除く任意の文字を任意の数(空文字列を含む)にマッチします。 -- `**` — `/` を含む任意の文字を任意の数(空文字列を含む)にマッチします。 -- `?` — 任意の1文字にマッチします。 -- `{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の同じパスを指すように設定されており、あるサーバーが処理済みファイルのコミットを完了する前にKeeperセッションが期限切れになった場合、別のサーバーがそのファイルの処理を引き継ぐ可能性があります。このファイルは最初のサーバーによって部分的または完全に処理されている可能性があります。ただし、`use_persistent_processing_nodes = 1`の場合、バージョン25.8以降ではこの問題は発生しません; - -- サーバーの異常終了。 - -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 'S3Queueメタデータのインメモリ状態とファイルごとの現在処理中の行数を含みます。' │ -└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -例: - -```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`。永続テーブル。`system.s3queue`と同じ情報を持ちますが、`processed`および`failed`ファイルに関するものです。 - -このテーブルは以下の構造を持ちます: - -```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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md deleted file mode 100644 index 45fbc69acf6..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -description: 'このエンジンは、SQLite との間でデータのインポートおよびエクスポートを行うことができ、ClickHouse から SQLite のテーブルに対する直接クエリをサポートします。' -sidebar_label: 'SQLite' -sidebar_position: 185 -slug: /engines/table-engines/integrations/sqlite -title: 'SQLite テーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# SQLite テーブルエンジン - - - -このエンジンを使用すると、SQLite へのデータのインポートおよびエクスポートが可能になり、ClickHouse から SQLite テーブルへ直接クエリを実行することもできます。 - - - -## テーブルの作成 - -```sql - CREATE TABLE [IF NOT EXISTS] [db.]table_name - ( - name1 [type1], - name2 [type2], ... - ) ENGINE = SQLite('db_path', 'table') -``` - -**エンジンのパラメータ** - -* `db_path` — データベースを含む SQLite ファイルへのパス。 -* `table` — SQLite データベース内のテーブル名。 - - -## 使用例 - -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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md deleted file mode 100644 index 21982415035..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -description: 'タイムスタンプとタグ(またはラベル)に関連付けられた値の集合としての時系列データを格納するテーブルエンジン。' -sidebar_label: 'TimeSeries' -sidebar_position: 60 -slug: /engines/table-engines/special/time_series -title: 'TimeSeries テーブルエンジン' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# TimeSeries テーブルエンジン - - - - - -時系列データ、すなわちタイムスタンプおよびタグ(またはラベル)に関連付けられた値の集合を格納するテーブルエンジンです。 - -```sql -metric_name1[tag1=value1, tag2=value2, ...] = {timestamp1: value1, timestamp2: value2, ...} -metric_name2[...] = ... -``` - -:::info -これは実験的な機能であり、今後のリリースで後方互換性のない形で変更される可能性があります。 -TimeSeries テーブルエンジンを使用するには、[allow_experimental_time_series_table](/operations/settings/settings#allow_experimental_time_series_table) 設定を有効にします。 -`set allow_experimental_time_series_table = 1` コマンドを実行します。 -::: - - -## 構文 - -```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)] -``` - - -## 使用方法 - -すべてをデフォルト設定のままにして開始するのが簡単です(列の一覧を指定しなくても `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` テーブル自体はデータを持たず、すべてのデータはターゲットテーブルに保存されます。 -これは [マテリアライズドビュー](../../../sql-reference/statements/create/view#materialized-view) の動作に似ていますが、 -マテリアライズドビューがターゲットテーブルを 1 つだけ持つのに対して、 -`TimeSeries` テーブルは [data](#data-table)、[tags](#tags-table)、[metrics](#metrics-table) という 3 つのターゲットテーブルを持つ点が異なります。 - -ターゲットテーブルは `CREATE TABLE` クエリ内で明示的に指定することも、 -`TimeSeries` テーブルエンジンに内部ターゲットテーブルを自動的に生成させることもできます。 - -ターゲットテーブルは次のとおりです。 - -### Data テーブル {#data-table} - -_data_ テーブルには、何らかの識別子に関連付けられた時系列データが格納されます。 - -_data_ テーブルは次のカラムを持たなければなりません: - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `id` | [x] | `UUID` | any | メトリック名とタグの組み合わせを識別します | -| `timestamp` | [x] | `DateTime64(3)` | `DateTime64(X)` | 時点 | -| `value` | [x] | `Float64` | `Float32` or `Float64` | `timestamp` に関連付けられた値 | - -### Tags テーブル {#tags-table} - -_tags_ テーブルには、メトリック名とタグの各組み合わせに対して計算された識別子が格納されます。 - -_tags_ テーブルは次のカラムを持たなければなりません: - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `id` | [x] | `UUID` | any (must match the type of `id` in the [data](#data-table) table) | `id` はメトリック名とタグの組み合わせを識別します。DEFAULT 式でそのような識別子の計算方法を指定します | -| `metric_name` | [x] | `LowCardinality(String)` | `String` or `LowCardinality(String)` | メトリックの名前 | -| `` | [ ] | `String` | `String` or `LowCardinality(String)` or `LowCardinality(Nullable(String))` | 特定のタグの値。タグ名と対応するカラム名は [tags_to_columns](#settings) 設定で指定します | -| `tags` | [x] | `Map(LowCardinality(String), String)` | `Map(String, String)` or `Map(LowCardinality(String), String)` or `Map(LowCardinality(String), LowCardinality(String))` | メトリック名を保持するタグ `__name__` および [tags_to_columns](#settings) 設定で列挙された名前を持つタグを除いたタグのマップ | -| `all_tags` | [ ] | `Map(String, String)` | `Map(String, String)` or `Map(LowCardinality(String), String)` or `Map(LowCardinality(String), LowCardinality(String))` | 一時的なカラムであり、各行はメトリック名を保持するタグ `__name__` のみを除外したすべてのタグのマップです。このカラムの唯一の目的は、`id` を計算する際に使用されることです | -| `min_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` or `Nullable(DateTime64(X))` | 当該 `id` を持つ時系列の最小タイムスタンプ。[store_min_time_and_max_time](#settings) が `true` の場合に作成されます | -| `max_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` or `Nullable(DateTime64(X))` | 当該 `id` を持つ時系列の最大タイムスタンプ。[store_min_time_and_max_time](#settings) が `true` の場合に作成されます | - -### Metrics テーブル {#metrics-table} - -_metrics_ テーブルには、収集されているメトリクスに関する情報、そのメトリクスの型および説明が格納されます。 - -_metrics_ テーブルは次のカラムを持たなければなりません: - - - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `metric_family_name` | [x] | `String` | `String` or `LowCardinality(String)` | メトリックファミリー名 | -| `type` | [x] | `String` | `String` or `LowCardinality(String)` | メトリックファミリーのタイプ。"counter"、"gauge"、"summary"、"stateset"、"histogram"、"gaugehistogram" のいずれか | -| `unit` | [x] | `String` | `String` or `LowCardinality(String)` | メトリックで使用される単位 | -| `help` | [x] | `String` | `String` or `LowCardinality(String)` | メトリックの説明 | - -`TimeSeries` テーブルに挿入された行はすべて、実際にはこれら 3 つのターゲットテーブルに保存されます。 -`TimeSeries` テーブルには、[data](#data-table)、[tags](#tags-table)、[metrics](#metrics-table) 各テーブルのすべてのカラムが含まれます。 - - - -## 作成 - -`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' -``` - -したがって、列は自動的に生成され、このステートメントには、作成された各内部ターゲットテーブルに対応して 1 つずつ、合計 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 -``` - - -## 列型の調整 - -メインテーブルを定義する際に型を明示的に指定することで、内部ターゲットテーブルのほとんどすべての列型を調整できます。例えば、 - -```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` 列には識別子が格納されており、各識別子はメトリクス名とタグの組み合わせに対して計算されます。 -`id` 列の DEFAULT 式は、これらの識別子を計算するために使用される式です。 -`id` 列の型とその式の両方は、明示的に指定することで変更できます。 - -```sql -CREATE TABLE my_table -( - id UInt64 DEFAULT sipHash64(metric_name, all_tags) -) -ENGINE=TimeSeries -``` - - -## `tags` 列と `all_tags` 列 - -タグのマップを含む列が 2 つあります。`tags` と `all_tags` です。この例では同じものですが、`tags_to_columns` 設定を使用した場合には異なる場合があります。この設定を使用すると、特定のタグを `tags` 列内のマップとしてではなく、別の列に保存するよう指定できます。 - -```sql -CREATE TABLE my_table -ENGINE = TimeSeries -SETTINGS tags_to_columns = {'instance': 'instance', 'job': 'job'} -``` - -このステートメントにより、次の列が追加されます: - -```sql -`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 tags_to_columns = {'instance': 'instance', 'job': 'job'} -``` - - -## 内部ターゲットテーブルのテーブルエンジン - -デフォルトでは、内部ターゲットテーブルは次のテーブルエンジンを使用します。 - -* [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 -``` - - -## 外部ターゲットテーブル - -`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` テーブルを定義する際に指定できる設定の一覧は次のとおりです。 - -| Name | Type | Default | Description | -|---|---|---|---| -| `tags_to_columns` | Map | {} | [tags](#tags-table) テーブル内で、どのタグを個別のカラムとして出力するかを指定する Map。構文: `{'tag1': 'column1', 'tag2' : column2, ...}` | -| `use_all_tags_column_to_generate_id` | Bool | true | 時系列の ID を計算する式を生成する際に、このフラグを有効にすると、その計算で `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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md deleted file mode 100644 index ca15e112e3e..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -description: 'YTsaurus クラスターからデータを取り込むためのテーブルエンジン。' -sidebar_label: 'YTsaurus' -sidebar_position: 185 -slug: /engines/table-engines/integrations/ytsaurus -title: 'YTsaurus テーブルエンジン' -keywords: ['YTsaurus', 'table engine'] -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# YTsaurus テーブルエンジン - - - - -YTsaurus テーブルエンジンを使用すると、YTsaurus クラスターからデータを取り込むことができます。 - - - -## テーブルの作成 - -```sql - CREATE TABLE [IF NOT EXISTS] [db.]table_name - ( - name1 [type1], - name2 [type2], ... - ) ENGINE = YTsaurus('http_proxy_url', 'cypress_path', 'oauth_token') -``` - -:::info -これは実験的な機能であり、将来のリリースで後方互換性のない形で変更される可能性があります。 -設定 [`allow_experimental_ytsaurus_table_engine`](/operations/settings/settings#allow_experimental_ytsaurus_table_engine) を使用して、YTsaurus テーブルエンジンを有効にします。 - -次のように設定します。 - -`SET allow_experimental_ytsaurus_table_engine = 1`。 -::: - -**エンジンパラメータ** - -* `http_proxy_url` — YTsaurus HTTP プロキシの URL。 -* `cypress_path` — データソースへの Cypress パス。 -* `oauth_token` — OAuth トークン。 - - -## 使用例 - -YTsaurus テーブルを作成するクエリの例です。 - -```sql title="Query" -SHOW CREATE TABLE yt_saurus; -``` - -```sql title="Response" -CREATE TABLE yt_saurus -( - `a` UInt32, - `b` String -) -ENGINE = YTsaurus('http://localhost:8000', '//tmp/table', 'password') -``` - -テーブルのデータを取得するには、次を実行します。 - -```sql title="Query" -SELECT * FROM yt_saurus; -``` - -```response title="Response" - ┌──a─┬─b──┐ - │ 10 │ 20 │ - └────┴────┘ -``` - - -## データ型 {#data-types} - -### プリミティブ型 {#primitive-data-types} - -| YTsaurus データ型 | ClickHouse データ型 | -| ------------------ | ----------------------- | -| `int8` | `Int8` | -| `int16` | `Int16` | -| `int32` | `Int32` | -| `int64` | `Int64` | -| `uint8` | `UInt8` | -| `uint16` | `UInt16` | -| `uint32` | `UInt32` | -| `uint64` | `UInt64` | -| `float` | `Float32` | -| `double` | `Float64` | -| `boolean` | `Bool` | -| `string` | `String` | -| `utf8` | `String` | -| `json` | `JSON` | -| `yson(type_v3)` | `JSON` | -| `uuid` | `UUID` | -| `date32` | `Date`(まだサポートされていません)| -| `datetime64` | `Int64` | -| `timestamp64` | `Int64` | -| `interval64` | `Int64` | -| `date` | `Date`(まだサポートされていません)| -| `datetime` | `DateTime` | -| `timestamp` | `DateTime64(6)` | -| `interval` | `UInt64` | -| `any` | `String` | -| `null` | `Nothing` | -| `void` | `Nothing` | -| `T`(`required = False` の場合)| `Nullable(T)` | - -### 複合型 {#composite-data-types} - -| YTsaurus データ型 | ClickHouse データ型 | -| ------------------ | -------------------- | -| `decimal` | `Decimal` | -| `optional` | `Nullable` | -| `list` | `Array` | -| `struct` | `NamedTuple` | -| `tuple` | `Tuple` | -| `variant` | `Variant` | -| `dict` | `Array(Tuple(...)) | -| `tagged` | `T` | - -**関連項目** - -- [ytsaurus](../../../sql-reference/table-functions/ytsaurus.md) テーブル関数 -- [ytsaurus データスキーマ](https://ytsaurus.tech/docs/en/user-guide/storage/static-schema) -- [ytsaurus データ型](https://ytsaurus.tech/docs/en/user-guide/storage/data-types) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md deleted file mode 100644 index 0dad62231a5..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -description: 'Log エンジンファミリーのドキュメント' -sidebar_label: 'Log ファミリー' -sidebar_position: 20 -slug: /engines/table-engines/log-family/ -title: 'Log エンジンファミリー' -doc_type: 'guide' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Log テーブルエンジンファミリー - - - -これらのエンジンは、多数の小さなテーブル(およそ 100 万行まで)を高速に書き込み、後からテーブル全体をまとめて読み取る必要があるシナリオ向けに開発されています。 - -このファミリーに属するエンジン: - -| Log Engines | -|---------------------------------------------------------------------| -| [StripeLog](/engines/table-engines/log-family/stripelog.md) | -| [Log](/engines/table-engines/log-family/log.md) | -| [TinyLog](/engines/table-engines/log-family/tinylog.md) | - -`Log` ファミリーのテーブルエンジンは、[HDFS](/engines/table-engines/integrations/hdfs) や [S3](/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3) などの分散ファイルシステムにデータを保存できます。 - -:::warning This engine is not for log data. -名前に *Log* と付いているものの、Log テーブルエンジンはログデータの保存を目的としたものではありません。高速な書き込みが必要な、少量のデータに対してのみ使用してください。 -::: - - - -## 共通プロパティ {#common-properties} - -エンジンの共通特性: - -- データをディスク上に保存します。 - -- 書き込み時にはファイルの末尾にデータを追記します。 - -- 並行データアクセス向けのロックをサポートします。 - - `INSERT` クエリの実行中はテーブルがロックされ、他の読み取りおよび書き込みクエリはテーブルのロック解除を待機します。書き込みクエリがなければ、任意の数の読み取りクエリを同時に実行できます。 - -- [mutations](/sql-reference/statements/alter#mutations) をサポートしません。 - -- インデックスをサポートしません。 - - これは、データ範囲に対する `SELECT` クエリが効率的でないことを意味します。 - -- データのアトミックな書き込みを行いません。 - - たとえばサーバーの異常終了などにより書き込み処理が中断された場合、破損したデータを含むテーブルが生成される可能性があります。 - - - -## 違い {#differences} - -`TinyLog` エンジンはこのファミリーの中で最も単純で、提供される機能が最も少なく、効率も最も低いエンジンです。`TinyLog` エンジンは、単一のクエリ内で複数スレッドによる並列データ読み取りをサポートしません。単一クエリからの並列読み取りをサポートする同じファミリー内の他のエンジンと比べてデータ読み取りが遅く、また各カラムを個別のファイルとして保存するため、`Log` エンジンとほぼ同じ数のファイルディスクリプタを使用します。シンプルな用途でのみ使用してください。 - -`Log` エンジンと `StripeLog` エンジンは並列データ読み取りをサポートします。データ読み取り時には、ClickHouse は複数のスレッドを使用します。各スレッドは個別のデータブロックを処理します。`Log` エンジンはテーブルの各カラムごとに個別のファイルを使用します。`StripeLog` はすべてのデータを 1 つのファイルに保存します。その結果、`StripeLog` エンジンは使用するファイルディスクリプタが少なくなりますが、データ読み取り時の効率は `Log` エンジンの方が高くなります。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md deleted file mode 100644 index 1bdb46cf405..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -description: 'Log テーブルエンジンのドキュメント' -slug: /engines/table-engines/log-family/log -toc_priority: 33 -toc_title: 'Log' -title: 'Log テーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Log テーブルエンジン - - - -このエンジンは `Log` エンジンファミリーに属します。`Log` エンジンの共通の特性や相違点については、[Log エンジンファミリー](../../../engines/table-engines/log-family/index.md) の記事を参照してください。 - -`Log` は [TinyLog](../../../engines/table-engines/log-family/tinylog.md) と異なり、カラムファイルに付随して小さな「マーク」ファイルを持ちます。これらのマークは各データブロックごとに書き込まれ、指定された行数をスキップするためにファイルのどこから読み始めるべきかを示すオフセットを含みます。これにより、テーブルデータを複数スレッドで読み取ることが可能になります。 -同時データアクセスを可能にするために、読み取り操作は同時に実行できますが、書き込み操作は読み取りおよび他の書き込みをブロックします。 -`Log` エンジンはインデックスをサポートしません。また、テーブルへの書き込みが失敗した場合、そのテーブルは破損し、それ以降の読み取りはエラーを返します。`Log` エンジンは、一時データ、書き込み一度きりのテーブル、およびテストやデモ目的に適しています。 - - - -## テーブルを作成する - -```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 = Log -``` - -[CREATE TABLE](/sql-reference/statements/create/table) クエリの詳細な説明を参照してください。 - - -## データの書き込み {#table_engines-log-writing-the-data} - -`Log` エンジンは、各列を個別のファイルに書き込むことで効率的にデータを保存します。各テーブルに対して、Log エンジンは指定されたストレージパスに次のファイルを書き出します。 - -- `.bin`: 各列用のデータファイルで、シリアル化および圧縮されたデータを格納します。 -- `__marks.mrk`: 各挿入データブロックのオフセットと行数を保持するマークファイルです。マークは、読み取り時に不要なデータブロックをスキップできるようにすることで、クエリ実行を効率化するために使用されます。 - -### 書き込みプロセス {#writing-process} - -データが `Log` テーブルに書き込まれるとき: - -1. データはブロック単位でシリアル化および圧縮されます。 -2. 各列について、圧縮されたデータが対応する `.bin` ファイルに追記されます。 -3. 新しく挿入されたデータのオフセットと行数を記録するために、対応するエントリが `__marks.mrk` ファイルに追加されます。 - - - -## データの読み取り {#table_engines-log-reading-the-data} - -マークファイルにより、ClickHouse はデータの読み取りを並列化できます。つまり、`SELECT` クエリが行を返す順序は保証されません。行を並べ替えるには、`ORDER BY` 句を使用します。 - - - -## 使用例 - -テーブルの作成: - -```sql -CREATE TABLE log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = Log -``` - -データの挿入: - -```sql -INSERT INTO log_table VALUES (now(),'REGULAR','1つ目の通常メッセージ') -INSERT INTO log_table VALUES (now(),'REGULAR','2つ目の通常メッセージ'),(now(),'WARNING','1つ目の警告メッセージ') -``` - -`.bin` ファイル内に 2 つのデータブロックを作成するために、2 つの `INSERT` クエリを使用しました。 - -ClickHouse はデータを読み出す際に複数スレッドを使用します。各スレッドは別々のデータブロックを読み取り、処理が完了したものからそれぞれ独立して行を返します。その結果、出力における行ブロックの順序が、入力の同じブロックの順序と一致しない場合があります。たとえば、次のようになります。 - -```sql -SELECT * FROM log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:27:32 │ REGULAR │ 2番目の通常メッセージ │ -│ 2019-01-18 14:34:53 │ WARNING │ 最初の警告メッセージ │ -└─────────────────────┴──────────────┴────────────────────────────┘ -┌───────────timestamp─┬─message_type─┬─message───────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ 最初の通常メッセージ │ -└─────────────────────┴──────────────┴───────────────────────────┘ -``` - -結果の並べ替え(デフォルトは昇順): - -```sql -SELECT * FROM log_table ORDER BY timestamp -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ 最初の通常メッセージ │ -│ 2019-01-18 14:27:32 │ REGULAR │ 2番目の通常メッセージ │ -│ 2019-01-18 14:34:53 │ WARNING │ 最初の警告メッセージ │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md deleted file mode 100644 index e553e83bcdd..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -description: 'StripeLog テーブルエンジンに関するドキュメント' -slug: /engines/table-engines/log-family/stripelog -toc_priority: 32 -toc_title: 'StripeLog' -title: 'StripeLog テーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# StripeLog テーブルエンジン - - - -このエンジンは Log エンジンファミリーに属します。Log エンジンの共通の特性と相違点については、[Log Engine Family](../../../engines/table-engines/log-family/index.md) の記事を参照してください。 - -このエンジンは、少量のデータ(100 万行未満)を持つ多数のテーブルに書き込む必要があるシナリオで使用します。たとえば、このテーブルは、変換のために取り込まれるデータバッチを、各バッチをアトミックに処理する必要がある場合の保存先として使用できます。このテーブルタイプのインスタンスを最大 10 万個まで ClickHouse サーバー上で運用できます。多数のテーブルが必要な場合、このテーブルエンジンは [Log](./log.md) よりも優先して使用すべきです。ただし、その分読み取り効率は低下します。 - - - -## テーブルの作成 - -```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) クエリの詳細な説明をご覧ください。 - - -## データの書き込み {#table_engines-stripelog-writing-the-data} - -`StripeLog` エンジンは、すべてのカラムを 1 つのファイルに保存します。各 `INSERT` クエリのたびに、ClickHouse はデータブロックをテーブルファイルの末尾に追記し、カラムを 1 つずつ書き込みます。 - -各テーブルについて、ClickHouse は次のファイルを書き込みます: - -- `data.bin` — データファイル。 -- `index.mrk` — マークを格納するファイル。マークには、挿入された各データブロックにおける各カラムのオフセットが含まれます。 - -`StripeLog` エンジンは `ALTER UPDATE` および `ALTER DELETE` 操作をサポートしません。 - - - -## データの読み取り {#table_engines-stripelog-reading-the-data} - -マーク付きファイルにより、ClickHouse はデータの読み取りを並列化できます。これにより、`SELECT` クエリは行を不定の順序で返します。行をソートするには、`ORDER BY` 句を使用してください。 - - - -## 使用例 - -テーブルを作成: - -```sql -CREATE TABLE stripe_log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = StripeLog -``` - -データの挿入: - -```sql -INSERT INTO stripe_log_table VALUES (now(),'REGULAR','最初の通常メッセージ') -INSERT INTO stripe_log_table VALUES (now(),'REGULAR','2番目の通常メッセージ'),(now(),'WARNING','最初の警告メッセージ') -``` - -2つの `INSERT` クエリを使用して、`data.bin` ファイル内に2つのデータブロックを作成しました。 - -ClickHouse はデータを選択する際に複数スレッドを使用します。各スレッドは別々のデータブロックを読み取り、処理が完了し次第、それぞれ独立して結果行を返します。その結果、出力される行ブロックの順序は、ほとんどの場合、入力時の同じブロックの順序と一致しません。例えば次のようになります。 - -```sql -stripe_log_table から全てを選択する -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:27:32 │ REGULAR │ 2つ目の通常メッセージ │ -│ 2019-01-18 14:34:53 │ WARNING │ 最初の警告メッセージ │ -└─────────────────────┴──────────────┴────────────────────────────┘ -┌───────────timestamp─┬─message_type─┬─message───────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ 最初の通常メッセージ │ -└─────────────────────┴──────────────┴───────────────────────────┘ -``` - -結果の並べ替え(デフォルトは昇順): - -```sql -SELECT * FROM stripe_log_table ORDER BY timestamp -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ 最初の通常メッセージ │ -│ 2019-01-18 14:27:32 │ REGULAR │ 2つ目の通常メッセージ │ -│ 2019-01-18 14:34:53 │ WARNING │ 最初の警告メッセージ │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md deleted file mode 100644 index df248d194d8..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -description: 'TinyLog テーブルエンジンのドキュメント' -slug: /engines/table-engines/log-family/tinylog -toc_priority: 34 -toc_title: 'TinyLog' -title: 'TinyLog テーブルエンジン' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# TinyLog テーブルエンジン - - - -このエンジンは Log エンジンファミリーに属します。Log エンジンに共通する特性とそれぞれの違いについては、[Log Engine Family](../../../engines/table-engines/log-family/index.md) を参照してください。 - -このテーブルエンジンは、通常は一度だけ書き込み、その後は必要な回数だけ読み取るという運用方法で使用されます。例えば、小さなバッチで処理される中間データには `TinyLog` 型のテーブルを使用できます。ただし、多数の小さいテーブルにデータを保存するのは非効率です。 - -クエリは単一ストリームで実行されます。言い換えると、このエンジンは比較的小さなテーブル(約 1,000,000 行まで)を想定しています。開く必要のあるファイル数が少ないため、[Log](../../../engines/table-engines/log-family/log.md) エンジンよりもシンプルであり、多数の小さなテーブルを扱う場合にはこのテーブルエンジンを使用するのが妥当です。 - - - -## 特性 {#characteristics} - -- **よりシンプルな構造**: Log エンジンとは異なり、TinyLog は mark ファイルを使用しません。これにより構造は単純になり複雑さは軽減されますが、大規模なデータセットに対するパフォーマンスの最適化は制限されます。 -- **単一ストリームでのクエリ**: TinyLog テーブルに対するクエリは単一ストリームで実行されるため、比較的小規模なテーブル、通常は最大で約 1,000,000 行までのテーブルに適しています。 -- **小さなテーブルに対して効率的**: TinyLog エンジンのシンプルさにより、多数の小さなテーブルを管理する際に有利であり、Log エンジンと比較して必要なファイル操作が少なくて済みます。 - -Log エンジンとは異なり、TinyLog は mark ファイルを使用しません。これにより複雑さは軽減されますが、大規模なデータセットに対するパフォーマンスの最適化は制限されます。 - - - -## テーブルの作成 - -```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 = TinyLog -``` - -[CREATE TABLE](/sql-reference/statements/create/table) クエリについては、詳細な説明を参照してください。 - - -## データの書き込み {#table_engines-tinylog-writing-the-data} - -`TinyLog` エンジンは、すべてのカラムを 1 つのファイルに保存します。各 `INSERT` クエリのたびに、ClickHouse はデータブロックをテーブルファイルの末尾に追記し、カラムを 1 つずつ書き込みます。 - -ClickHouse は各テーブルに対して次のファイルを作成します。 - -- `.bin`: 各カラム用のデータファイルで、シリアル化および圧縮されたデータが含まれます。 - -`TinyLog` エンジンは、`ALTER UPDATE` および `ALTER DELETE` 操作をサポートしません。 - - - -## 使用例 - -テーブルの作成: - -```sql -CREATE TABLE tiny_log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = TinyLog -``` - -データの挿入: - -```sql -INSERT INTO tiny_log_table VALUES (now(),'REGULAR','最初の通常メッセージ') -INSERT INTO tiny_log_table VALUES (now(),'REGULAR','2番目の通常メッセージ'),(now(),'WARNING','最初の警告メッセージ') -``` - -2 つの `INSERT` クエリを使用して、`.bin` ファイル内に 2 つのデータブロックを作成しました。 - -ClickHouse は単一のストリームでデータを読み出します。その結果、出力における行ブロックの順序は、入力における同じブロックの順序と一致します。例えば次のとおりです。 - -```sql -SELECT * FROM tiny_log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2024-12-10 13:11:58 │ REGULAR │ 1件目の通常メッセージ │ -│ 2024-12-10 13:12:12 │ REGULAR │ 2件目の通常メッセージ │ -│ 2024-12-10 13:12:12 │ WARNING │ 1件目の警告メッセージ │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md deleted file mode 100644 index 076b06acabc..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -description: '同じ主キー(より正確には同じ[ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md))を持つすべての行を、集約関数の状態を組み合わせて保持する単一の行(単一のデータパーツ内)に置き換えます。' -sidebar_label: 'AggregatingMergeTree' -sidebar_position: 60 -slug: /engines/table-engines/mergetree-family/aggregatingmergetree -title: 'AggregatingMergeTree テーブルエンジン' -doc_type: 'reference' ---- - - - -# AggregatingMergeTree テーブルエンジン - -このエンジンは [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) から継承しており、データパーツのマージロジックを変更します。ClickHouse は、同じ主キー(より正確には、同じ[ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md))を持つすべての行を 1 行(単一のデータパーツ内)にまとめ、その行に集約関数の状態を組み合わせて格納します。 - -`AggregatingMergeTree` テーブルは、集約済みマテリアライズドビューを含むインクリメンタルなデータ集約に使用できます。 - -以下の動画で、AggregatingMergeTree と集約関数の使用例を確認できます。 -
- -
- -このエンジンは、次の型を持つすべてのカラムを処理します。 - -- [`AggregateFunction`](../../../sql-reference/data-types/aggregatefunction.md) -- [`SimpleAggregateFunction`](../../../sql-reference/data-types/simpleaggregatefunction.md) - -行数を桁違いに削減できる場合には、`AggregatingMergeTree` を使用するのが適切です。 - - - -## テーブルを作成する - -```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 出力形式で実装依存のバイナリ表現になります。たとえば、`SELECT` クエリでデータを `TabSeparated` 形式にダンプした場合、このダンプは `INSERT` クエリを使用して再度ロードできます。 - - - -## 集約マテリアライズドビューの例 - -次の例では、`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`](/sql-reference/data-types/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` の両方に挿入されます。 - -集約されたデータを取得するには、マテリアライズドビュー `test.visits_mv` に対して `SELECT ... GROUP BY ...` といったクエリを実行します。 - -```sql -SELECT - StartDate, - sumMerge(Visits) AS Visits, - uniqMerge(Users) AS Users -FROM test.visits_mv -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 -┌───────────────開始日─┬─訪問数─┬─ユーザー数─┐ -│ 2022-11-03 03:27:11.000 │ 16 │ 3 │ -│ 2022-11-26 07:00:31.000 │ 5 │ 1 │ -└─────────────────────────┴────────┴───────┘ -``` - -場合によっては、挿入時に行を事前集計せず、集計のコストを挿入時からマージ時へ移したいことがあります。通常は、エラーを避けるために、マテリアライズドビュー定義の `GROUP BY` -句に、集計の対象ではない列も含める必要があります。しかし、この動作を実現するには、`optimize_on_insert = 0`(デフォルトで有効になっています)を設定したうえで、[`initializeAggregation`](/sql-reference/functions/other-functions#initializeAggregation) -関数を利用できます。この場合、`GROUP BY` -を使用する必要はなくなります。 - -```sql -CREATE MATERIALIZED VIEW test.visits_mv TO test.agg_visits -AS SELECT - StartDate, - CounterID, - initializeAggregation('sumState', Sign) AS Visits, - initializeAggregation('uniqState', UserID) AS Users -FROM test.visits; -``` - - -:::note -`initializeAggregation` を使用する場合、グループ化を行わずに各行に対して集約状態が作成されます。 -各ソース行はマテリアライズドビュー内で 1 行を生成し、実際の集約は後で `AggregatingMergeTree` がパートをマージする際に行われます。 -これは `optimize_on_insert = 0` の場合にのみ当てはまります。 -::: - - - -## 関連コンテンツ {#related-content} - -- ブログ記事: [Using Aggregate Combinators in ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md deleted file mode 100644 index fe4f6ded1ef..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md +++ /dev/null @@ -1,737 +0,0 @@ ---- -description: '厳密および近似ベクトル検索に関するドキュメント' -keywords: ['ベクトル類似度検索', 'ANN', 'kNN', 'HNSW', 'インデックス', 'インデックス作成', '最近傍探索', 'ベクトル検索'] -sidebar_label: '厳密および近似ベクトル検索' -slug: /engines/table-engines/mergetree-family/annindexes -title: '厳密および近似ベクトル検索' -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# 厳密ベクトル検索と近似ベクトル検索 - -多次元(ベクトル)空間において、ある点に最も近い N 個の点を見つける問題は、[nearest neighbor search](https://en.wikipedia.org/wiki/Nearest_neighbor_search)(最近傍探索)、または略してベクトル検索と呼ばれます。 -ベクトル検索を行うための一般的なアプローチは 2 つあります: - -* 厳密ベクトル検索は、与えられた点とベクトル空間内のすべての点との距離を計算します。これにより可能な限り最高の精度が保証され、返される点は必ず実際の最近傍になります。ベクトル空間を総当たりで探索するため、厳密ベクトル検索は実運用では遅くなり過ぎる場合があります。 -* 近似ベクトル検索は、一連の手法(例えばグラフやランダムフォレストといった特殊なデータ構造)を指し、厳密ベクトル検索よりもはるかに高速に結果を計算します。結果の精度は通常、実用上「十分良い」レベルです。多くの近似手法は、結果の精度と検索時間のトレードオフを調整するためのパラメータを提供します。 - -ベクトル検索(厳密または近似)は、次のように SQL で記述できます: - -```sql -WITH [...] AS reference_vector -SELECT [...] -FROM table -WHERE [...] -- WHERE 句は任意です -ORDER BY (vectors, reference_vector) -LIMIT -``` - -ベクトル空間内の点は、配列型の `vectors` 列に格納されます。例えば [Array(Float64)](../../../sql-reference/data-types/array.md)、[Array(Float32)](../../../sql-reference/data-types/array.md)、または [Array(BFloat16)](../../../sql-reference/data-types/array.md) です。 -参照ベクトルは定数配列であり、共通テーブル式として与えられます。 -`<DistanceFunction>` は、参照点と格納されているすべての点との距離を計算します。 -この処理には、利用可能な任意の [distance function](/sql-reference/functions/distance-functions) を使用できます。 -`<N>` は、返すべき近傍点の数を指定します。 - - -## 厳密なベクトル検索 - -厳密なベクトル検索は、上記の SELECT クエリをそのまま使用して実行できます。 -このようなクエリの実行時間は、一般的に保存されているベクトル数とその次元数、つまり配列要素数に比例します。 -また、ClickHouse はすべてのベクトルに対して総当たりスキャンを行うため、クエリで使用されるスレッド数(設定項目 [max_threads](../../../operations/settings/settings.md#max_threads) を参照)にも実行時間が依存します。 - -### 例 - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32)) ENGINE = MergeTree ORDER BY id; - -INSERT INTO tab VALUES (0, [1.0, 0.0]), (1, [1.1, 0.0]), (2, [1.2, 0.0]), (3, [1.3, 0.0]), (4, [1.4, 0.0]), (5, [1.5, 0.0]), (6, [0.0, 2.0]), (7, [0.0, 2.1]), (8, [0.0, 2.2]), (9, [0.0, 2.3]), (10, [0.0, 2.4]), (11, [0.0, 2.5]); - -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -戻り値 - -```result - ┌─id─┬─vec─────┐ -1. │ 6 │ [0,2] │ -2. │ 7 │ [0,2.1] │ -3. │ 8 │ [0,2.2] │ - └────┴─────────┘ -``` - - -## 近似ベクトル検索 - -### ベクトル類似度インデックス - -ClickHouse は、近似ベクトル検索を実行するための特別な「ベクトル類似度」インデックスを提供します。 - -:::note -ベクトル類似度インデックスは ClickHouse バージョン 25.8 以降で利用可能です。 -問題が発生した場合は、[ClickHouse リポジトリ](https://github.com/clickhouse/clickhouse/issues) に issue を作成してください。 -::: - -#### ベクトル類似度インデックスの作成 - -新しいテーブルに対して、次のようにベクトル類似度インデックスを作成できます。 - -```sql -CREATE TABLE table -( - [...], - vectors Array(Float*), - INDEX vectors TYPE vector_similarity(, , ) [GRANULARITY ] -) -ENGINE = MergeTree -ORDER BY [...] -``` - -別の方法として、既存のテーブルにベクトル類似インデックスを追加するには次のようにします。 - -```sql -ALTER TABLE table ADD INDEX vectors TYPE vector_similarity(, , ) [GRANULARITY ]; -``` - -ベクトル類似性インデックスは特別な種類のスキッピングインデックスにあたります([こちら](mergetree.md#table_engine-mergetree-data_skipping-indexes)および[こちら](../../../optimize/skipping-indexes)を参照してください)。 -したがって、上記の `ALTER TABLE` 文では、テーブルに今後挿入される新規データに対してのみインデックスが作成されます。 -既存データに対してもインデックスを構築するには、インデックスをマテリアライズする必要があります。 - -```sql -ALTER TABLE table MATERIALIZE INDEX SETTINGS mutations_sync = 2; -``` - -関数 `` には、次のいずれかを指定する必要があります。 - -* `L2Distance` — [ユークリッド距離](https://en.wikipedia.org/wiki/Euclidean_distance)。ユークリッド空間における 2 点間を結ぶ線分の長さを表します。 -* `cosineDistance` — [コサイン距離](https://en.wikipedia.org/wiki/Cosine_similarity#Cosine_distance)。ゼロではない 2 つのベクトル間の角度を表します。 - -正規化済みデータに対しては、通常 `L2Distance` が最適な選択肢です。それ以外の場合はスケールの違いを補正するために `cosineDistance` を推奨します。 - -`` は、基礎となるカラムにおける配列のカーディナリティ(要素数)を指定します。 -ClickHouse がインデックス作成中に異なるカーディナリティの配列を検出した場合、そのインデックスは破棄され、エラーが返されます。 - -オプションの GRANULARITY パラメータ `` は、インデックスグラニュールのサイズを表します([こちら](../../../optimize/skipping-indexes)を参照)。 -デフォルト値の 1 億は、ほとんどのユースケースで十分に良好に動作しますが、チューニングすることも可能です。 -その影響を理解している上級ユーザーのみがチューニングすることをお勧めします([下記](#differences-to-regular-skipping-indexes)を参照)。 - -ベクトル類似度インデックスは汎用的であり、さまざまな近似検索手法を利用できます。 -実際に使用される手法は、パラメータ `` によって指定されます。 -現時点で利用可能な手法は HNSW([論文](https://arxiv.org/abs/1603.09320))のみであり、階層的近接グラフに基づく、近似ベクトル検索のための一般的かつ最先端の手法です。 -`type` として HNSW を使用する場合、ユーザーは任意で HNSW 固有の追加パラメータを指定できます。 - -```sql -CREATE TABLE table -( - [...], - vectors Array(Float*), - INDEX index_name vectors TYPE vector_similarity('hnsw', , [, , , ]) [GRANULARITY N] -) -ENGINE = MergeTree -ORDER BY [...] -``` - -これらの HNSW 固有パラメータが利用可能です: - -* `` は近傍グラフ内のベクトルの量子化方式を制御します。指定可能な値は `f64`、`f32`、`f16`、`bf16`、`i8`、`b1` です。デフォルト値は `bf16` です。このパラメータは、基盤となるカラム内でのベクトル表現には影響しない点に注意してください。 -* `` は、グラフ内の各ノードあたりの近傍ノード数を制御します。これは HNSW のハイパーパラメータ `M` としても知られています。デフォルト値は `32` です。値 `0` はデフォルト値を使用することを意味します。 -* `` は、HNSW グラフ構築時の動的候補リストのサイズを制御します。これは HNSW のハイパーパラメータ `ef_construction` としても知られています。デフォルト値は `128` です。値 `0` はデフォルト値を使用することを意味します。 - -すべての HNSW 固有パラメータのデフォルト値は、ほとんどのユースケースで良好に機能します。 -したがって、HNSW 固有パラメータのカスタマイズは推奨しません。 - - -さらなる制限があります: - -* ベクター類似度インデックスは、[Array(Float32)](../../../sql-reference/data-types/array.md)、[Array(Float64)](../../../sql-reference/data-types/array.md)、または [Array(BFloat16)](../../../sql-reference/data-types/array.md) 型の列に対してのみ作成できます。`Array(Nullable(Float32))` や `Array(LowCardinality(Float32))` のような nullable や low-cardinality の浮動小数点数配列は使用できません。 -* ベクター類似度インデックスは単一列に対してのみ作成しなければなりません。 -* ベクター類似度インデックスは計算式(例: `INDEX index_name arraySort(vectors) TYPE vector_similarity([...])`)に対して作成することもできますが、そのようなインデックスは後で近似近傍探索に利用することはできません。 -* ベクター類似度インデックスでは、基になる列中のすべての配列が `` 個の要素を持つ必要があります。この条件はインデックス作成時に検査されます。この要件違反をできるだけ早期に検出するために、ユーザーはベクター列に対して [constraint](/sql-reference/statements/create/table.md#constraints) を追加できます(例: `CONSTRAINT same_length CHECK length(vectors) = 256`)。 -* 同様に、基になる列中の配列値は空 (`[]`) であってはならず、デフォルト値(同じく `[]`)であってもいけません。 - -**ストレージおよびメモリ消費量の見積もり** - -典型的な AI モデル(例: 大規模言語モデル [LLM](https://en.wikipedia.org/wiki/Large_language_model))で使用するために生成されるベクターは、数百から数千の浮動小数点値で構成されます。 -そのため、単一のベクター値でも複数キロバイトのメモリを消費する可能性があります。 -テーブル内の基になるベクター列に必要なストレージ量、およびベクター類似度インデックスに必要なメインメモリ量を見積もりたい場合は、以下の 2 つの式を利用できます。 - -テーブル内のベクター列のストレージ使用量(非圧縮): - -```text -ストレージ消費量 = ベクトル数 × 次元数 × カラムデータ型のサイズ -``` - -[dbpedia データセット](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M) の例: - -```text -ストレージ消費量 = 100万 × 1536 × 4(Float32の場合)= 6.1 GB -``` - -ベクトル類似度インデックスで検索を行うには、ディスクから主メモリに完全に読み込まれている必要があります。 -同様に、ベクトルインデックスもメモリ上で完全に構築してからディスクに保存されます。 - -ベクトルインデックスをロードする際に必要なメモリ使用量: - -```text -インデックス内のベクトル用メモリ (mv) = ベクトル数 * 次元数 * 量子化データ型のサイズ -インメモリグラフ用メモリ (mg) = ベクトル数 * hnsw_max_connections_per_layer * ノードIDあたりのバイト数 (= 4) * レイヤーノード繰り返し係数 (= 2) - -メモリ消費量: mv + mg -``` - -[DBpedia データセット](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M) の例: - -```text -インデックス内のベクトル用メモリ (mv) = 100万 × 1536 × 2 (BFloat16の場合) = 3072 MB -インメモリグラフ用メモリ (mg) = 100万 × 64 × 2 × 4 = 512 MB - -メモリ消費量 = 3072 + 512 = 3584 MB -``` - -上記の式には、事前割り当てバッファやキャッシュなど、ベクトル類似性インデックスがランタイムのデータ構造を割り当てるために必要となる追加メモリは含まれていません。 - -#### ベクトル類似性インデックスの使用 - -:::note -ベクトル類似性インデックスを使用するには、[compatibility](../../../operations/settings/settings.md) 設定を `''`(デフォルト値)、または `'25.1'` 以降に設定する必要があります。 -::: - -ベクトル類似性インデックスは、次の形式の SELECT クエリをサポートします。 - -```sql -WITH [...] AS reference_vector -SELECT [...] -FROM table -WHERE [...] -- WHERE 句は任意 -ORDER BY (vectors, reference_vector) -LIMIT -``` - -ClickHouse のクエリオプティマイザは、上記のクエリテンプレートと照合し、利用可能なベクトル類似度インデックスを活用します。 -SELECT クエリ内の距離関数がインデックス定義で指定されている距離関数と同じである場合にのみ、そのクエリはベクトル類似度インデックスを使用できます。 - -上級ユーザーは、検索時の候補リストのサイズを調整するために、[hnsw_candidate_list_size_for_search](../../../operations/settings/settings.md#hnsw_candidate_list_size_for_search)(HNSW のハイパーパラメータ「ef_search」としても知られる)に任意の値を設定できます(例: `SELECT [...] SETTINGS hnsw_candidate_list_size_for_search = `)。 -この設定のデフォルト値である 256 は、ほとんどのユースケースで良好に機能します。 -この値を大きくすると精度は向上しますが、その分パフォーマンスが低下します。 - - -クエリでベクター類似性インデックスを使用する場合、ClickHouse は SELECT クエリで指定された LIMIT `` が妥当な範囲内かどうかをチェックします。 -より具体的には、`` が設定値 [max_limit_for_vector_search_queries](../../../operations/settings/settings.md#max_limit_for_vector_search_queries)(デフォルト値は 100)より大きい場合はエラーが返されます。 -LIMIT の値が大きすぎると検索が遅くなり、通常は誤った使用方法であることを示しています。 - -SELECT クエリがベクター類似性インデックスを使用しているかどうかを確認するには、クエリの先頭に `EXPLAIN indexes = 1` を付けて実行します。 - -例として、次のクエリを示します。 - -```sql -EXPLAIN indexes = 1 -WITH [0.462, 0.084, ..., -0.110] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 10; -``` - -返す場合があります - -```result - ┌─explain─────────────────────────────────────────────────────────────────────────────────────────┐ - 1. │ Expression (プロジェクト名) │ - 2. │ Limit (予備LIMIT (OFFSETなし)) │ - 3. │ Sorting (ORDER BY用のソート) │ - 4. │ Expression ((ORDER BY前 + (射影 + 列名を列識別子に変更))) │ - 5. │ ReadFromMergeTree (default.tab) │ - 6. │ Indexes: │ - 7. │ PrimaryKey │ - 8. │ Condition: true │ - 9. │ Parts: 1/1 │ -10. │ Granules: 575/575 │ -11. │ Skip │ -12. │ Name: idx │ -13. │ Description: vector_similarity GRANULARITY 100000000 │ -14. │ Parts: 1/1 │ -15. │ Granules: 10/575 │ - └─────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -この例では、[dbpedia dataset](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M) の 100 万個のベクトル(各ベクトルの次元は 1536)が 575 個の granule(グラニュール)に格納されており、つまり 1 granule あたり約 1.7k 行となります。 -クエリは 10 個の近傍を要求し、ベクトル類似度インデックスはこれら 10 個の近傍を 10 個の別々の granule から見つけます。 -クエリ実行中には、これら 10 個の granule が読み込まれます。 - -出力に `Skip` とベクトルインデックスの名前と型(この例では `idx` および `vector_similarity`)が含まれている場合、ベクトル類似度インデックスが使用されています。 -このケースでは、ベクトル類似度インデックスによって 4 個の granule のうち 2 個がスキップされ、つまりデータの 50% が読み取り対象から外れました。 -スキップできる granule が多いほど、インデックスの利用はより効果的になります。 - -:::tip -インデックスの使用を強制するには、設定 [force_data_skipping_indexes](../../../operations/settings/settings#force_data_skipping_indices) を指定して SELECT クエリを実行します(インデックス名を設定値として指定します)。 -::: - -**Post-filtering と Pre-filtering** - -ユーザーはオプションで、SELECT クエリに対して追加のフィルター条件を含む `WHERE` 句を指定できます。 -ClickHouse は、post-filtering あるいは pre-filtering 戦略を用いてこれらのフィルター条件を評価します。 -要するに、どちらの戦略もフィルターを評価する順序を決定します。 - -* Post-filtering とは、まずベクトル類似度インデックスが評価され、その後に ClickHouse が `WHERE` 句で指定された追加フィルターを評価することを意味します。 -* Pre-filtering とは、フィルター評価の順序がその逆になることを意味します。 - -これらの戦略には、それぞれ異なるトレードオフがあります。 - -* Post-filtering には、`LIMIT ` 句で要求された行数より少ない結果しか返せない可能性があるという一般的な問題があります。これは、ベクトル類似度インデックスから返された 1 行以上の結果行が、追加フィルターを満たさない場合に発生します。 -* Pre-filtering は、一般的には未解決の問題です。一部の特化したベクトルデータベースは pre-filtering アルゴリズムを提供していますが、ほとんどのリレーショナルデータベース(ClickHouse を含む)は、インデックスを使わない総当たり走査、すなわち厳密な近傍探索へフォールバックします。 - -どの戦略が使用されるかは、フィルター条件に依存します。 - -*追加フィルターがパーティションキーの一部である場合* - -追加のフィルター条件がパーティションキーの一部である場合、ClickHouse はパーティションプルーニングを適用します。 -例として、テーブルが列 `year` によってレンジパーティションされており、次のクエリが実行されるとします。 - -```sql -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -WHERE year = 2025 -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -ClickHouse は、2025 年のパーティション以外をすべてプルーニングします。 - -*追加フィルタはインデックスを使って評価できない場合があります* - -追加のフィルタ条件がインデックス(PRIMARY KEY インデックス、スキッピングインデックス)を使って評価できない場合、ClickHouse はポストフィルタリングを適用します。 - - -*追加のフィルターはプライマリキーインデックスを用いて評価できる* - -追加のフィルター条件が [プライマリキー](mergetree.md#primary-key) を用いて評価可能な場合(すなわち、プライマリキーのプレフィックスを構成している場合)、かつ - -* フィルター条件がパーツ内で少なくとも 1 行を除外できる場合、ClickHouse はそのパーツ内の「生き残る」範囲に対してプレフィルタリングに切り替えます。 -* フィルター条件がパーツ内で 1 行も除外しない場合、ClickHouse はそのパーツに対してポストフィルタリングを実行します。 - -実際のユースケースでは、後者のケースが発生することはほとんどありません。 - -*追加のフィルターは skipping index を用いて評価できる* - -追加のフィルター条件が [skipping indexes](mergetree.md#table_engine-mergetree-data_skipping-indexes)(minmax index、set index など)を用いて評価可能な場合、ClickHouse はポストフィルタリングを実行します。 -このような場合、他の skipping index と比較して最も多くの行を除外できると期待されるため、まずベクトル類似度インデックスが評価されます。 - -ポストフィルタリングとプレフィルタリングをより細かく制御するために、2 つの設定を使用できます。 - -[vector_search_filter_strategy](../../../operations/settings/settings#vector_search_filter_strategy) 設定(デフォルト: 上記のヒューリスティクスを実装する `auto`)は `prefilter` に設定できます。 -これは、追加のフィルター条件が非常に選択的な場合に、プレフィルタリングを強制したいケースで有用です。 -例として、次のクエリはプレフィルタリングの恩恵を受ける可能性があります: - -```sql -SELECT bookid, author, title -FROM books -WHERE price < 2.00 -ORDER BY cosineDistance(book_vector, getEmbedding('古代アジアの帝国に関する書籍')) -LIMIT 10 -``` - -2ドル未満の本がごく少数しか存在しないと仮定すると、ベクターインデックスから返される上位10件の結果がすべて2ドルより高い価格である可能性があるため、ポストフィルタリングでは行が0件になることがあります。 -プリフィルタリングを強制することで(クエリに `SETTINGS vector_search_filter_strategy = 'prefilter'` を追加)、ClickHouse はまず価格が2ドル未満のすべての本を検索し、その後、それらの本に対して総当たりのベクター検索を実行します。 - -上記の問題を解決する別のアプローチとして、[vector_search_index_fetch_multiplier](../../../operations/settings/settings#vector_search_index_fetch_multiplier)(デフォルト: `1.0`、最大: `1000.0`)を `1.0` より大きい値(たとえば `2.0`)に設定することができます。 -ベクターインデックスから取得される最近傍の数は、この設定値を掛けた数となり、その後、それらの行に対して追加のフィルタを適用して、LIMIT で指定された件数の行を返します。 -例として、乗数を `3.0` にして再度クエリを実行できます。 - -```sql -SELECT bookid, author, title -FROM books -WHERE price < 2.00 -ORDER BY cosineDistance(book_vector, getEmbedding('Books on ancient Asian empires')) -LIMIT 10 -SETTING vector_search_index_fetch_multiplier = 3.0; -``` - -ClickHouse は各パーツのベクターインデックスから 3.0 x 10 = 30 個の最近傍を取得し、その後に追加のフィルタを評価します。 -最も近い 10 個の近傍だけが返されます。 -`vector_search_index_fetch_multiplier` を設定することでこの問題を軽減できることに注意してください。 -しかし、極端なケース(非常に選択性の高い WHERE 条件)では、要求された行数 N 未満の行しか返されない可能性があります。 - -**リスコアリング(再スコアリング)** - -ClickHouse のスキップインデックスは一般的にグラニュールレベルでフィルタリングします。つまり、スキップインデックスでのルックアップは(内部的に)一致する可能性のあるグラニュールのリストを返し、その後のスキャンで読み取るデータ量を削減します。 -これはスキップインデックス全般ではうまく機能しますが、ベクター類似性インデックスの場合には「粒度のミスマッチ」を引き起こします。 -詳しく言うと、ベクター類似性インデックスは、ある参照ベクターに対して最も類似した N 個のベクターの行番号を決定しますが、その後これらの行番号をグラニュール番号に外挿する必要があります。 -その後 ClickHouse はこれらのグラニュールをディスクから読み込み、これらのグラニュール内のすべてのベクターに対して距離計算を繰り返します。 -このステップはリスコアリングと呼ばれます。理論的には精度を向上させることができます(ベクター類似性インデックスはあくまで*近似的な*結果しか返さないことを思い出してください)が、パフォーマンスの観点から最適ではないことは明らかです。 - -そのため ClickHouse では、リスコアリングを無効化し、インデックスから最も類似したベクターとその距離を直接返す最適化を提供しています。 -この最適化はデフォルトで有効になっており、設定 [vector_search_with_rescoring](../../../operations/settings/settings#vector_search_with_rescoring) を参照してください。 -概要としては、ClickHouse が最も類似したベクターとその距離を仮想カラム `_distances` として利用可能にします。 -これを確認するには、`EXPLAIN header = 1` を付けてベクター検索クエリを実行します。 - - -```sql -EXPLAIN header = 1 -WITH [0., 2.] AS reference_vec -SELECT id -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3 -SETTINGS vector_search_with_rescoring = 0 -``` - -```result -Query id: a2a9d0c8-a525-45c1-96ca-c5a11fa66f47 - - ┌─explain─────────────────────────────────────────────────────────────────────────────────────────────────┐ - 1. │ Expression (名前の射影) │ - 2. │ Header: id Int32 │ - 3. │ Limit (予備的LIMIT(OFFSETなし)) │ - 4. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ - 5. │ __table1.id Int32 │ - 6. │ Sorting (ORDER BYのソート) │ - 7. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ - 8. │ __table1.id Int32 │ - 9. │ Expression ((ORDER BY前 + (射影 + カラム名のカラム識別子への変更))) │ -10. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ -11. │ __table1.id Int32 │ -12. │ ReadFromMergeTree (default.tab) │ -13. │ Header: id Int32 │ -14. │ _distance Float32 │ - └─────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -:::note -`vector_search_with_rescoring = 0` で再スコアリングなしのクエリを実行し、かつ並列レプリカを有効にしている場合、再スコアリングにフォールバックして実行されることがあります。 -::: - -#### パフォーマンスチューニング - -**圧縮のチューニング** - -ほぼすべてのユースケースで、基盤となる列内のベクトルは高密度であり、圧縮が効きにくくなります。 -その結果、[圧縮](/sql-reference/statements/create/table.md#column_compression_codec) はベクトル列への挿入およびベクトル列からの読み取りを遅くします。 -そのため、圧縮を無効にすることを推奨します。 -そのためには、ベクトル列に対して次のように `CODEC(NONE)` を指定します。 - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32) CODEC(NONE), INDEX idx vec TYPE vector_similarity('hnsw', 'L2Distance', 2)) ENGINE = MergeTree ORDER BY id; -``` - -**インデックス作成のチューニング** - -ベクトル類似度インデックスのライフサイクルは、パーツのライフサイクルに結び付いています。 -言い換えると、ベクトル類似度インデックスが定義された新しいパーツが作成されるたびに、インデックスも作成されます。 -これは通常、データが[挿入](https://clickhouse.com/docs/guides/inserting-data)されたとき、または[マージ](https://clickhouse.com/docs/merges)中に発生します。 -残念ながら、HNSW はインデックス作成時間が長いことで知られており、INSERT やマージを大幅に遅くする可能性があります。 -ベクトル類似度インデックスは、データが不変、またはほとんど変更されない場合にのみ使用するのが理想的です。 - -インデックス作成を高速化するために、次の手法を使用できます。 - -まず、インデックス作成は並列化できます。 -インデックス作成スレッドの最大数は、サーバー設定 [max_build_vector_similarity_index_thread_pool_size](/operations/server-configuration-parameters/settings#max_build_vector_similarity_index_thread_pool_size) を使用して設定できます。 -最適なパフォーマンスのためには、この設定値を CPU コア数に合わせて設定することを推奨します。 - -次に、INSERT 文を高速化するために、セッション設定 [materialize_skip_indexes_on_insert](../../../operations/settings/settings.md#materialize_skip_indexes_on_insert) を使用して、新しく挿入されたパーツに対するスキップインデックスの作成を無効にすることができます。 -そのようなパーツに対する SELECT クエリは、厳密検索にフォールバックします。 -挿入されたパーツは、テーブル全体のサイズと比較して小さい傾向があるため、そのことによるパフォーマンスへの影響は無視できると想定されます。 - -第 3 に、マージを高速化するために、セッション設定 [materialize_skip_indexes_on_merge](../../../operations/settings/merge-tree-settings.md#materialize_skip_indexes_on_merge) を使用して、マージされたパーツに対するスキップインデックスの作成を無効にすることができます。 -これは、ステートメント [ALTER TABLE [...] MATERIALIZE INDEX [...]](../../../sql-reference/statements/alter/skipping-index.md#materialize-index) と組み合わせることで、ベクトル類似度インデックスのライフサイクルを明示的に制御する手段を提供します。 -たとえば、インデックス作成を、すべてのデータが取り込まれるまで、あるいは週末のようなシステム負荷の低い期間まで延期することができます。 - -**インデックス使用のチューニング** - - -SELECT クエリでベクトル類似性インデックスを使用するには、それらをメインメモリにロードする必要があります。 -同じベクトル類似性インデックスが繰り返しメインメモリにロードされることを避けるため、ClickHouse はそのようなインデックス用の専用インメモリキャッシュを提供しています。 -このキャッシュが大きいほど、不要なロードの回数は少なくなります。 -キャッシュの最大サイズは、サーバー設定 [vector_similarity_index_cache_size](../../../operations/server-configuration-parameters/settings.md#vector_similarity_index_cache_size) で設定できます。 -デフォルトでは、このキャッシュは最大 5 GB まで拡張できます。 - -:::note -ベクトル類似性インデックスキャッシュには、ベクトルインデックスのグラニュールが保存されます。 -個々のベクトルインデックスグラニュールがキャッシュサイズより大きい場合、それらはキャッシュされません。 -そのため、「Estimating storage and memory consumption」の式、または [system.data_skipping_indices](../../../operations/system-tables/data_skipping_indices) に基づいてベクトルインデックスサイズを算出し、それに応じてキャッシュサイズを設定してください。 -::: - -ベクトル類似性インデックスキャッシュの現在のサイズは、[system.metrics](../../../operations/system-tables/metrics.md) に表示されます。 - -```sql -SELECT metric, value -FROM system.metrics -WHERE metric = 'VectorSimilarityIndexCacheBytes' -``` - -特定のクエリ ID に対応するクエリのキャッシュヒットおよびミスは、[system.query_log](../../../operations/system-tables/query_log.md) から取得できます。 - -```sql -SYSTEM FLUSH LOGS query_log; - -SELECT ProfileEvents['VectorSimilarityIndexCacheHits'], ProfileEvents['VectorSimilarityIndexCacheMisses'] -FROM system.query_log -WHERE type = 'QueryFinish' AND query_id = '<...>' -ORDER BY event_time_microseconds; -``` - -本番環境でのユースケースでは、すべてのベクトルインデックスが常にメモリ上に保持されるよう、十分な容量のキャッシュを確保することを推奨します。 - -**量子化のチューニング** - -[量子化](https://huggingface.co/blog/embedding-quantization) は、ベクトルのメモリ使用量と、ベクトルインデックスの構築および走査にかかる計算コストを削減するための手法です。 -ClickHouse のベクトルインデックスは、次の量子化オプションをサポートします: - -| Quantization | Name | Storage per dimension | -| -------------- | ----------------- | --------------------- | -| f32 | 単精度 | 4 bytes | -| f16 | 半精度 | 2 bytes | -| bf16 (default) | 半精度 (brain float) | 2 bytes | -| i8 | 4分の1精度 | 1 byte | -| b1 | バイナリ | 1 bit | - -量子化は、元のフル精度の浮動小数点値 (`f32`) に対する検索と比較して、ベクトル検索の精度を低下させます。 -しかし、ほとんどのデータセットでは、半精度 brain float 量子化 (`bf16`) による精度低下はごくわずかであるため、ベクトル類似度インデックスではこの量子化手法がデフォルトで使用されます。 -4分の1精度 (`i8`) およびバイナリ (`b1`) 量子化は、ベクトル検索において無視できない精度低下を引き起こします。 -これら 2 つの量子化は、ベクトル類似度インデックスのサイズが、利用可能な DRAM 容量を大きく上回る場合にのみ推奨されます。 -このような場合は、精度向上のために再スコアリング([vector_search_index_fetch_multiplier](../../../operations/settings/settings#vector_search_index_fetch_multiplier)、[vector_search_with_rescoring](../../../operations/settings/settings#vector_search_with_rescoring))を有効にすることも推奨します。 -バイナリ量子化は、1) 正規化済み埋め込み(すなわちベクトル長 = 1、OpenAI のモデルは通常正規化されている)、かつ 2) 距離関数としてコサイン距離を使用する場合にのみ推奨されます。 -バイナリ量子化は内部的に Hamming 距離を用いて近傍グラフを構築および検索します。 -再スコアリングのステップでは、テーブルに保存されている元のフル精度ベクトルを用いて、コサイン距離により最近傍を特定します。 - -**データ転送のチューニング** - -ベクトル検索クエリの参照ベクトルはユーザーによって提供され、一般的には大規模言語モデル(LLM)を呼び出して取得されます。 -ClickHouse でベクトル検索を実行する典型的な Python コードは、次のようになります。 - -```python -search_v = openai_client.embeddings.create(input = "[Good Books]", model='text-embedding-3-large', dimensions=1536).data[0].embedding - -params = {'search_v': search_v} -result = chclient.query( - "SELECT id FROM items - ORDER BY cosineDistance(vector, %(search_v)s) - LIMIT 10", - parameters = params) -``` - - -埋め込みベクトル(上記スニペットの `search_v`)は、非常に大きな次元数を持つ場合があります。 -たとえば、OpenAI は 1536 次元や 3072 次元の埋め込みベクトルを生成するモデルを提供しています。 -上記のコードでは、ClickHouse Python ドライバは埋め込みベクトルを人間が読める文字列に置き換え、その後 SELECT クエリ全体を文字列として送信します。 -埋め込みベクトルが 1536 個の単精度浮動小数点値で構成されているとすると、送信される文字列は長さが 20 kB に達します。 -これにより、トークナイズ、パース、および数千回におよぶ文字列から浮動小数点への変換で CPU 使用率が高くなります。 -また、ClickHouse サーバーログファイルにも多くのディスク容量が必要となり、`system.query_log` の肥大化も引き起こします。 - -ほとんどの LLM モデルは、埋め込みベクトルをネイティブな float のリストまたは NumPy 配列として返すことに注意してください。 -そのため、Python アプリケーションでは、参照ベクトルのパラメータを次のようなスタイルでバイナリ形式としてバインドすることを推奨します。 - -```python -search_v = openai_client.embeddings.create(input = "[Good Books]", model='text-embedding-3-large', dimensions=1536).data[0].embedding - -params = {'$search_v_binary$': np.array(search_v, dtype=np.float32).tobytes()} -result = chclient.query( - "SELECT id FROM items - ORDER BY cosineDistance(vector, (SELECT reinterpret($search_v_binary$, 'Array(Float32)'))) - LIMIT 10" - parameters = params) -``` - -この例では、参照ベクターはそのままバイナリ形式で送信され、サーバー側で浮動小数点数配列として再解釈されます。 -これにより、サーバー側の CPU 時間を節約し、サーバーログおよび `system.query_log` の肥大化を防ぐことができます。 - -#### 管理と監視 - -ベクトル類似性インデックスのディスク上のサイズは、[system.data_skipping_indices](../../../operations/system-tables/data_skipping_indices) から取得できます。 - -```sql -SELECT database, table, name, formatReadableSize(data_compressed_bytes) -FROM system.data_skipping_indices -WHERE type = 'vector_similarity'; -``` - -出力例: - -```result -┌─database─┬─table─┬─name─┬─formatReadab⋯ssed_bytes)─┐ -│ default │ tab │ idx │ 348.00 MB │ -└──────────┴───────┴──────┴──────────────────────────┘ -``` - -#### 通常のスキッピングインデックスとの違い - -通常の[スキッピングインデックス](/optimize/skipping-indexes)と同様に、ベクトル類似度インデックスはグラニュール単位で構築され、各インデックスブロックは `GRANULARITY = [N]` 個のグラニュールで構成されます(通常のスキッピングインデックスではデフォルトで `[N]` = 1)。 -たとえば、テーブルのプライマリインデックスのグラニュラリティが 8192(`index_granularity = 8192` の設定)で `GRANULARITY = 2` の場合、各インデックスブロックには 16384 行が含まれます。 -しかし、おおよその近傍検索のためのデータ構造とアルゴリズムは、本質的に行指向です。 -これらは行の集合をコンパクトに表現して保存し、ベクトル検索クエリに対しても行を返します。 -このため、ベクトル類似度インデックスの挙動は、通常のスキッピングインデックスと比べて、いくつか直感的ではない違いが生じます。 - -ユーザーがあるカラムにベクトル類似度インデックスを定義すると、ClickHouse は内部的に各インデックスブロックごとにベクトル類似度の「サブインデックス」を作成します。 -サブインデックスは、そのインデックスブロックに含まれる行だけを認識しているという意味で「ローカル」です。 -前述の例で、あるカラムが 65536 行を持つと仮定すると、8 個のグラニュールにまたがる 4 つのインデックスブロックと、それぞれのインデックスブロックに対応するベクトル類似度サブインデックスが得られます。 -サブインデックスは理論的には、そのインデックスブロック内で最も近い N 個の点に対応する行を直接返すことができます。 -しかし、ClickHouse はディスクからメモリへデータを読み込む際にグラニュールの粒度で処理するため、サブインデックスはマッチした行をグラニュール単位にまで拡張して扱います。 -これは、インデックスブロックの粒度でデータをスキップする通常のスキッピングインデックスとは異なります。 - - -`GRANULARITY` パラメータは、いくつのベクトル類似度サブインデックスを作成するかを決定します。 -より大きな `GRANULARITY` の値では、サブインデックスの数は少なくなる一方、それぞれのサブインデックスはより大きくなり、最終的にはあるカラム(またはカラムのデータパーツ)が単一のサブインデックスしか持たない状態になります。 -その場合、そのサブインデックスはカラム行全体に対する「グローバル」なビューを持ち、関連する行を含むカラム(パーツ)のすべてのグラニュールを直接返すことができます(そのようなグラニュールは最大でも `LIMIT [N]` 個です)。 -次のステップとして、ClickHouse はこれらのグラニュールを読み込み、グラニュール内のすべての行に対して総当たりの距離計算を行うことで、実際に最適な行を特定します。 -`GRANULARITY` の値が小さい場合、それぞれのサブインデックスは最大 `LIMIT N` 個のグラニュールを返します。 -その結果、より多くのグラニュールを読み込んで事後フィルタリングする必要が生じます。 -どちらの場合でも検索精度は同等であり、異なるのは処理パフォーマンスのみであることに注意してください。 -一般的には、ベクトル類似度インデックスに対しては大きな `GRANULARITY` を使用し、ベクトル類似度構造によるメモリ消費が過大になるなどの問題が発生した場合にのみ、より小さな `GRANULARITY` の値に切り替えることを推奨します。 -ベクトル類似度インデックスに対して `GRANULARITY` が指定されていない場合、デフォルト値は 1 億です。 - -#### 例 - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32), INDEX idx vec TYPE vector_similarity('hnsw', 'L2Distance', 2)) ENGINE = MergeTree ORDER BY id; - -INSERT INTO tab VALUES (0, [1.0, 0.0]), (1, [1.1, 0.0]), (2, [1.2, 0.0]), (3, [1.3, 0.0]), (4, [1.4, 0.0]), (5, [1.5, 0.0]), (6, [0.0, 2.0]), (7, [0.0, 2.1]), (8, [0.0, 2.2]), (9, [0.0, 2.3]), (10, [0.0, 2.4]), (11, [0.0, 2.5]); - -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -戻り値 - -```result - ┌─id─┬─vec─────┐ -1. │ 6 │ [0,2] │ -2. │ 7 │ [0,2.1] │ -3. │ 8 │ [0,2.2] │ - └────┴─────────┘ -``` - -近似ベクトル検索を利用する他のサンプルデータセット: - -* [LAION-400M](../../../getting-started/example-datasets/laion-400m-dataset) -* [LAION-5B](../../../getting-started/example-datasets/laion-5b-dataset) -* [dbpedia](../../../getting-started/example-datasets/dbpedia-dataset) -* [hackernews](../../../getting-started/example-datasets/hackernews-vector-search-dataset) - -### Quantized Bit (QBit) - - - -厳密なベクトル検索を高速化する一般的な方法の 1 つは、低精度の [浮動小数点数型 (float data type)](../../../sql-reference/data-types/float.md) を使用することです。 -例えば、ベクトルを `Array(Float32)` ではなく `Array(BFloat16)` として保存すると、データサイズは半分になり、クエリ実行時間もそれに比例して短くなることが期待されます。 -この手法は量子化と呼ばれます。計算は高速になりますが、すべてのベクトルを完全走査していても、結果の精度は低下する可能性があります。 - -従来の量子化では、検索時とデータ保存時の両方で精度が失われます。上記の例では、`Float32` の代わりに `BFloat16` を保存することになり、たとえ望んだとしても、後からより高精度な検索を実行することはできません。別のアプローチとして、量子化済みデータとフル精度のデータという 2 つのコピーを保存する方法があります。これは有効ですが、冗長なストレージが必要になります。例えば、元データが `Float64` であり、異なる精度 (16 ビット、32 ビット、フル 64 ビット) で検索を実行したいシナリオを考えてみましょう。この場合、データのコピーを 3 つ別々に保存する必要があります。 - -ClickHouse は、これらの制約を解決する Quantized Bit (`QBit`) データ型を提供しており、次のことを実現します: - -1. 元のフル精度データを保存する。 -2. クエリ時に量子化精度を指定できるようにする。 - - -これは、データをビットグループ化形式(すべてのベクトルの i 番目のビットをまとめて保存する形式)で保存することで実現され、要求された精度レベルだけを読み出せるようにします。これにより、量子化による I/O と計算量の削減による高速化の恩恵を受けつつ、必要に応じて元のデータをすべて利用可能な状態に保てます。最大精度が選択された場合、検索は厳密なもの(完全一致)になります。 - -:::note -`QBit` データ型とそれに関連する距離関数は、現在実験的な機能です。これらを有効にするには、`SET allow_experimental_qbit_type = 1` を実行してください。 -問題が発生した場合は、[ClickHouse リポジトリ](https://github.com/clickhouse/clickhouse/issues) に Issue を作成してください。 -::: - -`QBit` 型のカラムを宣言するには、次の構文を使用します。 - -```sql -column_name QBit(element_type, dimension) -``` - -次のとおりです。 - -* `element_type` – 各ベクトル要素の型。サポートされている型は `BFloat16`、`Float32`、`Float64` です -* `dimension` – 各ベクトル内の要素数 - -#### `QBit` テーブルの作成とデータの追加 - -```sql -CREATE TABLE fruit_animal ( - word String, - vec QBit(Float64, 5) -) ENGINE = MergeTree -ORDER BY word; - -INSERT INTO fruit_animal VALUES - ('apple', [-0.99105519, 1.28887844, -0.43526649, -0.98520696, 0.66154391]), - ('banana', [-0.69372815, 0.25587061, -0.88226235, -2.54593015, 0.05300475]), - ('orange', [0.93338752, 2.06571317, -0.54612565, -1.51625717, 0.69775337]), - ('dog', [0.72138876, 1.55757105, 2.10953259, -0.33961248, -0.62217325]), - ('cat', [-0.56611276, 0.52267331, 1.27839863, -0.59809804, -1.26721048]), - ('horse', [-0.61435682, 0.48542571, 1.21091247, -0.62530446, -1.33082533]); -``` - -#### `QBit` を使ったベクトル検索 - -L2 距離を用いて、単語 'lemon' を表すベクトルに最も近い近傍を検索します。距離関数の第 3 引数ではビット単位の精度を指定します。値を大きくすると精度は向上しますが、計算コストも増加します。 - -`QBit` で使用可能なすべての距離関数は[こちら](../../../sql-reference/data-types/qbit.md#vector-search-functions)で確認できます。 - -**フル精度検索 (64 ビット):** - -```sql -SELECT - word, - L2DistanceTransposed(vec, [-0.88693672, 1.31532824, -0.51182908, -0.99652702, 0.59907770], 64) AS distance -FROM fruit_animal -ORDER BY distance; -``` - -```text - ┌─word───┬────────────distance─┐ -1. │ apple │ 0.14639757188169716 │ -2. │ banana │ 1.998961369007679 │ -3. │ orange │ 2.039041552613732 │ -4. │ cat │ 2.752802631487914 │ -5. │ horse │ 2.7555776805484813 │ -6. │ dog │ 3.382295083120104 │ - └────────┴─────────────────────┘ -``` - -**精度を下げた検索:** - -```sql -SELECT - word, - L2DistanceTransposed(vec, [-0.88693672, 1.31532824, -0.51182908, -0.99652702, 0.59907770], 12) AS distance -FROM fruit_animal -ORDER BY distance; -``` - -```text - ┌─word───┬───────────distance─┐ -1. │ apple │ 0.757668703053566 │ -2. │ orange │ 1.5499475034938677 │ -3. │ banana │ 1.6168396735102937 │ -4. │ cat │ 2.429752230904804 │ -5. │ horse │ 2.524650475528617 │ -6. │ dog │ 3.17766975527459 │ - └────────┴────────────────────┘ -``` - - -12 ビット量子化では、クエリ実行が高速化されつつ、距離を良好に近似できることに注目してください。相対的な順位付けも概ね一貫しており、依然として「apple」が最も近い一致となっています。 - -:::note -現時点では、高速化の主な要因は、読み取るデータ量が減ることによる I/O の削減です。元のデータが `Float64` のようにビット幅の大きい型であっても、より低い精度を選択すると、同じ幅のデータに対して距離計算が行われますが、精度だけが下がります。 -::: - -#### パフォーマンス上の考慮事項 {#qbit-performance} - -`QBit` のパフォーマンス上の利点は、より低い精度を使用した場合に、ストレージから読み取る必要のあるデータ量が減ることによる I/O 操作の削減から生じます。さらに、`QBit` に格納されているデータが `Float32` であり、`precision` パラメータが 16 以下の場合は、計算量が減ることによる追加のメリットも得られます。`precision` パラメータは、精度と速度のトレードオフを直接制御します。 - -- **精度が高い場合**(元のデータ幅に近い場合): 結果はより正確だが、クエリは遅くなる -- **精度が低い場合**: 近似結果になるがクエリは高速になり、メモリ使用量も削減される - -### 参考文献 {#references} - -ブログ: -- [Vector Search with ClickHouse - Part 1](https://clickhouse.com/blog/vector-search-clickhouse-p1) -- [Vector Search with ClickHouse - Part 2](https://clickhouse.com/blog/vector-search-clickhouse-p2) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md deleted file mode 100644 index 857724da71b..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -description: 'CoalescingMergeTree は MergeTree エンジンを継承しています。その主な特徴は、パーツのマージ時に各列の直近の非 NULL 値を自動的に格納できることです。' -sidebar_label: 'CoalescingMergeTree' -sidebar_position: 50 -slug: /engines/table-engines/mergetree-family/coalescingmergetree -title: 'CoalescingMergeTree テーブルエンジン' -keywords: ['CoalescingMergeTree'] -show_related_blogs: true -doc_type: 'reference' ---- - - - -# CoalescingMergeTree テーブルエンジン - -:::note Available from version 25.6 -このテーブルエンジンは、OSS と Cloud の両方でバージョン 25.6 以降で利用可能です。 -::: - -このエンジンは [MergeTree](/engines/table-engines/mergetree-family/mergetree) を継承しています。主な違いはデータパートのマージ方法です。`CoalescingMergeTree` テーブルでは、ClickHouse は同じ主キー(より正確には、同じ [ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md))を持つすべての行を、各カラムについて最新の非 NULL 値を含む 1 行に置き換えます。 - -これによりカラム単位のアップサートが可能になり、行全体ではなく特定のカラムだけを更新できます。 - -`CoalescingMergeTree` は、キー以外のカラムで Nullable 型と併用することを想定しています。カラムが Nullable でない場合は、その動作は [ReplacingMergeTree](/engines/table-engines/mergetree-family/replacingmergetree) と同じになります。 - - - -## テーブルを作成する - -```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 = CoalescingMergeTree([columns]) -[PARTITION BY expr] -[ORDER BY expr] -[SAMPLE BY expr] -[SETTINGS name=value, ...] -``` - -リクエストパラメータの説明については、[リクエストの説明](../../../sql-reference/statements/create/table.md)を参照してください。 - -### CoalescingMergeTree のパラメータ - -#### Columns - -`columns` - 値が統合されるカラム名のタプルです。省略可能なパラメータです。\ -カラムは数値型である必要があり、パーティションキーまたはソートキーに含まれていてはなりません。 - -`columns` が指定されていない場合、ClickHouse はソートキーに含まれていないすべてのカラムの値を統合します。 - -### クエリ句 - -`CoalescingMergeTree` テーブルを作成する際には、`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 [=] CoalescingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns]) - ``` - - `columns` を除くすべてのパラメータは、`MergeTree` における意味と同じです。 - - * `columns` — 値が合計されるカラム名のタプルです。省略可能なパラメータです。詳細な説明については上記のテキストを参照してください。 -
- - -## 使用例 - -次のテーブルを例にします。 - -```sql -CREATE TABLE test_table -( - key UInt64, - value_int Nullable(UInt32), - value_string Nullable(String), - value_date Nullable(Date) -) -ENGINE = CoalescingMergeTree() -ORDER BY key -``` - -データを挿入する: - -```sql -INSERT INTO test_table VALUES(1, NULL, NULL, '2025-01-01'), (2, 10, 'test', NULL); -INSERT INTO test_table VALUES(1, 42, 'win', '2025-02-01'); -INSERT INTO test_table(key, value_date) VALUES(2, '2025-02-01'); -``` - -結果は次のようになります。 - -```sql -SELECT * FROM test_table ORDER BY key; -``` - -```text -┌─key─┬─value_int─┬─value_string─┬─value_date─┐ -│ 1 │ 42 │ win │ 2025-02-01 │ -│ 1 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-01-01 │ -│ 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-02-01 │ -│ 2 │ 10 │ test │ ᴺᵁᴸᴸ │ -└─────┴───────────┴──────────────┴────────────┘ -``` - -最終的な正しい結果を得るための推奨クエリ: - -```sql -SELECT * FROM test_table FINAL ORDER BY key; -``` - -```text -┌─key─┬─value_int─┬─value_string─┬─value_date─┐ -│ 1 │ 42 │ win │ 2025-02-01 │ -│ 2 │ 10 │ test │ 2025-02-01 │ -└─────┴───────────┴──────────────┴────────────┘ -``` - -`FINAL` 修飾子を使用すると、クエリ実行時に ClickHouse がマージロジックを適用し、各カラムごとに正しい統合後の「最新」値を必ず取得できます。これは、CoalescingMergeTree テーブルに対してクエリを実行する際に、最も安全で精度の高い方法です。 - -:::note - -`GROUP BY` を用いるアプローチは、背後のパーツが完全にはマージされていない場合、誤った結果を返す可能性があります。 - -```sql -SELECT key, last_value(value_int), last_value(value_string), last_value(value_date) FROM test_table GROUP BY key; -- 非推奨です。 -``` - -::: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md deleted file mode 100644 index 306f76d95e9..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md +++ /dev/null @@ -1,377 +0,0 @@ ---- -description: 'MergeTree をベースとしており、マージ処理中に行を折りたたむためのロジックを追加したものです。' -keywords: ['更新', '折りたたみ'] -sidebar_label: 'CollapsingMergeTree' -sidebar_position: 70 -slug: /engines/table-engines/mergetree-family/collapsingmergetree -title: 'CollapsingMergeTree テーブルエンジン' -doc_type: 'guide' ---- - - - -# CollapsingMergeTree テーブルエンジン - - - -## 説明 {#description} - -`CollapsingMergeTree` エンジンは [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) -を継承し、マージ処理中に行を折りたたむ(コラプスする)ためのロジックを追加します。 -`CollapsingMergeTree` テーブルエンジンは、特別なフィールド `Sign` を除くソートキー(`ORDER BY`)内のすべてのフィールドが等しく、 -かつ `Sign` フィールドの値が `1` または `-1` である行のペアを非同期に削除(折りたたみ)します。 -`Sign` が反対の値を持つ対応する行のペアが存在しない行は保持されます。 - -詳細については、このドキュメントの [Collapsing](#table_engine-collapsingmergetree-collapsing) セクションを参照してください。 - -:::note -このエンジンはストレージ容量を大幅に削減でき、 -その結果として `SELECT` クエリの効率を高めることができます。 -::: - - - -## パラメータ {#parameters} - -このテーブルエンジンのすべてのパラメータは、`Sign` パラメータを除き、 -[`MergeTree`](/engines/table-engines/mergetree-family/mergetree) における同名パラメータと同じ意味を持ちます。 - -- `Sign` — 行の種別を示す列に付ける名前で、`1` は「状態」行、`-1` は「取消」行を表します。型: [Int8](/sql-reference/data-types/int-uint)。 - - - -## テーブルの作成 - -```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, ...] -``` - -
- テーブル作成の非推奨メソッド - - :::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` — `1` が「state」行、`-1` が「cancel」行を表す行種別を持つカラムに付ける名前です。[Int8](/sql-reference/data-types/int-uint)。 -
- -* クエリパラメータの説明については、[クエリの説明](../../../sql-reference/statements/create/table.md)を参照してください。 -* `CollapsingMergeTree` テーブルを作成する場合は、`MergeTree` テーブルを作成する場合と同じ [クエリ句](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table) が必要です。 - - -## 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 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -最初の行は、(この場合はユーザーを表す)オブジェクトの以前の状態を打ち消します。 -この「canceled」行では、`Sign` を除くすべてのソートキーのフィールドをコピーする必要があります。 -その上の 2 行目が現在の状態を表しています。 - -ユーザーアクティビティの最後の状態だけが必要なため、元の「state」行と、挿入した「cancel」行は、次のように削除して、オブジェクトの無効(古い)状態を畳み込むことができます。 - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -- 古い「状態」行は削除可能 -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -- 「キャンセル」行は削除可能 -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -- 新しい「状態」行は残る -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -`CollapsingMergeTree` は、データパーツのマージが行われる際に、まさにこの *collapsing(折りたたみ)* 動作を実行します。 - -:::note -各変更に対して行が 2 行必要となる理由については、 -[Algorithm](#table_engine-collapsingmergetree-collapsing-algorithm) の節でさらに詳しく説明します。 -::: - -**このアプローチ特有の注意点** - -1. データを書き込むプログラムは、取り消しを行えるように、オブジェクトの状態を保持しておく必要があります。「cancel」行には、「state」行のソートキー項目のコピーと、反対の `Sign` を含める必要があります。これにより初期のストレージサイズは増加しますが、データを高速に書き込めるようになります。 -2. カラム内で長く伸び続ける配列は、書き込み負荷の増大によりエンジンの効率を低下させます。データが単純であればあるほど効率は高くなります。 -3. `SELECT` の結果は、オブジェクト変更履歴の一貫性に大きく依存します。挿入用データを準備する際には注意してください。一貫性のないデータでは予測不能な結果が生じる可能性があります。たとえば、セッション深度のような非負のメトリクスに対して負の値が出力されることがあります。 - -### Algorithm - -ClickHouse がデータ[パーツ](/concepts/glossary#parts)をマージする際、 -同じソートキー(`ORDER BY`)を持つ連続した行の各グループは、高々 2 行にまでまとめられます。 -すなわち、`Sign` = `1` の「state」行と、`Sign` = `-1` の「cancel」行です。 -言い換えると、ClickHouse ではエントリが collapsing(折りたたみ)されます。 - - -各結果データパーツごとに、ClickHouse は次のように保存します。 - -| | | -|--|-------------------------------------------------------------------------------------------------------------------------------------| -|1.| 「state」行と「cancel」行の数が一致し、かつ最後の行が「state」行である場合、最初の「cancel」行と最後の「state」行。 | -|2.| 「state」行の方が「cancel」行より多い場合、最後の「state」行。 | -|3.| 「cancel」行の方が「state」行より多い場合、最初の「cancel」行。 | -|4.| 上記以外のすべての場合、いずれの行も保存しない。 | - -さらに、「state」行が「cancel」行より少なくとも 2 行多い場合、または「cancel」行が「state」行より少なくとも 2 行多い場合は、マージ処理は継続されます。 -ただし、ClickHouse はこの状況を論理エラーと見なし、サーバーログに記録します。 -同じデータが複数回挿入された場合に、このエラーが発生することがあります。 -したがって、collapsing によって統計値の計算結果が変わることはありません。 -変更は徐々に collapse されていき、最終的にはほぼすべてのオブジェクトについて最後の状態だけが残されます。 - -`Sign` 列が必要なのは、マージアルゴリズムが、同じソートキーを持つすべての行が同じ結果データパーツ、さらには同じ物理サーバー上に入ることを保証しないためです。 -ClickHouse は複数スレッドで `SELECT` クエリを処理するため、結果における行の順序を予測できません。 - -`CollapsingMergeTree` テーブルから完全に「collapse された」データを取得する必要がある場合は、集約処理が必要です。 -collapsing を最終確定させるには、`GROUP BY` 句と、`Sign` を考慮した集約関数を使ってクエリを書きます。 -例えば、件数を計算するには `count()` の代わりに `sum(Sign)` を使用します。 -ある値の合計を計算するには、`sum(x)` の代わりに `sum(Sign * x)` と `HAVING sum(Sign) > 0` を併用します。 -下記の[例](#example-of-use)のようにします。 - -集約関数 `count`、`sum`、`avg` はこの方法で計算できます。 -オブジェクトに少なくとも 1 つの collapse されていない状態が存在する場合、集約関数 `uniq` も計算できます。 -一方で、`min` と `max` は計算できません。 -これは、`CollapsingMergeTree` が collapse された状態の履歴を保存しないためです。 - -:::note -集約を行わずにデータを取り出す必要がある場合 -(例えば、最新の値が特定の条件に一致する行が存在するかどうかを確認する場合など)は、 -`FROM` 句に対して [`FINAL`](../../../sql-reference/statements/select/from.md#final-modifier) 修飾子を使用できます。これは、結果を返す前にデータをマージします。 -`CollapsingMergeTree` では、各キーごとに最新の「state」行のみが返されます。 -::: - - - -## 例 - -### 使用例 - -次のサンプルデータを前提とします。 - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -次に、`CollapsingMergeTree` を使用してテーブル `UAct` を作成します。 - -```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つの異なるデータパーツを作成するために、2つの `INSERT` クエリを使用します。 - -:::note -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 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -上で返されたデータを見て、collapsing が発生したかどうか確認してみましょう。 -2 つの `INSERT` クエリで、2 つのデータパーツを作成しました。 -`SELECT` クエリは 2 つのスレッドで実行され、行の順序はランダムになりました。 -しかし、データパーツのマージはまだ行われておらず、 -ClickHouse はデータパーツを予測できないタイミングでバックグラウンドでマージするため、 -**collapsing は発生しませんでした**。 - -そのため、集約処理を行う必要があります。 -ここでは、[`sum`](/sql-reference/aggregate-functions/reference/sum) -集約関数と [`HAVING`](/sql-reference/statements/select/having) 句を使って集約を実行します。 - -```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 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -:::note -このようなデータの選択方法は効率が悪く、スキャン対象データが多い場合(数百万行規模)には使用しないことを推奨します。 -::: - -### 別のアプローチの例 - -このアプローチの考え方は、マージ処理がキー列のみを考慮するという点にあります。 -そのため「cancel」行では、`Sign` 列を使用せずに集計したときにその行の以前のバージョンと相殺されるような -負の値を指定できます。 - -この例では、以下のサンプルデータを使用します。 - - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -│ 4324182021466249494 │ -5 │ -146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -この方法では、負の値を保存できるようにするために、`PageViews` と `Duration` のデータ型を変更する必要があります。 -そのため、テーブル `UAct` を `collapsingMergeTree` を使って作成する際に、これらの列の型を `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; -``` - -```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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md deleted file mode 100644 index cc06feb766e..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -description: 'MergeTree テーブルにカスタムパーティショニングキーを追加する方法について説明します。' -sidebar_label: 'カスタムパーティショニングキー' -sidebar_position: 30 -slug: /engines/table-engines/mergetree-family/custom-partitioning-key -title: 'カスタムパーティショニングキー' -doc_type: 'guide' ---- - - - -# カスタムパーティションキー - -:::note -ほとんどの場合、パーティションキーは不要であり、それ以外の多くの場合でも、月単位より細かいパーティションキーは不要です。例外はオブザーバビリティ向けのユースケースで、この場合は日単位のパーティションが一般的です。 - -パーティションを過度に細かくしてはいけません。クライアント識別子や名前でデータをパーティションしないでください。その代わりに、クライアント識別子や名前を ORDER BY 式の最初の列にします。 -::: - -パーティショニングは、[MergeTree ファミリーのテーブル](../../../engines/table-engines/mergetree-family/mergetree.md)、[レプリケートテーブル](../../../engines/table-engines/mergetree-family/replication.md)、および[マテリアライズドビュー](/sql-reference/statements/create/view#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; -``` - -パーティションキーは([primary key](../../../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 分ほどで、同一パーティション内のパーツが 1 つのパーツにマージされます。 - -:::info -マージは、パーティション式の値が同じデータパーツに対してのみ機能します。これは **パーティションを過度に細かくしないでください**(目安としてパーティション数はおおよそ 1000 個以下にする)ということを意味します。そうしないと、ファイルシステム上のファイル数やオープンファイルディスクリプタ数が不当に多くなり、`SELECT` クエリの性能が低下します。 -::: - -テーブルのパーツおよびパーティションを確認するには、[system.parts](../../../operations/system-tables/parts.md) テーブルを使用します。たとえば、月ごとにパーティション分割された `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#attach-partitionpart) クエリでパーツ名を指定できます。 - -パーツ名 `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/detach) クエリを使用してテーブルから切り離されたパーツが含まれます。破損したパーツも削除されるのではなく、このディレクトリへ移動されます。サーバーは `detached` ディレクトリ内のパーツを使用しません。このディレクトリ内のデータは、いつでも追加、削除、または変更できます。サーバーは、[ATTACH](/sql-reference/statements/alter/partition#attach-partitionpart) クエリを実行するまでこれらを認識しません。 - -稼働中のサーバーでは、サーバーが認識できないため、ファイルシステム上のパーツの集合やそのデータを手動で変更することはできません。非レプリケートテーブルの場合、サーバー停止中であればこれを行うことはできますが、推奨されません。レプリケートテーブルの場合は、いかなる場合でもパーツの集合を変更することはできません。 - -ClickHouse ではパーティションに対して操作を実行できます。削除したり、あるテーブルから別のテーブルへコピーしたり、バックアップを作成したりできます。すべての操作の一覧は、[パーティションおよびパーツの操作](/sql-reference/statements/alter/partition) セクションを参照してください。 - - - -## パーティションキーを利用した Group By 最適化 - -テーブルのパーティションキーとクエリの Group By キーの組み合わせによっては、 -各パーティションごとに独立して集約処理を実行できる場合があります。 -この場合、すべての実行スレッドからの部分集約済みデータを最後にマージする必要がなくなります。 -これは、各 Group By キーの値が、異なる 2 つのスレッドのワーキングセット内に同時に現れないことが保証されているためです。 - -典型的な例としては、次のようなものがあります。 - -```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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md deleted file mode 100644 index c2dbfba48cf..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md +++ /dev/null @@ -1,278 +0,0 @@ ---- -description: 'Graphite データの間引きおよび集約・平均(ロールアップ)のために設計されています。' -sidebar_label: 'GraphiteMergeTree' -sidebar_position: 90 -slug: /engines/table-engines/mergetree-family/graphitemergetree -title: 'GraphiteMergeTree テーブルエンジン' -doc_type: 'guide' ---- - - - -# GraphiteMergeTree テーブルエンジン - -このエンジンは、[Graphite](http://graphite.readthedocs.io/en/latest/index.html) データの間引きおよび集約・平均化(ロールアップ)のために設計されています。Graphite のデータストアとして ClickHouse を使用したい開発者に役立ちます。 - -ロールアップが不要な場合は任意の ClickHouse テーブルエンジンで Graphite データを保存できますが、ロールアップが必要な場合は `GraphiteMergeTree` を使用してください。このエンジンはストレージ容量を削減し、Graphite からのクエリの効率を向上させます。 - -このエンジンは [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) の特性を継承します。 - - - -## テーブルの作成 - -```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) クエリの詳細な説明を参照してください。 - -Graphite データ用のテーブルには、以下のデータを格納するために次の列が必要です。 - -* メトリクス名(Graphite センサー)。データ型: `String`。 - -* メトリクスを計測した時刻。データ型: `DateTime`。 - -* メトリクスの値。データ型: `Float64`。 - -* メトリクスのバージョン。データ型: 任意の数値型(ClickHouse は、バージョンが最大の行、もしくはバージョンが同一の場合は最後に書き込まれた行を保持します。他の行はデータパーツのマージ時に削除されます)。 - -これらの列名は rollup の設定で指定する必要があります。 - -**GraphiteMergeTree のパラメータ** - -* `config_section` — 設定ファイル内のセクション名。このセクションに rollup のルールを設定します。 - -**クエリ句** - -`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 のルールを設定します。 -
- - -## ロールアップ設定 - -ロールアップの設定は、サーバー設定内の [graphite_rollup](../../../operations/server-configuration-parameters/settings.md#graphite) パラメータによって定義されます。パラメータ名は任意の名前を付けることができます。複数の設定を作成し、異なるテーブルに対して使い分けることができます。 - -ロールアップ設定の構造: - -required-columns -patterns - -### 必須カラム - -#### `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` セクションの構造: - -```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` - タグ付きメトリクス用のルール(メトリクスは DB に `someName?tag1=value1&tag2=value2&tag3=value3` 形式で保存されます)。正規表現はタグ名でソートされている必要があり、存在する場合は最初のタグが `__name__` でなければなりません。フィールド `regexp` は正規表現として処理されます。 - * `tag_list` - タグ付きメトリクス用のルールで、graphite 形式 `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。平均は、平均値同士の平均を取るのと同様に、厳密ではない平均として計算されます。 - -### ルールタイプなしの設定例 - - -```xml - - Version - - click_cost - any - - 0 - 5 - - - 86400 - 60 - - - - max - - 0 - 60 - - - 3600 - 300 - - - 86400 - 3600 - - - -``` - -### ルールタイプ別の設定例 - -```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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md deleted file mode 100644 index 75251b18fea..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -description: 'MergeTree エンジンファミリーに関するドキュメント' -sidebar_label: 'MergeTree ファミリー' -sidebar_position: 10 -slug: /engines/table-engines/mergetree-family/ -title: 'MergeTree エンジンファミリー' -doc_type: 'reference' ---- - - - -# 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) の利用を検討してください。 - -{/* このページの目次は、 - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - によって、YAML フロントマターのフィールド(slug、description、title)から自動生成されています。 - - 誤りを見つけた場合は、該当ページの YAML フロントマターを編集してください。 - */ } - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| ------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -| [MergeTree テーブルエンジン](/engines/table-engines/mergetree-family/mergetree) | `MergeTree` ファミリーのテーブルエンジンは、高いデータ取り込みレートと大規模なデータ量に対応するよう設計されています。 | -| [Replicated* テーブルエンジン](/engines/table-engines/mergetree-family/replication) | ClickHouse における Replicated* ファミリーのテーブルエンジンを用いたデータレプリケーションの概要です。 | -| [カスタムパーティションキー](/engines/table-engines/mergetree-family/custom-partitioning-key) | MergeTree テーブルにカスタムパーティションキーを追加する方法を説明します。 | -| [ReplacingMergeTree テーブルエンジン](/engines/table-engines/mergetree-family/replacingmergetree) | MergeTree と異なり、同じソートキー値(`ORDER BY` 句で指定される列であり、`PRIMARY KEY` ではありません)を持つ重複したエントリを削除します。 | -| [CoalescingMergeTree テーブルエンジン](/engines/table-engines/mergetree-family/coalescingmergetree) | CoalescingMergeTree は MergeTree エンジンを継承しています。主な特徴は、パーツのマージ時に各列の最後の非 NULL 値を自動的に保存できることです。 | -| [SummingMergeTree テーブルエンジン](/engines/table-engines/mergetree-family/summingmergetree) | SummingMergeTree は MergeTree エンジンを継承しています。主な特徴は、パーツのマージ時に数値データを自動的に集計(合計)できることです。 | -| [AggregatingMergeTree テーブルエンジン](/engines/table-engines/mergetree-family/aggregatingmergetree) | 同じプライマリキー(より正確には、同じ [ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md))を持つすべての行を、集約関数の状態を組み合わせて保存した 1 行(単一のデータパーツ内)に置き換えます。 | -| [CollapsingMergeTree テーブルエンジン](/engines/table-engines/mergetree-family/collapsingmergetree) | MergeTree を継承していますが、マージ処理中に行を折りたたむロジックが追加されています。 | -| [VersionedCollapsingMergeTree テーブルエンジン](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) | 継続的に変化するオブジェクトの状態を高速に書き込み、古いオブジェクト状態をバックグラウンドで削除できるようにします。 | -| [GraphiteMergeTree テーブルエンジン](/engines/table-engines/mergetree-family/graphitemergetree) | Graphite データの間引きおよび集約・平均化(ロールアップ)のために設計されています。 | -| [Exact および Approximate Vector Search](/engines/table-engines/mergetree-family/annindexes) | Exact および Approximate Vector Search についてのドキュメントです。 | -| [テキストインデックスを使用した全文検索](/engines/table-engines/mergetree-family/invertedindexes) | テキスト内から検索語句を高速に見つけます。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md deleted file mode 100644 index 24a3927a6ca..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md +++ /dev/null @@ -1,816 +0,0 @@ ---- -description: 'テキスト中の検索語句を素早く見つけます。' -keywords: ['全文検索', 'テキストインデックス', 'インデックス', 'インデックス(複数形)'] -sidebar_label: 'テキストインデックスを使用した全文検索' -slug: /engines/table-engines/mergetree-family/invertedindexes -title: 'テキストインデックスを使用した全文検索' -doc_type: 'reference' ---- - -import PrivatePreviewBadge from '@theme/badges/PrivatePreviewBadge'; - - -# テキストインデックスを使用した全文検索 - - - -ClickHouse のテキストインデックス(["inverted indexes"](https://en.wikipedia.org/wiki/Inverted_index) とも呼ばれます)は、文字列データに対して高速な全文検索機能を提供します。 -インデックスは、列内の各トークンを、そのトークンを含む行に対応付けます。 -トークンは、トークン化と呼ばれる処理によって生成されます。 -例えば、ClickHouse は英語の文 "All cat like mice." を、デフォルトでは ["All", "cat", "like", "mice"] のようにトークン化します(末尾のドットは無視される点に注意してください)。 -ログデータ向けなど、より高度なトークナイザーも利用できます。 - - - -## テキストインデックスの作成 - -テキストインデックスを作成するには、まず対応する実験的な設定を有効にしてください。 - -```sql -SET allow_experimental_full_text_index = true; -``` - -テキストインデックスは、次の構文を使用して、[String](/sql-reference/data-types/string.md)、[FixedString](/sql-reference/data-types/fixedstring.md)、[Array(String)](/sql-reference/data-types/array.md)、[Array(FixedString)](/sql-reference/data-types/array.md)、および [Map](/sql-reference/data-types/map.md)([mapKeys](/sql-reference/functions/tuple-map-functions.md/#mapkeys) および [mapValues](/sql-reference/functions/tuple-map-functions.md/#mapvalues) マップ関数を通じて)列に定義できます。 - -```sql -CREATE TABLE tab -( - `key` UInt64, - `str` String, - INDEX text_idx(str) TYPE text( - -- 必須パラメータ: - tokenizer = splitByNonAlpha - | splitByString[(S)] - | ngrams[(N)] - | sparseGrams[(min_length[, max_length[, min_cutoff_length]])] - | array - -- オプションパラメータ: - [, preprocessor = expression(str)] - -- オプション高度なパラメータ: - [, dictionary_block_size = D] - [, dictionary_block_frontcoding_compression = B] - [, max_cardinality_for_embedded_postings = M] - [, bloom_filter_false_positive_rate = R] - ) [GRANULARITY 64] -) -ENGINE = MergeTree -ORDER BY key -``` - -**トークナイザー引数(必須)**。`tokenizer` 引数は使用するトークナイザーを指定します: - -* `splitByNonAlpha` は、英数字以外の ASCII 文字で文字列を分割します(関数 [splitByNonAlpha](/sql-reference/functions/splitting-merging-functions.md/#splitByNonAlpha) も参照してください)。 -* `splitByString(S)` は、ユーザー定義の区切り文字列 `S` に従って文字列を分割します(関数 [splitByString](/sql-reference/functions/splitting-merging-functions.md/#splitByString) も参照してください)。 - 区切り文字列はオプションのパラメータで指定できます。たとえば `tokenizer = splitByString([', ', '; ', '\n', '\\'])` のように指定します。 - それぞれの区切り文字列は、複数文字(例では `', '`)から構成されていてもかまいません。 - 区切り文字リストを明示的に指定しない場合(たとえば `tokenizer = splitByString`)、既定の区切り文字リストは単一の空白 `[' ']` です。 -* `ngrams(N)` は、文字列を同じ長さの `N`-gram に分割します(関数 [ngrams](/sql-reference/functions/splitting-merging-functions.md/#ngrams) も参照してください)。 - n-gram の長さは 2 から 8 の整数でオプション引数として指定できます。たとえば `tokenizer = ngrams(3)` のように指定します。 - n-gram の既定サイズは、明示的に指定されない場合(たとえば `tokenizer = ngrams`)は 3 です。 -* `sparseGrams(min_length, max_length, min_cutoff_length)` は、`min_length` 以上 `max_length` 以下(両端を含む)の長さの可変長 n-gram に文字列を分割します(関数 [sparseGrams](/sql-reference/functions/string-functions#sparseGrams) も参照してください)。 - 明示的に指定されない場合、`min_length` と `max_length` の既定値はそれぞれ 3 と 100 です。 - パラメータ `min_cutoff_length` が指定されている場合、その長さ以上の n-gram のみがインデックスに保存されます。 - `ngrams(N)` と比べて、`sparseGrams` トークナイザーは可変長の N-gram を生成するため、元のテキストをより柔軟に表現できます。 - たとえば `tokenizer = sparseGrams(3, 5, 4)` は内部的には入力文字列から 3・4・5-gram を生成しますが、インデックスには 4-gram と 5-gram のみが保存されます。 -* `array` はトークン化を行いません。つまり各行の値全体が 1 つのトークンになります(関数 [array](/sql-reference/functions/array-functions.md/#array) も参照してください)。 - -:::note -`splitByString` トークナイザーは、左から右へ区切り文字列を順に適用します。 -これにより曖昧さが生じる場合があります。 -たとえば、区切り文字列を `['%21', '%']` とすると `%21abc` は `['abc']` にトークン化されますが、区切り文字列の順序を `['%', '%21']` と入れ替えると、出力は `['21abc']` になります。 -多くの場合、より長い区切り文字列が優先的にマッチすることを期待するでしょう。 -これは一般には、区切り文字列を長いものから短いものの順に渡すことで実現できます。 -区切り文字列が [prefix code](https://en.wikipedia.org/wiki/Prefix_code) を形成している場合は、任意の順序で渡すことができます。 -::: - - -:::warning -現時点では、中国語などの非西洋言語のテキストに対してテキストインデックスを構築することは推奨されません。 -現在サポートされているトークナイザーでは、インデックスサイズの肥大化とクエリ時間の増大を引き起こす可能性があります。 -今後、これらのケースをより適切に処理する言語固有の専用トークナイザーを追加する予定です。 -::: - -トークナイザーが入力文字列をどのように分割するかをテストするには、ClickHouseの[tokens](/sql-reference/functions/splitting-merging-functions.md/#tokens)関数を使用します: - -例: - -```sql -SELECT tokens('abc def', 'ngrams', 3); -``` - -結果: - -```result -['abc','bc ','c d',' de','def'] -``` - -**プリプロセッサ引数(オプション)**。`preprocessor`引数は、トークン化の前に入力文字列に適用される式です。 - -プリプロセッサ引数の典型的な使用例には以下が含まれます - -1. 大文字小文字を区別しないマッチングを可能にするための小文字化または大文字化。例:[lower](/sql-reference/functions/string-functions.md/#lower)、[lowerUTF8](/sql-reference/functions/string-functions.md/#lowerUTF8)。以下の最初の例を参照してください。 -2. UTF-8正規化。例:[normalizeUTF8NFC](/sql-reference/functions/string-functions.md/#normalizeUTF8NFC)、[normalizeUTF8NFD](/sql-reference/functions/string-functions.md/#normalizeUTF8NFD)、[normalizeUTF8NFKC](/sql-reference/functions/string-functions.md/#normalizeUTF8NFKC)、[normalizeUTF8NFKD](/sql-reference/functions/string-functions.md/#normalizeUTF8NFKD)、[toValidUTF8](/sql-reference/functions/string-functions.md/#toValidUTF8)。 -3. 不要な文字または部分文字列の削除または変換。例:[extractTextFromHTML](/sql-reference/functions/string-functions.md/#extractTextFromHTML)、[substring](/sql-reference/functions/string-functions.md/#substring)、[idnaEncode](/sql-reference/functions/string-functions.md/#idnaEncode)。 - -プリプロセッサ式は、[String](/sql-reference/data-types/string.md)型または[FixedString](/sql-reference/data-types/fixedstring.md)型の入力値を同じ型の値に変換する必要があります。 - -例: - -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(col))` -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = substringIndex(col, '\n', 1))` -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(extractTextFromHTML(col))` - -また、プリプロセッサ式は、テキストインデックスが定義されている列のみを参照する必要があります。 -非決定的関数の使用は許可されていません。 - -関数[hasToken](/sql-reference/functions/string-search-functions.md/#hasToken)、[hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens)、[hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens)は、プリプロセッサを使用して検索語をトークン化する前にまず変換します。 - -例えば、 - -```sql -CREATE TABLE tab -( - key UInt64, - str String, - INDEX idx(str) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(str)) -) -ENGINE = MergeTree -ORDER BY tuple(); - -SELECT count() FROM tab WHERE hasToken(str, 'Foo'); -``` - -は以下と等価です: - -```sql -CREATE TABLE tab -( - key UInt64, - str String, - INDEX idx(lower(str)) TYPE text(tokenizer = 'splitByNonAlpha') -) -ENGINE = MergeTree -ORDER BY tuple(); - -SELECT count() FROM tab WHERE hasToken(str, lower('Foo')); -``` - -**その他の引数(オプション)**。ClickHouseのテキストインデックスは[セカンダリインデックス](/engines/table-engines/mergetree-family/mergetree.md/#skip-index-types)として実装されています。 -ただし、他のスキップインデックスとは異なり、テキストインデックスのデフォルトのインデックスGRANULARITYは64です。 -この値は経験的に選択されており、ほとんどの使用例において速度とインデックスサイズの適切なトレードオフを提供します。 -上級ユーザーは異なるインデックス粒度を指定できます(ただし、推奨しません)。 - -
- -オプションの高度なパラメータ - -以下の高度なパラメータのデフォルト値は、ほぼすべての状況で適切に機能します。 -これらの変更は推奨しません。 - -オプションパラメータ`dictionary_block_size`(デフォルト:128)は、辞書ブロックのサイズを行数で指定します。 - -オプションパラメータ`dictionary_block_frontcoding_compression`(デフォルト:1)は、辞書ブロックが圧縮としてフロントコーディングを使用するかどうかを指定します。 - -オプションパラメータ`max_cardinality_for_embedded_postings`(デフォルト:16)は、ポスティングリストを辞書ブロックに埋め込むべきカーディナリティの閾値を指定します。 - - -オプションパラメータ `bloom_filter_false_positive_rate`(デフォルト: 0.1)は、辞書ブルームフィルタの偽陽性率を指定します。 - -
- -テキストインデックスは、テーブル作成後にカラムへ追加または削除することができます: - -```sql -ALTER TABLE tab DROP INDEX text_idx; -ALTER TABLE tab ADD INDEX text_idx(s) TYPE text(tokenizer = splitByNonAlpha); -``` - - -## テキストインデックスの使用 - -SELECT クエリでテキストインデックスを使用するのは簡単で、一般的な文字列検索関数では自動的にインデックスが利用されます。 -インデックスが存在しない場合、以下の文字列検索関数は低速な総当たりスキャンによる処理にフォールバックします。 - -### サポートされている関数 - -SELECT クエリの `WHERE` 句でテキスト関数が使用されている場合、テキストインデックスを利用できます。 - -```sql -SELECT [...] -FROM [...] -WHERE string_search_function(column_with_text_index) -``` - -#### `=` と `!=` - -`=` ([equals](/sql-reference/functions/comparison-functions.md/#equals)) と `!=` ([notEquals](/sql-reference/functions/comparison-functions.md/#notEquals)) は、指定された検索語全体と一致します。 - -例: - -```sql -SELECT * from tab WHERE str = 'こんにちは'; -``` - -テキストインデックスは `=` と `!=` をサポートしますが、等値・不等値検索が意味を持つのは `array` トークナイザを使用する場合のみです(このトークナイザではインデックスに行全体の値が保存されます)。 - -#### `IN` と `NOT IN` - -`IN`([`in`](/sql-reference/functions/in-functions))と `NOT IN`([`notIn`](/sql-reference/functions/in-functions))は `equals` および `notEquals` 関数と似ていますが、検索語句のすべてに一致するもの(`IN`)、あるいはどれにも一致しないもの(`NOT IN`)を判定します。 - -例: - -```sql -SELECT * from tab WHERE str IN ('Hello', 'World'); -``` - -`=` および `!=` に対する制限と同じ制限が適用されます。つまり、`IN` と `NOT IN` は `array` トークナイザーと組み合わせて使用する場合にのみ意味があります。 - -#### `LIKE`、`NOT LIKE` および `match` - -:::note -これらの関数がフィルタリングのためにテキストインデックスを使用するのは、インデックストークナイザーが `splitByNonAlpha` または `ngrams` のいずれかである場合に限られます。 -::: - -テキストインデックスで `LIKE` ([like](/sql-reference/functions/string-search-functions.md/#like))、`NOT LIKE` ([notLike](/sql-reference/functions/string-search-functions.md/#notLike))、および [match](/sql-reference/functions/string-search-functions.md/#match) 関数を使用するには、ClickHouse が検索語句から完全なトークンを抽出できる必要があります。 - -例: - -```sql -SELECT count() FROM tab WHERE comment LIKE 'support%'; -``` - -この例の `support` は、`support`、`supports`、`supporting` などにマッチする可能性があります。 -この種のクエリは部分文字列クエリであり、テキストインデックスによって高速化することはできません。 - -LIKE クエリでテキストインデックスを活用するには、LIKE パターンを次のように書き換える必要があります。 - -```sql -SELECT count() FROM tab WHERE comment LIKE ' support %'; -- または `% support %` -``` - -`support` の左右に空白を入れておくと、その語をトークンとして抽出できるようになります。 - -#### `startsWith` と `endsWith` - -`LIKE` と同様に、関数 [startsWith](/sql-reference/functions/string-functions.md/#startsWith) と [endsWith](/sql-reference/functions/string-functions.md/#endsWith) は、検索語から完全なトークンを抽出できる場合にのみテキストインデックスを使用できます。 - -例: - -```sql -SELECT count() FROM tab WHERE startsWith(comment, 'clickhouse support'); -``` - -この例では、`clickhouse` だけがトークンとして扱われます。 -`support` は `support`、`supports`、`supporting` などにマッチする可能性があるため、トークンとはみなされません。 - -`clickhouse supports` で始まるすべての行を見つけるには、検索パターンの末尾にスペースを 1 つ追加してください: - -```sql -startsWith(comment, 'clickhouse supports ')` -``` - -同様に、`endsWith` も先頭にスペースを付けて使用します。 - -```sql -SELECT count() FROM tab WHERE endsWith(comment, ' olap engine'); -``` - -#### `hasToken` と `hasTokenOrNull` - -関数 [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken) および [hasTokenOrNull](/sql-reference/functions/string-search-functions.md/#hasTokenOrNull) は、指定された単一のトークンを対象にマッチングを行います。 - -前述の関数とは異なり、これらは検索語句をトークン化せず、入力が単一のトークンであると仮定します。 - -例: - -```sql -SELECT count() FROM tab WHERE hasToken(comment, 'clickhouse'); -``` - -関数 `hasToken` と `hasTokenOrNull` は、`text` インデックスと組み合わせて使用する関数として最も高いパフォーマンスを発揮します。 - -#### `hasAnyTokens` と `hasAllTokens` - - -関数 [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) と [hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) は、指定されたトークンの一部またはすべてにマッチします。 - -これら 2 つの関数は、検索トークンを、インデックス列で使用されるものと同じトークナイザでトークン化される文字列として、または検索前にトークナイズ処理を行わない、すでにトークン化済みのトークン配列として受け取ります。 -詳細については、それぞれの関数のドキュメントを参照してください。 - -例: - -```sql --- 検索トークンを文字列引数として渡す -SELECT count() FROM tab WHERE hasAnyTokens(comment, 'clickhouse olap'); -SELECT count() FROM tab WHERE hasAllTokens(comment, 'clickhouse olap'); - --- 検索トークンをArray(String)として渡す -SELECT count() FROM tab WHERE hasAnyTokens(comment, ['clickhouse', 'olap']); -SELECT count() FROM tab WHERE hasAllTokens(comment, ['clickhouse', 'olap']); -``` - -#### `has` - -配列関数 [has](/sql-reference/functions/array-functions#has) は、文字列配列内の単一のトークンとの一致を判定します。 - -例: - -```sql -SELECT count() FROM tab WHERE has(array, 'clickhouse'); -``` - -#### `mapContains` - -関数 [mapContains](/sql-reference/functions/tuple-map-functions#mapcontains)(`mapContainsKey` のエイリアス)は、マップのキーに含まれる単一のトークンにマッチさせます。 - -例: - -```sql -SELECT count() FROM tab WHERE mapContainsKey(map, 'clickhouse'); --- または -SELECT count() FROM tab WHERE mapContains(map, 'clickhouse'); -``` - -#### `operator[]` - -アクセス演算子 [operator[]](/sql-reference/operators#access-operators)は、テキストインデックスと併用してキーおよび値をフィルタリングするために使用できます。 - -例: - -```sql -SELECT count() FROM tab WHERE map['engine'] = 'clickhouse'; -``` - -`Array(T)` 型および `Map(K, V)` 型のカラムをテキストインデックスと併用する場合の例を以下に示します。 - -### テキストインデックスを使用した `Array` および `Map` カラムの例 - -#### Array(String) カラムへのインデックス作成 - -ブログプラットフォームを想像してください。著者はキーワードを使って自身のブログ記事にカテゴリー付けを行います。 -ユーザーには、トピックを検索したりクリックしたりすることで関連するコンテンツを見つけてほしいと考えています。 - -次のようなテーブル定義を想定します。 - -```sql -CREATE TABLE posts ( - post_id UInt64, - title String, - content String, - keywords Array(String) -) -ENGINE = MergeTree -ORDER BY (post_id); -``` - -テキストインデックスが存在しない場合、特定のキーワード(例:`clickhouse`)を含む投稿を見つけるには、すべてのエントリを全件スキャンする必要があります。 - -```sql -SELECT count() FROM posts WHERE has(keywords, 'clickhouse'); -- 低速なフルテーブルスキャン - 全投稿の全キーワードを確認 -``` - -プラットフォームが成長するにつれて、クエリはすべての行の `keywords` 配列を走査する必要があるため、次第に処理が遅くなっていきます。 -このパフォーマンス上の問題を解決するために、列 `keywords` に対してテキストインデックスを定義します。 - -```sql -ALTER TABLE posts ADD INDEX keywords_idx(keywords) TYPE text(tokenizer = splitByNonAlpha); -ALTER TABLE posts MATERIALIZE INDEX keywords_idx; -- 既存データに対してインデックスを再構築してください -``` - -#### Map 列のインデックス作成 - -多くのオブザーバビリティのユースケースでは、ログメッセージは「コンポーネント」に分割され、タイムスタンプには日時型、ログレベルには enum 型など、適切なデータ型で保存されます。 -メトリクスのフィールドはキーと値のペアとして保存するのが最適です。 -運用チームは、デバッグ、セキュリティインシデント、監視のために、ログを効率的に検索する必要があります。 - -次のような logs テーブルを考えます: - -```sql -CREATE TABLE logs ( - id UInt64, - timestamp DateTime, - message String, - attributes Map(String, String) -) -ENGINE = MergeTree -ORDER BY (timestamp); -``` - -テキストインデックスがない場合、[Map](/sql-reference/data-types/map.md) 型データを検索するには、テーブルのフルスキャンが必要になります。 - -```sql --- レート制限データを含むすべてのログを検索: -SELECT count() FROM logs WHERE has(mapKeys(attributes), 'rate_limit'); -- 低速なフルテーブルスキャン - --- 特定のIPからのすべてのログを検索: -SELECT count() FROM logs WHERE has(mapValues(attributes), '192.168.1.1'); -- 低速なフルテーブルスキャン -``` - -ログ量が増加すると、これらのクエリは遅くなります。 - -解決策は、[Map](/sql-reference/data-types/map.md) のキーと値に対してテキストインデックスを作成することです。 -フィールド名や属性タイプでログを検索する必要がある場合は、[mapKeys](/sql-reference/functions/tuple-map-functions.md/#mapkeys) を使用してテキストインデックスを作成します。 - - -```sql -ALTER TABLE logs ADD INDEX attributes_keys_idx mapKeys(attributes) TYPE text(tokenizer = array); -ALTER TABLE posts MATERIALIZE INDEX attributes_keys_idx; -``` - -属性の実際の内容を検索する必要がある場合は、[mapValues](/sql-reference/functions/tuple-map-functions.md/#mapvalues) を使用してテキストインデックスを作成します。 - -```sql -ALTER TABLE logs ADD INDEX attributes_vals_idx mapValues(attributes) TYPE text(tokenizer = array); -ALTER TABLE posts MATERIALIZE INDEX attributes_vals_idx; -``` - -クエリの例: - -```sql --- レート制限されたリクエストをすべて検索: -SELECT * FROM logs WHERE mapContainsKey(attributes, 'rate_limit'); -- fast - --- 特定のIPアドレスからのログをすべて検索: -SELECT * FROM logs WHERE has(mapValues(attributes), '192.168.1.1'); -- fast -``` - - -## パフォーマンスチューニング - -### 直接読み取り - -特定の種類のテキストクエリは、「direct read」と呼ばれる最適化によって大幅に高速化されます。 -より正確には、`SELECT` クエリがテキスト列を *選択しない* 場合に、この最適化を適用できます。 - -例: - -```sql -SELECT column_a, column_b, ... -- 注: column_with_text_indexは含めない -FROM [...] -WHERE string_search_function(column_with_text_index) -``` - -ClickHouse におけるダイレクトリード最適化は、基盤となるテキスト列にアクセスせずに、テキストインデックスのみ(すなわちテキストインデックスのルックアップ)の使用によってクエリに応答します。 -テキストインデックスのルックアップは比較的少量のデータしか読み取らないため、ClickHouse の通常のスキップインデックス(スキップインデックスのルックアップの後に、残った granule の読み込みとフィルタリングを行う)よりもはるかに高速です。 - -ダイレクトリードは次の 2 つの設定で制御されます。 - -* 設定 [query_plan_direct_read_from_text_index](../../../operations/settings/settings#query_plan_direct_read_from_text_index) は、ダイレクトリードを全体として有効にするかどうかを指定します。 -* 設定 [use_skip_indexes_on_data_read](../../../operations/settings/settings#use_skip_indexes_on_data_read) は、ダイレクトリードのもう 1 つの前提条件です。ClickHouse データベースで [compatibility](../../../operations/settings/settings#compatibility) < 25.10 の場合、`use_skip_indexes_on_data_read` は無効化されているため、compatibility 設定値を引き上げるか、明示的に `SET use_skip_indexes_on_data_read = 1` と設定する必要があります。 - -また、ダイレクトリードを利用するには、テキストインデックスが完全にマテリアライズされている必要があります(そのためには `ALTER TABLE ... MATERIALIZE INDEX` を使用します)。 - -**サポートされている関数** -ダイレクトリード最適化は、`hasToken`、`hasAllTokens`、`hasAnyTokens` 関数をサポートします。 -これらの関数は AND、OR、NOT 演算子と組み合わせることもできます。 -WHERE 句には、(テキスト列やその他の列に対する)追加の非テキスト検索関数によるフィルタも含めることができます。その場合でもダイレクトリード最適化は使用されますが、効果は小さくなります(サポートされているテキスト検索関数にのみ適用されるため)。 - -クエリがダイレクトリードを利用しているかを確認するには、`EXPLAIN PLAN actions = 1` を指定してクエリを実行します。 -例として、ダイレクトリードを無効にしたクエリは次のようになります - -```sql -EXPLAIN PLAN actions = 1 -SELECT count() -FROM tab -WHERE hasToken(col, 'some_token') -SETTINGS query_plan_direct_read_from_text_index = 0, -- disable direct read - use_skip_indexes_on_data_read = 1; -``` - -戻り値 - -```text -[...] -Filter ((WHERE + 列名を列識別子に変更)) -Filter column: hasToken(__table1.col, 'some_token'_String) (削除済み) -Actions: INPUT : 0 -> col String : 0 - COLUMN Const(String) -> 'some_token'_String String : 1 - FUNCTION hasToken(col :: 0, 'some_token'_String :: 1) -> hasToken(__table1.col, 'some_token'_String) UInt8 : 2 -[...] -``` - -一方、同じクエリを `query_plan_direct_read_from_text_index = 1` を指定して実行すると - -```sql -EXPLAIN PLAN actions = 1 -SELECT count() -FROM tab -WHERE hasToken(col, 'some_token') -SETTINGS query_plan_direct_read_from_text_index = 1, -- enable direct read - use_skip_indexes_on_data_read = 1; -``` - -戻り値 - -```text -[...] -Expression (Before GROUP BY) -Positions: - Filter - Filter column: __text_index_idx_hasToken_94cc2a813036b453d84b6fb344a63ad3 (removed) - Actions: INPUT :: 0 -> __text_index_idx_hasToken_94cc2a813036b453d84b6fb344a63ad3 UInt8 : 0 -[...] -``` - -2番目の EXPLAIN PLAN の出力には、仮想カラム `__text_index___` が含まれます。 -このカラムが存在する場合は、直接読み出しが使用されています。 - -### キャッシュ - -テキストインデックスの一部をメモリ上でバッファリングするために、複数のキャッシュが利用可能です([Implementation Details](#implementation) セクションを参照)。 -現在、I/O を削減するために、テキストインデックスのデシリアライズ済みディクショナリブロック、ヘッダー、およびポスティングリスト用のキャッシュが用意されています。 -これらは設定 [use_text_index_dictionary_cache](/operations/settings/settings#use_text_index_dictionary_cache)、[use_text_index_header_cache](/operations/settings/settings#use_text_index_header_cache)、および [use_text_index_postings_cache](/operations/settings/settings#use_text_index_postings_cache) によって有効化できます。 -デフォルトでは、すべてのキャッシュは無効になっています。 - -キャッシュを設定するには、以下のサーバー設定を参照してください。 - -#### ディクショナリブロックキャッシュの設定 - - -| Setting | Description | -|----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------| -| [text_index_dictionary_block_cache_policy](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_policy) | テキストインデックス辞書ブロックキャッシュのポリシー名。 | -| [text_index_dictionary_block_cache_size](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_size) | キャッシュの最大サイズ(バイト単位)。 | -| [text_index_dictionary_block_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_max_entries) | キャッシュ内のデシリアライズ済み辞書ブロックの最大数。 | -| [text_index_dictionary_block_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_size_ratio) | テキストインデックス辞書ブロックキャッシュにおける保護キューのサイズの、キャッシュ全体サイズに対する割合。 | - -#### ヘッダーキャッシュ設定 {#caching-header} - -| Setting | Description | -|--------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------| -| [text_index_header_cache_policy](/operations/server-configuration-parameters/settings#text_index_header_cache_policy) | テキストインデックスヘッダーキャッシュのポリシー名。 | -| [text_index_header_cache_size](/operations/server-configuration-parameters/settings#text_index_header_cache_size) | キャッシュの最大サイズ(バイト単位)。 | -| [text_index_header_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_header_cache_max_entries) | キャッシュ内のデシリアライズ済みヘッダーの最大数。 | -| [text_index_header_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_header_cache_size_ratio) | テキストインデックスヘッダーキャッシュにおける保護キューのサイズの、キャッシュ全体サイズに対する割合。 | - -#### ポスティングリストキャッシュ設定 {#caching-posting-lists} - -| Setting | Description | -|---------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| [text_index_postings_cache_policy](/operations/server-configuration-parameters/settings#text_index_postings_cache_policy) | テキストインデックスのポスティングリストキャッシュのポリシー名。 | -| [text_index_postings_cache_size](/operations/server-configuration-parameters/settings#text_index_postings_cache_size) | キャッシュの最大サイズ(バイト単位)。 | -| [text_index_postings_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_postings_cache_max_entries) | キャッシュ内のデシリアライズ済みポスティングの最大数。 | -| [text_index_postings_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_postings_cache_size_ratio) | テキストインデックスのポスティングリストキャッシュにおける保護キューのサイズの、キャッシュ全体サイズに対する割合。 | - - - -## 実装の詳細 {#implementation} - -各テキストインデックスは、2 つの(抽象的な)データ構造から構成されます: -- 各トークンをポスティングリストにマッピングする辞書 -- 各々が行番号の集合を表すポスティングリストの集合 - -テキストインデックスはスキップインデックスであるため、これらのデータ構造は論理的にはインデックスグラニュール単位で存在します。 - -インデックス作成時には、3 つのファイルが(パートごとに)作成されます。 - -**Dictionary blocks file (.dct)** - -インデックスグラニュール内のトークンはソートされ、128 トークンごとの辞書ブロックに格納されます(ブロックサイズはパラメータ `dictionary_block_size` で設定可能です)。 -Dictionary blocks file (.dct) は、あるパート内のすべてのインデックスグラニュールに対するすべての辞書ブロックから構成されます。 - -**Index granules file (.idx)** - -Index granules file (.idx) には、各辞書ブロックについて、そのブロックの先頭トークン、dictionary blocks file 内での相対オフセット、そしてブロック内のすべてのトークンに対するブルームフィルタが含まれます。 -この疎なインデックス構造は、ClickHouse の [sparse primary key index](https://clickhouse.com/docs/guides/best-practices/sparse-primary-indexes) と類似しています。 -ブルームフィルタにより、検索対象のトークンが辞書ブロックに含まれていない場合、その辞書ブロックを早期にスキップできます。 - -**Postings lists file (.pst)** - -すべてのトークンに対するポスティングリストは、postings lists file 内に連続して配置されます。 -ストレージ容量を節約しつつ、高速な積集合および和集合の演算を可能にするため、ポスティングリストは [roaring bitmaps](https://roaringbitmap.org/) として保存されます。 -ポスティングリストの基数が 16 未満の場合(パラメータ `max_cardinality_for_embedded_postings` で設定可能)、そのリストは辞書内に埋め込まれます。 - - - -## 例:Hackernews データセット - -大量のテキストを含む大規模なデータセットに対するテキストインデックスのパフォーマンス向上を確認していきます。 -ここでは、人気サイトである Hacker News 上のコメント 2,870 万件を使用します。 -以下はテキストインデックスを作成していないテーブルです: - -```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); -``` - -この 2,870 万行は 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'); -``` - -`ALTER TABLE` を使用して comment 列にテキストインデックスを追加し、次にそれをマテリアライズします: - -```sql --- インデックスを追加 -ALTER TABLE hackernews ADD INDEX comment_idx(comment) TYPE text(tokenizer = splitByNonAlpha); - --- 既存データのインデックスをマテリアライズ -ALTER TABLE hackernews MATERIALIZE INDEX comment_idx SETTINGS mutations_sync = 2; -``` - -では、`hasToken`、`hasAnyTokens`、`hasAllTokens` 関数を使ってクエリを実行してみます。 -次の例では、標準的なインデックススキャンとダイレクトリード最適化の間で、どれほど大きな性能差が生じるかを示します。 - -### 1. `hasToken` を使用する - -`hasToken` は、テキストに特定の単一トークンが含まれているかどうかをチェックします。 -ここでは大文字小文字を区別して、`ClickHouse` というトークンを検索します。 - -**ダイレクトリード無効(標準スキャン)** -デフォルトでは、ClickHouse はスキップインデックスを使ってグラニュールをフィルタリングし、そのグラニュールに対してカラムデータを読み込みます。 -ダイレクトリードを無効にすることで、この動作をシミュレートできます。 - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 516 │ -└─────────┘ - -1行のセット。経過時間: 0.362秒。処理: 2490万行、9.51 GB -``` - -**ダイレクトリード有効(高速インデックス読み取り)** -次に、デフォルトで有効になっているダイレクトリードを使用して同じクエリを実行します。 - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 516 │ -└─────────┘ - -1 row in set. 経過時間: 0.008秒 処理行数: 315万行、3.15 MB -``` - -直接読み取りクエリは 45 倍以上高速 (0.362s 対 0.008s) で、インデックスのみを読み取ることで処理するデータ量も大幅に削減されます (9.51 GB 対 3.15 MB)。 - -### 2. `hasAnyTokens` を使用する - -`hasAnyTokens` は、テキストに指定したトークンのうち少なくとも 1 つが含まれているかどうかをチェックします。 -ここでは、'love' または 'ClickHouse' のいずれかを含むコメントを検索します。 - -**直接読み取り無効(標準スキャン)** - -```sql -SELECT count() -FROM hackernews -WHERE hasAnyTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 408426 │ -└─────────┘ - -1 row in set. Elapsed: 1.329 sec. Processed 28.74 million rows, 9.72 GB -``` - -**ダイレクト読み取り有効(高速インデックス読み出し)** - -```sql -SELECT count() -FROM hackernews -WHERE hasAnyTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 408426 │ -└─────────┘ -``` - - -1 行がセットに含まれています。経過時間: 0.015 秒。27.99 百万行、27.99 MB を処理しました。 - -```` -この一般的な「OR」検索では、高速化がさらに顕著です。 -フルカラムスキャンを回避することで、クエリは約89倍高速化されます(1.329秒 vs 0.015秒)。 - -### 3. `hasAllTokens`の使用 - -`hasAllTokens`は、テキストに指定されたすべてのトークンが含まれているかを確認します。 -'love'と'ClickHouse'の両方を含むコメントを検索します。 - -**ダイレクトリード無効(標準スキャン)** -ダイレクトリードが無効な場合でも、標準スキップインデックスは依然として有効です。 -2870万行を14.746万行にフィルタリングしますが、カラムから57.03 MBを読み取る必要があります。 - -```sql -SELECT count() -FROM hackernews -WHERE hasAllTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 11 │ -└─────────┘ - -1 row in set. Elapsed: 0.184 sec. Processed 147.46 thousand rows, 57.03 MB -```` - -**ダイレクトリード有効(高速インデックス読み取り)** -ダイレクトリードではインデックスデータに対してクエリを実行し、147.46 KB 分のみを読み取って結果を返します。 - -```sql -SELECT count() -FROM hackernews -WHERE hasAllTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 11 │ -└─────────┘ - -1行が返されました。経過時間: 0.007秒。処理された行数: 147.46千行、147.46 KB -``` - -この AND 検索では、ダイレクトリード最適化は標準のスキップインデックススキャンと比べて 26 倍以上高速です (0.184s 対 0.007s)。 - -### 4. 複合検索: OR, AND, NOT, ... - -ダイレクトリード最適化は、複合ブール式にも適用されます。 -ここでは、大文字小文字を区別しない検索で「ClickHouse」または「clickhouse」を検索します。 - -**ダイレクトリード無効時 (標準スキャン)** - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') OR hasToken(comment, 'clickhouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 769 │ -└─────────┘ - -1行が返されました。経過時間: 0.450秒。処理された行数: 2587万行、9.58 GB -``` - -**ダイレクトリードが有効(高速インデックス読み取り)** - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') OR hasToken(comment, 'clickhouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 769 │ -└─────────┘ - -1 row in set. Elapsed: 0.013 sec. Processed 25.87 million rows, 51.73 MB -``` - -インデックスの結果を組み合わせることで、直接読み取りクエリは 34 倍高速 (0.450 秒対 0.013 秒) になり、9.58 GB のカラムデータを読み込む必要がなくなります。 -この特定のケースでは、`hasAnyTokens(comment, ['ClickHouse', 'clickhouse'])` が推奨される、より効率的な構文です。 - - -## 関連コンテンツ {#related-content} - -- ブログ: [ClickHouse における転置インデックスの紹介](https://clickhouse.com/blog/clickhouse-search-with-inverted-indices) -- ブログ: [ClickHouse の全文検索の内部構造: 高速・ネイティブ・カラム型](https://clickhouse.com/blog/clickhouse-full-text-search) -- 動画: [全文検索インデックス: 設計と実験](https://www.youtube.com/watch?v=O_MnyUkrIq8) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md deleted file mode 100644 index a1f7a01e209..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md +++ /dev/null @@ -1,1189 +0,0 @@ ---- -description: '`MergeTree` ファミリーのテーブルエンジンは、高いデータ取り込み速度と大量のデータを扱うために設計されています。' -sidebar_label: 'MergeTree' -sidebar_position: 11 -slug: /engines/table-engines/mergetree-family/mergetree -title: 'MergeTree テーブルエンジン' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MergeTree テーブルエンジン - -`MergeTree` エンジンおよび `ReplacingMergeTree`、`AggregatingMergeTree` などの `MergeTree` ファミリーの他のエンジンは、ClickHouse で最も一般的に使用され、最も堅牢なテーブルエンジンです。 - -`MergeTree` ファミリーのテーブルエンジンは、高いデータ取り込みレートと膨大なデータ量を扱えるように設計されています。 -INSERT 操作によりテーブルパーツが作成され、それらはバックグラウンドプロセスによって他のテーブルパーツとマージされます。 - -`MergeTree` ファミリーのテーブルエンジンの主な特長: - -- テーブルの主キーは、各テーブルパーツ内のソート順(クラスタ化インデックス)を決定します。主キーは個々の行ではなく、グラニュールと呼ばれる 8192 行のブロックを参照します。これにより、巨大なデータセットの主キーであっても主メモリに常駐できる程度に小さく保たれつつ、ディスク上のデータへの高速アクセスが可能になります。 - -- テーブルは任意のパーティション式を用いてパーティション分割できます。パーティションプルーニングにより、クエリが許す場合は読み取り対象からパーティションが除外されます。 - -- 高可用性、フェイルオーバー、およびゼロダウンタイムでのアップグレードのために、複数のクラスタノード間でデータをレプリケートできます。詳細は [Data replication](/engines/table-engines/mergetree-family/replication.md) を参照してください。 - -- `MergeTree` テーブルエンジンは、クエリ最適化を支援するために、さまざまな統計情報の種類とサンプリング手法をサポートします。 - -:::note -名前は似ていますが、[Merge](/engines/table-engines/special/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](/sql-reference/statements/create/table.md)文を参照してください。 - -### クエリ句 {#mergetree-query-clauses} - -#### ENGINE {#engine} - -`ENGINE` — エンジンの名前とパラメータ。`ENGINE = MergeTree()`。`MergeTree`エンジンにはパラメータがありません。 - -#### ORDER BY {#order_by} - -`ORDER BY` — ソートキー。 - -カラム名または任意の式のタプル。例: `ORDER BY (CounterID + 1, EventDate)`。 - -プライマリキーが定義されていない場合(つまり`PRIMARY KEY`が指定されていない場合)、ClickHouseはソートキーをプライマリキーとして使用します。 - -ソートが不要な場合は、`ORDER BY tuple()`という構文を使用できます。 -または、設定`create_table_empty_primary_key_by_default`が有効になっている場合、`ORDER BY ()`が`CREATE TABLE`文に暗黙的に追加されます。[プライマリキーの選択](#selecting-a-primary-key)を参照してください。 - -#### PARTITION BY {#partition-by} - -`PARTITION BY` — [パーティショニングキー](/engines/table-engines/mergetree-family/custom-partitioning-key.md)。オプション。ほとんどの場合、パーティションキーは不要です。パーティション分割が必要な場合でも、通常は月単位よりも細かいパーティションキーは必要ありません。パーティション分割はクエリを高速化しません(ORDER BY式とは対照的です)。過度に細かいパーティション分割は決して使用しないでください。クライアント識別子や名前でデータをパーティション分割しないでください(代わりに、クライアント識別子や名前をORDER BY式の最初のカラムにしてください)。 - -月単位でパーティション分割するには、`toYYYYMM(date_column)`式を使用します。ここで`date_column`は[Date](/sql-reference/data-types/date.md)型の日付を持つカラムです。この場合のパーティション名は`"YYYYMM"`形式になります。 - -#### PRIMARY KEY {#primary-key} - -`PRIMARY KEY` — [ソートキーと異なる](#choosing-a-primary-key-that-differs-from-the-sorting-key)場合のプライマリキー。オプション。 - -ソートキーを指定すると(`ORDER BY`句を使用)、暗黙的にプライマリキーが指定されます。 -通常、ソートキーに加えてプライマリキーを指定する必要はありません。 - -#### SAMPLE BY {#sample-by} - -`SAMPLE BY` — サンプリング式。オプション。 - -指定する場合は、プライマリキーに含まれている必要があります。 -サンプリング式は符号なし整数を返す必要があります。 - -例: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`。 - -#### TTL {#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 {#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](/sql-reference/statements/select/sample)句を定義すると、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](/sql-reference/data-types/date.md)型のカラムの名前。ClickHouseはこのカラムに基づいて月ごとのパーティションを自動的に作成します。パーティション名は`"YYYYMM"`形式です。 -- `sampling_expression` — サンプリング用の式。 -- `(primary, key)` — プライマリキー。型: [Tuple()](/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はマークを保存するインデックスファイルを作成します。各カラムについて、プライマリキーに含まれるかどうかに関わらず、ClickHouseは同じマークを保存します。これらのマークにより、カラムファイル内のデータを直接検索できます。 - -グラニュールのサイズは、テーブルエンジンの`index_granularity`および`index_granularity_bytes`設定によって制限されます。グラニュール内の行数は、行のサイズに応じて`[1, index_granularity]`の範囲内にあります。単一行のサイズが設定値より大きい場合、グラニュールのサイズは`index_granularity_bytes`を超えることがあります。この場合、グラニュールのサイズは行のサイズと等しくなります。 - - -## クエリにおける主キーとインデックス {#primary-keys-and-indexes-in-queries} - -`(CounterID, Date)` という主キーを例に取ります。この場合、ソートとインデックスは次のように図示できます: - -```text -Whole data: [---------------------------------------------] -CounterID: [aaaaaaaaaaaaaaaaaabbbbcdeeeeeeeeeeeeefgggggggghhhhhhhhhiiiiiiiiikllllllll] -Date: [1111111222222233331233211111222222333211111112122222223111112223311122333] -Marks: | | | | | | | | | | | - a,1 a,2 a,3 b,3 e,2 e,3 g,1 h,2 i,1 i,3 l,3 -Marks numbers: 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は一意な主キーを必要としません。同じ主キーを持つ複数の行を挿入できます。 - -`PRIMARY KEY` および `ORDER BY` 句で `Nullable` 型の式を使用できますが、強く非推奨です。この機能を有効にするには、[allow_nullable_key](/operations/settings/merge-tree-settings/#allow_nullable_key) 設定をオンにしてください。`ORDER BY` 句における `NULL` 値には [NULLS_LAST](/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](/engines/table-engines/mergetree-family/collapsingmergetree) および [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree.md) エンジンでデータパーツをマージする際に追加のロジックを提供する。 - - この場合、主キーとは異なる_ソートキー_を指定することが理にかなっています。 - -長い主キーは挿入パフォーマンスとメモリ消費に悪影響を及ぼしますが、主キーの余分な列は `SELECT` クエリ実行時のClickHouseのパフォーマンスには影響しません。 - -`ORDER BY tuple()` 構文を使用して、主キーなしでテーブルを作成できます。この場合、ClickHouseはデータを挿入順に格納します。`INSERT ... SELECT` クエリでデータを挿入する際にデータの順序を保持したい場合は、[max_insert_threads = 1](/operations/settings/settings#max_insert_threads) を設定してください。 - -初期順序でデータを選択するには、[シングルスレッド](/operations/settings/settings.md/#max_threads)の `SELECT` クエリを使用してください。 - -### ソートキーとは異なる主キーの選択 {#choosing-a-primary-key-that-differs-from-the-sorting-key} - - -プライマリキー(各マークに対してインデックスファイルに書き込まれる値の式)を、ソートキー(データパート内の行をソートするための式)とは異なるものとして指定することができます。この場合、プライマリキー式のタプルは、ソートキー式のタプルの接頭辞である必要があります。 - -この機能は、[SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree.md)および[AggregatingMergeTree](/engines/table-engines/mergetree-family/aggregatingmergetree.md)テーブルエンジンを使用する際に有用です。これらのエンジンを使用する一般的なケースでは、テーブルには2種類のカラムがあります:_ディメンション_と_メジャー_です。典型的なクエリは、任意の`GROUP BY`でメジャーカラムの値を集計し、ディメンションでフィルタリングします。SummingMergeTreeとAggregatingMergeTreeは、ソートキーの値が同じ行を集計するため、すべてのディメンションをソートキーに追加することが自然です。その結果、キー式は長いカラムのリストで構成され、このリストは新しく追加されるディメンションで頻繁に更新する必要があります。 - -この場合、効率的な範囲スキャンを提供する少数のカラムのみをプライマリキーに残し、残りのディメンションカラムをソートキーのタプルに追加することが合理的です。 - -ソートキーの[ALTER](/sql-reference/statements/alter/index.md)は軽量な操作です。新しいカラムがテーブルとソートキーに同時に追加される際、既存のデータパートを変更する必要がないためです。古いソートキーが新しいソートキーの接頭辞であり、新しく追加されたカラムにはデータが存在しないため、テーブル変更の時点でデータは古いソートキーと新しいソートキーの両方でソートされています。 - -### クエリにおけるインデックスとパーティションの使用 {#use-of-indexes-and-partitions-in-queries} - -`SELECT`クエリに対して、ClickHouseはインデックスが使用可能かどうかを分析します。`WHERE/PREWHERE`句に、等価または不等価比較演算を表す式(結合要素の1つとして、または全体として)がある場合、またはプライマリキーまたはパーティショニングキーに含まれるカラムや式、あるいはこれらのカラムの特定の部分的反復関数、またはこれらの式の論理関係に対して、固定接頭辞を持つ`IN`または`LIKE`がある場合、インデックスを使用できます。 - -したがって、プライマリキーの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](/operations/settings/settings.md/#force_index_by_date)および[force_primary_key](/operations/settings/settings#force_primary_key)設定を使用してください。 - -月次パーティショニングのキーにより、適切な範囲の日付を含むデータブロックのみを読み取ることができます。この場合、データブロックには多数の日付(最大で1か月全体)のデータが含まれる可能性があります。ブロック内では、データはプライマリキーでソートされており、プライマリキーの最初のカラムに日付が含まれていない場合があります。このため、プライマリキーの接頭辞を指定しない日付条件のみを使用するクエリでは、単一の日付に対するよりも多くのデータが読み取られることになります。 - -### 部分的に単調なプライマリキーに対するインデックスの使用 {#use-of-index-for-partially-monotonic-primary-keys} - - -例えば、月の日付を考えてみましょう。これらは1か月の間は[単調数列](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`個のグラニュール(グラニュールのサイズはテーブルエンジンの`index_granularity`設定で指定されます)で構成されるブロック上の指定された式に関する情報を集約します。その後、これらの集約は`SELECT`クエリで使用され、`where`句を満たさない大きなデータブロックをスキップすることで、ディスクから読み取るデータ量を削減します。 - -`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 -``` - -### スキップインデックスの種類 {#skip-index-types} - -`MergeTree`テーブルエンジンは以下の種類のスキップインデックスをサポートしています。 -スキップインデックスをパフォーマンス最適化に使用する方法の詳細については、 -["ClickHouseデータスキップインデックスの理解"](/optimize/skipping-indexes)を参照してください。 - -- [`MinMax`](#minmax)インデックス -- [`Set`](#set)インデックス -- [`bloom_filter`](#bloom-filter)インデックス -- [`ngrambf_v1`](#n-gram-bloom-filter)インデックス -- [`tokenbf_v1`](#token-bloom-filter)インデックス - -#### MinMaxスキップインデックス {#minmax} - -各インデックスグラニュールに対して、式の最小値と最大値が格納されます。 -(式が`tuple`型の場合、各タプル要素の最小値と最大値が格納されます。) - -```text title="構文" -minmax -``` - -#### Set {#set} - -各インデックスグラニュールに対して、指定された式の最大`max_rows`個のユニークな値が格納されます。 -`max_rows = 0`は「すべてのユニークな値を格納する」ことを意味します。 - -```text title="構文" -set(max_rows) -``` - -#### Bloomフィルタ {#bloom-filter} - -各インデックスグラニュールに対して、指定されたカラムの[Bloomフィルタ](https://en.wikipedia.org/wiki/Bloom_filter)を格納します。 - -```text title="構文" -bloom_filter([false_positive_rate]) -``` - -`false_positive_rate`パラメータは0から1の間の値を取ることができ(デフォルト: `0.025`)、偽陽性を生成する確率を指定します(これにより読み取るデータ量が増加します)。 - - -以下のデータ型がサポートされています: - -- `(U)Int*` -- `Float*` -- `Enum` -- `Date` -- `DateTime` -- `String` -- `FixedString` -- `Array` -- `LowCardinality` -- `Nullable` -- `UUID` -- `Map` - -:::note Mapデータ型: キーまたは値を使用したインデックス作成の指定 -`Map`データ型の場合、[`mapKeys`](/sql-reference/functions/tuple-map-functions.md/#mapkeys)または[`mapValues`](/sql-reference/functions/tuple-map-functions.md/#mapvalues)関数を使用して、キーまたは値のどちらに対してインデックスを作成するかを指定できます。 -::: - -#### N-gramブルームフィルタ {#n-gram-bloom-filter} - -各インデックスグラニュールに対して、指定されたカラムの[n-gram](https://en.wikipedia.org/wiki/N-gram)用の[ブルームフィルタ](https://en.wikipedia.org/wiki/Bloom_filter)を格納します。 - -```text title="構文" -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` | ブルームフィルタのハッシュ関数用のシード値。 | - -このインデックスは以下のデータ型でのみ動作します: - -- [`String`](/sql-reference/data-types/string.md) -- [`FixedString`](/sql-reference/data-types/fixedstring.md) -- [`Map`](/sql-reference/data-types/map.md) - -`ngrambf_v1`のパラメータを推定するには、以下の[ユーザー定義関数(UDF)](/sql-reference/statements/create/function.md)を使用できます。 - -```sql title="ngrambf_v1用のUDF" -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つのパラメータを指定する必要があります: - -- `total_number_of_all_grams` -- `probability_of_false_positives` - -例えば、グラニュールに`4300`個のngramがあり、偽陽性率を`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)のブルームフィルタ計算機を参照しています。 - -#### トークンブルームフィルタ {#token-bloom-filter} - -トークンブルームフィルタは`ngrambf_v1`と同じですが、ngramの代わりにトークン(英数字以外の文字で区切られたシーケンス)を格納します。 - -```text title="構文" -tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed) -``` - - -#### スパースグラムブルームフィルター {#sparse-grams-bloom-filter} - -スパースグラムブルームフィルターは`ngrambf_v1`と類似していますが、nグラムの代わりに[スパースグラムトークン](/sql-reference/functions/string-functions.md/#sparseGrams)を使用します。 - -```text title="構文" -sparse_grams(min_ngram_length, max_ngram_length, min_cutoff_length, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed) -``` - -### テキストインデックス {#text} - -全文検索をサポートしています。詳細は[こちら](invertedindexes.md)を参照してください。 - -#### ベクトル類似度 {#vector-similarity} - -近似最近傍探索をサポートしています。詳細は[こちら](annindexes.md)を参照してください。 - -### 関数のサポート {#functions-support} - -`WHERE`句の条件には、カラムを操作する関数の呼び出しが含まれます。カラムがインデックスの一部である場合、ClickHouseは関数を実行する際にこのインデックスの使用を試みます。ClickHouseは、インデックスを使用するための異なる関数のサブセットをサポートしています。 - -`set`型のインデックスはすべての関数で利用できます。その他のインデックス型は以下のようにサポートされています: - - -| 関数(演算子)/インデックス | 主キー | minmax | ngrambf_v1 | tokenbf_v1 | bloom_filter | text | sparse_grams | -| ------------------------------------------------------------------------------------------------------------------------- | --- | ------ | -------------- | -------------- | ---------------- | ---- | ---------------- | -| [equals(=, ==)](/sql-reference/functions/comparison-functions.md/#equals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [notEquals(!=, <>)](/sql-reference/functions/comparison-functions.md/#notEquals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [like](/sql-reference/functions/string-search-functions.md/#like) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [notLike](/sql-reference/functions/string-search-functions.md/#notLike) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [match](/sql-reference/functions/string-search-functions.md/#match) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [startsWith](/sql-reference/functions/string-functions.md/#startsWith) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [endsWith](/sql-reference/functions/string-functions.md/#endsWith) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [multiSearchAny](/sql-reference/functions/string-search-functions.md/#multiSearchAny) | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | ✗ | -| [in](/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [notIn](/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [より小さい (`<`)](/sql-reference/functions/comparison-functions.md/#less) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [大なり (`>`)](/sql-reference/functions/comparison-functions.md/#greater) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [lessOrEquals (`<=`)](/sql-reference/functions/comparison-functions.md/#lessOrEquals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [greaterOrEquals (`>=`)](/sql-reference/functions/comparison-functions.md/#greaterOrEquals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [empty](/sql-reference/functions/array-functions/#empty) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [notEmpty](/sql-reference/functions/array-functions/#notEmpty) | ✗ | ✔ | ✗ | ✗ | ✗ | ✗ | ✔ | -| [has](/sql-reference/functions/array-functions#has) | ✗ | ✗ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [hasAny](/sql-reference/functions/array-functions#hasAny) | ✗ | ✗ | ✔ | ✔ | ✔ | ✗ | ✔ | -| [hasAll](/sql-reference/functions/array-functions#hasAll) | ✗ | ✗ | ✔ | ✔ | ✔ | ✗ | ✔ | -| [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken) | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | ✗ | -| [hasTokenOrNull](/sql-reference/functions/string-search-functions.md/#hasTokenOrNull) | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | ✗ | -| [hasTokenCaseInsensitive (`*`)](/sql-reference/functions/string-search-functions.md/#hasTokenCaseInsensitive) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | -| [hasTokenCaseInsensitiveOrNull (`*`)](/sql-reference/functions/string-search-functions.md/#hasTokenCaseInsensitiveOrNull) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | -| [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | -| [hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | -| [mapContains](/sql-reference/functions/tuple-map-functions#mapcontains) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | - - - -`ngrambf_v1` では、定数引数が ngram のサイズより小さい関数はクエリ最適化に使用できません。 - -(*) `hasTokenCaseInsensitive` および `hasTokenCaseInsensitiveOrNull` を効果的に機能させるには、`tokenbf_v1` インデックスを小文字化したデータに対して作成する必要があります。例えば `INDEX idx (lower(str_col)) TYPE tokenbf_v1(512, 3, 0)` のようにします。 - -:::note -Bloom filter には偽陽性が発生する可能性があるため、`ngrambf_v1`、`tokenbf_v1`、`sparse_grams`、および `bloom_filter` インデックスは、関数の結果が false であることが期待されるクエリの最適化には使用できません。 - -例えば: - -- 最適化できるもの: - - `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} - -プロジェクションは[マテリアライズドビュー](/sql-reference/statements/create/view)に似ていますが、パートレベルで定義されます。クエリでの自動使用とともに一貫性を保証します。 - -:::note -プロジェクションを実装する際は、[force_optimize_projection](/operations/settings/settings#force_optimize_projection)設定も考慮してください。 -::: - -プロジェクションは[FINAL](/sql-reference/statements/select/from#final-modifier)修飾子を使用した`SELECT`文ではサポートされていません。 - -### プロジェクションクエリ {#projection-query} - -プロジェクションクエリはプロジェクションを定義するものです。親テーブルから暗黙的にデータを選択します。 -**構文** - -```sql -SELECT [GROUP BY] [ORDER BY] -``` - -プロジェクションは[ALTER](/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](/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)データ型として評価される必要があります。 - -**構文** - -カラムの有効期間を設定する: - -```sql -TTL time_column -TTL time_column + interval -``` - -`interval`を定義するには、[時間間隔](/sql-reference/operators#operators-for-working-with-dates-and-times)演算子を使用します。例: - -```sql -TTL date_time + INTERVAL 1 MONTH -TTL date_time + INTERVAL 15 HOUR -``` - -### カラムTTL {#mergetree-column-ttl} - -カラム内の値が期限切れになると、ClickHouseはそれらをカラムデータ型のデフォルト値で置き換えます。データパート内のすべてのカラム値が期限切れになった場合、ClickHouseはファイルシステム内のデータパートからこのカラムを削除します。 - -`TTL`句はキーカラムには使用できません。 - -**例** - -#### `TTL`を使用したテーブルの作成: {#creating-a-table-with-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を追加する {#adding-ttl-to-a-column-of-an-existing-table} - -```sql -ALTER TABLE tab - MODIFY COLUMN - c String TTL d + INTERVAL 1 DAY; -``` - -#### カラムのTTLを変更する {#altering-ttl-of-the-column} - -```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`句で明示的に設定されていない場合、結果行にはグループ化された行からの任意の値が含まれます(集約関数`any`が適用されたかのように)。 - -**例** - -#### `TTL`を使用したテーブルの作成: {#creating-a-table-with-ttl-1} - -```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`を変更する: {#altering-ttl-of-the-table} - -```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; -``` - -#### 期限切れの行が再圧縮されるテーブルの作成: {#creating-a-table-where-expired-rows-are-recompressed} - -```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} - -`TTL`が期限切れとなったデータは、ClickHouseがデータパートをマージする際に削除されます。 - -ClickHouseがデータの期限切れを検出すると、スケジュール外のマージを実行します。このようなマージの頻度を制御するには、`merge_with_ttl_timeout`を設定できます。値が低すぎると、多くのリソースを消費する可能性のあるスケジュール外のマージが頻繁に実行されます。 - -マージの間に`SELECT`クエリを実行すると、期限切れのデータが取得される可能性があります。これを回避するには、`SELECT`の前に[OPTIMIZE](/sql-reference/statements/optimize.md)クエリを使用してください。 - -**関連項目** - -- [ttl_only_drop_parts](/operations/settings/merge-tree-settings#ttl_only_drop_parts)設定 - - -## ディスクタイプ {#disk-types} - -ローカルブロックデバイスに加えて、ClickHouseは以下のストレージタイプをサポートしています: - -- [`s3` S3およびMinIO向け](#table_engine-mergetree-s3) -- [`gcs` GCS向け](/integrations/data-ingestion/gcs/index.md/#creating-a-disk) -- [`blob_storage_disk` Azure Blob Storage向け](/operations/storing-data#azure-blob-storage) -- [`hdfs` HDFS向け](/engines/table-engines/integrations/hdfs) -- [`web` Webからの読み取り専用アクセス向け](/operations/storing-data#web-storage) -- [`cache` ローカルキャッシュ向け](/operations/storing-data#using-local-cache) -- [`s3_plain` S3へのバックアップ向け](/operations/backup#backuprestore-using-an-s3-disk) -- [`s3_plain_rewritable` S3上の不変・非レプリケートテーブル向け](/operations/storing-data.md#s3-plain-rewritable-storage) - - -## データ保存のための複数のブロックデバイスを使用する {#table_engine-mergetree-multiple-volumes} - -### はじめに {#introduction} - -`MergeTree` ファミリーのテーブルエンジンは、複数のブロックデバイスにデータを格納できます。例えば、あるテーブルのデータが「ホット」と「コールド」に暗黙のうちに分けられる場合に有用です。最近のデータは頻繁にアクセスされますが、必要なストレージ容量は少量です。一方、ファットテールの古い履歴データはアクセス頻度が低いです。複数のディスクが利用可能な場合、「ホット」データは高速ディスク(例: NVMe SSD やメモリ内)に、「コールド」データは比較的低速なディスク(例: HDD)に配置できます。 - -データパーツは、`MergeTree` エンジンのテーブルにおける最小の移動単位です。一つのパーツに属するデータは一つのディスクに格納されます。データパーツは、バックグラウンドで(ユーザー設定に基づいて)ディスク間で移動でき、また [ALTER](/sql-reference/statements/alter/partition) クエリによっても移動可能です。 - -### 用語 {#terms} - -- Disk — ファイルシステムにマウントされたブロックデバイス。 -- Default disk — [path](/operations/server-configuration-parameters/settings.md/#path) サーバー設定で指定されたパスにデータを格納するディスク。 -- Volume — 同一のディスクからなる順序付き集合([JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures) に類似)。 -- Storage policy — ボリュームの集合と、それら間でデータを移動するためのルール。 - -記述されたエンティティの名前は、システムテーブル [system.storage_policies](/operations/system-tables/storage_policies) および [system.disks](/operations/system-tables/disks) で確認できます。構成済みのストレージポリシーのうちの一つをテーブルに適用するには、`MergeTree` エンジンファミリーテーブルの `storage_policy` 設定を使用します。 - -### 設定 {#table_engine-mergetree-multiple-volumes_configure} - -ディスク、ボリューム、およびストレージポリシーは、`config.d` ディレクトリのファイル内の `` タグで宣言します。 - -:::tip -ディスクはクエリの `SETTINGS` セクションで宣言することも可能です。これは、例えば URL でホストされたディスクを一時的にアタッチするアドホック分析に便利です。 -詳細は [dynamic storage](/operations/storing-data#dynamic-configuration) を参照してください。 -::: - -設定構造: - -```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` — データパーツ INSERT 時の TTL による移動を無効にします。デフォルト(有効な場合)では、TTL move ルールですでに期限切れとなっているデータパーツを挿入すると、直ちに移動ルールで指定されたボリューム/ディスクへ移動されます。宛先のボリューム/ディスクが低速(例:S3 のようなリモートストレージ)の場合、これは INSERT を大幅に遅くする可能性があります。無効にした場合、すでに期限切れのデータパーツはいったんデフォルトボリュームに書き込まれ、その直後に TTL ボリュームへ移動されます。 -* `load_balancing` - ディスクバランシングのポリシー。`round_robin` または `least_used`。 -* `least_used_ttl_ms` - すべてのディスクの利用可能な空き容量を更新するためのタイムアウト(ミリ秒単位)を設定します(`0` - 常に更新、`-1` - 決して更新しない、デフォルトは `60000`)。なお、そのディスクが ClickHouse のみで使用され、オンラインでのファイルシステムのサイズ変更(拡張/縮小)の対象とならない場合は `-1` を使用できます。それ以外のケースでは推奨されません。時間の経過とともに空き容量の把握が不正確になり、容量分布が偏る原因となるためです。 -* `prefer_not_to_merge` — この設定は使用しないでください。このボリューム上のデータパーツのマージを無効にします(有害であり、パフォーマンス低下を招きます)。この設定が有効な場合(有効にしないでください)、このボリューム上でのマージは許可されません(これは望ましくありません)。これにより(ただし、その必要はありません)、ClickHouse が低速ディスクをどのように扱うかを制御できますが(何かを制御したくなる時点で誤りです)、ClickHouse の方が適切に扱うため、この設定は使用しないでください。 -* `volume_priority` — ボリュームがどの優先度(順序)で埋められるかを定義します。値が小さいほど優先度が高くなります。パラメータ値は自然数でなければならず、1 から N(与えられた中で最も低い優先度)までの範囲を欠番なしで網羅する必要があります。 - * *すべての* ボリュームがタグ付けされている場合、それらは指定された順序で優先されます。 - * 一部のボリュームのみがタグ付けされている場合、タグのないボリュームは最も優先度が低く、設定ファイル内で定義された順序で優先されます。 - * *一つも* ボリュームがタグ付けされていない場合、その優先度は設定ファイル内で宣言された順序に対応して設定されます。 - * 2 つのボリュームが同じ優先度値を持つことはできません。 - -Configuration examples: - -```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 より大きいサイズのパーツはすべて、HDD ディスク `disk1` を含む `cold` ボリュームに直接格納されます。 -また、ディスク `fast_ssd` が 80% 以上満たされると、バックグラウンドプロセスによってデータが `disk1` に転送されます。 - -ストレージポリシー内のボリューム列挙の順序は、リストされたボリュームの少なくとも1つに明示的な `volume_priority` パラメータがない場合に重要です。 -ボリュームが満杯になると、データは次のボリュームに移動されます。ディスク列挙の順序も重要です。なぜなら、データは順番にディスクに格納されるためです。 - -テーブルを作成する際、構成されたストレージポリシーの1つを適用できます: - -```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` ストレージポリシーは、`` で指定された1つのディスクのみで構成される1つのボリュームのみを使用することを意味します。 -テーブル作成後に [ALTER TABLE ... MODIFY SETTING] クエリでストレージポリシーを変更できますが、新しいポリシーには同じ名前のすべての古いディスクとボリュームを含める必要があります。 - -データパーツのバックグラウンド移動を実行するスレッド数は、[background_move_pool_size](/operations/server-configuration-parameters/settings.md/#background_move_pool_size) 設定で変更できます。 - -### 詳細 {#details} - -`MergeTree` テーブルの場合、データは以下のさまざまな方法でディスクに書き込まれます: - -- 挿入の結果として(`INSERT` クエリ)。 -- バックグラウンドマージおよび [ミューテーション](/sql-reference/statements/alter#mutations) 中。 -- 別のレプリカからダウンロードする際。 -- パーティションフリーズの結果として [ALTER TABLE ... FREEZE PARTITION](/sql-reference/statements/alter/partition#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](/operations/system-tables/part_log)(フィールド `type = MOVE_PART`)および [system.parts](/operations/system-tables/parts.md)(フィールド `path` および `disk`)を使用できます。また、詳細情報はサーバーログで確認できます。 - -ユーザーは、クエリ [ALTER TABLE ... MOVE PART\|PARTITION ... TO VOLUME\|DISK ...](/sql-reference/statements/alter/partition) を使用して、パーツまたはパーティションをあるボリュームから別のボリュームに強制的に移動できます。バックグラウンド操作のすべての制限が考慮されます。このクエリは独自に移動を開始し、バックグラウンド操作の完了を待ちません。十分な空き容量がない場合、または必要な条件のいずれかが満たされていない場合、ユーザーはエラーメッセージを受け取ります。 - -データの移動はデータレプリケーションに干渉しません。したがって、異なるレプリカ上の同じテーブルに対して異なるストレージポリシーを指定できます。 - - -バックグラウンドで実行されるマージおよびミューテーションが完了した後、古いパーツは、一定時間(`old_parts_lifetime`)が経過してから削除されます。 -この間、それらは他のボリュームやディスクに移動されません。したがって、パーツが最終的に削除されるまでは、ディスク使用量の算出に引き続き含まれます。 - -ユーザーは、[min_bytes_to_rebalance_partition_over_jbod](/operations/settings/merge-tree-settings.md/#min_bytes_to_rebalance_partition_over_jbod) 設定を使用することで、新しい大きなパーツを [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures) ボリューム内の複数ディスクにバランス良く割り当てることができます。 - - - -## 外部ストレージを使用したデータ保存 {#table_engine-mergetree-s3} - -[MergeTree](/engines/table-engines/mergetree-family/mergetree.md)ファミリーのテーブルエンジンは、`s3`、`azure_blob_storage`、`hdfs`のディスクタイプを使用して、それぞれ`S3`、`AzureBlobStorage`、`HDFS`にデータを保存できます。詳細については、[外部ストレージオプションの設定](/operations/storing-data.md/#configuring-external-storage)を参照してください。 - -`s3`タイプのディスクを使用した外部ストレージとしての[S3](https://aws.amazon.com/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 - -
- ... -
-``` - -[外部ストレージオプションの設定](/operations/storing-data.md/#configuring-external-storage)も参照してください。 - -:::note キャッシュ設定 -ClickHouseバージョン22.3から22.7では異なるキャッシュ設定を使用します。これらのバージョンを使用している場合は、[ローカルキャッシュの使用](/operations/storing-data.md/#using-local-cache)を参照してください。 -::: - - -## 仮想カラム {#virtual-columns} - -- `_part` — パートの名前。 -- `_part_index` — クエリ結果内のパートの連番インデックス。 -- `_part_starting_offset` — クエリ結果内のパートの累積開始行。 -- `_part_offset` — パート内の行番号。 -- `_part_granule_offset` — パート内のグラニュール番号。 -- `_partition_id` — パーティションの名前。 -- `_part_uuid` — 一意のパート識別子(MergeTree設定`assign_part_uuids`が有効な場合)。 -- `_part_data_version` — パートのデータバージョン(最小ブロック番号またはミューテーションバージョンのいずれか)。 -- `_partition_value` — `partition by`式の値(タプル)。 -- `_sample_factor` — サンプリング係数(クエリより)。 -- `_block_number` — 挿入時に割り当てられた行の元のブロック番号。設定`enable_block_number_column`が有効な場合、マージ時に保持される。 -- `_block_offset` — 挿入時に割り当てられたブロック内の元の行番号。設定`enable_block_offset_column`が有効な場合、マージ時に保持される。 -- `_disk_name` — ストレージに使用されるディスク名。 - - -## カラム統計 {#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`を有効にした場合にのみ、prewhere最適化に使用できます。 - -### 利用可能なカラム統計のタイプ {#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} - -| | 等価フィルタ (==) | 範囲フィルタ (`>, >=, <, <=`) | -| -------- | --------------------- | ------------------------------ | -| 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](/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; -``` - -- 1つ以上の設定をリセットする。これによりテーブルのCREATEクエリのカラム式における設定宣言も削除されます。 - -```sql -ALTER TABLE tab MODIFY COLUMN document RESET SETTING min_compress_block_size; -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md deleted file mode 100644 index f99bba71216..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -description: 'MergeTree と異なり、同じソートキーの値(`ORDER BY` テーブルセクションで定義されるものであり、 - `PRIMARY KEY` ではありません)を持つ重複エントリを削除します。' -sidebar_label: 'ReplacingMergeTree' -sidebar_position: 40 -slug: /engines/table-engines/mergetree-family/replacingmergetree -title: 'ReplacingMergeTree テーブルエンジン' -doc_type: 'reference' ---- - - - -# ReplacingMergeTree テーブルエンジン - -このエンジンは、[MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) とは異なり、同じ[ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md)値(テーブル定義の `ORDER BY` セクションで指定されるもので、`PRIMARY KEY` ではありません)を持つ重複エントリを削除します。 - -データの重複排除はマージ時にのみ行われます。マージはバックグラウンドで不定のタイミングで実行されるため、そのタイミングを前提として計画することはできません。一部のデータは未処理のまま残る可能性があります。`OPTIMIZE` クエリを使用してオンデマンドでマージを実行することもできますが、`OPTIMIZE` クエリは大量のデータを読み書きするため、それに依存しないでください。 - -したがって、`ReplacingMergeTree` はバックグラウンドで重複データを削除してディスク使用量を削減する用途には適していますが、重複がまったく存在しないことを保証するものではありません。 - -:::note -ベストプラクティスやパフォーマンス最適化の方法を含む ReplacingMergeTree の詳細なガイドは[こちら](/guides/replacing-merge-tree)にあります。 -::: - - - -## テーブルを作成する - -```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` が指定されていない場合」のルールが適用されます。つまり、もっとも最近に挿入された行が残ります。 - -Example: - -```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` が使用されている場合にのみ有効化できます。 - -どのようなデータ操作であっても、バージョン番号は増加させる必要があります。2 つの挿入行が同じバージョン番号を持つ場合、後から挿入された行が保持されます。 - -デフォルトでは、ClickHouse はキーに対して最後の行を保持し、その行が削除行であっても保持します。これは、将来より低いバージョンの行が挿入された場合でも、安全に挿入でき、その削除行が引き続き適用されるようにするためです。 - -このような削除行を恒久的に削除するには、テーブル設定 `allow_experimental_replacing_merge_with_cleanup` を有効にし、次のいずれかを実行します。 - -1. テーブル設定 `enable_replacing_merge_with_cleanup_for_min_age_to_force_merge`、`min_age_to_force_merge_on_partition_only`、`min_age_to_force_merge_seconds` を設定します。パーティション内のすべてのパーツが `min_age_to_force_merge_seconds` より古い場合、ClickHouse はそれらを - 1 つのパーツにマージし、すべての削除行を削除します。 - -2. 手動で `OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP` を実行します。 - ::: - -Example: - -```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 │ -└─────┴─────────┴─────────────────────┴────────────┘ - -``` -``` - - -## クエリ句 {#query-clauses} - -`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` の詳細や `FINAL` のパフォーマンス最適化方法については、[ReplacingMergeTree に関する詳細ガイド](/guides/replacing-merge-tree) を参照することを推奨します。` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md deleted file mode 100644 index 6688eef453e..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md +++ /dev/null @@ -1,357 +0,0 @@ ---- -description: 'ClickHouse における Replicated* ファミリーのテーブルエンジンによるデータレプリケーションの概要' -sidebar_label: 'Replicated*' -sidebar_position: 20 -slug: /engines/table-engines/mergetree-family/replication -title: 'Replicated* テーブルエンジン' -doc_type: 'reference' ---- - - - -# Replicated* テーブルエンジン - -:::note -ClickHouse Cloud ではレプリケーションは自動的に管理されます。引数を追加せずにテーブルを作成してください。たとえば、以下のテキスト中の次の部分を置き換えてください: - -```sql -ENGINE = ReplicatedMergeTree( - '/clickhouse/tables/{shard}/table_name', - '{replica}' -) -``` - -次の内容で: - -```sql -ENGINE = ReplicatedMergeTree -``` - -::: - -レプリケーションは MergeTree ファミリーのテーブルに対してのみサポートされます: - -* ReplicatedMergeTree -* ReplicatedSummingMergeTree -* ReplicatedReplacingMergeTree -* ReplicatedAggregatingMergeTree -* ReplicatedCollapsingMergeTree -* ReplicatedVersionedCollapsingMergeTree -* ReplicatedGraphiteMergeTree - -レプリケーションはサーバー全体ではなく、個々のテーブル単位で行われます。1 つのサーバー上に、レプリケートされたテーブルとレプリケートされていないテーブルを同時に保持できます。 - -レプリケーションはシャーディングに依存しません。各シャードがそれぞれ独立してレプリケーションを行います。 - -`INSERT` および `ALTER` クエリで圧縮されたデータはレプリケートされます(詳細については、[ALTER](/sql-reference/statements/alter) のドキュメントを参照してください)。 - -`CREATE`、`DROP`、`ATTACH`、`DETACH`、`RENAME` クエリは単一のサーバー上で実行され、レプリケートされません: - -* `CREATE TABLE` クエリは、そのクエリが実行されたサーバー上に新しいレプリケート可能なテーブルを作成します。このテーブルがすでに他のサーバー上に存在する場合は、新しいレプリカを追加します。 -* `DROP TABLE` クエリは、そのクエリが実行されたサーバー上にあるレプリカを削除します。 -* `RENAME` クエリは、レプリカの 1 つにあるテーブルの名前を変更します。言い換えると、レプリケートされたテーブルは、レプリカごとに異なる名前を持つことができます。 - -ClickHouse はレプリカのメタ情報を保存するために [ClickHouse Keeper](/guides/sre/keeper/index.md) を使用します。ZooKeeper のバージョン 3.4.5 以降を使用することも可能ですが、ClickHouse Keeper を推奨します。 - -レプリケーションを使用するには、[zookeeper](/operations/server-configuration-parameters/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 クラスターに保存するには、次のように -ReplicatedMergeTree エンジンを指定してテーブルを作成する SQL を使用します。 - -```sql -CREATE TABLE table_name ( ... ) ENGINE = ReplicatedMergeTree('zookeeper_name_configured_in_auxiliary_zookeepers:path', 'replica_name') ... -``` - -任意の既存の ZooKeeper クラスターを指定でき、システムはそのクラスター上のディレクトリを自身のデータ用として使用します(このディレクトリはレプリケーテッドテーブルを作成するときに指定します)。 - -config ファイルで ZooKeeper が設定されていない場合、レプリケーテッドテーブルを作成できず、既存のレプリケーテッドテーブルは読み取り専用になります。 - - -ZooKeeper は `SELECT` クエリでは使用されません。これは、レプリケーションが `SELECT` のパフォーマンスに影響せず、レプリケートされていないテーブルと同じ速度でクエリが実行されるためです。分散レプリケートテーブルに対してクエリを実行する場合、ClickHouse の動作は設定項目 [max_replica_delay_for_distributed_queries](/operations/settings/settings.md/#max_replica_delay_for_distributed_queries) と [fallback_to_stale_replicas_for_distributed_queries](/operations/settings/settings.md/#fallback_to_stale_replicas_for_distributed_queries) によって制御されます。 - -各 `INSERT` クエリごとに、おおよそ 10 個のエントリが複数のトランザクションを通して ZooKeeper に追加されます。(より正確には、これは挿入される各データブロックごとです。1 つの `INSERT` クエリには 1 つのブロック、もしくは `max_insert_block_size = 1048576` 行ごとに 1 ブロックが含まれます。)このため、レプリケートされていないテーブルと比較して `INSERT` のレイテンシーがわずかに長くなります。ただし、1 秒あたり 1 回以下の `INSERT` でデータをバッチ挿入するという推奨事項に従えば、問題は発生しません。1 つの ZooKeeper クラスターをコーディネーションに使用している ClickHouse クラスター全体で、1 秒あたり数百件程度の `INSERT` が発生します。データ挿入時のスループット(1 秒あたりの行数)は、レプリケートされていないデータと同程度に高いままです。 - -非常に大規模なクラスターでは、シャードごとに別々の ZooKeeper クラスターを使用できます。しかし、運用クラスター(およそ 300 台のサーバー)での実運用経験からは、その必要性は確認されていません。 - -レプリケーションは非同期かつマルチマスターです。`INSERT` クエリ(および `ALTER`)は、利用可能な任意のサーバーに送信できます。データはクエリが実行されたサーバーに挿入され、その後他のサーバーへコピーされます。非同期であるため、最近挿入されたデータは、他のレプリカには一定のレイテンシーを伴って反映されます。一部のレプリカが利用できない場合、利用可能になった時点でデータが書き込まれます。レプリカが利用可能な場合、レイテンシーは圧縮データブロックをネットワーク経由で転送する時間に相当します。レプリケートテーブルに対してバックグラウンドタスクを実行するスレッド数は、[background_schedule_pool_size](/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) 設定で指定できます。 - -`ReplicatedMergeTree` エンジンは、レプリケーションのフェッチ用に専用のスレッドプールを使用します。プールのサイズは [background_fetches_pool_size](/operations/server-configuration-parameters/settings#background_fetches_pool_size) 設定によって制限されており、サーバーの再起動によって調整できます。 - -デフォルトでは、`INSERT` クエリは 1 つのレプリカからのデータ書き込みの確認だけを待ちます。もしデータが 1 つのレプリカにしか正常に書き込まれず、そのレプリカを持つサーバーが消失した場合、そのデータは失われます。複数のレプリカからの書き込み確認を有効にするには、`insert_quorum` オプションを使用します。 - -各データブロックはアトミックに書き込まれます。`INSERT` クエリは、最大 `max_insert_block_size = 1048576` 行までのブロックに分割されます。言い換えると、`INSERT` クエリの行数が 1048576 行未満であれば、そのクエリ全体がアトミックに処理されます。 - -データブロックは重複排除されます。同じデータブロック(同じサイズで、同じ行が同じ順序で含まれているデータブロック)を複数回書き込もうとした場合、そのブロックは 1 度だけ書き込まれます。これは、ネットワーク障害が発生した際に、クライアントアプリケーション側でデータが DB に書き込まれたかどうかを判断できない場合でも、`INSERT` クエリを単純に再送できるようにするためです。同一データを持つ `INSERT` がどのレプリカに送信されたかは関係ありません。`INSERTs` は冪等です。重複排除のパラメータは、[merge_tree](/operations/server-configuration-parameters/settings.md/#merge_tree) サーバー設定で制御されます。 - -レプリケーション時には、挿入対象の元データのみがネットワーク経由で転送されます。その後のデータ変換(マージ)は、すべてのレプリカで同じようにコーディネートされ、実行されます。これによりネットワーク使用量が最小化されるため、レプリカが異なるデータセンターに配置されている場合でもレプリケーションは良好に動作します(異なるデータセンター間でデータを複製することがレプリケーションの主な目的である点に注意してください)。 - -同じデータに対して任意の数のレプリカを持つことができます。これまでの経験では、本番運用では二重レプリケーション(ダブルレプリケーション)を用い、各サーバーで RAID-5 または RAID-6(場合によっては RAID-10)を使用する構成が、比較的信頼性が高く扱いやすいソリューションとなり得ます。 - -システムはレプリカ上のデータの同期状態を監視し、障害発生後に復旧することができます。フェイルオーバーは自動(データ差分が小さい場合)あるいは半自動(データの差異が大きい場合。この場合は設定ミスを示している可能性があります)で行われます。 - - - -## レプリケーテッドテーブルの作成 - -:::note -ClickHouse Cloud では、レプリケーションは自動的に行われます。 - -レプリケーション引数を指定せずに [`MergeTree`](/engines/table-engines/mergetree-family/mergetree) を使用してテーブルを作成します。システムは内部的に、レプリケーションとデータ分散のために [`MergeTree`](/engines/table-engines/mergetree-family/mergetree) を [`SharedMergeTree`](/cloud/reference/shared-merge-tree) に書き換えます。 - -レプリケーションはプラットフォームによって管理されるため、`ReplicatedMergeTree` を使用したり、レプリケーションパラメータを指定したりすることは避けてください。 - -::: - -### Replicated*MergeTree のパラメータ - -| Parameter | Description | -| ------------------ | ------------------------------------------------------------------------------- | -| `zoo_path` | ClickHouse Keeper 内のテーブルへのパス。 | -| `replica_name` | ClickHouse Keeper 内のレプリカ名。 | -| `other_parameters` | レプリケートされたバージョンを作成するために使用されるエンジンのパラメータ。たとえば、`ReplacingMergeTree` の `version` など。 | - -例: - -```sql -CREATE TABLE table_name -( - EventDate DateTime, - CounterID UInt32, - UserID UInt32, - ver UInt16 -ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{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](/operations/server-configuration-parameters/settings.md/#macros)セクションから取得されます。 - -例: - -```xml - - 02 - example05-02-1 - -``` - -ClickHouse Keeper 内のテーブルへのパスは、レプリケートされた各テーブルごとに一意である必要があります。異なるシャード上のテーブルは、それぞれ異なるパスを持つ必要があります。 -この場合、パスは次の要素から構成されます。 - -`/clickhouse/tables/` は共通のプレフィックスです。この文字列をそのまま使用することを推奨します。 - -`{shard}` はシャード識別子に展開されます。 - -`table_name` は ClickHouse Keeper 内でのテーブル用ノードの名前です。テーブル名と同じにしておくと良いでしょう。テーブル名とは異なり、`RENAME` クエリを実行しても変わらないため、明示的に定義します。 -*HINT*: `table_name` の前にデータベース名を付けることもできます。例: `db_name.table_name` - -2 つの組み込み置換 `{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` を実行します。ただし、削除されるのは 1 つのレプリカのみであり、それはクエリを実行したサーバー上に存在するレプリカです。 - - -## 障害発生後のリカバリ - -サーバー起動時に ClickHouse Keeper が使用できない場合、レプリケートテーブルは読み取り専用モードに切り替わります。システムは定期的に ClickHouse Keeper への接続を試行します。 - -`INSERT` の実行中に ClickHouse Keeper が使用できない場合、または ClickHouse Keeper とのやり取り時にエラーが発生した場合は、例外がスローされます。 - -ClickHouse Keeper への接続後、システムはローカルファイルシステム上のデータセットが想定されているデータセット(この情報は ClickHouse Keeper が保持)と一致しているかをチェックします。軽微な不整合であれば、システムはレプリカとのデータ同期によってこれを解消します。 - -システムが破損したデータパーツ(ファイルサイズが不正なもの)や、認識されないパーツ(ファイルシステムに書き込まれているが ClickHouse Keeper に記録されていないパーツ)を検出した場合、それらを `detached` サブディレクトリに移動します(削除はされません)。不足しているパーツはレプリカからコピーされます。 - -ClickHouse は、大量のデータを自動削除するといった破壊的な操作は実行しないことに注意してください。 - -サーバー起動時(または ClickHouse Keeper との新しいセッション確立時)には、すべてのファイルの個数とサイズのみをチェックします。ファイルサイズが一致していても、途中のバイトがどこかで変更されているような場合は、すぐには検出されず、`SELECT` クエリでデータを読み取ろうとしたときに初めて検出されます。このクエリは、チェックサムの不一致または圧縮ブロックのサイズ不一致に関する例外をスローします。この場合、データパーツは検証キューに追加され、必要に応じてレプリカからコピーされます。 - -ローカルのデータセットが想定されているものと大きく異なる場合、安全機構がトリガーされます。サーバーはその旨をログに記録し、起動を拒否します。これは、あるシャード上のレプリカが誤って別のシャード上のレプリカと同じ構成にされてしまった、といった構成ミスを示している可能性があるためです。ただし、この機構のしきい値はかなり低く設定されており、通常の障害復旧中にもこの状況が発生することがあります。この場合、データは「ボタンを押す」ことで半自動的に復元されます。 - -リカバリを開始するには、任意の内容で ClickHouse Keeper 内に `/path_to_table/replica_name/flags/force_restore_data` ノードを作成するか、すべてのレプリケートテーブルを復元するためのコマンドを実行します。 - -```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 ノード `/path_to_table/replica_name/flags/force_restore_data` を作成するか、すべてのレプリケートテーブルを復旧するために次のコマンドを実行します: `sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data` - -その後、サーバーを起動します(すでに起動している場合は再起動します)。データはレプリカからダウンロードされます。 - -別の復旧方法としては、ClickHouse Keeper から失われたレプリカに関する情報(`/path_to_table/replica_name`)を削除し、「[レプリケートテーブルの作成](#creating-replicated-tables)」で説明されている手順に従ってレプリカを再作成する方法があります。 - -復旧時のネットワーク帯域幅には制限がありません。同時に多数のレプリカを復旧する場合は、この点に注意してください。 - - - -## MergeTree から ReplicatedMergeTree への変換 - -`MergeTree` という用語は、`MergeTree family` に属するすべてのテーブルエンジンを指すために使用しており、`ReplicatedMergeTree` についても同様です。 - -手動でレプリケーションしていた `MergeTree` テーブルがある場合、それをレプリケーション対応のテーブルに変換できます。`MergeTree` テーブルにすでに大量のデータを蓄積していて、これからレプリケーションを有効化したい場合に、この操作が必要になることがあります。 - -[ATTACH TABLE ... AS REPLICATED](/sql-reference/statements/attach.md#attach-mergetree-table-as-replicatedmergetree) ステートメントを使用すると、デタッチされた `MergeTree` テーブルを `ReplicatedMergeTree` としてアタッチできます。 - -`convert_to_replicated` フラグがテーブルのデータディレクトリ(`Atomic` データベースの場合は `/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/`)に設定されている場合、サーバー再起動時に `MergeTree` テーブルは自動的に変換されます。 -空の `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` エンジンの第 1 引数でそのパスを明示的に指定する必要があります。次のクエリでそのパスを取得できます。 - -```sql -SELECT zookeeper_path FROM system.replicas WHERE table = 'table_name'; -``` - -これを行う別の方法として、手動で行うこともできます。 - -複数のレプリカ間でデータが異なっている場合は、まず同期をとるか、1つを除くすべてのレプリカからそのデータを削除します。 - -既存の MergeTree テーブルの名前を変更し、同じ古い名前で `ReplicatedMergeTree` テーブルを作成します。 -古いテーブルから、新しいテーブルデータのディレクトリ(`/var/lib/clickhouse/data/db_name/table_name/`)内にある `detached` サブディレクトリへデータを移動します。 -その後、いずれかのレプリカ上で `ALTER TABLE ATTACH PARTITION` を実行し、これらのデータパーツを稼働中のデータセットに追加します。 - - -## ReplicatedMergeTree から MergeTree への変換 {#converting-from-replicatedmergetree-to-mergetree} - -単一サーバー上で切り離されている `ReplicatedMergeTree` テーブルを `MergeTree` として再アタッチするには、[ATTACH TABLE ... AS NOT REPLICATED](/sql-reference/statements/attach.md#attach-mergetree-table-as-replicatedmergetree) ステートメントを使用します。 - -これを行う別の方法として、サーバーの再起動を伴う手順があります。別の名前の MergeTree テーブルを作成し、`ReplicatedMergeTree` テーブルのデータがあるディレクトリから、すべてのデータを新しいテーブルのデータディレクトリに移動します。その後、`ReplicatedMergeTree` テーブルを削除してサーバーを再起動します。 - -サーバーを起動せずに `ReplicatedMergeTree` テーブルを削除したい場合は、次の手順を実行します。 - -- メタデータディレクトリ(`/var/lib/clickhouse/metadata/`)内の対応する `.sql` ファイルを削除します。 -- 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](/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) -- [background_fetches_pool_size](/operations/server-configuration-parameters/settings.md/#background_fetches_pool_size) -- [execute_merges_on_single_replica_time_threshold](/operations/settings/merge-tree-settings#execute_merges_on_single_replica_time_threshold) -- [max_replicated_fetches_network_bandwidth](/operations/settings/merge-tree-settings.md/#max_replicated_fetches_network_bandwidth) -- [max_replicated_sends_network_bandwidth](/operations/settings/merge-tree-settings.md/#max_replicated_sends_network_bandwidth) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md deleted file mode 100644 index bdf14e7f005..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -description: 'SummingMergeTree は MergeTree エンジンを継承します。その主な機能は、パーツのマージ時に数値データを自動的に合計できることです。' -sidebar_label: 'SummingMergeTree' -sidebar_position: 50 -slug: /engines/table-engines/mergetree-family/summingmergetree -title: 'SummingMergeTree テーブルエンジン' -doc_type: 'reference' ---- - - - -# SummingMergeTree テーブルエンジン - -このエンジンは [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) を継承しています。違いは、`SummingMergeTree` テーブルでデータパーツをマージする際に、ClickHouse が同じ主キー(より正確には同じ [ソートキー](../../../engines/table-engines/mergetree-family/mergetree.md))を持つすべての行を、数値データ型のカラムの値を合計した 1 行に置き換える点です。ソートキーの構成によって、1 つのキー値に多数の行が対応する場合、これにより必要なストレージ容量を大幅に削減し、データ取得の高速化を実現できます。 - -このエンジンは `MergeTree` と組み合わせて使用することを推奨します。生データ(完全なデータ)は `MergeTree` テーブルに保存し、集計済みデータの保存には `SummingMergeTree` を使用します(たとえばレポートを作成する場合など)。このようなアプローチにより、不適切に構成された主キーが原因で貴重なデータを失うことを防止できます。 - - - -## テーブルを作成する - -```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` が指定されていない場合、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` — 値を集計(合計)するカラム名を含むタプルです。省略可能なパラメータです。詳細は上記を参照してください。 -
- - -## 使用例 - -次のテーブルを例にします。 - -```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 │ -└─────┴────────────┘ -``` - - -## データ処理 - -データがテーブルに挿入されると、そのままの形で保存されます。ClickHouse は挿入されたデータパートを定期的にマージし、その際に同じ主キーを持つ行が合計され、各結果データパートごとに 1 行に置き換えられます。 - -ClickHouse はデータパートをマージする際、マージの結果として異なるデータパート同士に同じ主キーを持つ行が分かれて存在する場合があります。つまり、合計処理が不完全になる可能性があります。そのため、上記の例で説明したように、クエリでは集約関数 [`sum()`](/sql-reference/aggregate-functions/reference/sum) と `GROUP BY` 句を組み合わせて使用する必要があります。 - -### 集計に関する共通ルール - -数値データ型の列に含まれる値は合計されます。対象となる列の集合はパラメータ `columns` で定義されます。 - -合計対象となるすべての列の値が 0 であった場合、その行は削除されます。 - -列が主キーに含まれておらず、かつ合計対象でもない場合、既存の値の中から任意の値が選択されます。 - -主キーに含まれる列の値は合計されません。 - -### AggregateFunction 列における集計 - -[AggregateFunction 型](../../../sql-reference/data-types/aggregatefunction.md)の列に対しては、ClickHouse は [AggregatingMergeTree](../../../engines/table-engines/mergetree-family/aggregatingmergetree.md) エンジンと同様に、関数に従って集約処理を行います。 - -### ネストした構造 - -テーブルには特別な方法で処理されるネストしたデータ構造を含めることができます。 - -ネストしたテーブル名が `Map` で終わり、かつ次の条件を満たす 2 列以上を含んでいる場合: - -* 1 列目が数値型 `(*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) 関数を使用します。 - -ネストされたデータ構造の場合、集計対象のカラムのタプル内で、その構造に含まれるカラムを個別に指定する必要はありません。 - - - -## 関連コンテンツ {#related-content} - -- ブログ記事: [Using Aggregate Combinators in ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md deleted file mode 100644 index a2343e1536d..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -description: '継続的に変化するオブジェクトの状態を高速に書き込み、古い状態をバックグラウンドで削除できるテーブルエンジンです。' -sidebar_label: 'VersionedCollapsingMergeTree' -sidebar_position: 80 -slug: /engines/table-engines/mergetree-family/versionedcollapsingmergetree -title: 'VersionedCollapsingMergeTree テーブルエンジン' -doc_type: 'reference' ---- - - - -# VersionedCollapsingMergeTree テーブルエンジン - -このエンジンは次のことができます: - -- 継続的に変化するオブジェクトの状態を高速に書き込む。 -- 古いオブジェクトの状態をバックグラウンドで削除する。これにより必要なストレージ容量を大幅に削減できます。 - -詳細は [Collapsing](#table_engines_versionedcollapsingmergetree) のセクションを参照してください。 - -このエンジンは [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) を継承し、データパーツのマージアルゴリズムに行の折りたたみロジックを追加します。`VersionedCollapsingMergeTree` は [CollapsingMergeTree](../../../engines/table-engines/mergetree-family/collapsingmergetree.md) と同じ目的で使用されますが、異なる折りたたみアルゴリズムを採用しており、複数スレッドで任意の順序でデータを挿入できます。特に、`Version` 列は、行が誤った順序で挿入された場合でも、適切に行を折りたたむのに役立ちます。これに対して、`CollapsingMergeTree` は厳密に連続した順序での挿入のみをサポートします。 - - - -## テーブルの作成 - -```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` | 行の種類を示す列の名前。`1` は「state」行、`-1` は「cancel」行を表します。 | [`Int8`](/sql-reference/data-types/int-uint) | -| `version` | オブジェクト状態のバージョンを表す列の名前。 | [`Int*`](/sql-reference/data-types/int-uint), [`UInt*`](/sql-reference/data-types/int-uint), [`Date`](/sql-reference/data-types/date), [`Date32`](/sql-reference/data-types/date32), [`DateTime`](/sql-reference/data-types/datetime) または [`DateTime64`](/sql-reference/data-types/datetime64) | - -### クエリ句 - -`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` は「state」行、`-1` は「cancel」行を表します。 - - 列のデータ型 — `Int8`。 - - * `version` — オブジェクト状態のバージョンを表す列の名前。 - - 列のデータ型は `UInt*` である必要があります。 -
- - -## 折りたたみ(Collapsing) - -### データ - -あるオブジェクトについて、継続的に変化するデータを保存する必要がある状況を考えます。オブジェクトごとに 1 行を持ち、変更があるたびにその行を更新するのは合理的に思えます。しかし、更新操作はストレージ上のデータを書き換える必要があるため、DBMS にとっては高コストかつ低速です。データを高速に書き込む必要がある場合、更新は適していませんが、その代わりにオブジェクトに対する変更を次のように逐次書き込むことができます。 - -行を書き込むときに `Sign` 列を使用します。`Sign = 1` の場合、その行はオブジェクトの状態を表す(これを「state 行」と呼びます)ことを意味します。`Sign = -1` の場合、同じ属性を持つオブジェクトの状態を取り消す(これを「cancel 行」と呼びます)ことを意味します。また、`Version` 列も使用し、オブジェクトの各状態を一意の番号で識別します。 - -たとえば、あるサイトでユーザーが閲覧したページ数と、そのページに滞在した時間を集計したいとします。ある時点で、ユーザーのアクティビティ状態を表す次の行を書き込みます。 - -```text -┌──────────────ユーザーID─┬─ページビュー数─┬─滞在時間─┬─署名─┬─バージョン─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -後でユーザーアクティビティの変更を記録し、それを次の 2 行で書き込みます。 - -```text -┌──────────────UserID─┬─ページビュー数─┬─継続時間─┬─符号─┬─バージョン─┐ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | -│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -最初の行は、オブジェクト(ユーザー)の以前の状態を取り消します。この行には、`Sign` 以外の、取り消される状態のすべてのフィールドをコピーして含める必要があります。 - -2 行目には現在の状態が含まれます。 - -ユーザーアクティビティの最後の状態だけが必要なため、これらの行は - -```text -┌──────────────ユーザーID─┬─ページビュー─┬─継続時間─┬─サイン─┬─バージョン─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | -│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -は削除され、オブジェクトの無効(古い)状態が折りたたまれます。`VersionedCollapsingMergeTree` は、データパートをマージする際にこれを行います。 - -各変更ごとに 2 行が必要な理由については、[Algorithm](#table_engines-versionedcollapsingmergetree-algorithm) を参照してください。 - -**使用上の注意** - -1. データを書き込むプログラムは、取り消しができるようにオブジェクトの状態を保持しておく必要があります。"Cancel" 文字列には、主キーのフィールドのコピー、"state" 文字列のバージョン、および反対の `Sign` を含める必要があります。これにより初期のストレージ使用量は増加しますが、高速にデータを書き込むことができます。 -2. 列内で長く伸び続ける配列は、書き込み時の負荷によりエンジンの効率を低下させます。データが単純であればあるほど効率は高くなります。 -3. `SELECT` の結果は、オブジェクト変更履歴の一貫性に大きく依存します。挿入するデータを準備する際は注意してください。セッション深度のような本来非負であるメトリクスに対して負の値が得られるなど、不整合なデータでは予測不能な結果になる可能性があります。 - -### Algorithm - -ClickHouse がデータパートをマージする際、同じ主キーとバージョンを持ち、`Sign` が異なる行のペアを削除します。行の順序は関係ありません。 - -ClickHouse がデータを挿入する際には、行は主キーでソートされます。`Version` 列が主キーに含まれていない場合、ClickHouse はそれを暗黙的に主キーの最後のフィールドとして追加し、その並び替えに使用します。 - - -## データの選択 {#selecting-data} - -ClickHouse は、同じプライマリキーを持つすべての行が、同じ結果のデータパート内、あるいは同じ物理サーバー上に存在することを保証しません。これは、データを書き込むときと、その後にデータパートをマージするときの両方について当てはまります。さらに、ClickHouse は `SELECT` クエリを複数スレッドで処理するため、結果の行の順序を予測できません。つまり、`VersionedCollapsingMergeTree` テーブルから完全に「折りたたまれた」データを取得する必要がある場合は、集約処理が必要になります。 - -折りたたみを最終的に確定させるには、`GROUP BY` 句と、符号を考慮した集約関数を使ってクエリを書きます。たとえば数量を計算するには、`count()` の代わりに `sum(Sign)` を使用します。何らかの合計を計算するには、`sum(x)` の代わりに `sum(Sign * x)` を使用し、さらに `HAVING sum(Sign) > 0` を追加します。 - -`count`、`sum`、`avg` といった集約は、この方法で計算できます。`uniq` 集約は、オブジェクトに少なくとも 1 つの未折りたたみ状態がある場合に計算できます。`min` および `max` 集約は、`VersionedCollapsingMergeTree` が折りたたまれた状態の値の履歴を保存しないため、計算できません。 - -集約なしで「折りたたみ」を行ったデータを抽出する必要がある場合(たとえば、最新の値が特定の条件に一致する行が存在するかを確認する場合)は、`FROM` 句に対して `FINAL` 修飾子を使用できます。このアプローチは非効率的であり、大きなテーブルには使用すべきではありません。 - - - -## 使用例 - -サンプルデータ: - -```text -┌──────────────ユーザーID─┬─ページビュー─┬─滞在時間─┬─符号─┬─バージョン─┐ -│ 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` クエリを使用して、2つの異なるデータパーツを作成します。1つのクエリでデータを挿入した場合、ClickHouse は1つのデータパーツしか作成せず、マージ処理は行いません。 - -データの取得: - -```sql -SELECT * FROM UAct -``` - -```text -┌──────────────ユーザーID─┬─ページビュー─┬─滞在時間─┬─符号─┬─バージョン─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -┌──────────────ユーザーID─┬─ページビュー─┬─滞在時間─┬─符号─┬─バージョン─┐ -│ 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 -┌──────────────ユーザーID─┬─ページビュー─┬─滞在時間─┬─サイン─┬─バージョン─┐ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │ -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -これはデータを抽出する非常に非効率な方法です。大規模なテーブルには使用しないでください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md deleted file mode 100644 index 0a81e922891..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -description: 'Alias テーブルエンジンは、別のテーブルへの透過的なプロキシを作成します。すべての操作は対象テーブルに委譲され、Alias 自体にはデータは保持されません。' -sidebar_label: 'Alias' -sidebar_position: 5 -slug: /engines/table-engines/special/alias -title: 'Alias テーブルエンジン' -doc_type: 'reference' ---- - - - -# Alias テーブルエンジン - -`Alias` エンジンは、別のテーブルへのプロキシを作成するテーブルエンジンです。すべての読み取りおよび書き込み操作は対象テーブルに転送され、エイリアス自体はデータを保持せず、対象テーブルへの参照のみを保持します。 - - - -## テーブルを作成する - -```sql -CREATE TABLE [db_name.]alias_name -ENGINE = Alias(target_table) -``` - -または、データベース名を明示的に指定して: - -```sql -CREATE TABLE [db_name.]alias_name -ENGINE = Alias(target_db, target_table) -``` - -:::note -`Alias` テーブルでは、カラムを明示的に定義することはできません。カラムは自動的に対象テーブルから継承されます。これにより、エイリアスは常に対象テーブルのスキーマと一致することが保証されます。 -::: - - -## エンジンパラメータ {#engine-parameters} - -- **`target_db (optional)`** — 対象テーブルを含むデータベース名。 -- **`target_table`** — 対象テーブル名。 - - - -## サポートされる操作 {#supported-operations} - -`Alias` テーブルエンジンは、主要な操作をすべてサポートします。 -### 対象テーブルへの操作 {#operations-on-target} - -これらの操作は、エイリアスを介して対象テーブルに対して実行されます: - -| Operation | Support | Description | -|-----------|---------|-------------| -| `SELECT` | ✅ | 対象テーブルからデータを読み取る | -| `INSERT` | ✅ | 対象テーブルにデータを書き込む | -| `INSERT SELECT` | ✅ | 対象テーブルへのバッチ挿入を行う | -| `ALTER TABLE ADD COLUMN` | ✅ | 対象テーブルにカラムを追加する | -| `ALTER TABLE MODIFY SETTING` | ✅ | 対象テーブルの設定を変更する | -| `ALTER TABLE PARTITION` | ✅ | 対象テーブルに対するパーティション操作 (DETACH/ATTACH/DROP) を行う | -| `ALTER TABLE UPDATE` | ✅ | 対象テーブル内の行を更新する (ミューテーション) | -| `ALTER TABLE DELETE` | ✅ | 対象テーブルから行を削除する (ミューテーション) | -| `OPTIMIZE TABLE` | ✅ | 対象テーブルを最適化する (パーツをマージする) | -| `TRUNCATE TABLE` | ✅ | 対象テーブルを空にする | - -### `Alias` 自体への操作 {#operations-on-alias} - -これらの操作はエイリアスのみに影響し、対象テーブルには **影響しません**: - -| Operation | Support | Description | -|-----------|---------|-------------| -| `DROP TABLE` | ✅ | エイリアスのみを削除し、対象テーブルは変更されない | -| `RENAME TABLE` | ✅ | エイリアスの名前のみを変更し、対象テーブルは変更されない | - - - -## 使用例 - -### 基本的なエイリアスの作成 - -同じデータベース内にシンプルなエイリアスを作成します。 - -```sql --- ソーステーブルを作成 -CREATE TABLE source_data ( - id UInt32, - name String, - value Float64 -) ENGINE = MergeTree -ORDER BY id; - --- データを挿入 -INSERT INTO source_data VALUES (1, 'one', 10.1), (2, 'two', 20.2); - --- エイリアスを作成 -CREATE TABLE data_alias ENGINE = Alias('source_data'); - --- エイリアス経由でクエリを実行 -SELECT * FROM data_alias; -``` - -```text -┌─id─┬─name─┬─value─┐ -│ 1 │ one │ 10.1 │ -│ 2 │ two │ 20.2 │ -└────┴──────┴───────┘ -``` - -### データベース間エイリアス - -別のデータベース内のテーブルを指すエイリアスを作成します: - -```sql --- データベースを作成 -CREATE DATABASE db1; -CREATE DATABASE db2; - --- db1にソーステーブルを作成 -CREATE TABLE db1.events ( - timestamp DateTime, - event_type String, - user_id UInt32 -) ENGINE = MergeTree -ORDER BY timestamp; - --- db1.eventsを指すエイリアスをdb2に作成 -CREATE TABLE db2.events_alias ENGINE = Alias('db1', 'events'); - --- またはdatabase.table形式を使用 -CREATE TABLE db2.events_alias2 ENGINE = Alias('db1.events'); - --- 両方のエイリアスは同一に動作 -INSERT INTO db2.events_alias VALUES (now(), 'click', 100); -SELECT * FROM db2.events_alias2; -``` - -### エイリアス経由の書き込み操作 - -すべての書き込み操作はターゲットテーブルに転送されます。 - -```sql -CREATE TABLE metrics ( - ts DateTime, - metric_name String, - value Float64 -) ENGINE = MergeTree -ORDER BY ts; - -CREATE TABLE metrics_alias ENGINE = Alias('metrics'); - --- エイリアスを介して挿入 -INSERT INTO metrics_alias VALUES - (now(), 'cpu_usage', 45.2), - (now(), 'memory_usage', 78.5); - --- SELECTで挿入 -INSERT INTO metrics_alias -SELECT now(), 'disk_usage', number * 10 -FROM system.numbers -LIMIT 5; - --- ターゲットテーブルにデータが格納されていることを確認 -SELECT count() FROM metrics; -- 7を返す -SELECT count() FROM metrics_alias; -- 7を返す -``` - -### スキーマの変更 - -`ALTER` 操作は対象テーブルのスキーマを変更します。 - -```sql -CREATE TABLE users ( - id UInt32, - name String -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE users_alias ENGINE = Alias('users'); - --- エイリアス経由でカラムを追加 -ALTER TABLE users_alias ADD COLUMN email String DEFAULT ''; - --- カラムは対象テーブルに追加される -DESCRIBE users; -``` - -```text -┌─name──┬─type───┬─default_type─┬─default_expression─┐ -│ id │ UInt32 │ │ │ -│ name │ String │ │ │ -│ email │ String │ DEFAULT │ '' │ -└───────┴────────┴──────────────┴────────────────────┘ -``` - -### データの変更 - -`UPDATE` および `DELETE` 操作がサポートされています。 - -```sql -CREATE TABLE products ( - id UInt32, - name String, - price Float64, - status String DEFAULT 'active' -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE products_alias ENGINE = Alias('products'); - -INSERT INTO products_alias VALUES - (1, 'item_one', 100.0, 'active'), - (2, 'item_two', 200.0, 'active'), - (3, 'item_three', 300.0, 'inactive'); - --- エイリアス経由で更新 -ALTER TABLE products_alias UPDATE price = price * 1.1 WHERE status = 'active'; - --- エイリアス経由で削除 -ALTER TABLE products_alias DELETE WHERE status = 'inactive'; - --- 変更は対象テーブルに適用されます -SELECT * FROM products ORDER BY id; -``` - -```text -┌─id─┬─name─────┬─price─┬─status─┐ -│ 1 │ item_one │ 110.0 │ active │ -│ 2 │ item_two │ 220.0 │ active │ -└────┴──────────┴───────┴────────┘ -``` - -### パーティション操作 - -パーティション化されたテーブルでは、パーティション操作はフォワードされます。 - - -```sql -CREATE TABLE logs ( - date Date, - level String, - message String -) ENGINE = MergeTree -PARTITION BY toYYYYMM(date) -ORDER BY date; - -CREATE TABLE logs_alias ENGINE = Alias('logs'); - -INSERT INTO logs_alias VALUES - ('2024-01-15', 'INFO', 'message1'), - ('2024-02-15', 'ERROR', 'message2'), - ('2024-03-15', 'INFO', 'message3'); - --- エイリアス経由でパーティションをデタッチ -ALTER TABLE logs_alias DETACH PARTITION '202402'; - -SELECT count() FROM logs_alias; -- 2を返す(パーティション202402はデタッチ済み) - --- パーティションを再アタッチ -ALTER TABLE logs_alias ATTACH PARTITION '202402'; - -SELECT count() FROM logs_alias; -- 3を返す -``` - -### テーブルの最適化 - -ターゲットテーブルに対するパーツのマージ処理を最適化します。 - -```sql -CREATE TABLE events ( - id UInt32, - data String -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE events_alias ENGINE = Alias('events'); - --- 複数の挿入により複数のパートが作成されます -INSERT INTO events_alias VALUES (1, 'data1'); -INSERT INTO events_alias VALUES (2, 'data2'); -INSERT INTO events_alias VALUES (3, 'data3'); - --- パート数を確認します -SELECT count() FROM system.parts -WHERE database = currentDatabase() - AND table = 'events' - AND active; - --- エイリアス経由で最適化します -OPTIMIZE TABLE events_alias FINAL; - --- ターゲットテーブルでパートがマージされます -SELECT count() FROM system.parts -WHERE database = currentDatabase() - AND table = 'events' - AND active; -- 1を返します -``` - -### エイリアスの管理 - -エイリアスは個別に名前を変更したり削除したりできます。 - -```sql -CREATE TABLE important_data ( - id UInt32, - value String -) ENGINE = MergeTree -ORDER BY id; - -INSERT INTO important_data VALUES (1, 'critical'), (2, 'important'); - -CREATE TABLE old_alias ENGINE = Alias('important_data'); - --- エイリアスの名前を変更(ターゲットテーブルは変更されません) -RENAME TABLE old_alias TO new_alias; - --- 同じテーブルに別のエイリアスを作成 -CREATE TABLE another_alias ENGINE = Alias('important_data'); - --- エイリアスを1つ削除(ターゲットテーブルと他のエイリアスは変更されません) -DROP TABLE new_alias; - -SELECT * FROM another_alias; -- 引き続き機能します -SELECT count() FROM important_data; -- データは保持されており、2を返します -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md deleted file mode 100644 index adf2f7643f6..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -description: '書き込むデータをあらかじめ RAM 上でバッファリングし、定期的に別のテーブルへフラッシュします。読み取り時には、バッファと別のテーブルの両方から同時にデータを読み出します。' -sidebar_label: 'Buffer' -sidebar_position: 120 -slug: /engines/table-engines/special/buffer -title: 'Buffer テーブルエンジン' -doc_type: 'reference' ---- - - - -# Buffer テーブルエンジン - -書き込み対象のデータを RAM 上でバッファリングし、定期的に別のテーブルへフラッシュします。読み取り時には、バッファとその別のテーブルの両方から同時にデータを読み取ります。 - -:::note -Buffer テーブルエンジンの代替として推奨されるのは、[非同期インサート](/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`, および `max_bytes` - -バッファからデータをフラッシュするための条件。 - -### オプションのエンジンパラメータ - -#### `flush_time`, `flush_rows`, および `flush_bytes` - -バックグラウンドでバッファからデータをフラッシュするための条件(省略または 0 の場合は、`flush*` パラメータは存在しないものとして扱われます)。 - -すべての `min*` 条件が満たされるか、少なくとも 1 つの `max*` 条件が満たされた場合、データはバッファからフラッシュされ、出力先テーブルに書き込まれます。 - -また、少なくとも 1 つの `flush*` 条件が満たされると、バックグラウンドでフラッシュが開始されます。これは `max*` とは異なり、`flush*` によって、Buffer テーブルへの `INSERT` クエリにレイテンシを追加しないように、バックグラウンドフラッシュを個別に構成できます。 - -#### `min_time`, `max_time`, および `flush_time` - -最初の書き込み時点からの経過時間(秒)に関する条件。 - -#### `min_rows`, `max_rows`, および `flush_rows` - -バッファ内の行数に関する条件。 - -#### `min_bytes`, `max_bytes`, および `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' テーブルに書き込まれます。1 つのバッファが作成され、以下のいずれかの条件を満たすとデータがフラッシュされます: - -* 前回のフラッシュから 100 秒経過した場合(`max_time`) -* 100 万行が書き込まれた場合(`max_rows`) -* 100 MB のデータが書き込まれた場合(`max_bytes`) -* 10 秒が経過しており(`min_time`)、かつ 1 万行(`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 テーブルを削除して再作成する以外に方法はありません。Buffer テーブルに対して ALTER を実行する前に、お使いのリリースでこのエラーが修正されていることを確認してください。 -::: - -サーバーが異常終了した場合、バッファ内のデータは失われます。 - -`FINAL` と `SAMPLE` は Buffer テーブルでは正しく動作しません。これらの条件は宛先テーブルには渡されますが、バッファ内のデータ処理には使用されません。これらの機能が必要な場合は、Buffer テーブルは書き込み専用とし、読み取りは宛先テーブルからのみ行うことを推奨します。 - -Buffer テーブルにデータを追加する際は、バッファの 1 つがロックされます。そのため、同時にテーブルから読み取り操作が行われていると遅延が発生します。 - -Buffer テーブルに挿入されたデータは、下位テーブル内では異なる順序や異なるブロックに配置される場合があります。このため、Buffer テーブルを CollapsingMergeTree への正しい書き込みに用いるのは困難です。問題を避けるには、`num_layers` を 1 に設定できます。 - -宛先テーブルがレプリケートされている場合、Buffer テーブルに書き込むと、レプリケートされたテーブルに期待される特性の一部が失われます。行の順序やデータパーツのサイズがランダムに変化することで、データ重複排除が機能しなくなり、レプリケートされたテーブルに対して信頼できる「厳密に一度だけ」の書き込みを行うことが不可能になります。 - -これらの欠点により、Buffer テーブルの使用はごく限られたケースにのみ推奨されます。 - -Buffer テーブルは、単位時間あたりに多数のサーバーから大量の INSERT が送信され、挿入前にデータをバッファリングできないために INSERT が十分な速度で実行できない場合に使用されます。 - -なお、Buffer テーブルであっても、1 行ずつデータを挿入することには意味がありません。この方法では、スループットは毎秒数千行程度にとどまり、より大きなブロック単位でデータを挿入することで、毎秒 100 万行を超えるスループットを得ることができます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md deleted file mode 100644 index 6281e3f7900..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -description: '`Dictionary` エンジンは、辞書データを ClickHouse のテーブルとして扱えるようにします。' -sidebar_label: 'Dictionary' -sidebar_position: 20 -slug: /engines/table-engines/special/dictionary -title: 'Dictionary テーブルエンジン' -doc_type: 'リファレンス' ---- - - - -# Dictionary テーブルエンジン - -`Dictionary` エンジンは、[dictionary](../../../sql-reference/dictionaries/index.md) のデータを ClickHouse のテーブルとして扱います。 - - - -## 例 - -例として、次のように構成された `products` 辞書を考えます。 - -```xml - - - products - - -
products
- DSN=some-db-server - - - - 300 - 360 - - - - - - - product_id - - - title - String - - - - - -``` - -辞書データにクエリを実行する: - -```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 │ -└──────────┴──────┴────────┴─────────────────┴─────────────────┴─────────────────┴───────────────┴─────────────────┘ -``` - -この形式で辞書データを取得するには、[dictGet*](/sql-reference/functions/ext-dict-functions#dictget-dictgetordefault-dictgetornull) 関数を使用できます。 - -生データを取得する必要がある場合や、`JOIN` 操作を実行する場合には、このビューは有用ではありません。これらの場合には、`Dictionary` エンジンを使用することで、辞書データをテーブルとして表示できます。 - -構文: - -```sql -CREATE TABLE %table_name% (%fields%) engine = Dictionary(%dictionary_name%)` -``` - -使用例: - -```sql -CREATE TABLE products (product_id UInt64, title String) ENGINE = Dictionary(products); -``` - -では - -テーブルの内容を確認しましょう。 - -```sql -SELECT * FROM products LIMIT 1; -``` - -```text -┌────product_id─┬─title───────────┐ -│ 152689 │ Some item │ -└───────────────┴─────────────────┘ -``` - -**関連項目** - -* [Dictionary 関数](/sql-reference/table-functions/dictionary) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md deleted file mode 100644 index 52070299b6c..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md +++ /dev/null @@ -1,251 +0,0 @@ ---- -description: 'Distributed エンジンを持つテーブルは自身では一切データを保存せず、複数サーバー上での分散クエリ処理を可能にします。読み取り処理は自動的に並列化されます。読み取り時には、存在する場合はリモートサーバー上のテーブルインデックスが利用されます。' -sidebar_label: 'Distributed' -sidebar_position: 10 -slug: /engines/table-engines/special/distributed -title: 'Distributed テーブルエンジン' -doc_type: 'reference' ---- - - - -# Distributed テーブルエンジン - -:::warning ClickHouse Cloud における Distributed エンジン -ClickHouse Cloud で Distributed テーブルエンジンを作成するには、[`remote` および `remoteSecure`](../../../sql-reference/table-functions/remote) テーブル関数を使用します。 -`Distributed(...)` 構文は ClickHouse Cloud では使用できません。 -::: - -Distributed エンジンを持つテーブル自体はデータを一切保存しませんが、複数のサーバーでの分散クエリ処理を可能にします。 -読み取り処理は自動的に並列化されます。読み取り時には、リモートサーバー上にテーブルインデックスが存在する場合、それらが利用されます。 - - - -## テーブルの作成 - -```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` テーブルが現在のサーバー上のテーブルを参照している場合、そのテーブルのスキーマを利用できます。 - -```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 パラメータ - -| Parameter | Description | -| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `cluster` | サーバーの設定ファイル内のクラスター名 | -| `database` | リモートデータベース名 | -| `table` | リモートテーブル名 | -| `sharding_key` (Optional) | シャーディングキー。
`sharding_key` の指定が必要となるケースは次のとおりです。
  • Distributed テーブルへの `INSERT` の場合(テーブルエンジンがデータの分割方法を決定するために `sharding_key` を必要とするため)。ただし、`insert_distributed_one_random_shard` 設定が有効な場合は、`INSERT` にシャーディングキーは不要です。
  • `optimize_skip_unused_shards` を利用する場合(どのシャードをクエリするかを決定するために `sharding_key` が必要です)。
| -| `policy_name` (Optional) | ポリシー名。バックグラウンド送信処理で使用する一時ファイルを保存するために使用されます | - -**関連項目** - -* [distributed_foreground_insert](../../../operations/settings/settings.md#distributed_foreground_insert) 設定 -* 例については [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) を参照 - -### Distributed 設定 - - -| Setting | Description | Default value | -| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| `fsync_after_insert` | Distributed へのバックグラウンド挿入後にファイルデータに対して `fsync` を実行します。OS が **イニシエーターノード** のディスク上の挿入済みデータ全体をファイルにフラッシュしたことを保証します。 | `false` | -| `fsync_directories` | ディレクトリに対して `fsync` を実行します。Distributed テーブルでのバックグラウンド挿入に関連する操作(挿入後、シャードへのデータ送信後など)の後で、OS がディレクトリメタデータを更新したことを保証します。 | `false` | -| `skip_unavailable_shards` | true の場合、ClickHouse は利用不能なシャードを黙って自動的にスキップします。シャードは次の場合に利用不能とマークされます: 1) 接続障害によりシャードに到達できない場合。2) シャードが DNS で解決できない場合。3) テーブルがそのシャード上に存在しない場合。 | `false` | -| `bytes_to_throw_insert` | バックグラウンド `INSERT` のために保留中の圧縮データ量(バイト数)がこの値を超えた場合、例外がスローされます。`0` の場合はスローしません。 | `0` | -| `bytes_to_delay_insert` | バックグラウンド `INSERT` のために保留中の圧縮データ量(バイト数)がこの値を超えた場合、クエリは遅延されます。`0` の場合は遅延しません。 | `0` | -| `max_delay_to_insert` | バックグラウンド送信のために保留中のバイト数が多い場合に、Distributed テーブルへのデータ挿入を遅延させる最大秒数。 | `60` | -| `background_insert_batch` | [`distributed_background_insert_batch`](../../../operations/settings/settings.md#distributed_background_insert_batch) と同じです。 | `0` | -| `background_insert_split_batch_on_failure` | [`distributed_background_insert_split_batch_on_failure`](../../../operations/settings/settings.md#distributed_background_insert_split_batch_on_failure) と同じです。 | `0` | -| `background_insert_sleep_time_ms` | [`distributed_background_insert_sleep_time_ms`](../../../operations/settings/settings.md#distributed_background_insert_sleep_time_ms) と同じです。 | `0` | -| `background_insert_max_sleep_time_ms` | [`distributed_background_insert_max_sleep_time_ms`](../../../operations/settings/settings.md#distributed_background_insert_max_sleep_time_ms) と同じです。 | `0` | -| `flush_on_detach` | `DETACH`/`DROP`/サーバーシャットダウン時に、リモートノードへデータをフラッシュします。 | `true` | - -:::note -**耐久性設定** (`fsync_...`): - -* データがまずイニシエーターノードのディスクに保存され、その後バックグラウンドでシャードへ送信される、バックグラウンド `INSERT`(つまり `distributed_foreground_insert=false`)にのみ影響します。 -* `INSERT` のパフォーマンスを大きく低下させる可能性があります。 -* 分散テーブルフォルダ内に保存されているデータを、**挿入を受け付けたノード** に書き込む処理に影響します。基盤となる MergeTree テーブルへの書き込み保証が必要な場合は、`system.merge_tree_settings` 内の耐久性設定(`...fsync...`)を参照してください。 - -**挿入制限設定**(`..._insert`)については、次も参照してください: - -* [`distributed_foreground_insert`](../../../operations/settings/settings.md#distributed_foreground_insert) 設定 -* [`prefer_localhost_replica`](/operations/settings/settings#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()` です。 - - -## クラスター - -クラスターは[サーバー設定ファイル](../../../operations/configuration-files.md)で構成されます。 - -```xml - - - - - - - - - - - 1 - - shard_01 - - false - - - 1 - example01-01-1 - 9000 - - - example01-01-2 - 9000 - - - - 2 - shard_02 - false - - example01-02-1 - 9000 - - - example01-02-2 - 1 - 9440 - - - - -``` - -ここでは、`logs` という名前のクラスタが定義されており、2 つのシャード(各シャードには 2 つのレプリカを含む)で構成されています。シャードとは、データの異なる部分を保持しているサーバーのことであり(すべてのデータを読み取るには、すべてのシャードにアクセスする必要があります)、レプリカはサーバーの複製です(すべてのデータを読み取るには、いずれか 1 つのレプリカ上のデータにアクセスすれば十分です)。 - -クラスタ名にはドットを含めてはいけません。 - -各サーバーには、`host`、`port`、および必要に応じて `user`、`password`、`secure`、`compression`、`bind_host` のパラメータを指定します。 - - -| Parameter | Description | Default Value | -|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------| -| `host` | リモートサーバーのアドレス。ドメイン名、IPv4 アドレス、または IPv6 アドレスを使用できます。ドメイン名を指定した場合、サーバー起動時に DNS リクエストが実行され、その結果はサーバーが稼働している間保持されます。DNS リクエストが失敗すると、サーバーは起動しません。DNS レコードを変更した場合は、サーバーを再起動してください。 | - | -| `port` | メッセージ送受信用に使用される TCP ポート(設定ファイル内の `tcp_port`、通常は 9000 に設定)。`http_port` と混同しないでください。 | - | -| `user` | リモートサーバーへ接続するためのユーザー名。このユーザーは指定したサーバーへの接続権限を持っている必要があります。アクセス権限は `users.xml` ファイルで設定します。詳細は [Access rights](../../../guides/sre/user-management/index.md) セクションを参照してください。 | `default` | -| `password` | リモートサーバーへ接続するためのパスワード(マスクされません)。 | '' | -| `secure` | セキュアな SSL/TLS 接続を使用するかどうか。通常、ポートの指定も必要です(デフォルトのセキュアポートは `9440`)。サーバーは `9440` でリッスンし、正しい証明書が設定されている必要があります。 | `false` | -| `compression` | データ圧縮を使用するかどうか。 | `true` | -| `bind_host` | このノードからリモートサーバーへ接続する際に使用する送信元アドレス。IPv4 アドレスのみサポートされます。ClickHouse の分散クエリで使用される送信元 IP アドレスを指定する必要がある、高度なデプロイメントのユースケース向けです。 | - | - -レプリカを指定すると、読み取り時に各シャードに対して利用可能なレプリカのうち 1 つが選択されます。ロードバランシングアルゴリズム(どのレプリカへアクセスするかの優先度)は、[load_balancing](../../../operations/settings/settings.md#load_balancing) 設定で構成できます。サーバーとの接続が確立できない場合、短いタイムアウトで接続を試行します。接続に失敗した場合は次のレプリカが選択され、すべてのレプリカについて同様に繰り返されます。すべてのレプリカへの接続試行が失敗した場合、同じ方法で複数回リトライされます。これはレジリエンス向上には有効ですが、完全なフォールトトレランスを提供するものではありません。リモートサーバーが接続を受け付けても、正常に動作しない、または性能が不十分な場合があるためです。 - -シャードを 1 つだけ指定することもできます(この場合、クエリ処理は「分散」ではなく「リモート」と呼ぶべきです)し、任意の数のシャードを指定することもできます。各シャード内では、1 つから任意の数のレプリカを指定できます。シャードごとに異なる数のレプリカを指定することも可能です。 - -設定内には、必要な数だけクラスターを指定できます。 - -クラスターを確認するには、`system.clusters` テーブルを使用します。 - -`Distributed` エンジンを使用すると、クラスターをローカルサーバーのように扱うことができます。ただし、クラスターの設定は動的に指定することはできず、サーバーの設定ファイルで構成しておく必要があります。通常、クラスター内のすべてのサーバーは同一のクラスター設定を持ちます(必須ではありません)。設定ファイル内のクラスターは、サーバーを再起動することなくオンザフライで更新されます。 - -毎回未知のシャードやレプリカの集合に対してクエリを送信する必要がある場合、`Distributed` テーブルを作成する必要はありません。その代わりに `remote` テーブル関数を使用してください。詳細は [Table functions](../../../sql-reference/table-functions/index.md) セクションを参照してください。 - - - -## データの書き込み {#distributed-writing-data} - -クラスターにデータを書き込む方法は 2 つあります。 - -1 つ目は、どのサーバーにどのデータを書き込むかを自分で定義し、各シャードに直接書き込む方法です。言い換えると、`Distributed` テーブルが参照しているクラスター内のリモートテーブルに対して、直接 `INSERT` 文を実行します。これは、任意のシャーディング方式を使用できるため、対象分野の要件により複雑な方式であっても対応できる、最も柔軟な方法です。また、この方式では異なるシャードに完全に独立してデータを書き込めるため、最も効率的でもあります。 - -2 つ目は、`Distributed` テーブルに対して `INSERT` 文を実行する方法です。この場合、テーブル自体が挿入されたデータをサーバー間に分散します。`Distributed` テーブルに書き込むには、`sharding_key` パラメータが設定されている必要があります(シャードが 1 つしかない場合を除く)。 - -各シャードには、設定ファイル内で `` を定義できます。デフォルトでは weight は `1` です。データは、シャードの weight に比例した量でシャード間に分散されます。すべてのシャードの weight が合計され、その後、各シャードの weight を合計値で割ることで、各シャードの比率が決まります。例えば、2 つのシャードがあり、1 つ目の weight が 1、2 つ目の weight が 2 の場合、1 つ目のシャードには挿入された行の 3 分の 1 (1 / 3)、2 つ目のシャードには 3 分の 2 (2 / 3) が送られます。 - -各シャードには、設定ファイル内で `internal_replication` パラメータを定義できます。このパラメータが `true` に設定されている場合、書き込み処理は最初の正常なレプリカを選択し、そのレプリカにデータを書き込みます。これは、`Distributed` テーブルの背後にあるテーブルがレプリケートされたテーブル(例: 任意の `Replicated*MergeTree` テーブルエンジン)である場合に使用します。テーブルレプリカのうち 1 つが書き込みを受け取り、その後自動的に他のレプリカへレプリケートされます。 - -`internal_replication` が `false`(デフォルト)に設定されている場合、データはすべてのレプリカに書き込まれます。この場合、`Distributed` テーブル自体がデータを複製します。これは、レプリケートされたテーブルを使用する場合よりも劣ります。というのも、レプリカ間の一貫性が検査されず、時間の経過とともに、レプリカごとにわずかに異なるデータを保持するようになるためです。 - -どのシャードに行データを送るかを選択するために、シャーディング式が評価され、その結果をシャードの総 weight で割った余りが取られます。行は、余りが `prev_weights` から `prev_weights + weight` までの半開区間に対応するシャードに送られます。ここで、`prev_weights` は番号がより小さいシャードの総 weight、`weight` はそのシャード自身の weight です。例えば、2 つのシャードがあり、1 つ目の weight が 9、2 つ目の weight が 10 の場合、余りが範囲 \[0, 9) に入る行は 1 つ目のシャードに、範囲 \[9, 19) に入る行は 2 つ目のシャードに送られます。 - -シャーディング式は、定数やテーブル列からなる任意の式であり、整数を返す必要があります。例えば、データをランダムに分散するには `rand()` を使用できますし、ユーザー ID を割った余りで分散するには `UserID` を使用できます(この場合、1 人のユーザーのデータは 1 つのシャードにのみ配置されるため、ユーザー単位の `IN` や `JOIN` を実行しやすくなります)。ある列が十分に均等に分散されない場合は、`intHash64(UserID)` のようにハッシュ関数でラップできます。 - -単純な除算の余りによる方法は、シャーディングの解決策としては限定的であり、常に適切というわけではありません。これは、中〜大規模(サーバーが数十台)のデータ量では機能しますが、非常に大規模(サーバーが数百台以上)のデータ量には向きません。後者の場合、`Distributed` テーブルを使用するのではなく、対象分野で求められるシャーディング方式を使用してください。 - -次のような場合には、シャーディング方式について検討する必要があります。 - - - -- 特定のキーでデータを結合する(`IN` または `JOIN`)クエリを使用している場合、そのキーでデータがシャーディングされていれば、`GLOBAL IN` や `GLOBAL JOIN` よりもはるかに効率的なローカルな `IN` または `JOIN` を使用できます。 -- 多数のサーバー(数百台以上)を使用し、多数の小さなクエリ、たとえば個々のクライアント(ウェブサイト、広告主、パートナーなど)のデータに対するクエリを実行する場合。小さなクエリがクラスター全体に影響しないようにするには、1 クライアントのデータを 1 シャード上に配置するのが理にかなっています。あるいは、二段階のシャーディングを構成することもできます。クラスター全体を複数の「レイヤー」に分割し、レイヤーは複数のシャードから構成されるようにします。1 クライアントのデータは 1 つのレイヤー内に配置されますが、必要に応じてそのレイヤーにシャードを追加でき、データはそれらのシャード内でランダムに分散されます。各レイヤーに対して `Distributed` テーブルを作成し、グローバルなクエリ用に 1 つの共有の `Distributed` テーブルを作成します。 - -データはバックグラウンドで書き込まれます。テーブルに `INSERT` されたとき、データブロックはローカルファイルシステムに書き込まれるだけです。データは可能な限り早くバックグラウンドでリモートサーバーへ送信されます。データ送信の周期は、[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/server-configuration-parameters/settings#background_distributed_schedule_pool_size) 設定で指定できます。 - -`Distributed` テーブルへの `INSERT` 実行後に、サーバーが消失した場合や(ハードウェア障害などにより)クラッシュして強制再起動された場合、挿入されたデータが失われる可能性があります。テーブルディレクトリ内で破損したデータパーツが検出されると、それは `broken` サブディレクトリに移動され、以後は使用されません。 - - - -## データの読み取り {#distributed-reading-data} - -`Distributed` テーブルをクエリする場合、`SELECT` クエリはすべてのシャードに送信され、データがシャード間でどのように分散されているかに関係なく動作します(完全にランダムに分散されていても問題ありません)。新しいシャードを追加する場合、既存のデータをそのシャードへ移行する必要はありません。その代わり、新しいシャードに対してより大きな重み付けを指定して新しいデータを書き込むことができます。この場合、データの分散はやや不均一になりますが、クエリは正しくかつ効率的に動作します。 - -`max_parallel_replicas` オプションが有効な場合、クエリ処理は 1 つのシャード内のすべてのレプリカに対して並列化されます。詳細については、[max_parallel_replicas](../../../operations/settings/settings.md#max_parallel_replicas) セクションを参照してください。 - -分散環境における `in` および `global in` クエリがどのように処理されるかの詳細については、[こちら](/sql-reference/operators/in#distributed-subqueries) のドキュメントを参照してください。 - - - -## 仮想カラム {#virtual-columns} - -#### _Shard_num {#_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/server-configuration-parameters/settings#background_distributed_schedule_pool_size) 設定 -- [`shardNum()`](../../../sql-reference/functions/other-functions.md#shardNum) および [`shardCount()`](../../../sql-reference/functions/other-functions.md#shardCount) 関数 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md deleted file mode 100644 index 666d7949b08..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md +++ /dev/null @@ -1,234 +0,0 @@ ---- -description: '`Executable` および `ExecutablePool` テーブルエンジンを使用すると、スクリプトの標準出力(**stdout**)に行を書き出すことで、そのスクリプトから行が生成されるテーブルを定義できます。' -sidebar_label: 'Executable/ExecutablePool' -sidebar_position: 40 -slug: /engines/table-engines/special/executable -title: '`Executable` および `ExecutablePool` テーブルエンジン' -doc_type: 'reference' ---- - - - -# 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` - * 説明: コマンドの標準出力からデータを読み取るタイムアウト(ミリ秒) - * デフォルト値: 10000 -* `command_write_timeout` - * 説明: コマンドの標準入力へデータを書き込むタイムアウト(ミリ秒) - * デフォルト値: 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='') - - # 結果を標準出力にフラッシュする - 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` を使うと、コメントがポジティブかネガティブかニュートラルかを判定し、-1(非常にネガティブなコメント)から 1(非常にポジティブなコメント)の値を割り当てることができます。`nltk` を使って Hacker News のコメントのセンチメント(感情)を計算する `Executable` テーブルを作成してみましょう。 - -この例では、[こちら](/engines/table-engines/mergetree-family/invertedindexes/#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` の結果セットの 1 行に対応します -* 入力として渡される行はタブ区切りになっているため、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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md deleted file mode 100644 index db6c663ecc1..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -description: 'ClickHouse では、`SELECT` クエリと一緒に、そのクエリの処理に必要なデータをサーバーに送信することができます。このデータは一時テーブルに格納され、クエリ内で(たとえば `IN` 演算子などで)使用できます。' -sidebar_label: 'クエリ処理のための外部データ' -sidebar_position: 130 -slug: /engines/table-engines/special/external-data -title: 'クエリ処理のための外部データ' -doc_type: 'reference' ---- - -# クエリ処理のための外部データ - -ClickHouse では、`SELECT` クエリと一緒に、そのクエリの処理に必要なデータをサーバーに送信できます。これらのデータは一時テーブル(「Temporary tables」のセクションを参照)に格納され、クエリ内(たとえば `IN` 演算子)で利用できます。 - -たとえば、重要なユーザー識別子が記載されたテキストファイルがある場合、そのリストでフィルタリングを行うクエリと一緒に、そのファイルをサーバーにアップロードできます。 - -大量の外部データを使って複数のクエリを実行する必要がある場合は、この機能は使用しないでください。その場合は、事前にデータを DB にアップロードしておく方が適切です。 - -外部データは、コマンドラインクライアント(非対話モード)または HTTP インターフェイスを使用してアップロードできます。 - -コマンドラインクライアントでは、次の形式でパラメータセクションを指定できます - -```bash ---external --file=... [--name=...] [--format=...] [--types=...|--structure=...] -``` - -転送されるテーブルの数に応じて、このようなセクションを複数指定することができます。 - -**–external** – 節の開始を示します。 -**–file** – テーブルダンプのファイルへのパス、または stdin を参照する `-` を指定します。 -stdin から取得できるのは単一のテーブルのみです。 - -次のパラメータは省略可能です: **–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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md deleted file mode 100644 index 2e9784010ee..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -description: 'File テーブルエンジンは、サポートされているファイル形式(`TabSeparated`、`Native` など)のいずれかで、データをファイルに保存します。' -sidebar_label: 'File' -sidebar_position: 40 -slug: /engines/table-engines/special/file -title: 'File テーブルエンジン' -doc_type: 'reference' ---- - - - -# File テーブルエンジン - -File テーブルエンジンは、サポートされている[ファイルフォーマット](/interfaces/formats#formats-overview)(`TabSeparated`、`Native` など)のいずれかでデータをファイルに保存します。 - -利用シナリオ: - -- ClickHouse からファイルへのデータエクスポート。 -- データをあるフォーマットから別のフォーマットへ変換。 -- ディスク上のファイルを編集して ClickHouse 内のデータを更新。 - -:::note -このエンジンは現在 ClickHouse Cloud では利用できません。[代わりに S3 テーブル関数を使用してください](/sql-reference/table-functions/s3.md)。 -::: - - - -## ClickHouse サーバーでの利用方法 - -```sql -File(Format) -``` - -`Format` パラメータは、利用可能なファイルフォーマットのうちの 1 つを指定します。`SELECT` クエリを実行するには、そのフォーマットが入力用としてサポートされている必要があり、`INSERT` クエリを実行するには出力用としてサポートされている必要があります。利用可能なフォーマットは [Formats](/interfaces/formats#formats-overview) セクションに一覧があります。 - -ClickHouse では、`File` に対してファイルシステムのパスを指定することはできません。サーバー設定の [path](../../../operations/server-configuration-parameters/settings.md) 設定で定義されたフォルダが使用されます。 - -`File(Format)` を使用してテーブルを作成すると、そのフォルダ内に空のサブディレクトリが作成されます。そのテーブルにデータが書き込まれると、そのサブディレクトリ内の `data.Format` ファイルに書き込まれます。 - -サーバーのファイルシステム上で、このサブフォルダとファイルを手動で作成し、その後、同じ名前のテーブルとして [ATTACH](../../../sql-reference/statements/attach.md) することで、そのファイルからデータをクエリできるようにすることも可能です。 - -:::note -この機能を使用する際は注意してください。ClickHouse は、この種のファイルに対する外部からの変更を追跡しません。ClickHouse 経由での書き込みと ClickHouse 外部からの書き込みが同時に行われた場合の結果は未定義です。 -::: - - -## 例 - -**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 での使用方法 - -[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` 式の最初の列としてクライアント識別子または名前を指定します)。 - -月単位でパーティション分割するには、`toYYYYMM(date_column)` 式を使用します。ここで `date_column` は [Date](/sql-reference/data-types/date.md) 型の日付を持つ列です。このときのパーティション名は `"YYYYMM"` 形式になります。 - - - -## 仮想カラム {#virtual-columns} - -- `_path` — ファイルへのパス。型: `LowCardinality(String)`。 -- `_file` — ファイル名。型: `LowCardinality(String)`。 -- `_size` — ファイルサイズ(バイト単位)。型: `Nullable(UInt64)`。サイズが不明な場合、値は `NULL` です。 -- `_time` — ファイルの最終更新時刻。型: `Nullable(DateTime)`。時刻が不明な場合、値は `NULL` です。 - - - -## 設定 {#settings} - -- [engine_file_empty_if_not_exists](/operations/settings/settings#engine_file_empty_if_not_exists) - 存在しないファイルに対して空のデータを選択できるようにします。デフォルトでは無効です。 -- [engine_file_truncate_on_insert](/operations/settings/settings#engine_file_truncate_on_insert) - 挿入前にファイルを切り詰められるようにします。デフォルトでは無効です。 -- [engine_file_allow_create_multiple_files](/operations/settings/settings.md#engine_file_allow_create_multiple_files) - フォーマットにサフィックスがある場合、挿入ごとに新しいファイルを作成できるようにします。デフォルトでは無効です。 -- [engine_file_skip_empty_files](/operations/settings/settings.md#engine_file_skip_empty_files) - 読み取り時に空のファイルをスキップできるようにします。デフォルトでは無効です。 -- [storage_file_read_method](/operations/settings/settings#engine_file_empty_if_not_exists) - ストレージファイルからデータを読み出す方法で、`read`、`pread`、`mmap` のいずれかです。`mmap` メソッドは clickhouse-server には適用されません(clickhouse-local 用です)。デフォルト値は、clickhouse-server では `pread`、clickhouse-local では `mmap` です。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md deleted file mode 100644 index 0870bcf5825..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -description: 'このエンジンは、アプリケーションログファイルをレコードのストリームとして処理します。' -sidebar_label: 'FileLog' -sidebar_position: 160 -slug: /engines/table-engines/special/filelog -title: 'FileLog テーブルエンジン' -doc_type: 'reference' ---- - - - -# FileLog テーブルエンジン {#filelog-engine} - -このエンジンを使用すると、アプリケーションのログファイルをレコードのストリームとして処理できます。 - -`FileLog` を使用すると、次のことができます: - -- ログファイルを監視する。 -- 監視対象のログファイルに追記された新しいレコードを処理する。 - - - -## テーブルを作成する - -```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'] -``` - -Engine 引数: - -* `path_to_logs` – 購読対象とするログファイルへのパス。ログファイルを含むディレクトリへのパス、または単一のログファイルへのパスを指定できます。なお、ClickHouse は `user_files` ディレクトリ内のパスのみを許可します。 -* `format_name` - レコードフォーマット。FileLog はファイル内の各行を個別のレコードとして処理するため、すべてのデータフォーマットが適しているわけではない点に注意してください。 - -オプションパラメータ: - -* `poll_timeout_ms` - ログファイルからの 1 回のポーリングにおけるタイムアウト。デフォルト: [stream_poll_timeout_ms](../../../operations/settings/settings.md#stream_poll_timeout_ms)。 -* `poll_max_batch_size` — 1 回のポーリングで取得される最大レコード数。デフォルト: [max_block_size](/operations/settings/settings#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 エンジンでエラーをどのように処理するか。指定可能な値: `default`(メッセージのパースに失敗した場合に例外をスロー)、`stream`(例外メッセージと元のメッセージを仮想カラム `_error` と `_raw_message` に保存)。 - - -## 説明 - -取り込まれたレコードは自動的に追跡されるため、ログファイル内の各レコードは一度だけカウントされます。 - -`SELECT` は(デバッグ用途を除き)レコードの読み取りにはあまり有用ではありません。各レコードは一度しか読み取れないためです。代わりに、[マテリアライズドビュー](../../../sql-reference/statements/create/view.md) を使ってリアルタイム処理パイプラインを作成する方が実用的です。これを行うには、次のようにします。 - -1. FileLog エンジンを使用して FileLog テーブルを作成し、それをデータストリームと見なします。 -2. 目的の構造を持つテーブルを作成します。 -3. エンジンから読み取ったデータを変換して、事前に作成したテーブルに格納するマテリアライズドビューを作成します。 - -`MATERIALIZED VIEW` がエンジンに接続されると、バックグラウンドでデータの収集を開始します。これにより、ログファイルから継続的にレコードを受信し、`SELECT` を使用して必要な形式に変換できます。 -1 つの FileLog テーブルには、必要な数だけマテリアライズドビューを作成できます。これらはテーブルから直接データを読み取るのではなく、新しいレコードを(ブロック単位で)受け取ります。この方法により、詳細度の異なる複数のテーブル(グループ化・集約あり/なし)に書き込むことができます。 - -例: - -```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; -``` - -ストリームデータの受信を停止するか、変換ロジックを変更するには、マテリアライズドビューをデタッチします。 - -```sql - DETACH TABLE consumer; - ATTACH TABLE consumer; -``` - -`ALTER` を使用してターゲットテーブルを変更する場合は、ターゲットテーブルとビューからのデータとの不整合を避けるため、マテリアルビューを無効化することを推奨します。 - - -## 仮想カラム {#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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md deleted file mode 100644 index 0e22ebc3efe..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -description: 'GenerateRandom テーブルエンジンは、指定されたテーブルスキーマに従ってランダムなデータを生成します。' -sidebar_label: 'GenerateRandom' -sidebar_position: 140 -slug: /engines/table-engines/special/generate -title: 'GenerateRandom テーブルエンジン' -doc_type: 'reference' ---- - - - -# GenerateRandom テーブルエンジン - -GenerateRandom テーブルエンジンは、指定されたテーブルスキーマに基づいてランダムなデータを生成します。 - -使用例: - -- テストで再現可能な大規模テーブルを作成するために使用します。 -- ファジングテスト用のランダムな入力データを生成します。 - - - -## ClickHouse サーバーでの利用方法 - -```sql -ENGINE = GenerateRandom([random_seed [,max_string_length [,max_array_length]]]) -``` - -`max_array_length` と `max_string_length` パラメータは、生成されるデータ内のすべての配列型およびマップ型カラムと文字列の最大長をそれぞれ指定します。 - -Generate テーブルエンジンは `SELECT` クエリのみをサポートします。 - -テーブルに保存可能な [DataTypes](../../../sql-reference/data-types/index.md) のうち、`AggregateFunction` を除くすべてをサポートします。 - - -## 例 - -**1.** `generate_engine_table` テーブルを作成します。 - -```sql -CREATE TABLE generate_engine_table (name String, value UInt32) ENGINE = GenerateRandom(1, 5, 3) -``` - -**2.** データをクエリします: - -```sql -SELECT * FROM generate_engine_table LIMIT 3 -``` - -```text -┌─name─┬──────value─┐ -│ c4xJ │ 1412771199 │ -│ r │ 1791099446 │ -│ 7#$ │ 124312908 │ -└──────┴────────────┘ -``` - - -## 実装の詳細 {#details-of-implementation} - -- サポート対象外: - - `ALTER` - - `SELECT ... SAMPLE` - - `INSERT` - - インデックス - - レプリケーション diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md deleted file mode 100644 index e6134f97d1c..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -description: '特殊なテーブルエンジンに関するドキュメント' -sidebar_label: '特殊' -sidebar_position: 50 -slug: /engines/table-engines/special/ -title: '特殊テーブルエンジン' -doc_type: 'reference' ---- - - - -# 特殊なテーブルエンジン - -テーブルエンジンには、主に次の 3 つのカテゴリがあります。 - -* 本番利用向けの [MergeTree エンジンファミリー](../../../engines/table-engines/mergetree-family/index.md)。 -* 小規模な一時データ向けの [Log エンジンファミリー](../../../engines/table-engines/log-family/index.md)。 -* [連携用テーブルエンジン](../../../engines/table-engines/integrations/index.md)。 - -それ以外のエンジンは用途が固有で、まだファミリーとしてグループ化されていないため、この「特殊」カテゴリに分類されています。 - -{/* このページの目次テーブルは、 - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - によって、YAML フロントマターのフィールド slug、description、title から自動生成されています。 - - 誤りに気付いた場合は、該当ページの YML フロントマターを編集してください。 - */ } - - -{/*AUTOGENERATED_START*/ } - -| Page | 説明 | -| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| [Alias table engine](/engines/table-engines/special/alias) | Alias テーブルエンジンは、別のテーブルへの透過的なプロキシを作成します。すべての操作は対象テーブルに転送され、エイリアス自体はデータを保持しません。 | -| [Distributed table engine](/engines/table-engines/special/distributed) | Distributed エンジンを持つテーブルは自身のデータを一切保持しませんが、複数サーバー上での分散クエリ処理を可能にします。読み取りは自動的に並列化されます。読み取り時には、存在する場合はリモートサーバー上のテーブルインデックスが使用されます。 | -| [Dictionary table engine](/engines/table-engines/special/dictionary) | `Dictionary` エンジンは、辞書データを ClickHouse テーブルとして表示します。 | -| [Merge table engine](/engines/table-engines/special/merge) | `Merge` エンジン(`MergeTree` と混同しないでください)は自体ではデータを保存しませんが、任意の数の他のテーブルから同時に読み取ることを可能にします。 | -| [Executable and ExecutablePool table engines](/engines/table-engines/special/executable) | `Executable` および `ExecutablePool` テーブルエンジンを使用すると、(行を **stdout** に書き出すことで)定義したスクリプトから行が生成されるテーブルを定義できます。 | -| [File table engine](/engines/table-engines/special/file) | File テーブルエンジンは、サポートされているファイル形式(`TabSeparated`、`Native` など)のいずれかでデータをファイル内に保持します。 | -| [Null table engine](/engines/table-engines/special/null) | `Null` テーブルに書き込むと、データは破棄されます。`Null` テーブルから読み取ると、レスポンスは空になります。 | -| [Set table engine](/engines/table-engines/special/set) | 常に RAM 上に存在するデータセットです。`IN` 演算子の右側での使用を意図しています。 | -| [Join table engine](/engines/table-engines/special/join) | JOIN 演算で使用するためのオプションの事前構築済みデータ構造です。 | -| [URL table engine](/engines/table-engines/special/url) | リモートの HTTP/HTTPS サーバーとの間でデータをクエリします。このエンジンは File エンジンに似ています。 | -| [View table engine](/engines/table-engines/special/view) | ビューを実装するために使用されます(詳細は `CREATE VIEW query` を参照してください)。データは保存せず、指定された `SELECT` クエリのみを保持します。テーブルから読み取るときには、このクエリを実行し(クエリから不要なカラムをすべて削除します)。 | -| [Memory table engine](/engines/table-engines/special/memory) | Memory エンジンは、データを RAM 上に非圧縮形式で保存します。データは、読み出す際にも受信時とまったく同じ形式のまま保持されます。言い換えると、このテーブルからの読み取りには一切の追加処理が発生しません。 | -| [Buffer table engine](/engines/table-engines/special/buffer) | 書き込み対象のデータを RAM 上でバッファリングし、定期的に別のテーブルへフラッシュします。読み取り操作時には、バッファともう一方のテーブルの両方から同時にデータが読み取られます。 | -| [External data for query processing](/engines/table-engines/special/external-data) | ClickHouse では、`SELECT` クエリと一緒に、クエリを処理するために必要なデータをサーバーに送信できます。このデータは一時テーブルに格納され、クエリ内で(たとえば `IN` 演算子で)使用できます。 | -| [GenerateRandom table engine](/engines/table-engines/special/generate) | GenerateRandom テーブルエンジンは、指定されたテーブルスキーマに対してランダムなデータを生成します。 | -| [KeeperMap table engine](/engines/table-engines/special/keeper-map) | このエンジンを使用すると、Keeper/ZooKeeper クラスタを、一貫性のあるキー・バリュー・ストアとして、線形化可能な書き込みと逐次一貫性を持つ読み取りで利用できます。 | -| [FileLog table engine](/engines/table-engines/special/filelog) | このエンジンを使用すると、アプリケーションのログファイルをレコードストリームとして処理できます。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md deleted file mode 100644 index 4cba07ffe27..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -description: 'JOIN 操作で使用するためのオプションの事前構築されたデータ構造。' -sidebar_label: 'Join' -sidebar_position: 70 -slug: /engines/table-engines/special/join -title: 'Join テーブルエンジン' -doc_type: 'reference' ---- - - - -# Join テーブルエンジン - -[JOIN](/sql-reference/statements/select/join) 演算で使用するための、オプションの事前構築済みデータ構造です。 - -:::note -ClickHouse Cloud で、サービスがバージョン 25.4 より前に作成されている場合は、`SET compatibility=25.4` を実行して、compatibility を少なくとも 25.4 に設定する必要があります。 -::: - - - -## テーブルの作成 - -```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](/sql-reference/statements/create/table) クエリの詳細については、説明を参照してください。 - - -## エンジンパラメータ {#engine-parameters} - -### `join_strictness` {#join_strictness} - -`join_strictness` – [JOIN の厳密度](/sql-reference/statements/select/join#supported-types-of-join)。 - -### `join_type` {#join_type} - -`join_type` – [JOIN の種類](/sql-reference/statements/select/join#supported-types-of-join)。 - -### キー列 {#key-columns} - -`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} - -`INSERT` クエリを使用して、`Join` エンジンのテーブルにデータを追加できます。テーブルが `ANY` 厳密度で作成されている場合、重複キーのデータは無視されます。`ALL` 厳密度では、すべての行が追加されます。 - -`Join` エンジンテーブルの主なユースケースは次のとおりです。 - -- `JOIN` 句の右側にテーブルを配置する。 -- [joinGet](/sql-reference/functions/other-functions.md/#joinGet) 関数を呼び出し、辞書と同じ方法でテーブルからデータを抽出する。 - -### データの削除 {#deleting-data} - -`Join` エンジンテーブルに対する `ALTER DELETE` クエリは、[mutation](/sql-reference/statements/alter/index.md#mutations) として実装されています。`DELETE` mutation はフィルタ済みのデータを読み取り、メモリおよびディスク上のデータを上書きします。 - -### 制限事項と設定 {#join-limitations-and-settings} - -テーブル作成時には、次の設定が適用されます。 - -#### `join_use_nulls` {#join_use_nulls} - -[join_use_nulls](/operations/settings/settings.md/#join_use_nulls) - -#### `max_rows_in_join` {#max_rows_in_join} - -[max_rows_in_join](/operations/settings/settings#max_rows_in_join) - -#### `max_bytes_in_join` {#max_bytes_in_join} - -[max_bytes_in_join](/operations/settings/settings#max_bytes_in_join) - -#### `join_overflow_mode` {#join_overflow_mode} - -[join_overflow_mode](/operations/settings/settings#join_overflow_mode) - -#### `join_any_take_last_row` {#join_any_take_last_row} - -[join_any_take_last_row](/operations/settings/settings.md/#join_any_take_last_row) -#### `join_use_nulls` {#join_use_nulls-1} - -#### Persistent {#persistent} - -Join および [Set](/engines/table-engines/special/set.md) テーブルエンジンの永続化を無効にします。 - -I/O オーバーヘッドを削減します。性能を重視し、永続化を必要としないシナリオに適しています。 - -設定可能な値: - -- 1 — 有効。 -- 0 — 無効。 - -デフォルト値: `1`。 - -`Join` エンジンテーブルは `GLOBAL JOIN` 操作では使用できません。 - -`Join` エンジンでは、`CREATE TABLE` 文内で [join_use_nulls](/operations/settings/settings.md/#join_use_nulls) 設定を指定できます。[SELECT](/sql-reference/statements/select/index.md) クエリでも同じ `join_use_nulls` の値を使用する必要があります。 - - - -## 使用例 - -左側テーブルの作成: - -```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/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md deleted file mode 100644 index 60922cac90f..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -description: 'このエンジンを使用すると、Keeper/ZooKeeper クラスターを、書き込みは線形化可能、読み取りは逐次一貫性を持つ、一貫性のあるキーバリューストアとして利用できます。' -sidebar_label: 'KeeperMap' -sidebar_position: 150 -slug: /engines/table-engines/special/keeper-map -title: 'KeeperMap テーブルエンジン' -doc_type: 'reference' ---- - - - -# KeeperMap テーブルエンジン - -このエンジンを使用すると、Keeper/ZooKeeper クラスターを、線形化可能な書き込みと逐次一貫な読み取りを備えた一貫性のあるキー・バリュー ストアとして利用できます。 - -KeeperMap ストレージエンジンを有効化するには、テーブルを保存する ZooKeeper パスを `` 設定で定義する必要があります。 - -例: - -```xml - - /keeper_map_tables - -``` - -ここで path には任意の有効な ZooKeeper パスを指定できます。 - - -## テーブルを作成する - -```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` – カラムリスト内の任意のカラム名。 -* `primary key` は必ず指定する必要があり、主キーとしては 1 つのカラムのみをサポートします。主キーは ZooKeeper 内で `node name` としてバイナリ形式でシリアライズされます。 -* 主キー以外のカラムは、対応する順序でバイナリにシリアライズされ、シリアライズされたキーによって定義される生成ノードの値として保存されます。 -* キーに対して `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` を実行することで、同様のデータ共有効果を得ることができます。 - - -## サポートされている操作 - -### 挿入 - -新しい行が `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; -``` - - -## 関連コンテンツ {#related-content} - -- ブログ記事: [ClickHouse と Hex を利用したリアルタイム分析アプリの構築](https://clickhouse.com/blog/building-real-time-applications-with-clickhouse-and-hex-notebook-keeper-engine) diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md deleted file mode 100644 index 2eb34ab15af..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -description: 'Memory エンジンはデータを圧縮せずに RAM 上に保持します。データは取り込まれたときの形式そのままで保存されます。言い換えると、このテーブルからの読み取りでは追加の処理コストが一切発生しません。' -sidebar_label: 'Memory' -sidebar_position: 110 -slug: /engines/table-engines/special/memory -title: 'Memory テーブルエンジン' -doc_type: 'reference' ---- - - - -# Memory テーブルエンジン - -:::note -ClickHouse Cloud 上で Memory テーブルエンジンを使用する場合、データは(設計上)すべてのノード間でレプリケートされません。すべてのクエリが同じノードにルーティングされ、Memory テーブルエンジンが期待どおりに動作することを保証するには、次のいずれかを行ってください: -- 同一セッション内で、すべての操作を実行する -- TCP またはネイティブインターフェース(スティッキー接続をサポート)を使用するクライアント、たとえば [clickhouse-client](/interfaces/cli) を使用する -::: - -Memory エンジンは、圧縮されていない形式でデータを RAM に保存します。データは読み取り時に受け取ったものとまったく同じ形式で保存されます。言い換えると、このテーブルからの読み取りコストはほぼゼロです。 -同時データアクセスは同期制御されます。ロック時間は短く、読み取りと書き込み操作は互いにブロックしません。 -インデックスはサポートされません。読み取りは並列化されます。 - -ディスクからの読み取りやデータの解凍、デシリアライズがないため、単純なクエリでは最大スループット(10 GB/秒超)が得られます。(多くの場合、MergeTree エンジンのスループットもほぼ同等であることに注意してください。) -サーバーを再起動すると、テーブル内のデータは消失し、テーブルは空になります。 -通常、このテーブルエンジンを使用する必然性はあまりありません。ただし、テスト用途や、比較的少ない行数(おおよそ 100,000,000 行まで)に対して最大速度が求められるタスクには使用できます。 - -Memory エンジンは、クエリの外部データ用一時テーブル(「クエリを処理するための外部データ」のセクションを参照)や、`GLOBAL IN` の実装(「IN 演算子」のセクションを参照)に、システムによって使用されます。 - -Memory エンジンのテーブルサイズを制限するために上限および下限を指定でき、事実上、循環バッファとして動作させることができます([Engine Parameters](#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` -- `compress` — メモリ上のデータを圧縮するかどうか。 - - デフォルト値: `false` - - - -## 使用方法 - -**設定を初期化する** - -```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` のうち小さい方の値が優先されます。 - - -## 例 - -```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 バイト - -/* 2. 削除されないブロックを追加 */ -INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 1'024 バイト - -/* 3. 最も古いブロックが削除されることをテスト - 9216 バイト - 1100 */ -INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 8'192 バイト - -/* 4. 非常に大きなブロックがすべてを置き換えることを確認 */ -INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 65'536 バイト - -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 行 - -/* 2. 削除されないブロックを追加する */ -INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 行 - -/* 3. 最古のブロックが削除されることを確認 - 9216 バイト - 1100 行 */ -INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 行 - -/* 4. 非常に大きなブロックがすべてを置き換えることを確認 */ -INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 行 - -SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase(); -``` - -```text -┌─total_bytes─┬─total_rows─┐ -│ 65536 │ 10000 │ -└─────────────┴────────────┘ -``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md deleted file mode 100644 index 90a696086c3..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -description: '`Merge` エンジン(`MergeTree` と混同しないでください)は自分自身ではデータを保存せず、任意の数の他のテーブルから同時に読み出すことができます。' -sidebar_label: 'Merge' -sidebar_position: 30 -slug: /engines/table-engines/special/merge -title: 'Merge テーブルエンジン' -doc_type: 'reference' ---- - - - -# Merge テーブルエンジン - -`Merge` エンジン(`MergeTree` と混同しないでください)は、自身ではデータを保存せず、任意の数の他のテーブルから同時に読み取ることができます。 - -読み取りは自動的に並列化されます。テーブルへの書き込みはサポートされていません。読み取り時には、存在する場合は、実際に読み出されるテーブルのインデックスが使用されます。 - - - -## テーブルを作成する - -```sql -CREATE TABLE ... Engine=Merge(db_name, tables_regexp) -``` - - -## エンジンパラメータ {#engine-parameters} - -### `db_name` {#db_name} - -`db_name` — 指定可能な値: - - データベース名 - - データベース名の文字列を返す定数式(例: `currentDatabase()`) - - `REGEXP(expression)`。ここで `expression` は DB 名にマッチする正規表現。 - -### `tables_regexp` {#tables_regexp} - -`tables_regexp` — 指定した DB または複数の DB 内のテーブル名にマッチさせるための正規表現。 - -正規表現 — [re2](https://github.com/google/re2)(PCRE のサブセットをサポート)、大文字小文字を区別します。 -正規表現内での記号のエスケープについては「match」セクションの注意事項を参照してください。 - - - -## 使用方法 {#usage} - -テーブルを読み取り対象として選択する際は、たとえ正規表現にマッチしても `Merge` テーブル自体は選択されません。これはループを避けるためです。 -互いのデータを延々と読み合おうとする 2 つの `Merge` テーブルを作成することも技術的には可能ですが、これは望ましくありません。 - -`Merge` エンジンの典型的な使用方法は、多数の `TinyLog` テーブルを 1 つのテーブルであるかのように扱うことです。 - - - -## 例 - -**例 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 -ORDER BY (date, UserId, EventType); - -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)。 - - `_table` に対してフィルタを行う場合(例: `WHERE _table='xyz'`)、フィルタ条件を満たすテーブルのみが読み取られます。 - -- `_database` — データが読み取られたデータベースの名前。型: [String](../../../sql-reference/data-types/string.md)。 - -**参照** - -- [仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns) -- [merge](../../../sql-reference/table-functions/merge.md) テーブル関数 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md deleted file mode 100644 index 15c23ae1b61..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -description: '`Null` テーブルに書き込むと、データは無視されます。`Null` テーブルから読み出すと、結果は空になります。' -sidebar_label: 'Null' -sidebar_position: 50 -slug: /engines/table-engines/special/null -title: 'Null テーブルエンジン' -doc_type: 'reference' ---- - -# Null テーブルエンジン - -`Null` テーブルにデータを書き込むと、そのデータは無視されます。 -`Null` テーブルから読み出すと、レスポンスは空になります。 - -`Null` テーブルエンジンは、データ変換後に元のデータが不要になるようなユースケースに有用です。 -このような用途のために、`Null` テーブル上にマテリアライズドビューを作成できます。 -テーブルに書き込まれたデータはビューが消費しますが、元の生データは破棄されます。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md deleted file mode 100644 index 986c831b63b..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -description: '常に RAM 上に保持されるデータセットです。`IN` 演算子の右側での利用を想定しています。' -sidebar_label: 'Set' -sidebar_position: 60 -slug: /engines/table-engines/special/set -title: 'Set テーブルエンジン' -doc_type: 'reference' ---- - - - -# Set テーブルエンジン - -:::note -ClickHouse Cloud では、サービスが 25.4 より前のバージョンで作成されている場合、`SET compatibility=25.4` を使って互換性を少なくとも 25.4 に設定する必要があります。 -::: - -常に RAM 上に保持されるデータセットです。`IN` 演算子の右辺での利用を想定しています(「IN 演算子」のセクションを参照してください)。 - -`INSERT` を使用してテーブルにデータを挿入できます。新しい要素はデータセットに追加され、重複は無視されます。 -ただし、このテーブルに対して `SELECT` を実行することはできません。データを取得する唯一の方法は、`IN` 演算子の右側で使用することです。 - -データは常に RAM に配置されます。`INSERT` の際、挿入されたデータのブロックはディスク上のテーブルのディレクトリにも書き込まれます。サーバー起動時に、このデータが RAM に読み込まれます。つまり、再起動後もデータは保持されます。 - -サーバーが異常再起動した場合、ディスク上のデータブロックが失われたり破損したりする可能性があります。後者の場合、破損したデータを含むファイルを手動で削除する必要があるかもしれません。 - -### 制限事項と設定 {#join-limitations-and-settings} - -テーブルを作成する際、以下の設定が適用されます。 - -#### Persistent {#persistent} - -Set および [Join](/engines/table-engines/special/join) テーブルエンジンに対して永続化を無効化します。 - -I/O のオーバーヘッドを削減します。パフォーマンスを重視し、永続化を必要としないシナリオに適しています。 - -設定可能な値: - -- 1 — 有効。 -- 0 — 無効。 - -デフォルト値: `1`。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md deleted file mode 100644 index 9b7c997f90c..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -description: 'リモート HTTP/HTTPS サーバーとの間でデータをクエリします。このエンジンは File エンジンに似ています。' -sidebar_label: 'URL' -sidebar_position: 80 -slug: /engines/table-engines/special/url -title: 'URL テーブルエンジン' -doc_type: 'reference' ---- - - - -# 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#formats-overview) を参照してください。 - - この引数が指定されていない場合、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) をサポートしている必要があります。 - -[max_http_get_redirects](/operations/settings/settings#max_http_get_redirects) 設定を使用して、HTTP GET リダイレクトの最大ホップ数を制限できます。 - - - -## 例 - -**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` 操作 - - インデックス - - レプリケーション - - - -## 仮想カラム {#virtual-columns} - -- `_path` — `URL` へのパス。型: `LowCardinality(String)`。 -- `_file` — `URL` のリソース名。型: `LowCardinality(String)`。 -- `_size` — リソースのサイズ(バイト単位)。型: `Nullable(UInt64)`。サイズが不明な場合、値は `NULL`。 -- `_time` — ファイルの最終更新時刻。型: `Nullable(DateTime)`。時刻が不明な場合、値は `NULL`。 -- `_headers` - HTTP レスポンスヘッダー。型: `Map(LowCardinality(String), LowCardinality(String))`。 - - - -## ストレージ設定 {#storage-settings} - -- [engine_url_skip_empty_files](/operations/settings/settings.md#engine_url_skip_empty_files) - 読み込み時に空のファイルをスキップできるようにします。既定では無効です。 -- [enable_url_encoding](/operations/settings/settings.md#enable_url_encoding) - URI パスのエンコード/デコード処理を有効/無効にできます。既定では有効です。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md b/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md deleted file mode 100644 index 0616c593050..00000000000 --- a/i18n/jp/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -description: 'ビューの実装に使用されます(詳細は `CREATE VIEW` クエリを参照してください)。データ自体は保存せず、指定された `SELECT` クエリのみを保持します。このエンジンを使用するテーブルから読み取る際には、このクエリを実行し(クエリから不要な列をすべて削除した上で)、結果を返します。' -sidebar_label: 'View' -sidebar_position: 90 -slug: /engines/table-engines/special/view -title: 'View テーブルエンジン' -doc_type: 'reference' ---- - -# View テーブルエンジン - -ビューを実装するために使用されます(詳細は `CREATE VIEW query` を参照してください)。データ自体は保存せず、指定された `SELECT` クエリだけを保持します。テーブルから読み取る際には、このクエリを実行し(不要なカラムはクエリからすべて削除され)、結果を返します。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/concurrency.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/concurrency.md index f5e674b2725..c0ea1fbb6b3 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/concurrency.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/concurrency.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['concurrency', 'QPS'] --- -# ClickHouse は高頻度かつ同時実行されるクエリをサポートしていますか? +# ClickHouse は高頻度かつ同時実行されるクエリをサポートしていますか? {#does-clickhouse-support-frequent-concurrent-queries} ClickHouse は、外部ユーザーに直接応答するリアルタイム分析アプリケーション向けに設計されています。ペタバイト規模のデータベースに対して、履歴データとリアルタイム挿入データを組み合わせつつ、低レイテンシ(10 ミリ秒未満)かつ高い同時実行性(1 秒あたり 10,000 クエリ超)で分析クエリを処理できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/cost-based.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/cost-based.md index eaec07b2442..47a30fb7c0a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/cost-based.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/cost-based.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['CBE', 'optimizer'] --- -# ClickHouse はコストベースオプティマイザを持っていますか? +# ClickHouse はコストベースオプティマイザを持っていますか? {#does-clickhouse-have-a-cost-based-optimizer} ClickHouse には、いくつかの限定的な形でコストベース最適化の仕組みがあります。たとえば、カラムの読み取り順序は、ディスクから圧縮されたデータ範囲を読み取るコストによって決定されます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/datalake.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/datalake.md index 537a73c76f4..4a1f70b3b9d 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/datalake.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/datalake.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['データレイク', 'レイクハウス'] --- -# ClickHouse はデータレイクをサポートしていますか? +# ClickHouse はデータレイクをサポートしていますか? {#does-clickhouse-support-data-lakes} ClickHouse は Iceberg、Delta Lake、Apache Hudi、Apache Paimon、Hive を含むデータレイクをサポートしています。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/dependencies.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/dependencies.md index d38c9d0558f..bd63aae30c8 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/dependencies.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/dependencies.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['dependencies', '3rd-party'] --- -# ClickHouse を実行する際に必要なサードパーティ製の依存関係はありますか? +# ClickHouse を実行する際に必要なサードパーティ製の依存関係はありますか? {#what-are-the-3rd-party-dependencies-for-running-clickhouse} ClickHouse には実行時の依存関係は一切ありません。完全に自己完結した単一バイナリアプリケーションとして配布されており、このアプリケーションだけでクラスタのすべての機能を提供します。クエリの処理に加え、クラスタ内のワーカーノードとして、RAFT コンセンサスアルゴリズムを提供する調整システムとして、さらにはクライアントやローカルクエリエンジンとして動作します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md index 2453ad2a5a9..80ea9d9a9f6 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['distributed', 'join'] --- -# ClickHouse は分散 JOIN をサポートしていますか? +# ClickHouse は分散 JOIN をサポートしていますか? {#does-clickhouse-support-distributed-join} ClickHouse はクラスタ上での分散 JOIN をサポートしています。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/federated.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/federated.md index 342fad39fe3..06c4db0bb3a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/federated.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/federated.md @@ -8,22 +8,22 @@ doc_type: 'reference' keywords: ['federated', 'hybrid', 'postgres', 'mysql', 'sqlite', 'odbc', 'jdbc'] --- -# ClickHouse はフェデレーテッドクエリをサポートしていますか? +# ClickHouse はフェデレーテッドクエリをサポートしていますか? {#does-clickhouse-support-federated-queries} ClickHouse は、分析用データベースの中でもフェデレーテッドクエリおよびハイブリッドクエリ実行について、最も包括的なサポートを提供します。 ClickHouse は外部データベースに対するクエリをサポートしています: -- PostgreSQL -- MySQL -- MongoDB -- Redis -- 任意の ODBC データソース -- 任意の JDBC データソース -- 任意の Arrow Flight データソース -- Kafka や RabbitMQ などのストリーミングデータソース -- Iceberg、Delta Lake、Apache Hudi、Apache Paimon などの Data Lake -- AWS S3、GCS、Minio、Cloudflare R2、Azure Blob Storage、Alicloud OSS、Tencent COS などの共有ストレージ上にある外部ファイル、ならびにローカルストレージ上の外部ファイル(幅広いデータフォーマットに対応) +* PostgreSQL +* MySQL +* MongoDB +* Redis +* 任意の ODBC データソース +* 任意の JDBC データソース +* 任意の Arrow Flight データソース +* Kafka や RabbitMQ などのストリーミングデータソース +* Iceberg、Delta Lake、Apache Hudi、Apache Paimon などの Data Lake +* AWS S3、GCS、Minio、Cloudflare R2、Azure Blob Storage、Alicloud OSS、Tencent COS などの共有ストレージ上にある外部ファイル、ならびにローカルストレージ上の外部ファイル(幅広いデータフォーマットに対応) ClickHouse は、1 つのクエリ内で複数の異なるデータソースを結合できます。また、ローカルリソースを活用しつつ、クエリの一部をリモートマシンにオフロードするハイブリッドクエリ実行オプションも提供します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/index.md index 0f5aba06085..0fc115e1aa0 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/index.md @@ -8,18 +8,18 @@ description: 'ClickHouse に関する一般的な質問をまとめたインデ doc_type: 'landing-page' --- -# ClickHouse に関する一般的な質問 +# ClickHouse に関する一般的な質問 {#general-questions-about-clickhouse} -- [ClickHouse とは何ですか?](../../intro.md) -- [なぜ ClickHouse はそんなに高速なのですか?](../../concepts/why-clickhouse-is-so-fast.mdx) -- [誰が 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) +* [ClickHouse とは何ですか?](../../intro.md) +* [なぜ ClickHouse はそんなに高速なのですか?](../../concepts/why-clickhouse-is-so-fast.mdx) +* [誰が 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/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/sql.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/sql.md index 9bbe1b382ae..c7754898585 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/sql.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/sql.md @@ -8,46 +8,46 @@ doc_type: 'reference' keywords: ['SQL 構文', 'ANSI SQL'] --- -# ClickHouse はどのような SQL 構文をサポートしていますか? +# ClickHouse はどのような SQL 構文をサポートしていますか? {#what-sql-syntax-does-clickhouse-support} ClickHouse は SQL 構文を完全にサポートしており、次のような機能が含まれます。 -- SQL/JSON と JSON データ型 (SQL-2023) -- ウィンドウ関数 (SQL-2003) -- 共通テーブル式 (CTE) と再帰クエリ (SQL-1999) -- ROLLUP、CUBE、GROUPING SETS (SQL-1999) -- RBAC の完全サポート (SQL-1999) -- 相関サブクエリ (SQL-1992) +* SQL/JSON と JSON データ型 (SQL-2023) +* ウィンドウ関数 (SQL-2003) +* 共通テーブル式 (CTE) と再帰クエリ (SQL-1999) +* ROLLUP、CUBE、GROUPING SETS (SQL-1999) +* RBAC の完全サポート (SQL-1999) +* 相関サブクエリ (SQL-1992) このサポートは、TPC-H および TPC-DS ベンチマーク、ならびに SQLTest によって検証されています。 ClickHouse は、ISO/IEC によって標準化される以前から、次のような多くの機能を導入してきました。 -- 条件付き集約関数 -- `any` 集約関数 -- `least` と `greatest` -- `GROUP BY ALL` -- エイリアスの拡張的な利用 -- 数値リテラル内でのアンダースコア +* 条件付き集約関数 +* `any` 集約関数 +* `least` と `greatest` +* `GROUP BY ALL` +* エイリアスの拡張的な利用 +* 数値リテラル内でのアンダースコア ClickHouse は、次のような大きな利便性向上機能を導入することで、SQL を拡張しています。 -- エイリアスの自由な利用 -- WITH 句内でのエイリアス -- 集約関数コンビネータ -- パラメータ化された集約関数 -- 近似集約関数 -- ネイティブおよびビッグ整数の数値データ型、拡張精度の decimal -- 配列操作のための高階関数 -- ARRAY JOIN 句および arrayJoin 関数 -- 配列集約 -- LIMIT BY 句 -- GROUP BY WITH TOTALS -- AS OF JOIN -- ANY/ALL JOIN -- JSON の自然な構文 -- カラムリスト末尾のカンマ -- FROM ... SELECT の句順 -- 型安全なクエリパラメータおよびパラメータ化ビュー +* エイリアスの自由な利用 +* WITH 句内でのエイリアス +* 集約関数コンビネータ +* パラメータ化された集約関数 +* 近似集約関数 +* ネイティブおよびビッグ整数の数値データ型、拡張精度の decimal +* 配列操作のための高階関数 +* ARRAY JOIN 句および arrayJoin 関数 +* 配列集約 +* LIMIT BY 句 +* GROUP BY WITH TOTALS +* AS OF JOIN +* ANY/ALL JOIN +* JSON の自然な構文 +* カラムリスト末尾のカンマ +* FROM ... SELECT の句順 +* 型安全なクエリパラメータおよびパラメータ化ビュー これらの一部は、今後の SQL 標準に取り込まれる可能性がありますが、ClickHouse ではすでに利用可能です。 \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/updates.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/updates.md index d9d508763d6..b0fb47739e4 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/updates.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/general/updates.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['更新', 'リアルタイム'] --- -# ClickHouse はリアルタイム更新をサポートしていますか? +# ClickHouse はリアルタイム更新をサポートしていますか? {#does-clickhouse-support-real-time-updates} ClickHouse は `UPDATE` 文をサポートしており、`INSERT` と同等の速度でリアルタイムに更新を実行できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/index.md index 630c608140d..b7781104e85 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/index.md @@ -8,15 +8,15 @@ description: 'ClickHouse を他のシステムと連携する際の質問を一 doc_type: 'landing-page' --- -# ClickHouse と他のシステムの連携に関する質問 +# ClickHouse と他のシステムの連携に関する質問 {#questions-about-integrating-clickhouse-and-other-systems} -- [ClickHouse からファイルへデータをエクスポートするにはどうすればよいですか?](https://clickhouse.com/docs/knowledgebase/file-export) -- [JSON を ClickHouse にインポートするにはどうすればよいですか?](/integrations/data-ingestion/data-formats/json/intro.md) -- [Kafka を ClickHouse に接続するにはどうすればよいですか?](/integrations/data-ingestion/kafka/index.md) -- [Java アプリケーションを ClickHouse に接続できますか?](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) -- [ClickHouse は MySQL のテーブルを読み込むことができますか?](/integrations/mysql) -- [ClickHouse は PostgreSQL のテーブルを読み込むことができますか?](/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md) -- [ODBC 経由で Oracle に接続するときにエンコーディングの問題が発生する場合はどうすればよいですか?](/faq/integration/oracle-odbc.md) +* [ClickHouse からファイルへデータをエクスポートするにはどうすればよいですか?](https://clickhouse.com/docs/knowledgebase/file-export) +* [JSON を ClickHouse にインポートするにはどうすればよいですか?](/integrations/data-ingestion/data-formats/json/intro.md) +* [Kafka を ClickHouse に接続するにはどうすればよいですか?](/integrations/data-ingestion/kafka/index.md) +* [Java アプリケーションを ClickHouse に接続できますか?](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) +* [ClickHouse は MySQL のテーブルを読み込むことができますか?](/integrations/mysql) +* [ClickHouse は PostgreSQL のテーブルを読み込むことができますか?](/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md) +* [ODBC 経由で Oracle に接続するときにエンコーディングの問題が発生する場合はどうすればよいですか?](/faq/integration/oracle-odbc.md) :::info お探しの情報が見つかりませんか? [Knowledge Base](/knowledgebase/) を確認し、あわせて本ドキュメント内の多数の有用な記事も参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/json-import.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/json-import.md index 8032ffda69c..e72f8bbac96 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/json-import.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/json-import.md @@ -16,7 +16,7 @@ ClickHouse は、[入出力用のさまざまなデータ形式](/interfaces/for -## 例 +## 例 {#examples} [HTTP インターフェース](../../interfaces/http.md)を使用する場合: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md index b89e7ca3b9c..58cffcbf35b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md @@ -8,9 +8,7 @@ doc_type: 'guide' keywords: ['oracle', 'odbc', 'encoding', 'integration', 'external dictionary'] --- - - -# ODBC 経由で Oracle を使用する際に文字コードの問題が発生した場合はどうすればよいですか? +# ODBC 経由で Oracle を使用する際に文字コードの問題が発生した場合はどうすればよいですか? {#oracle-odbc-encodings} Oracle ODBC ドライバを介して ClickHouse の外部ディクショナリのソースとして Oracle を使用する場合は、`/etc/default/clickhouse` 内の `NLS_LANG` 環境変数に正しい値を設定する必要があります。詳細については、[Oracle NLS_LANG FAQ](https://www.oracle.com/technetwork/products/globalization/nls-lang-099431.html) を参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md index 56b805d23d6..4aaf57e72f4 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md @@ -30,7 +30,7 @@ TTL は、データを [/dev/null](https://en.wikipedia.org/wiki/Null_device) -## DELETE FROM +## DELETE FROM {#delete-from} [DELETE FROM](/sql-reference/statements/delete.md) を使用すると、ClickHouse で標準的な DELETE クエリを実行できます。フィルター句で対象となった行は削除済みとしてマークされ、今後の結果セットには含まれません。行のクリーンアップは非同期に行われます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/index.md index ea1ddd01eed..577fb6d3ca3 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/operations/index.md @@ -8,16 +8,16 @@ doc_type: 'landing-page' keywords: ['運用', '管理', 'デプロイメント', 'クラスター管理', 'FAQ'] --- -# ClickHouse サーバーおよびクラスターの運用に関する質問 +# ClickHouse サーバーおよびクラスターの運用に関する質問 {#question-about-operating-clickhouse-servers-and-clusters} -- [本番環境ではどの ClickHouse バージョンを使用すべきですか?](/faq/operations/production.md) -- [ストレージとコンピュートを分離した構成で ClickHouse をデプロイできますか?](/faq/operations/separate_storage.md) -- [ClickHouse テーブルから古いレコードを削除できますか?](/faq/operations/delete-old-data.md) -- [ClickHouse Keeper はどのように構成すればよいですか?](/guides/sre/keeper/index.md) -- [ClickHouse を LDAP と連携できますか?](/guides/sre/user-management/configuring-ldap.md) -- [ClickHouse でユーザー、ロール、権限をどのように設定すればよいですか?](/guides/sre/user-management/index.md) -- [ClickHouse で行の更新や削除はできますか?](/guides/starter_guides/mutations.md) -- [ClickHouse はマルチリージョンレプリケーションをサポートしていますか?](/faq/operations/multi-region-replication.md) +* [本番環境ではどの ClickHouse バージョンを使用すべきですか?](/faq/operations/production.md) +* [ストレージとコンピュートを分離した構成で ClickHouse をデプロイできますか?](/faq/operations/separate_storage.md) +* [ClickHouse テーブルから古いレコードを削除できますか?](/faq/operations/delete-old-data.md) +* [ClickHouse Keeper はどのように構成すればよいですか?](/guides/sre/keeper/index.md) +* [ClickHouse を LDAP と連携できますか?](/guides/sre/user-management/configuring-ldap.md) +* [ClickHouse でユーザー、ロール、権限をどのように設定すればよいですか?](/guides/sre/user-management/index.md) +* [ClickHouse で行の更新や削除はできますか?](/guides/starter_guides/mutations.md) +* [ClickHouse はマルチリージョンレプリケーションをサポートしていますか?](/faq/operations/multi-region-replication.md) :::info お探しの内容が見つかりませんか? [Knowledge Base](/knowledgebase/) をご覧いただき、このドキュメント内にある多数の有用な記事もあわせて参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/faq/use-cases/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/faq/use-cases/index.md index f87d9568bb3..d3df69feefd 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/faq/use-cases/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/faq/use-cases/index.md @@ -8,10 +8,10 @@ keywords: ['ClickHouse use cases', '時系列データベース', 'キーバリ doc_type: 'landing-page' --- -# ClickHouse のユースケースに関する質問 +# ClickHouse のユースケースに関する質問 {#questions-about-clickhouse-use-cases} -- [ClickHouse を時系列データベースとして利用できますか?](/knowledgebase/time-series) -- [ClickHouse をキーバリューストレージとして利用できますか?](/knowledgebase/key-value) +* [ClickHouse を時系列データベースとして利用できますか?](/knowledgebase/time-series) +* [ClickHouse をキーバリューストレージとして利用できますか?](/knowledgebase/key-value) :::info お探しの情報が見つかりませんか? [Knowledge Base](/knowledgebase/) を確認し、本ドキュメント内にある多数の役立つ記事も参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md index 538ef960540..6a3e3d66220 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md @@ -11,11 +11,11 @@ keywords: ['Amazon レビュー', 'カスタマーレビュー データセッ :::note 以下のクエリは、**Production** 環境の ClickHouse Cloud インスタンス上で実行されています。詳細については -["Playground specifications"](/getting-started/playground#specifications) +["Playground specifications"](/getting-started/playground#specifications) を参照してください。 ::: -## データセットの読み込み +## データセットの読み込み {#loading-the-dataset} 1. データを ClickHouse に挿入しなくても、元の場所に対して直接クエリを実行できます。どのようなデータか確認するために、いくつか行を取得してみましょう。 @@ -123,7 +123,6 @@ FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_*.snappy.parquet') ``` - :::tip ClickHouse Cloud では、クラスター名は `default` です。`default` を環境のクラスター名に置き換えてください。クラスターがない場合は、`s3Cluster` の代わりに `s3` テーブル関数を使用してください。 ::: @@ -153,8 +152,7 @@ ORDER BY size DESC 元のデータは約 70G ありましたが、ClickHouse で圧縮されると約 30G に収まります。 - -## クエリ例 +## クエリ例 {#example-queries} 7. クエリをいくつか実行してみましょう。こちらは、このデータセットで最も役に立ったレビューの上位 10 件です。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md index eb779872fed..d023dd1cafe 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md @@ -7,7 +7,7 @@ title: '匿名化されたウェブアナリティクス' doc_type: 'guide' --- -# 匿名化されたウェブ解析データ +# 匿名化されたウェブ解析データ {#anonymized-web-analytics-data} このデータセットは、匿名化されたウェブ解析データを含む 2 つのテーブルで構成されており、ヒット(`hits_v1`)と訪問(`visits_v1`)のデータが含まれています。 @@ -15,17 +15,17 @@ doc_type: 'guide' ## データをダウンロードして取り込む {#download-and-ingest-the-data} -### hits の圧縮 TSV ファイルをダウンロードする +### hits の圧縮 TSV ファイルをダウンロードする {#download-the-hits-compressed-tsv-file} ```bash curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv -# チェックサムを検証する +# チェックサムを検証する {#validate-the-checksum} md5sum hits_v1.tsv -# チェックサムは次の値と一致する必要があります: f3631b6295bf06989c1437491f7592cb +# チェックサムは次の値と一致する必要があります: f3631b6295bf06989c1437491f7592cb {#checksum-should-be-equal-to-f3631b6295bf06989c1437491f7592cb} ``` -### データベースとテーブルを作成 +### データベースとテーブルを作成 {#create-the-database-and-table} ```bash clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets" @@ -45,7 +45,7 @@ clickhouse-client --query="CREATE TABLE default.hits_100m_obfuscated (WatchID UI ``` -### hits データをインポートする +### hits データをインポートする {#import-the-hits-data} ```bash cat hits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.hits_v1 FORMAT TSV" --max_insert_block_size=100000 @@ -62,13 +62,13 @@ clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1" ``` -### 「visits」の圧縮 TSV ファイルをダウンロード +### 「visits」の圧縮 TSV ファイルをダウンロード {#download-the-visits-compressed-tsv-file} ```bash curl https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv -# チェックサムを検証する +# チェックサムを検証する {#validate-the-checksum} md5sum visits_v1.tsv -# チェックサムは次の値と一致する必要があります: 6dafe1a0f24e59e3fc2d0fed85601de6 +# チェックサムは次の値と一致する必要があります: 6dafe1a0f24e59e3fc2d0fed85601de6 {#checksum-should-be-equal-to-6dafe1a0f24e59e3fc2d0fed85601de6} ``` @@ -78,7 +78,7 @@ md5sum visits_v1.tsv 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" ``` -### visits データを取り込む +### visits データを取り込む {#import-the-visits-data} ```bash cat visits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.visits_v1 FORMAT TSV" --max_insert_block_size=100000 @@ -95,7 +95,7 @@ clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1" ``` -## JOIN の例 +## JOIN の例 {#an-example-join} hits と visits のデータセットは ClickHouse のテストルーチンで使用されており、これはテストスイートに含まれるクエリの 1 つです。残りのテストは、このページの最後にある *次のステップ* セクションを参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md index 255aca035a4..801f78df415 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md @@ -94,8 +94,7 @@ clickhouse-client --query "INSERT INTO mgbench.logs2 FORMAT CSVWithNames" < mgbe clickhouse-client --query "INSERT INTO mgbench.logs3 FORMAT CSVWithNames" < mgbench3.csv ``` - -## ベンチマーク用クエリを実行する +## ベンチマーク用クエリを実行する {#run-benchmark-queries} ```sql USE mgbench; @@ -238,7 +237,6 @@ ORDER BY machine_name, dt; ``` - ```sql -- Q1.6: すべてのファイルサーバーにおける1時間あたりの総ネットワークトラフィック量は? diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md index b9cfb96e712..edbab07a3a5 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md @@ -7,15 +7,15 @@ keywords: ['基地局データ', 'ジオデータ', 'OpenCelliD', '地理空間 doc_type: 'guide' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; -import ActionsMenu from '@site/docs/_snippets/_service_actions_menu.md'; -import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; -import SupersetDocker from '@site/docs/_snippets/_add_superset_detail.md'; +import ActionsMenu from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_service_actions_menu.md'; +import SQLConsoleDetail from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_launch_sql_console.md'; +import SupersetDocker from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_add_superset_detail.md'; import cloud_load_data_sample from '@site/static/images/_snippets/cloud-load-data-sample.png'; import cell_towers_1 from '@site/static/images/getting-started/example-datasets/superset-cell-tower-dashboard.png' import add_a_database from '@site/static/images/getting-started/example-datasets/superset-add.png' @@ -29,7 +29,6 @@ import superset_radio_umts from '@site/static/images/getting-started/example-dat import superset_umts_netherlands from '@site/static/images/getting-started/example-datasets/superset-umts-netherlands.png' import superset_cell_tower_dashboard from '@site/static/images/getting-started/example-datasets/superset-cell-tower-dashboard.png' - ## 目標 {#goal} このガイドでは次のことを学びます。 @@ -124,7 +123,7 @@ INSERT INTO cell_towers SELECT * FROM s3('https://datasets-documentation.s3.amaz -## サンプルクエリをいくつか実行する +## サンプルクエリをいくつか実行する {#examples} 1. 種類別のセルタワー数: @@ -171,7 +170,6 @@ SELECT mcc, count() FROM cell_towers GROUP BY mcc ORDER BY count() DESC LIMIT 10 これらの値をデコードするために、ClickHouse で [Dictionary](../../sql-reference/dictionaries/index.md) を作成することを検討してもよいでしょう。 - ## ユースケース:地理データの活用 {#use-case} [`pointInPolygon`](/sql-reference/functions/geo/coordinates.md/#pointinpolygon) 関数を使用します。 @@ -266,7 +264,6 @@ WHERE pointInPolygon((lon, lat), (SELECT * FROM moscow)) 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.) ``` - ## スキーマの確認 {#review-of-the-schema} Superset で可視化を作成する前に、使用するカラムを確認しておきましょう。このデータセットは主に、世界中の携帯電話基地局の位置情報(経度と緯度)と無線方式(radio types)の種類を提供します。カラムの説明は [community forum](https://community.opencellid.org/t/documenting-the-columns-in-the-downloadable-cells-database-csv/186) にあります。これから作成する可視化で使用するカラムについては、以下で説明します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md index 6003bffc61f..a7459c0d78d 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md @@ -15,7 +15,7 @@ doc_type: 'guide' このデータセットには、[huggingface.co](https://huggingface.co/api/datasets/Qdrant/dbpedia-entities-openai3-text-embedding-3-large-1536-1M/parquet/default/train/) 上にある 26 個の `Parquet` ファイルが含まれています。ファイル名は `0.parquet`、`1.parquet`、…、`25.parquet` です。データセットのサンプル行を確認するには、この [Hugging Face ページ](https://huggingface.co/datasets/Qdrant/dbpedia-entities-openai3-text-embedding-3-large-1536-1M) を参照してください。 -## テーブルを作成する +## テーブルを作成する {#create-table} 記事 ID、タイトル、テキスト、および埋め込みベクトルを格納する `dbpedia` テーブルを作成します: @@ -31,7 +31,7 @@ CREATE TABLE dbpedia ``` -## テーブルの読み込み +## テーブルの読み込み {#load-table} すべての Parquet ファイルからデータセットを読み込むには、次のシェルコマンドを実行します。 @@ -74,7 +74,7 @@ FROM dbpedia _最近傍(nearest neighbours)_ とは、ユーザーのクエリに関連する結果となる文書、画像、その他のコンテンツを指します。 取得された結果は、生成 AI アプリケーションにおける検索拡張生成(Retrieval Augmented Generation, RAG)の重要な入力となります。 -## 総当たり方式でベクトル類似度検索を実行する +## 総当たり方式でベクトル類似度検索を実行する {#run-a-brute-force-vector-similarity-search} KNN(k-Nearest Neighbours)検索、または総当たり(ブルートフォース)検索では、データセット内の各ベクトルと 検索用埋め込みベクトルとの距離を計算し、その距離を並べ替えて最も近いベクトル(近傍)を取得します。`dbpedia` データセットでは、 @@ -119,7 +119,7 @@ LIMIT 20 また、実際の計算リソース使用量とストレージ帯域幅使用量を把握するため、OS ファイルキャッシュがコールドな状態および `max_threads=1` の条件でのクエリレイテンシも記録してください(それを基に、数百万ベクトル規模の本番データセットでの値を外挿します)。 -## ベクトル類似度インデックスを作成する +## ベクトル類似度インデックスを作成する {#build-vector-similarity-index} `vector` 列にベクトル類似度インデックスを定義・作成するには、次の SQL を実行します。 @@ -134,7 +134,7 @@ ALTER TABLE dbpedia MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2; インデックスの構築および保存処理には、利用可能な CPU コア数やストレージ帯域幅によっては数分かかる場合があります。 -## ANN 検索を実行する +## ANN 検索を実行する {#perform-ann-search} *Approximate Nearest Neighbours*(ANN、近似最近傍)とは、正確なベクトル検索よりもはるかに高速に結果を取得できる一群の手法(たとえば、グラフやランダムフォレストのような専用データ構造)を指します。結果の精度は、実用上はたいてい「十分よい」レベルです。多くの近似手法では、結果精度と検索時間のトレードオフを調整するためのパラメータが提供されています。 @@ -181,7 +181,7 @@ LIMIT 20 ``` -## 検索クエリ用の埋め込みベクトルの生成 +## 検索クエリ用の埋め込みベクトルの生成 {#generating-embeddings-for-search-query} これまでに見てきた類似度検索クエリでは、`dbpedia` テーブル内に既に存在するベクトルの1つを検索ベクトルとして使用していました。実際のアプリケーションでは、検索ベクトルは、自然言語で記述されたものを含むユーザーの入力クエリに対して生成する必要があります。検索ベクトルは、データセット用の埋め込みベクトルを生成する際に使用したものと同じ LLM モデルを使って生成しなければなりません。 @@ -223,7 +223,7 @@ while True: ``` -## Q&A デモアプリケーション +## Q&A デモアプリケーション {#q-and-a-demo-application} 上記の例では、ClickHouse を用いたセマンティック検索とドキュメント検索を示しました。次に紹介するのは、非常にシンプルでありながら高い可能性を持つ生成 AI のサンプルアプリケーションです。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md index 6fb55bd0f42..2868e4a99aa 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md @@ -23,7 +23,7 @@ Foursquare によるこのデータセットは、[ダウンロード](https://d 1 億件以上のレコードが含まれています。さらに、それらの場所に関するカテゴリやソーシャルメディア情報といった 追加のメタデータも含まれています。 -## データ探索 +## データ探索 {#data-exploration} データ探索には、[`clickhouse-local`](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) を使用します。これはフル機能の ClickHouse エンジンを提供する軽量なコマンドラインツールですが、代わりに ClickHouse Cloud や `clickhouse-client`、あるいは `chDB` を使用することもできます。 @@ -147,7 +147,7 @@ DESCRIBE s3('s3://fsq-os-places-us-east-1/release/dt=2025-04-08/places/parquet/* ``` -## データを ClickHouse に取り込む +## データを ClickHouse に取り込む {#loading-the-data} データをディスクに永続化したい場合は、`clickhouse-server` または ClickHouse Cloud を使用できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md index e97039f9309..ae76e5c4ebf 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md @@ -29,7 +29,7 @@ import superset_authors_matrix_v2 from '@site/static/images/getting-started/exam * `line_changes` - 2.7G - 7,535,157 行 -## データの生成 +## データの生成 {#generating-the-data} この手順は任意です。データは無償で配布しています。「[データのダウンロードと挿入](#downloading-and-inserting-the-data)」を参照してください。 @@ -73,7 +73,7 @@ CREATE TABLE git.commits * Linux - `~/clickhouse git-import` - 160分 -## データのダウンロードと挿入 +## データのダウンロードと挿入 {#downloading-and-inserting-the-data} 以下のデータを使用すると、動作環境を再現できます。また、このデータセットは play.clickhouse.com からも利用できます。詳しくは [Queries](#queries) を参照してください。 @@ -220,7 +220,7 @@ FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/clickhou このデータセットは、`git_clickhouse` データベース内にある [play.clickhouse.com](https://sql.clickhouse.com?query_id=DCQPNPAIMAQXRLHYURLKVJ) で利用できます。すべてのクエリについて、この環境へのリンクを、必要に応じてデータベース名を調整したうえで提供します。なお、データ収集時期の違いにより、play.clickhouse.com 上での結果は、ここで示すものと異なる場合があります。 -### 単一ファイルの履歴 +### 単一ファイルの履歴 {#history-of-a-single-file} 最も単純なクエリです。ここでは `StorageReplicatedMergeTree.cpp` のすべてのコミットメッセージを確認します。これらのほうが興味深いと考えられるため、最新のメッセージが先頭に来るように並べ替えます。 @@ -296,7 +296,7 @@ LIMIT 10 ファイル名の変更も考慮して、[ファイルの行ごとのコミット履歴](#line-by-line-commit-history-of-a-file)を取得する、より複雑な形のクエリも存在します。 -### 現在アクティブなファイルを特定する +### 現在アクティブなファイルを特定する {#find-the-current-active-files} これは、リポジトリ内の現在のファイルだけを対象に分析したい後続の処理において重要です。ここでは、「名前変更も削除もされておらず(その後に再追加/再リネームされていない)ファイル」の集合として推定します。 @@ -428,7 +428,7 @@ git ls-files | grep -v -E 'generated\.cpp|^(contrib|docs?|website|libs/(libcityh これらの差分は、私たちの分析に本質的な影響を与えることはないはずです。**このクエリの改善版をぜひお寄せください**。 -### 変更数が最も多いファイルを一覧表示する +### 変更数が最も多いファイルを一覧表示する {#list-files-with-most-modifications} 現在のファイルに限定すると、変更数は削除数と追加数の合計とみなします。 @@ -484,7 +484,7 @@ LIMIT 10 ``` -### コミットは通常、週のどの曜日に行われることが多いですか? +### コミットは通常、週のどの曜日に行われることが多いですか? {#what-day-of-the-week-do-commits-usually-occur} [play](https://sql.clickhouse.com?query_id=GED2STFSYJDRAA59H8RLIV) @@ -510,7 +510,7 @@ GROUP BY dayOfWeek(time) AS day_of_week 金曜日には生産性が少し落ちることを考えると、これは納得のいく結果です。週末にもコードをコミットしてくれている人がいるのは素晴らしいですね。貢献してくださっている皆さん、本当にありがとうございます! -### サブディレクトリ/ファイルの履歴 - 行数、コミット数、コントリビューター数の推移 +### サブディレクトリ/ファイルの履歴 - 行数、コミット数、コントリビューター数の推移 {#history-of-subdirectoryfile---number-of-lines-commits-and-contributors-over-time} このクエリは、フィルタしない場合、非常に大きな結果セットとなり、現実的には表示や可視化が困難です。そこで、次の例ではファイルまたはサブディレクトリでフィルタリングできるようにしています。ここでは `toStartOfWeek` 関数を使って週ごとにグルーピングしていますが、必要に応じて調整してください。 @@ -555,7 +555,7 @@ LIMIT 10 コミットおよび作者 -### 著者数が最も多いファイルを一覧表示する +### 著者数が最も多いファイルを一覧表示する {#list-files-with-maximum-number-of-authors} 現在のファイルのみを対象とします。 @@ -611,7 +611,7 @@ LIMIT 10 ``` -### リポジトリ内で最も古いコード行 +### リポジトリ内で最も古いコード行 {#oldest-lines-of-code-in-the-repository} 現在存在するファイルのみが対象です。 @@ -669,7 +669,7 @@ LIMIT 10 ``` -### 履歴が最も長いファイル +### 履歴が最も長いファイル {#files-with-longest-history} 現在存在するファイルのみを対象とします。 @@ -728,7 +728,7 @@ LIMIT 10 コアとなるデータ構造である MergeTree は、言うまでもなく、長年にわたる数多くの改良を経て、今もなお進化し続けています。 -### 月内におけるドキュメントとコード別のコントリビューター分布 +### 月内におけるドキュメントとコード別のコントリビューター分布 {#distribution-of-contributors-with-respect-to-docs-and-code-over-the-month} **データ取得時には、コミット履歴が非常に入り組んでいたため `docs/` フォルダに対する変更を除外しています。そのため、このクエリから得られる結果は正確ではありません。** @@ -792,7 +792,7 @@ FROM 月末にかけてやや多くなるかもしれませんが、全体としては概ね均等に分布しています。とはいえ、データ挿入時に `docs` フィルタで絞り込んでいるため、この結果の信頼性は高くありません。 -### 最も多様な貢献をしている著者 +### 最も多様な貢献をしている著者 {#authors-with-the-most-diverse-impact} ここでいう「多様性」とは、ある著者が貢献したユニークなファイル数を指します。 @@ -870,7 +870,7 @@ LIMIT 10 ``` -### 著者のお気に入りファイル +### 著者のお気に入りファイル {#favorite-files-for-an-author} ここでは創業者の [Alexey Milovidov](https://github.com/alexey-milovidov) を選択し、分析対象を現行のファイルに限定します。 @@ -957,7 +957,7 @@ LIMIT 10 こちらの方が、彼の関心のある分野をより適切に反映しているかもしれません。 -### 著者数が最も少ない巨大ファイル +### 著者数が最も少ない巨大ファイル {#largest-files-with-lowest-number-of-authors} このためには、まず最大サイズのファイルを特定する必要があります。コミット履歴からすべてのファイルについて完全なファイル再構成を行ってサイズを見積もるのは、非常に高コストです。 @@ -1130,7 +1130,7 @@ LIMIT 10 ``` -### 時間帯別、曜日別、作者別、特定サブディレクトリ別のコミット数とコード行数の分布 +### 時間帯別、曜日別、作者別、特定サブディレクトリ別のコミット数とコード行数の分布 {#commits-and-lines-of-code-distribution-by-time-by-weekday-by-author-for-specific-subdirectories} ここでは、これを曜日ごとの追加行数と削除行数として解釈します。この例では、[Functions ディレクトリ](https://github.com/ClickHouse/ClickHouse/tree/master/src/Functions)に注目します。 @@ -1258,7 +1258,7 @@ FROM ``` -### 著者同士が互いのコードを書き換える傾向を示すマトリクス +### 著者同士が互いのコードを書き換える傾向を示すマトリクス {#matrix-of-authors-that-shows-what-authors-tends-to-rewrite-another-authors-code} `sign = -1` はコードの削除を示します。句読点や空行の挿入は除外しています。 @@ -1313,7 +1313,7 @@ Alexey は明らかに他人のコードを削除するのが好きなようで Superset authors matrix v2 -### 曜日ごとに最も高い割合でコミットしているのは誰か? +### 曜日ごとに最も高い割合でコミットしているのは誰か? {#who-is-the-highest-percentage-contributor-per-day-of-week} コミット数だけで見ると: @@ -1514,7 +1514,7 @@ LIMIT 5 BY root ``` -### ある著者のコードのうち、どれだけの割合が他の著者によって削除されたか? +### ある著者のコードのうち、どれだけの割合が他の著者によって削除されたか? {#what-percentage-of-code-for-an-author-has-been-removed-by-other-authors} このクエリでは、特定の著者が作成した行数を、その著者のコードのうち他のコントリビューターによって削除された行数の合計で割った値が必要です。 @@ -1565,7 +1565,7 @@ LIMIT 10 ``` -### 最も多く書き換えられたファイルを一覧表示するには? +### 最も多く書き換えられたファイルを一覧表示するには? {#list-files-that-were-rewritten-most-number-of-times} この問いに対する最も単純なアプローチは、(現在存在するファイルに限定して)パスごとの行の変更回数を数えることです。例: @@ -1708,7 +1708,7 @@ LIMIT 10 ``` -### どの曜日に追加されたコードが最もリポジトリ内に残りやすいか? +### どの曜日に追加されたコードが最もリポジトリ内に残りやすいか? {#what-weekday-does-the-code-have-the-highest-chance-to-stay-in-the-repository} このためには、コードの各行を一意に識別する必要があります。同じ行がファイル内に複数回現れる可能性があるため、パスと行内容の組み合わせで推定します。 @@ -1771,7 +1771,7 @@ GROUP BY dayOfWeek(added_day) AS day_of_week_added ``` -### 平均コード年齢でソートされたファイル +### 平均コード年齢でソートされたファイル {#files-sorted-by-average-code-age} このクエリは、[リポジトリに最も長く残りやすい曜日はいつか](#what-weekday-does-the-code-have-the-highest-chance-to-stay-in-the-repository) と同じ原理を用い、パスと行の内容によってコード行を一意に識別することを目指します。 これにより、あるコード行が追加されてから削除されるまでの時間を特定できます。ただし対象は現在存在するファイルおよびコードのみに絞り込み、各ファイルについて行ごとの時間を平均します。 @@ -1862,7 +1862,7 @@ LIMIT 10 ``` -### 誰がより多くのテスト / C++ コード / コメントを書く傾向があるのか? +### 誰がより多くのテスト / C++ コード / コメントを書く傾向があるのか? {#who-tends-to-write-more-tests--cpp-code--comments} この問いにはいくつかのアプローチがあります。コードとテストの比率に着目すると、このクエリは比較的単純で、`tests` を含むフォルダへのコントリビューション数を数え、それを全コントリビューション数で割って比率を算出します。 @@ -1996,7 +1996,7 @@ LIMIT 10 コードへの貢献数でソートしている点に注意してください。上位の主要なコントリビューターはいずれも、驚くほど高い割合を占めており、これがコードの可読性の高さにもつながっています。 -### コードとコメントの割合という観点で、ある作者のコミットは時間とともにどのように変化するでしょうか? +### コードとコメントの割合という観点で、ある作者のコミットは時間とともにどのように変化するでしょうか? {#how-does-an-authors-commits-change-over-time-with-respect-to-codecomments-percentage} 作者ごとにこの値を計算するのは容易です。 @@ -2114,7 +2114,7 @@ LIMIT 20 励みになることに、コメント率はほぼ一定で、著者が長期間にわたって貢献しても低下していません。 -### コードが書き換えられるまでの平均時間と中央値(コード劣化の半減期)はどのくらいか? +### コードが書き換えられるまでの平均時間と中央値(コード劣化の半減期)はどのくらいか? {#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-times)ときと同じ原理を、すべてのファイルを対象にして書き換えを特定するために使うことができます。各ファイルについて、書き換えの間隔を算出するためにウィンドウ関数を使用します。そこから、すべてのファイルにわたる平均値と中央値を算出できます。 @@ -2175,7 +2175,7 @@ FROM rewrites ``` -### 将来書き直される可能性が最も高いという観点で、コードを書くのに最悪なタイミングはいつでしょうか? +### 将来書き直される可能性が最も高いという観点で、コードを書くのに最悪なタイミングはいつでしょうか? {#what-is-the-worst-time-to-write-code-in-sense-that-the-code-has-highest-chance-to-be-re-written} [What is the average time before code will be rewritten and the median (half-life of code 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](#list-files-that-were-rewritten-most-number-of-times) と同様ですが、ここでは集計単位を曜日としています。必要に応じて、たとえば月ごとなどに調整してください。 @@ -2240,7 +2240,7 @@ GROUP BY dayOfWeek ``` -### どの著者のコードが最も「定着」しているか? +### どの著者のコードが最も「定着」しているか? {#which-authors-code-is-the-most-sticky} ここでは「sticky(定着度)」を、「著者のコードが書き換えられるまでどれくらいの期間残り続けるか」という意味で定義します。前の質問 [コードが書き換えられるまでの平均時間と中央値(コード崩壊の半減期)は?](#what-is-the-average-time-before-code-will-be-rewritten-and-the-median-half-life-of-code-decay) と同様に、書き換えの指標として、ファイルに対する 50% の追加と 50% の削除を用います。著者ごとに平均書き換え時間を算出し、2 ファイルより多くのファイルに貢献しているコントリビューターのみを対象とします。 @@ -2318,7 +2318,7 @@ LIMIT 10 ``` -### 著者ごとの連続コミット日数の最大値 +### 著者ごとの連続コミット日数の最大値 {#most-consecutive-days-of-commits-by-an-author} このクエリではまず、著者がコミットを行った日付を算出する必要があります。ウィンドウ関数を使用し、著者ごとにパーティション分割することで、コミット間の日数を計算します。各コミットについて、前回のコミットからの経過日数が1日であれば連続 (1)、それ以外は0としてマークし、その結果を `consecutive_day` に保存します。 @@ -2374,7 +2374,7 @@ LIMIT 10 ``` -### ファイルの行ごとのコミット履歴 +### ファイルの行ごとのコミット履歴 {#line-by-line-commit-history-of-a-file} ファイルはリネームされることがあります。この場合、リネームイベントが発生し、その際に `path` カラムにはファイルの新しいパスが、`old_path` には以前の場所が設定されます。例えば次のとおりです。 @@ -2455,7 +2455,7 @@ FORMAT PrettyCompactMonoBlock ## 未解決の問題 {#unsolved-questions} -### Git blame +### Git blame {#git-blame} これは、配列関数内で現在は状態を保持できないため、厳密な結果を得るのが特に難しいケースです。各イテレーションで状態を保持できるようにする `arrayFold` や `arrayReduce` が利用可能になれば、これが実現できるようになります。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md index 73915053ac5..da1fba68b4b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md @@ -7,7 +7,7 @@ doc_type: 'guide' keywords: ['サンプルデータセット', 'Hacker News', 'サンプルデータ', 'テキスト分析', 'ベクトル検索'] --- -# Hacker News データセット +# Hacker News データセット {#hacker-news-dataset} > このチュートリアルでは、Hacker News のデータ 2,800 万行を、CSV および Parquet 形式から ClickHouse > のテーブルに挿入し、そのデータを探索するための簡単なクエリを実行します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md index 2dd6fb3a6b3..73b90f05945 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md @@ -11,7 +11,7 @@ keywords: ['サンプルデータセット', 'laion', '画像埋め込み', 'サ このデータセットには、画像の URL、画像および画像キャプションそれぞれの埋め込みベクトル、画像と画像キャプション間の類似度スコアに加え、画像の幅/高さ、ライセンス、NSFW フラグといったメタデータが含まれます。このデータセットを使って、ClickHouse における[近似最近傍検索](../../engines/table-engines/mergetree-family/annindexes.md)を実演できます。 -## データ準備 +## データ準備 {#data-preparation} 生データでは、埋め込みとメタデータは別々のファイルに保存されています。データ準備のステップでは、データをダウンロードしてファイルを結合し、 CSV に変換して ClickHouse にインポートします。そのために、次の `download.sh` スクリプトを使用できます。 @@ -40,28 +40,28 @@ npy_file = "img_emb_" + str_i + '.npy' metadata_file = "metadata_" + str_i + '.parquet' text_npy = "text_emb_" + str_i + '.npy' -# 全ファイルを読み込み +# 全ファイルを読み込み {#load-all-files} im_emb = np.load(npy_file) text_emb = np.load(text_npy) data = pd.read_parquet(metadata_file) -# ファイルを結合 +# ファイルを結合 {#combine-files} data = pd.concat([data, pd.DataFrame({"image_embedding" : [*im_emb]}), pd.DataFrame({"text_embedding" : [*text_emb]})], axis=1, copy=False) -# ClickHouseへインポートする列 +# ClickHouseへインポートする列 {#columns-to-be-imported-into-clickhouse} data = data[['url', 'caption', 'NSFW', 'similarity', "image_embedding", "text_embedding"]] -# np.arraysをリストへ変換 +# np.arraysをリストへ変換 {#transform-nparrays-to-lists} data['image_embedding'] = data['image_embedding'].apply(lambda x: x.tolist()) data['text_embedding'] = data['text_embedding'].apply(lambda x: x.tolist()) -# captionに様々な引用符が含まれる場合があるため、この回避策が必要 +# captionに様々な引用符が含まれる場合があるため、この回避策が必要 {#this-small-hack-is-needed-because-caption-sometimes-contains-all-kind-of-quotes} data['caption'] = data['caption'].apply(lambda x: x.replace("'", " ").replace('"', " ")) -# データをCSVファイルとしてエクスポート +# データをCSVファイルとしてエクスポート {#export-data-as-csv-file} data.to_csv(str_i + '.csv', header=False) -# 生データファイルを削除 +# 生データファイルを削除 {#removed-raw-data-files} os.system(f"rm {npy_file} {metadata_file} {text_npy}") ``` @@ -76,7 +76,7 @@ seq 0 409 | xargs -P1 -I{} bash -c './download.sh {}' (上記の Python スクリプトは非常に遅く(1 ファイルあたり約 2〜10 分)、大量のメモリを消費し(1 ファイルあたり 41 GB)、生成される CSV ファイルも大きい(各 10 GB)ため、注意してください。十分な RAM がある場合は、より高い並列度を得るために `-P1` の値を増やしてください。これでもまだ遅い場合は、より良いインジェスト手順を検討してください。たとえば .npy ファイルを Parquet に変換してから、残りの処理をすべて ClickHouse で行うなどです。) -## テーブルを作成する +## テーブルを作成する {#create-table} 最初にインデックスなしでテーブルを作成するには、次を実行します。 @@ -105,7 +105,7 @@ INSERT INTO laion FROM INFILE '{path_to_csv_files}/*.csv' `id` 列はあくまで例示用のものであり、スクリプトによって一意ではない値が入力されている点に注意してください。 -## 総当たり方式でベクトル類似度検索を実行する +## 総当たり方式でベクトル類似度検索を実行する {#run-a-brute-force-vector-similarity-search} 総当たり方式の近似ベクトル検索を実行するには、次を実行します。 @@ -137,7 +137,7 @@ SELECT url, caption FROM laion ORDER BY cosineDistance(image_embedding, {target: ``` -## ベクトル類似度インデックスを使って近似ベクトル類似検索を実行する +## ベクトル類似度インデックスを使って近似ベクトル類似検索を実行する {#run-an-approximate-vector-similarity-search-with-a-vector-similarity-index} ここでは、テーブルに 2 つのベクトル類似度インデックスを定義します。 @@ -194,7 +194,7 @@ HNSW インデックスは、HNSW パラメータを慎重に選定し、イン 通常は、新しい画像や新しい画像キャプションに対して埋め込みを作成し、そのデータ内で類似する画像/画像キャプションのペアを検索します。[UDF](/sql-reference/functions/udf) を使用すると、クライアント環境を離れることなく `target` ベクトルを作成できます。データ作成時と検索用の新しい埋め込みを生成する際には、同じモデルを使用することが重要です。以下のスクリプトは、データセットの基盤にもなっている `ViT-B/32` モデルを利用します。 -### テキスト埋め込み +### テキスト埋め込み {#text-embeddings} まず、次の Python スクリプトを ClickHouse のデータパス配下にある `user_scripts/` ディレクトリに保存し、実行可能にします(`chmod +x encode_text.py`)。 @@ -256,7 +256,7 @@ LIMIT 10 `encode_text()` UDF 自体が計算を行い埋め込みベクトルを出力するまでに、数秒かかる場合があることに注意してください。 -### 画像埋め込み +### 画像埋め込み {#image-embeddings} 画像埋め込みも同様に作成できるように、ローカルにファイルとして保存されている画像の埋め込みを生成するための Python スクリプトを用意しています。 @@ -304,7 +304,7 @@ if __name__ == '__main__': 検索用のサンプル画像を取得: ```shell -# LEGOセットのランダムな画像を取得 +# LEGOセットのランダムな画像を取得 {#get-a-random-image-of-a-lego-set} $ wget http://cdn.firstcry.com/brainbees/images/products/thumb/191325a.jpg ``` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md index cb8b2529975..dfcbae74b10 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md @@ -15,22 +15,22 @@ keywords: ['example dataset', 'menus', 'historical data', 'sample data', 'nypl'] このデータは図書館アーカイブ由来であるため、不完全であったり、統計解析には扱いづらい場合があります。それでも、とても「おいしい」データです。 メニューに掲載された料理に関するレコードはわずか130万件で、ClickHouse にとってはごく小さなデータ量ですが、良いサンプルとして利用できます。 -## データセットをダウンロードする +## データセットをダウンロードする {#download-dataset} 次のコマンドを実行します。 ```bash wget https://s3.amazonaws.com/menusdata.nypl.org/gzips/2021_08_01_07_01_17_data.tgz -# オプション: チェックサムの検証 +# オプション: チェックサムの検証 {#option-validate-the-checksum} md5sum 2021_08_01_07_01_17_data.tgz -# チェックサムは次と一致する必要があります: db6126724de939a5481e3160a2d67d15 +# チェックサムは次と一致する必要があります: db6126724de939a5481e3160a2d67d15 {#checksum-should-be-equal-to-db6126724de939a5481e3160a2d67d15} ``` 必要に応じて、[http://menus.nypl.org/data](http://menus.nypl.org/data) にある最新のリンクに差し替えてください。 ダウンロードサイズは約 35 MB です。 -## データセットの展開 +## データセットの展開 {#unpack-dataset} ```bash tar xvf 2021_08_01_07_01_17_data.tgz @@ -46,7 +46,7 @@ tar xvf 2021_08_01_07_01_17_data.tgz * `MenuItem` — メニュー項目。特定のメニューページ上での料理とその価格を表し、`Dish` と `MenuPage` へのリンクを持ちます。 -## テーブルを作成する +## テーブルを作成する {#create-tables} 価格を格納するために[Decimal](../../sql-reference/data-types/decimal.md)データ型を使用します。 @@ -114,7 +114,7 @@ CREATE TABLE menu_item ``` -## データをインポートする +## データをインポートする {#import-data} ClickHouse にデータをアップロードするには、次のコマンドを実行します: @@ -134,7 +134,7 @@ clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_defa [date_time_input_format best_effort](/operations/settings/formats#date_time_input_format) 設定により、[DateTime](../../sql-reference/data-types/datetime.md) フィールドをさまざまなフォーマットでパースできます。例えば、秒なしの ISO-8601 形式である「2000-01-01 01:02」も認識されます。この設定を有効にしない場合、固定形式の DateTime フォーマットのみが許可されます。 -## データを非正規化する +## データを非正規化する {#denormalize-data} データは[正規化形式](https://en.wikipedia.org/wiki/Database_normalization#Normal_forms)で複数のテーブルに分かれて格納されています。これは、例えばメニュー項目から料理名をクエリしたい場合などに、[JOIN](/sql-reference/statements/select/join) を実行する必要があるということです。 典型的な分析タスクでは、毎回 `JOIN` を実行しないよう、あらかじめ JOIN 済みのデータを扱う方がはるかに効率的です。これを「非正規化」データと呼びます。 @@ -187,7 +187,7 @@ FROM menu_item ``` -## データを検証する +## データを検証する {#validate-data} クエリ: @@ -206,7 +206,7 @@ SELECT count() FROM menu_item_denorm; ## いくつかのクエリを実行してみる {#run-queries} -### 料理の過去平均価格 +### 料理の過去平均価格 {#query-averaged-historical-prices} クエリ: @@ -249,7 +249,7 @@ ORDER BY d ASC; あくまで目安としてお考えください。 -### ハンバーガーの価格 +### ハンバーガーの価格 {#query-burger-prices} クエリ: @@ -287,7 +287,7 @@ ORDER BY d ASC; ``` -### ウォッカ +### ウォッカ {#query-vodka} クエリ: @@ -322,7 +322,7 @@ ORDER BY d ASC; ウォッカを取得するには `ILIKE '%vodka%'` と書く必要があり、これはなかなかインパクトのある書き方です。 -### キャビア +### キャビア {#query-caviar} キャビアの価格を表示しましょう。また、キャビア料理の名前をひとつ表示しましょう。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md index 0cab1334a30..e46b2b4a78f 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md @@ -28,7 +28,7 @@ The sections below give a brief overview of the steps that were involved in brin - ClickHouse 向けに[事前に用意されたデータ](#pre-prepared-data)。クレンジングや再構造化、拡張が行われており、1900 年から 2022 年までをカバーしています。 - [元データをダウンロード](#original-data)して、ClickHouse に必要な形式へ変換します。独自のカラムを追加したいユーザーは、このアプローチを検討するとよいでしょう。 -### 事前処理済みデータ +### 事前処理済みデータ {#pre-prepared-data} より具体的には、NOAA による品質保証チェックで一度も失敗しなかった行は削除されています。また、データは 1 行につき 1 測定値という構造から、station id と日付ごとに 1 行という構造に再編成されています。つまり、 @@ -55,7 +55,7 @@ wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enriche 以下では、ClickHouse にロードするための準備として、元データをダウンロードおよび変換する手順を説明します。 -#### ダウンロード +#### ダウンロード {#download} 元データをダウンロードするには、次の手順を行います。 @@ -64,7 +64,7 @@ for i in {1900..2023}; do wget https://noaa-ghcn-pds.s3.amazonaws.com/csv.gz/${i ``` -#### データのサンプリング +#### データのサンプリング {#sampling-the-data} ```bash $ clickhouse-local --query "SELECT * FROM '2021.csv.gz' LIMIT 10" --format PrettyCompact @@ -108,7 +108,7 @@ $ clickhouse-local --query "SELECT * FROM '2021.csv.gz' LIMIT 10" --format Prett 1 行あたり 1 件の測定値とする形式では、ClickHouse ではスパースなテーブル構造になってしまいます。時刻と観測所ごとに 1 行とし、測定値を列として持つ形式に変換する必要があります。まず、問題のない行、すなわち `qFlag` が空文字列に等しい行にデータセットを絞り込みます。 -#### データをクリーンアップする +#### データをクリーンアップする {#clean-the-data} [ClickHouse local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) を使用して、関心のある測定値を表し、かつ品質要件を満たす行だけが残るようにフィルタリングできます。 @@ -122,7 +122,7 @@ FROM file('*.csv.gz', CSV, 'station_id String, date String, measurement String, 26億行以上あるため、すべてのファイルをパースするこのクエリは高速ではありません。8コアのマシンでは、完了までに約160秒かかります。 -### データのピボット +### データのピボット {#pivot-data} 1 行に 1 つの計測値を持つ構造も ClickHouse で利用できますが、将来のクエリを不必要に複雑にしてしまいます。理想的には、各 station id と日付ごとに 1 行とし、各計測タイプとその値がそれぞれ列になる形が望ましいです。つまり、次のようなイメージです。 @@ -161,7 +161,7 @@ done このクエリにより、サイズが 50GB の単一ファイル `noaa.csv` が生成されます。 -### データの拡充 +### データの拡充 {#enriching-the-data} 現在のデータには、国コードのプレフィックスを含むステーション ID 以外に位置情報に関する情報がありません。本来であれば、各ステーションには緯度と経度が紐づいていることが望ましいです。これを実現するために、NOAA は各ステーションの詳細を別ファイルとして提供しており、それが [ghcnd-stations.txt](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn#format-of-ghcnd-stationstxt-file) です。このファイルには[複数の列](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn#format-of-ghcnd-stationstxt-file)があり、そのうち今後の分析で有用なのは 5 つの列、すなわち id、latitude、longitude、elevation、name です。 @@ -194,7 +194,7 @@ FROM file('noaa.csv', CSV, このクエリは実行に数分かかり、サイズ 6.4 GB の `noaa_enriched.parquet` ファイルを生成します。 -## テーブルの作成 +## テーブルの作成 {#create-table} ClickHouse クライアントから、ClickHouse 上に MergeTree テーブルを作成します。 @@ -223,7 +223,7 @@ CREATE TABLE noaa ## ClickHouse へのデータ挿入 {#inserting-into-clickhouse} -### ローカルファイルからの挿入 +### ローカルファイルからの挿入 {#inserting-from-local-file} データは、ClickHouse クライアントから次のようにローカルファイルから挿入できます: @@ -236,7 +236,7 @@ INSERT INTO noaa FROM INFILE '/noaa_enriched.parquet' この読み込みを高速化する方法については[こちら](https://clickhouse.com/blog/real-world-data-noaa-climate-data#load-the-data)を参照してください。 -### S3 からの挿入 +### S3 からの挿入 {#inserting-from-s3} ```sql INSERT INTO noaa SELECT * @@ -249,7 +249,7 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enr ## サンプルクエリ {#sample-queries} -### 観測史上最高気温 +### 観測史上最高気温 {#highest-temperature-ever} ```sql SELECT @@ -278,7 +278,7 @@ LIMIT 5 2023 年時点での [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) における[記録上の最高気温](https://en.wikipedia.org/wiki/List_of_weather_records#Highest_temperatures_ever_recorded)と比べても、安心できるほどよく一致しています。 -### 最高のスキーリゾート +### 最高のスキーリゾート {#best-ski-resorts} アメリカ合衆国の[スキーリゾート一覧](https://gist.githubusercontent.com/gingerwizard/dd022f754fd128fdaf270e58fa052e35/raw/622e03c37460f17ef72907afe554cb1c07f91f23/ski_resort_stats.csv)とそれぞれの所在地を用い、過去5年間のいずれかの月における降雪量が最大だった上位1000件の気象観測所と結合します。この結合結果を[geoDistance](/sql-reference/functions/geo/coordinates/#geodistance)でソートし、距離が20km未満のものに絞り込んだうえで、リゾートごとに最上位の結果を選択し、それらを合計降雪量で並べ替えます。なお、良好なスキーコンディションの大まかな指標として、標高1800m以上のリゾートのみに制限しています。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md index 1268ecf07d8..9407ab26c93 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md @@ -24,7 +24,7 @@ import TabItem from '@theme/TabItem'; ::: -## trips テーブルを作成する +## trips テーブルを作成する {#create-the-table-trips} まずはタクシー乗車データ用のテーブルを作成します。 @@ -125,7 +125,7 @@ FROM gcs( -## サンプルクエリ +## サンプルクエリ {#sample-queries} 以下のクエリは、前述のサンプルに対して実行されます。ユーザーは、以下のクエリを修正してテーブル `nyc_taxi.trips` を使用することで、完全なデータセットに対してサンプルクエリを [sql.clickhouse.com](https://sql.clickhouse.com/?query=U0VMRUNUIGNvdW50KCkgRlJPTSBueWNfdGF4aS50cmlwcw\&chart=eyJ0eXBlIjoibGluZSIsImNvbmZpZyI6eyJ0aXRsZSI6IlRlbXBlcmF0dXJlIGJ5IGNvdW50cnkgYW5kIHllYXIiLCJ4YXhpcyI6InllYXIiLCJ5YXhpcyI6ImNvdW50KCkiLCJzZXJpZXMiOiJDQVNUKHBhc3Nlbmdlcl9jb3VudCwgJ1N0cmluZycpIn19) 上で実行できます。 @@ -182,7 +182,7 @@ ORDER BY passenger_count ASC ``` -## 準備済みパーティションのダウンロード +## 準備済みパーティションのダウンロード {#download-of-prepared-partitions} :::note 以下の手順では、元のデータセットに関する情報と、準備済みパーティションをセルフマネージドな ClickHouse サーバー環境にロードする方法を説明します。 @@ -195,9 +195,9 @@ ORDER BY passenger_count ASC ```bash $ curl -O https://datasets.clickhouse.com/trips_mergetree/partitions/trips_mergetree.tar -# チェックサムを検証する +# チェックサムを検証する {#validate-the-checksum} $ md5sum trips_mergetree.tar -# チェックサムは次の値と一致する必要があります: f3b8d469b41d9a82da064ded7245d12c +# チェックサムは次の値と一致する必要があります: f3b8d469b41d9a82da064ded7245d12c {#checksum-should-be-equal-to-f3b8d469b41d9a82da064ded7245d12c} $ tar xvf trips_mergetree.tar -C /var/lib/clickhouse # ClickHouse データディレクトリへのパス $ # 展開されたデータの権限を確認し、必要に応じて修正する $ sudo service clickhouse-server restart @@ -209,7 +209,7 @@ $ clickhouse-client --query "select count(*) from datasets.trips_mergetree" ::: -## 単一サーバー環境での結果 +## 単一サーバー環境での結果 {#results-on-single-server} Q1: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md index 08afe191fdd..b417e399de8 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md @@ -42,7 +42,7 @@ keywords: ['サンプルデータセット', 'nypd', '犯罪データ', 'サン ClickHouse データベースを扱い始める前に、まずデータの内容を確認しておいてください。 -### 元の TSV ファイルのフィールドを確認する +### 元の TSV ファイルのフィールドを確認する {#look-at-the-fields-in-the-source-tsv-file} これは TSV ファイルをクエリするコマンド例ですが、まだ実行しないでください。 @@ -119,7 +119,7 @@ New Georeferenced Column Nullable(String) ここで、TSV ファイル内のカラムが、[dataset web page](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243) の **Columns in this Dataset** セクションに記載されている名前と型と一致しているか確認してください。データ型はあまり厳密ではなく、数値フィールドはすべて `Nullable(Float64)`、それ以外のフィールドはすべて `Nullable(String)` になっています。データを保存するための ClickHouse テーブルを作成する際には、より適切でパフォーマンスに優れた型を指定できます。 -### 適切なスキーマを決定する +### 適切なスキーマを決定する {#determine-the-proper-schema} 各フィールドにどの型を使用すべきか判断するには、データがどのような内容かを把握しておく必要があります。たとえば、フィールド `JURISDICTION_CODE` は数値ですが、これは `UInt8` にすべきでしょうか、それとも `Enum` にすべきでしょうか、あるいは `Float64` が適切でしょうか? @@ -210,7 +210,7 @@ clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ この執筆時点で使用しているデータセットでは、`PARK_NM` 列に含まれる公園および遊び場の値は数百種類しかありません。これは、`LowCardinality(String)` フィールド内の異なる文字列数を 10,000 未満に抑えることを推奨している [LowCardinality](/sql-reference/data-types/lowcardinality#description) のガイドラインと比較しても小さい数です。 -### DateTime フィールド +### DateTime フィールド {#datetime-fields} [データセットのウェブページ](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243) の **Columns in this Dataset** セクションによると、報告されたイベントの開始時刻と終了時刻を表す日時フィールドが用意されています。`CMPLNT_FR_DT` と `CMPLT_TO_DT` の最小値と最大値を確認すると、これらのフィールドが常に値で埋められているかどうかを把握できます。 @@ -297,7 +297,7 @@ FORMAT PrettyCompact" 型に対して行うべき変更はまだ多くありますが、いずれも同じ調査手順に従うことで判断できます。フィールド内の文字列の異なる値の数や、数値の最小値と最大値を確認し、それに基づいて決定してください。このガイドの後半で示すテーブルスキーマでは、低カーディナリティの文字列と符号なし整数フィールドが多数あり、浮動小数点数値はごくわずかです。 ::: -## 日付フィールドと時刻フィールドを連結する +## 日付フィールドと時刻フィールドを連結する {#concatenate-the-date-and-time-fields} 日付フィールド `CMPLNT_FR_DT` と時刻フィールド `CMPLNT_FR_TM` を、`DateTime` 型にキャスト可能な 1 つの `String` 型の値に連結するには、連結演算子で結合した 2 つのフィールドを選択します: `CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM`。`CMPLNT_TO_DT` と `CMPLNT_TO_TM` フィールドも同様に処理されます。 @@ -328,7 +328,7 @@ FORMAT PrettyCompact" ``` -## 日付と時刻の文字列を DateTime64 型に変換する +## 日付と時刻の文字列を DateTime64 型に変換する {#convert-the-date-and-time-string-to-a-datetime64-type} このガイドの前のセクションで、TSV ファイル内に 1970 年 1 月 1 日より前の日付が含まれていることを確認しました。これは、日付に 64 ビットの DateTime 型が必要であることを意味します。さらに、日付は `MM/DD/YYYY` 形式から `YYYY/MM/DD` 形式へ変換する必要があります。これらはどちらも、[`parseDateTime64BestEffort()`](../../sql-reference/functions/type-conversion-functions.md#parsedatetime64besteffort) を使用して実行できます。 @@ -389,7 +389,7 @@ FORMAT PrettyCompact" これまでに決定した、カラムに使用するデータ型は、以下のテーブルスキーマに反映されています。テーブルで使用する `ORDER BY` と `PRIMARY KEY` も決める必要があります。`ORDER BY` と `PRIMARY KEY` の少なくとも一方は必ず指定しなければなりません。`ORDER BY` に含めるカラムを決定するためのガイドラインを以下に示します。さらに詳しい情報は、このドキュメント末尾の *Next Steps* セクションで説明します。 -### `ORDER BY` と `PRIMARY KEY` 句 +### `ORDER BY` と `PRIMARY KEY` 句 {#order-by-and-primary-key-clauses} * `ORDER BY` タプルには、クエリのフィルタで使用されるフィールドを含めるべきです * ディスク上での圧縮率を最大化するには、`ORDER BY` タプルはカーディナリティが低いものから高いものへ昇順になるように並べるべきです @@ -485,7 +485,7 @@ CREATE TABLE NYPD_Complaint ( ``` -### テーブルの主キーを確認する +### テーブルの主キーを確認する {#finding-the-primary-key-of-a-table} ClickHouse の `system` データベースのうち、特に `system.table` には、作成したばかりのテーブルに関するすべての情報が含まれています。次のクエリで、`ORDER BY`(ソートキー)と `PRIMARY KEY` を確認できます。 @@ -520,7 +520,7 @@ Query id: 6a5b10bf-9333-4090-b36e-c7f08b1d9e01 データの前処理には `clickhouse-local` ツールを使用し、取り込みには `clickhouse-client` を使用します。 -### `clickhouse-local` で使用される引数 +### `clickhouse-local` で使用される引数 {#clickhouse-local-arguments-used} :::tip `table='input'` は、以下の `clickhouse-local` の引数に含まれています。`clickhouse-local` は指定された入力(`cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv`)を受け取り、その入力をテーブルに挿入します。デフォルトではテーブル名は `table` です。このガイドではデータフローを分かりやすくするために、テーブル名を `input` に設定しています。`clickhouse-local` の最後の引数は、そのテーブル(`FROM input`)から SELECT するクエリであり、その結果がパイプで `clickhouse-client` に渡されて、`NYPD_Complaint` テーブルにデータが投入されます。 @@ -571,7 +571,7 @@ cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv \ ``` -## データを検証する +## データを検証する {#validate-data} :::note このデータセットは年に1回以上更新される可能性があるため、このドキュメントに記載されている数値と一致しない場合があります。 @@ -615,7 +615,7 @@ WHERE name = 'NYPD_Complaint' ## いくつかクエリを実行する {#run-queries} -### クエリ 1. 月別の苦情件数を比較する +### クエリ 1. 月別の苦情件数を比較する {#query-1-compare-the-number-of-complaints-by-month} クエリ: @@ -653,7 +653,7 @@ Query id: 7fbd4244-b32a-4acf-b1f3-c3aa198e74d9 ``` -### クエリ 2. 区ごとの苦情件数の合計を比較する +### クエリ 2. 区ごとの苦情件数の合計を比較する {#query-2-compare-total-number-of-complaints-by-borough} クエリ: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md index 69889409f1c..eaeb2d0e5ec 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md @@ -127,7 +127,7 @@ CREATE TABLE `ontime` ORDER BY (Year, Quarter, Month, DayofMonth, FlightDate, IATA_CODE_Reporting_Airline); ``` -## 生データのインポート +## 生データのインポート {#import-from-raw-data} データのダウンロード: @@ -144,7 +144,7 @@ ls -1 *.zip | xargs -I{} -P $(nproc) bash -c "echo {}; unzip -cq {} '*.csv' | se (サーバーでメモリ不足などの問題が発生する場合は、`-P $(nproc)` の部分を削除してください) -## 保存したコピーからのインポート +## 保存したコピーからのインポート {#import-from-a-saved-copy} 別の方法として、次のクエリを使用して保存したコピーからデータをインポートできます。 @@ -155,7 +155,7 @@ INSERT INTO ontime SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazo このスナップショットは2022-05-29に作成されました。 -## クエリ +## クエリ {#queries} Q0. diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md index 67432072214..77cd2c9b11c 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md @@ -22,7 +22,7 @@ import stackoverflow from '@site/static/images/getting-started/example-datasets/ このデータのスキーマの説明は[こちら](https://meta.stackexchange.com/questions/2677/database-schema-documentation-for-the-public-data-dump-and-sede)で確認できます。 -## あらかじめ用意されたデータ +## あらかじめ用意されたデータ {#pre-prepared-data} このデータのコピーを Parquet 形式で提供しており、内容は 2024 年 4 月時点のものです。行数(6,000 万件の投稿)の点では ClickHouse にとっては小規模ですが、このデータセットには大量のテキストと大きな String 型カラムが含まれています。 @@ -33,7 +33,7 @@ CREATE DATABASE stackoverflow 以下の計測結果は、`eu-west-2` に配置された 96 GiB・24 vCPU 構成の ClickHouse Cloud クラスターに対するものです。データセットは `eu-west-3` にあります。 -### 投稿 +### 投稿 {#posts} ```sql CREATE TABLE stackoverflow.posts @@ -73,7 +73,7 @@ INSERT INTO stackoverflow.posts SELECT * FROM s3('https://datasets-documentation 投稿データは年別のファイルとしても利用できます。例: [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 @@ -96,7 +96,7 @@ INSERT INTO stackoverflow.votes SELECT * FROM s3('https://datasets-documentation 投票データも年ごとに利用できます。例: [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 @@ -120,7 +120,7 @@ INSERT INTO stackoverflow.comments SELECT * FROM s3('https://datasets-documentat コメントについても年ごとのデータが利用可能です。例: [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 @@ -147,7 +147,7 @@ INSERT INTO stackoverflow.users SELECT * FROM s3('https://datasets-documentation ``` -### バッジ +### バッジ {#badges} ```sql CREATE TABLE stackoverflow.badges @@ -168,7 +168,7 @@ INSERT INTO stackoverflow.badges SELECT * FROM s3('https://datasets-documentatio ``` -### PostLinks +### PostLinks {#postlinks} ```sql CREATE TABLE stackoverflow.postlinks @@ -188,7 +188,7 @@ INSERT INTO stackoverflow.postlinks SELECT * FROM s3('https://datasets-documenta ``` -### PostHistory +### PostHistory {#posthistory} ```sql CREATE TABLE stackoverflow.posthistory @@ -217,7 +217,7 @@ INSERT INTO stackoverflow.posthistory SELECT * FROM s3('https://datasets-documen 元のデータセットは、7zip 形式で圧縮された XML ファイルとして [https://archive.org/download/stackexchange](https://archive.org/download/stackexchange) から入手できます。`stackoverflow.com*` というプレフィックスを持つファイルが対象です。 -### ダウンロード +### ダウンロード {#download} ```bash wget https://archive.org/download/stackexchange/stackoverflow.com-Badges.7z @@ -232,7 +232,7 @@ wget https://archive.org/download/stackexchange/stackoverflow.com-Votes.7z これらのファイルは最大 35GB あり、インターネット接続状況によってはダウンロードに約 30 分かかる場合があります。ダウンロードサーバー側で帯域が制限されており、おおよそ 20MB/秒が上限となります。 -### JSON への変換 +### JSON への変換 {#convert-to-json} 本ドキュメント執筆時点では、ClickHouse は入力フォーマットとして XML をネイティブにサポートしていません。ClickHouse にデータをロードするため、まず NDJSON に変換します。 @@ -260,7 +260,7 @@ p7zip -d stackoverflow.com-Posts.7z ```bash mkdir posts cd posts -# 以下は入力XMLファイルを10000行ごとのサブファイルに分割します +# 以下は入力XMLファイルを10000行ごとのサブファイルに分割します {#the-following-splits-the-input-xml-file-into-sub-files-of-10000-rows} tail +3 ../Posts.xml | head -n -1 | split -l 10000 --filter='{ printf "\n"; cat - ; printf "\n"; } > $FILE' - ``` @@ -283,7 +283,7 @@ clickhouse local --query "SELECT * FROM file('posts.json', JSONEachRow, 'Id Int3 ここから始めるための、いくつかの簡単なクエリです。 -### Stack Overflowで最も人気の高いタグ +### Stack Overflowで最も人気の高いタグ {#most-popular-tags-on-stack-overflow} ```sql @@ -313,7 +313,7 @@ Peak memory usage: 224.03 MiB. ``` -### 最も多く回答しているユーザー(アクティブなアカウント) +### 最も多く回答しているユーザー(アクティブなアカウント) {#user-with-the-most-answers-active-accounts} アカウントには `UserId` が必要です。 @@ -340,7 +340,7 @@ LIMIT 5 ``` -### 閲覧数が多い ClickHouse 関連記事 +### 閲覧数が多い ClickHouse 関連記事 {#clickhouse-related-posts-with-the-most-views} ```sql SELECT @@ -371,7 +371,7 @@ LIMIT 10 ``` -### 最も物議を醸した投稿 +### 最も物議を醸した投稿 {#most-controversial-posts} ```sql SELECT diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md index 8d1e2759661..ef6003e52a1 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md @@ -13,12 +13,12 @@ keywords: ['サンプルデータセット', 'tpch', 'ベンチマーク', 'サ **参考文献** -- [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](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 -## データ生成とインポート +## データ生成とインポート {#data-generation-and-import} まず、TPC-H リポジトリを取得し、データ生成ツールをコンパイルします。 @@ -60,7 +60,6 @@ TPC-H 仕様のルールにできるだけ忠実に従います: * セクション 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, @@ -170,7 +169,6 @@ clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO lineitem FORMA :::note tpch-kit を使用して自分でテーブルを生成する代わりに、公開 S3 バケットからデータをインポートすることもできます。必ず、上記の `CREATE` 文を使って、先に空のテーブルを作成してください。 - ```sql -- スケーリングファクター 1 INSERT INTO nation SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/nation.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1; @@ -195,8 +193,7 @@ INSERT INTO lineitem SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws. ::: - -## クエリ +## クエリ {#queries} :::note SQL 標準に従った正しい結果を得るために、[`join_use_nulls`](../../operations/settings/settings.md#join_use_nulls) の設定を有効にする必要があります。 @@ -349,7 +346,6 @@ ORDER BY **Q5** - ```sql SELECT n_name, @@ -497,7 +493,6 @@ ORDER BY **Q9** - ```sql SELECT nation, @@ -851,7 +846,6 @@ WHERE **Q20** - ```sql SELECT s_name, diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md index 774d9a2be43..e748a928976 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md @@ -26,7 +26,7 @@ keywords: ['サンプルデータセット', '天気', '台湾', 'サンプル - ClickHouse 向けにクリーンアップ、再構成、拡充された[前処理済みデータ](#pre-processed-data)。このデータセットは 1896 年から 2023 年までをカバーします。 - [元の生データをダウンロード](#original-raw-data)し、ClickHouse が要求する形式に変換します。独自のカラムを追加したいユーザーは、このデータを調査したり、自身のアプローチを検討・完成させたりするのに利用できます。 -### 前処理済みデータ +### 前処理済みデータ {#pre-processed-data} このデータセットは、「測定ごとに 1 行」の形式から、「気象観測所 ID」と「測定日」ごとに 1 行となる形式へと再構成されています。つまり、次のような形です。 @@ -47,16 +47,16 @@ C0X100,2016-01-01 04:00:00,1021.2,15.8,74,1.7,8.0,,,,,,,,,,,,,,,,,,,,,,, ```bash wget https://storage.googleapis.com/taiwan-weather-observaiton-datasets/preprocessed_weather_daily_1896_2023.tar.gz -# オプション: チェックサムを検証する +# オプション: チェックサムを検証する {#option-validate-the-checksum} md5sum preprocessed_weather_daily_1896_2023.tar.gz -# チェックサムは次と一致する必要があります: 11b484f5bd9ddafec5cfb131eb2dd008 +# チェックサムは次と一致する必要があります: 11b484f5bd9ddafec5cfb131eb2dd008 {#checksum-should-be-equal-to-11b484f5bd9ddafec5cfb131eb2dd008} tar -xzvf preprocessed_weather_daily_1896_2023.tar.gz daily_weather_preprocessed_1896_2023.csv -# オプション: チェックサムを検証する +# オプション: チェックサムを検証する {#option-validate-the-checksum} md5sum daily_weather_preprocessed_1896_2023.csv -# チェックサムは次と一致する必要があります: 1132248c78195c43d93f843753881754 +# チェックサムは次と一致する必要があります: 1132248c78195c43d93f843753881754 {#checksum-should-be-equal-to-1132248c78195c43d93f843753881754} ``` @@ -64,7 +64,7 @@ md5sum daily_weather_preprocessed_1896_2023.csv 以下では、目的に応じて変換や加工を行うための元の生データをダウンロードする手順について説明します。 -#### ダウンロード +#### ダウンロード {#download} 元の生データをダウンロードするには: @@ -73,9 +73,9 @@ 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 -# オプション: チェックサムの検証 +# オプション: チェックサムの検証 {#option-validate-the-checksum} md5sum raw_data_weather_daily_1896_2023.tar.gz -# チェックサムは b66b9f137217454d655e3004d7d1b51a と一致する必要があります +# チェックサムは b66b9f137217454d655e3004d7d1b51a と一致する必要があります {#checksum-should-be-equal-to-b66b9f137217454d655e3004d7d1b51a} tar -xzvf raw_data_weather_daily_1896_2023.tar.gz 466920_1928.csv @@ -84,23 +84,23 @@ tar -xzvf raw_data_weather_daily_1896_2023.tar.gz 466920_1931.csv ... -# オプション: チェックサムの検証 +# オプション: チェックサムの検証 {#option-validate-the-checksum} cat *.csv | md5sum -# チェックサムは b26db404bf84d4063fac42e576464ce1 と一致する必要があります +# チェックサムは b26db404bf84d4063fac42e576464ce1 と一致する必要があります {#checksum-should-be-equal-to-b26db404bf84d4063fac42e576464ce1} ``` -#### 台湾の気象観測所情報を取得する +#### 台湾の気象観測所情報を取得する {#retrieve-the-taiwan-weather-stations} ```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エンコーディングへ変換 +# オプション: UTF-8-BOMからUTF-8エンコーディングへ変換 {#option-convert-the-utf-8-bom-to-utf-8-encoding} sed -i '1s/^\xEF\xBB\xBF//' weather_sta_list.csv ``` -## テーブルスキーマの作成 +## テーブルスキーマの作成 {#create-table-schema} ClickHouse クライアントから、ClickHouse 上に MergeTree テーブルを作成します。 @@ -144,7 +144,7 @@ ORDER BY (MeasuredDate); ## ClickHouse への挿入 {#inserting-into-clickhouse} -### ローカルファイルからの挿入 +### ローカルファイルからの挿入 {#inserting-from-local-file} データは、ClickHouse クライアントから次のようにローカルファイルを利用して挿入できます: @@ -165,7 +165,7 @@ Peak memory usage: 583.23 MiB. ``` -### URL からのデータ挿入 +### URL からのデータ挿入 {#inserting-from-url} ```sql INSERT INTO tw_weather_data SELECT * @@ -176,7 +176,7 @@ FROM url('https://storage.googleapis.com/taiwan-weather-observaiton-datasets/dai これをより高速化する方法の詳細については、[大規模データロードのチューニング](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part2)に関するブログ記事を参照してください。 -## データ行数とサイズを確認する +## データ行数とサイズを確認する {#check-data-rows-and-sizes} 1. 何行挿入されたか確認してみましょう。 @@ -210,7 +210,7 @@ WHERE (`table` = 'tw_weather_data') AND active ## クエリ例 {#sample-queries} -### Q1: 特定の年における気象観測所ごとの最高露点温度を取得する +### Q1: 特定の年における気象観測所ごとの最高露点温度を取得する {#q1-retrieve-the-highest-dew-point-temperature-for-each-weather-station-in-the-specific-year} ```sql SELECT @@ -257,7 +257,7 @@ GROUP BY StationId ``` -### Q2: 特定の期間・フィールド・気象観測所を指定した生データの取得 +### Q2: 特定の期間・フィールド・気象観測所を指定した生データの取得 {#q2-raw-data-fetching-with-the-specific-duration-time-range-fields-and-weather-station} ```sql SELECT diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md index adf4b7124f6..2ac0b456647 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md @@ -13,7 +13,7 @@ keywords: ['example dataset', 'uk property', 'sample data', 'real estate', 'gett - 項目の説明: https://www.gov.uk/guidance/about-the-price-paid-data - HM Land Registry のデータを含みます © Crown copyright and database right 2021。このデータは Open Government Licence v3.0 に基づきライセンスされています。 -## テーブルの作成 +## テーブルの作成 {#create-table} ```sql CREATE DATABASE uk; @@ -40,7 +40,7 @@ ORDER BY (postcode1, postcode2, addr1, addr2); ``` -## データの前処理と挿入 +## データの前処理と挿入 {#preprocess-import-data} `url` 関数を使用してデータを ClickHouse にストリーミングします。その前に、受信データの一部を前処理する必要があります。内容は次のとおりです: @@ -95,7 +95,7 @@ FROM url( データの挿入が完了するまで待ちます。ネットワーク速度にもよりますが、1~2分ほどかかります。 -## データを検証する +## データを検証する {#validate-data} 何行挿入されたかを確認して、正しく動作したことを検証します。 @@ -119,7 +119,7 @@ WHERE name = 'uk_price_paid' データを分析するために、いくつかクエリを実行します。 -### クエリ 1: 年ごとの平均価格 +### クエリ 1: 年ごとの平均価格 {#average-price} ```sql runnable SELECT @@ -133,7 +133,7 @@ ORDER BY year ``` -### クエリ 2. ロンドンの1年あたりの平均価格 +### クエリ 2. ロンドンの1年あたりの平均価格 {#average-price-london} ```sql runnable SELECT @@ -150,7 +150,7 @@ ORDER BY year 2020年に住宅価格に異変が起きました!もっとも、それはおそらく驚くことではないでしょうが…… -### クエリ3. 最も高価なエリア +### クエリ3. 最も高価なエリア {#most-expensive-neighborhoods} ```sql runnable SELECT diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md index b25c39bc953..6729471296a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md @@ -241,7 +241,7 @@ keywords: ['サンプルデータセット', 'youtube', 'サンプルデータ', ## 質問 {#questions} -### コメントが無効化されていると、高評価や低評価が押される可能性は下がりますか? +### コメントが無効化されていると、高評価や低評価が押される可能性は下がりますか? {#create-the-table} コメントが無効化されている場合、視聴者は動画に対する気持ちを表そうとして、高評価や低評価を押す傾向が強くなるのでしょうか? @@ -297,7 +297,7 @@ ORDER BY コメントを有効にすると、エンゲージメント率が高くなる傾向があります。 -### 時間の経過に伴う動画数の変化と主なイベント +### 時間の経過に伴う動画数の変化と主なイベント {#insert-data} ```sql SELECT @@ -336,7 +336,7 @@ ORDER BY month ASC; アップローダー数の急増が、[新型コロナウイルス流行期のあたりで明確に見て取れます](https://www.theverge.com/2020/3/27/21197642/youtube-with-me-style-videos-views-coronavirus-cook-workout-study-home-beauty)。 -### 字幕はいつ頃からどのように増えてきたのか +### 字幕はいつ頃からどのように増えてきたのか {#count-row-numbers} 音声認識技術の進歩により、動画に字幕を付けることはいままでになく簡単になりました。YouTube では 2009 年末に自動キャプション機能が追加されましたが、あれが転換点だったのでしょうか? @@ -374,7 +374,7 @@ ORDER BY month ASC; これをきっかけに、難聴者やろう者の視聴者のために、クリエイターが自分の動画に字幕を追加することを促す、大きな成功を収めたキャンペーンが展開されました。 -### 時系列でのアップロード数上位ユーザー +### 時系列でのアップロード数上位ユーザー {#explore-the-data} ```sql WITH uploaders AS @@ -467,7 +467,7 @@ ORDER BY ``` -### ビューはどのように分散されますか? +### ビューはどのように分散されますか? {#if-someone-disables-comments-does-it-lower-the-chance-someone-will-actually-click-like-or-dislike} ```sql SELECT diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/index.md index 75f2efc074c..d1d01b4deca 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/index.md @@ -9,9 +9,7 @@ title: 'チュートリアルとサンプルデータセット' doc_type: 'landing-page' --- - - -# チュートリアルとサンプルデータセット +# チュートリアルとサンプルデータセット {#tutorials-and-example-datasets} ClickHouse の使い方を学び、すぐに使い始めるためのリソースを多数用意しています。 @@ -25,7 +23,6 @@ ClickHouse の使い方を学び、すぐに使い始めるためのリソース {/* 以下の表は、ビルド時に次のスクリプトによって自動生成されます https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh */ } - {/*AUTOGENERATED_START*/ } | ページ | 概要 | diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md index ff1d2595a4b..91330b557b3 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md @@ -1,6 +1,8 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; + + # Debian/UbuntuへのClickHouseのインストール {#install-from-deb-packages} > **Debian**または**Ubuntu**では、公式のプリコンパイル済み`deb`パッケージの使用を推奨します。 @@ -15,20 +17,30 @@ ClickHouse をインストールするには、次のコマンドを実行しま ```bash -# 前提パッケージをインストール +# 前提パッケージをインストール {#install-prerequisite-packages} sudo apt-get install -y apt-transport-https ca-certificates curl gnupg +``` + -# ClickHouse の GPG キーをダウンロードしてキーリングに保存する +# ClickHouse の GPG キーをダウンロードしてキーリングに保存する {#download-the-clickhouse-gpg-key-and-store-it-in-the-keyring} curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg -# システムのアーキテクチャを取得する + + +# システムのアーキテクチャを取得する {#get-the-system-architecture} ARCH=$(dpkg --print-architecture) -# ClickHouse リポジトリを apt のソースリストに追加する + + +# ClickHouse リポジトリを apt のソースリストに追加する {#add-the-clickhouse-repository-to-apt-sources} echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg arch=${ARCH}] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list -# apt パッケージリストを更新する + + +# apt パッケージリストを更新する {#update-apt-package-lists} + sudo apt-get update + ``` - 必要に応じて、`stable`を`lts`に置き換えることで、異なる[リリース種別](/knowledgebase/production)を使用できます。 @@ -36,42 +48,59 @@ sudo apt-get update
debパッケージをインストールする旧ディストリビューション方式 +``` + ```bash -# 前提パッケージのインストール +# 前提パッケージのインストール {#install-prerequisite-packages} sudo apt-get install apt-transport-https ca-certificates dirmngr +``` -# パッケージの認証に使用する ClickHouse の GPG キーを追加する + +# パッケージの認証に使用する ClickHouse の GPG キーを追加する {#add-the-clickhouse-gpg-key-to-authenticate-packages} sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754 -# APT のソースリストに ClickHouse リポジトリを追加する + + +# APT のソースリストに ClickHouse リポジトリを追加する {#add-the-clickhouse-repository-to-apt-sources} echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \ /etc/apt/sources.list.d/clickhouse.list + + -# apt パッケージリストを更新 +# apt パッケージリストを更新 {#update-apt-package-lists} sudo apt-get update -# ClickHouse サーバーおよびクライアントのパッケージをインストールする + + +# ClickHouse サーバーおよびクライアントのパッケージをインストールする {#install-clickhouse-server-and-client-packages} sudo apt-get install -y clickhouse-server clickhouse-client -# ClickHouse サーバーのサービスを起動する + + +# ClickHouse サーバーのサービスを起動する {#start-the-clickhouse-server-service} sudo service clickhouse-server start -# ClickHouse コマンドラインクライアントを起動する -clickhouse-client # パスワードを設定している場合は "clickhouse-client --password" を使用します。 + + +# ClickHouse コマンドラインクライアントを起動する {#launch-the-clickhouse-command-line-client} + +clickhouse-client # パスワードを設定している場合は "clickhouse-client --password" を使用します。 + ```
+``` -## ClickHouse サーバーとクライアントのインストール +## ClickHouse サーバーとクライアントのインストール {#install-clickhouse-server-and-client} ```bash sudo apt-get install -y clickhouse-server clickhouse-client ``` -## ClickHouse を起動する +## ClickHouse を起動する {#start-clickhouse-server} ClickHouse サーバーを起動するには、次のコマンドを実行します。 @@ -92,7 +121,7 @@ clickhouse-client --password ``` -## スタンドアロン構成の ClickHouse Keeper をインストールする +## スタンドアロン構成の ClickHouse Keeper をインストールする {#install-standalone-clickhouse-keeper} :::tip 本番環境では、ClickHouse Keeper を専用ノード上で実行することを強く推奨します。 @@ -131,7 +160,6 @@ sudo systemctl status clickhouse-keeper | `clickhouse-keeper` | 専用の ClickHouse Keeper ノードに ClickHouse Keeper をインストールするために使用します。ClickHouse server と同じサーバー上で 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` diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md index 8feffbdda87..1c02b3bc266 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md @@ -1,4 +1,4 @@ -# Docker を使用して ClickHouse をインストールする +# Docker を使用して ClickHouse をインストールする {#install-clickhouse-using-docker} [Docker Hub](https://hub.docker.com/r/clickhouse/clickhouse-server/) のガイドを、 便宜上、以下に再掲します。提供されている Docker イメージは、 @@ -33,9 +33,9 @@ docker pull clickhouse/clickhouse-server -## このイメージの使い方 +## このイメージの使い方 {#how-to-use-image} -### サーバーインスタンスを起動する +### サーバーインスタンスを起動する {#start-server-instance} ```bash docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server @@ -45,18 +45,18 @@ docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickh デフォルトでは、上記のサーバーインスタンスは、パスワードなしの `default` ユーザーとして実行されます。 -### ネイティブクライアントから接続する +### ネイティブクライアントから接続する {#connect-to-it-from-native-client} ```bash docker run -it --rm --network=container:some-clickhouse-server --entrypoint clickhouse-client clickhouse/clickhouse-server -# または +# または {#or} docker exec -it some-clickhouse-server clickhouse-client ``` ClickHouse クライアントの詳細については、[ClickHouse client](/interfaces/cli) を参照してください。 -### curl で接続する +### curl で接続する {#connect-to-it-using-curl} ```bash echo "SELECT 'こんにちは、ClickHouse!'" | docker run -i --rm --network=container:some-clickhouse-server buildpack-deps:curl curl 'http://localhost:8123/?query=' -s --data-binary @- @@ -64,14 +64,14 @@ echo "SELECT 'こんにちは、ClickHouse!'" | docker run -i --rm --network=con HTTP インターフェイスの詳細については、[ClickHouse HTTP Interface](/interfaces/http) を参照してください。 -### コンテナの停止と削除 +### コンテナの停止と削除 {#stopping-removing-container} ```bash docker stop some-clickhouse-server docker rm some-clickhouse-server ``` -### ネットワーキング +### ネットワーキング {#networking} :::note あらかじめ定義されているユーザー `default` は、パスワードが設定されていない限りネットワークにアクセスできません。 @@ -97,7 +97,7 @@ echo 'SELECT version()' | curl 'http://localhost:8123/' --data-binary @- 上記の例でのユーザーのデフォルト設定は、localhost からのリクエストに対してのみ利用可能です ::: -### ボリューム +### ボリューム {#volumes} 永続化を行うために、通常はコンテナ内に次のフォルダをマウントします: @@ -118,7 +118,7 @@ docker run -d \ * `/docker-entrypoint-initdb.d/` - データベース初期化スクリプトを配置するフォルダー(後述)。 -## Linux capabilities +## Linux capabilities {#linear-capabilities} ClickHouse には、複数の [Linux capabilities](https://man7.org/linux/man-pages/man7/capabilities.7.html) の有効化を必要とする高度な機能があります。 @@ -133,29 +133,29 @@ docker run -d \ 詳細は ["Docker における CAP_IPC_LOCK および CAP_SYS_NICE ケーパビリティの設定"](/knowledgebase/configure_cap_ipc_lock_and_cap_sys_nice_in_docker) を参照してください。 -## 設定 +## 設定 {#configuration} コンテナは [HTTP インターフェイス](https://clickhouse.com/docs/interfaces/http_interface/) 用にポート 8123 を、[ネイティブクライアント](https://clickhouse.com/docs/interfaces/tcp/) 用にポート 9000 を公開します。 ClickHouse の設定はファイル "config.xml"([ドキュメント](https://clickhouse.com/docs/operations/configuration_files/))で定義されます。 -### カスタム設定でサーバーインスタンスを起動する +### カスタム設定でサーバーインスタンスを起動する {#start-server-instance-with-custom-config} ```bash docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 -v /path/to/your/config.xml:/etc/clickhouse-server/config.xml clickhouse/clickhouse-server ``` -### 任意のユーザーとしてサーバーを起動する +### 任意のユーザーとしてサーバーを起動する {#start-server-custom-user} ```bash -# $PWD/data/clickhouse が存在し、現在のユーザーが所有者である必要があります +# $PWD/data/clickhouse が存在し、現在のユーザーが所有者である必要があります {#pwddataclickhouse-should-exist-and-be-owned-by-current-user} docker run --rm --user "${UID}:${GID}" --name some-clickhouse-server --ulimit nofile=262144:262144 -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server ``` ローカルディレクトリをマウントしてこのイメージを使用する場合、適切なファイル所有権を維持するためにユーザーを指定する必要があります。`--user` 引数を使用し、コンテナ内に `/var/lib/clickhouse` と `/var/log/clickhouse-server` をマウントしてください。そうしないと、コンテナイメージがエラーとなり起動しません。 -### root でサーバーを起動する +### root でサーバーを起動する {#start-server-from-root} ユーザーネームスペースが有効になっている場合、root でサーバーを起動することが有効です。 その場合は、次を実行します。 @@ -164,7 +164,7 @@ docker run --rm --user "${UID}:${GID}" --name some-clickhouse-server --ulimit no docker run --rm -e CLICKHOUSE_RUN_AS_ROOT=1 --name clickhouse-server-userns -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server ``` -### 起動時にデフォルトのデータベースとユーザーを作成する方法 +### 起動時にデフォルトのデータベースとユーザーを作成する方法 {#how-to-create-default-db-and-user} コンテナの起動時にユーザー(デフォルトでは `default` という名前のユーザーが使用されます)とデータベースを作成したい場合には、環境変数 `CLICKHOUSE_DB`、`CLICKHOUSE_USER`、`CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT`、`CLICKHOUSE_PASSWORD` を使用して設定できます。 @@ -172,7 +172,7 @@ docker run --rm -e CLICKHOUSE_RUN_AS_ROOT=1 --name clickhouse-server-userns -v " docker run --rm -e CLICKHOUSE_DB=my_database -e CLICKHOUSE_USER=username -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=password -p 9000:9000/tcp clickhouse/clickhouse-server ``` -#### `default` ユーザーの管理 +#### `default` ユーザーの管理 {#managing-default-user} `CLICKHOUSE_USER`、`CLICKHOUSE_PASSWORD`、`CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT` のいずれも設定されていない場合、`default` ユーザーはデフォルトではネットワークアクセスが無効化されています。 @@ -183,7 +183,7 @@ docker run --rm -e CLICKHOUSE_SKIP_USER_SETUP=1 -p 9000:9000/tcp clickhouse/clic ``` -## このイメージを拡張する方法 +## このイメージを拡張する方法 {#how-to-extend-image} このイメージを元にした派生イメージで追加の初期化処理を行うには、`/docker-entrypoint-initdb.d` 配下に `*.sql`、`*.sql.gz`、または `*.sh` スクリプトを 1 つ以上追加します。エントリポイントが `initdb` を呼び出した後、そのディレクトリ内にあるすべての `*.sql` ファイルを実行し、実行可能な `*.sh` スクリプトを実行し、実行可能でない `*.sh` スクリプトは読み込んで(source して)、サービスを起動する前にさらに初期化処理を行います。\ また、初期化中に clickhouse-client で使用される環境変数 `CLICKHOUSE_USER` と `CLICKHOUSE_PASSWORD` を指定することもできます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md index 0b431719605..36c6e2e0641 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md @@ -1,4 +1,4 @@ -# tgzアーカイブを使用したClickHouseのインストール +# tgzアーカイブを使用したClickHouseのインストール {#install-clickhouse-using-tgz-archives} > `deb`または`rpm`パッケージのインストールができないすべてのLinuxディストリビューションでは、公式のプリコンパイル済み`tgz`アーカイブの使用を推奨します。 @@ -19,7 +19,7 @@ -## 最新の ClickHouse バージョンを取得する +## 最新の ClickHouse バージョンを取得する {#get-latest-version} GitHub から最新の ClickHouse バージョンを取得し、`LATEST_VERSION` 変数に設定します。 @@ -30,7 +30,7 @@ export LATEST_VERSION ``` -## システムアーキテクチャを特定する +## システムアーキテクチャを特定する {#detect-system-architecture} システムアーキテクチャを特定し、それに応じて `ARCH` 変数を設定します。 @@ -43,7 +43,7 @@ esac ``` -## 各 ClickHouse コンポーネント用の tarball をダウンロードする +## 各 ClickHouse コンポーネント用の tarball をダウンロードする {#download-tarballs} 各 ClickHouse コンポーネント用の tarball をダウンロードします。ループではまずアーキテクチャ固有のパッケージを試し、なければ汎用パッケージにフォールバックします。 @@ -64,7 +64,7 @@ done ```bash -# clickhouse-common-static パッケージの展開とインストール +# clickhouse-common-static パッケージの展開とインストール {#extract-and-install-clickhouse-common-static-package} 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" @@ -74,7 +74,7 @@ sudo "clickhouse-common-static-$LATEST_VERSION/install/doinst.sh" ```bash -# デバッグシンボルパッケージの展開とインストール +# デバッグシンボルパッケージの展開とインストール {#extract-and-install-debug-symbols-package} 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" @@ -84,7 +84,7 @@ sudo "clickhouse-common-static-dbg-$LATEST_VERSION/install/doinst.sh" ```bash -# サーバーパッケージを展開し、設定を行ってインストール +# サーバーパッケージを展開し、設定を行ってインストール {#extract-and-install-server-package-with-configuration} tar -xzvf "clickhouse-server-$LATEST_VERSION-${ARCH}.tgz" \ || tar -xzvf "clickhouse-server-$LATEST_VERSION.tgz" sudo "clickhouse-server-$LATEST_VERSION/install/doinst.sh" configure @@ -95,7 +95,7 @@ sudo /etc/init.d/clickhouse-server start # サーバーを起動 ```bash -# クライアントパッケージを展開してインストール +# クライアントパッケージを展開してインストール {#extract-and-install-client-package} tar -xzvf "clickhouse-client-$LATEST_VERSION-${ARCH}.tgz" \ || tar -xzvf "clickhouse-client-$LATEST_VERSION.tgz" sudo "clickhouse-client-$LATEST_VERSION/install/doinst.sh" diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md index 781cf93b6ce..569ea917e0e 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md @@ -5,12 +5,12 @@ import privacy_allow from "@site/static/images/knowledgebase/fix-the-developer-v -# HomebrewによるClickHouseのインストール +# HomebrewによるClickHouseのインストール {#install-clickhouse-using-homebrew} -## コミュニティ版 Homebrew フォーミュラを使用してインストールする +## コミュニティ版 Homebrew フォーミュラを使用してインストールする {#install-using-community-homebrew-formula} macOS で [Homebrew](https://brew.sh/) を使用して ClickHouse をインストールするには、 ClickHouse コミュニティの [Homebrew フォーミュラ](https://formulae.brew.sh/cask/clickhouse) を使用できます。 @@ -20,7 +20,7 @@ brew install --cask clickhouse ``` -## macOS での開発元検証エラーの解消 +## macOS での開発元検証エラーの解消 {#fix-developer-verification-error-macos} `brew` を使用して ClickHouse をインストールした場合、macOS からエラーが表示されることがあります。 デフォルトでは、macOS は確認できない開発元によって作成されたアプリケーションやツールを実行しません。 @@ -31,7 +31,7 @@ brew install --cask clickhouse この検証エラーを回避するには、システム設定ウィンドウで該当する設定を変更するか、ターミナルを使用するか、または ClickHouse を再インストールするなどして、いずれかの方法で macOS の隔離領域からアプリを削除する必要があります。 -### システム設定での手順 +### システム設定での手順 {#system-settings-process} `clickhouse` 実行ファイルを隔離領域から削除する最も簡単な方法は次のとおりです。 @@ -51,7 +51,7 @@ brew install --cask clickhouse これでターミナルで `clickhouse` コマンドを実行できるようになるはずです。 -### ターミナルでの手順 +### ターミナルでの手順 {#terminal-process} `Allow Anyway` ボタンを押してもこの問題が解消しない場合は、コマンドラインを使って同じ処理を行うことができます。 あるいは、単にコマンドラインを使う方が好みの場合もあるでしょう。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md index b13e2c98feb..3a57c6e1ed7 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md @@ -1,11 +1,11 @@ -# curl でスクリプトを実行して ClickHouse をインストールする +# curl でスクリプトを実行して ClickHouse をインストールする {#install-clickhouse-via-script-using-curl} 本番環境向けに ClickHouse をインストールする必要がない場合、最も手早くセットアップする方法は、curl を使ってインストールスクリプトを実行することです。このスクリプトは、利用中の OS に適したバイナリを自動的に判別します。 -## curl を使用して ClickHouse をインストールする +## curl を使用して ClickHouse をインストールする {#install-clickhouse-using-curl} 以下のコマンドを実行して、使用しているオペレーティングシステム向けの単一のバイナリをダウンロードします。 @@ -18,7 +18,7 @@ Mac をお使いの方へ: バイナリの開発元を検証できないとい ::: -## clickhouse-local を起動する +## clickhouse-local を起動する {#start-clickhouse-local} `clickhouse-local` を使用すると、ClickHouse の強力な SQL 構文を利用して、 ローカルおよびリモートファイルを事前の設定なしに処理できます。テーブルデータは一時領域に保存されるため、 @@ -31,7 +31,7 @@ Mac をお使いの方へ: バイナリの開発元を検証できないとい ``` -## clickhouse-server を起動する +## clickhouse-server を起動する {#start-clickhouse-server} データを永続化する場合は、`clickhouse-server` を起動します。ClickHouse サーバーは、次のコマンドで起動できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md index dbc4f24138e..cb213946b80 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md @@ -5,7 +5,7 @@ -## RPM リポジトリの設定 +## RPM リポジトリの設定 {#setup-the-rpm-repository} 次のコマンドを実行して公式リポジトリを追加します: @@ -24,7 +24,7 @@ sudo zypper --gpg-auto-import-keys refresh clickhouse-stable 以下の手順では、利用しているパッケージマネージャに応じて、`yum install` を `zypper install` に置き換えて構いません。 -## ClickHouse サーバーとクライアントをインストールする +## ClickHouse サーバーとクライアントをインストールする {#install-clickhouse-server-and-client-1} ClickHouse をインストールするには、次のコマンドを実行します。 @@ -42,7 +42,7 @@ sudo yum install clickhouse-server-22.8.7.34 ``` -## ClickHouse サーバーを起動する +## ClickHouse サーバーを起動する {#start-clickhouse-server-1} ClickHouse サーバーを起動するには、以下を実行します。 @@ -65,7 +65,7 @@ clickhouse-client --password ``` -## スタンドアロン ClickHouse Keeper をインストールする +## スタンドアロン ClickHouse Keeper をインストールする {#install-standalone-clickhouse-keeper-1} :::tip 本番環境では、ClickHouse Keeper を専用ノード上で実行することを強く推奨します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md index 0a487d97607..2304fb24124 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md @@ -1,4 +1,4 @@ -# WSL を使って Windows に ClickHouse をインストールする +# WSL を使って Windows に ClickHouse をインストールする {#install-clickhouse-on-windows-with-wsl} @@ -11,7 +11,7 @@ WindowsにClickHouseをインストールする場合は、WSL(Windows Subsyst -## WSL をインストールする +## WSL をインストールする {#install-wsl} Windows PowerShell を管理者権限で開き、次のコマンドを実行します。 @@ -26,7 +26,7 @@ Ubuntu 24.04.1 LTS へようこそ (GNU/Linux 5.15.133.1-microsoft-WSL2 x86_64) ``` -## curl を使ったスクリプトで ClickHouse をインストールする +## curl を使ったスクリプトで ClickHouse をインストールする {#install-clickhouse-via-script-using-curl} curl を使ったスクリプトで ClickHouse をインストールするには、次のコマンドを実行します。 @@ -42,7 +42,7 @@ ClickHouseバイナリのダウンロードが完了しました。以下のコ ``` -## clickhouse-local を起動する +## clickhouse-local を起動する {#start-clickhouse-local} `clickhouse-local` を使用すると、ClickHouse の強力な SQL 構文を利用して、 ローカルおよびリモートのファイルを設定なしで処理できます。テーブルデータは @@ -56,7 +56,7 @@ ClickHouseバイナリのダウンロードが完了しました。以下のコ ``` -## clickhouse-server を起動する +## clickhouse-server を起動する {#start-clickhouse-server} データを永続化したい場合は、`clickhouse-server` を実行します。ClickHouse サーバーは次のコマンドで起動できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md index e4485f33a1b..ae90f270a22 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md @@ -10,7 +10,7 @@ doc_type: 'guide' -## ソースからコンパイルする +## ソースからコンパイルする {#compile-from-source} ClickHouse を手動でコンパイルするには、[Linux](/development/build.md) または [macOS](/development/build-osx.md) 向けの手順に従ってください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md index f1036c846c6..61f9992212b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md @@ -10,4 +10,4 @@ doc_type: 'guide' import DebianProd from './_snippets/_deb_install.md' - + diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx index 7ac1817e233..1768651b3fd 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx @@ -18,33 +18,13 @@ import Docker from './_snippets/_docker.md' import {CardPrimary} from '@clickhouse/click-ui/bundled'; import {galaxyOnClick} from '@site/src/lib/galaxy/galaxy' +# インストール手順 \{#installation-instructions\} -# インストール手順 + - - -
+
または、以下からプラットフォーム、ディストリビューション、およびインストール方法を選択して、 オープンソース版 ClickHouse のインストール手順を表示します。 -} - quickinstall={} - debian_prod={} - rpm_prod={} - tar_prod={} - macos_prod={} - docker={} -/> \ No newline at end of file +} quickinstall={} debian_prod={} rpm_prod={} tar_prod={} macos_prod={} docker={} /> \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/playground.md b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/playground.md index 40e70936d80..d2c3bfe027c 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/playground.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/playground.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# ClickHouse playground +# ClickHouse playground {#clickhouse-playground} [ClickHouse Playground](https://sql.clickhouse.com) は、ユーザーが独自のサーバーやクラスターをセットアップすることなく、すぐにクエリを実行して ClickHouse を試せる環境です。 Playground には、いくつかのサンプルデータセットが用意されています。 @@ -40,7 +40,7 @@ Playground には、任意の HTTP クライアントからクエリを送信で -## 例 +## 例 {#examples} `curl` を使って HTTPS エンドポイントにアクセスする例: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx index 46491fd5197..618619e1ec5 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx @@ -20,16 +20,15 @@ import data_sources from '@site/static/images/_snippets/data_sources.png'; import select_data_source from '@site/static/images/_snippets/select_data_source.png'; import client_details from '@site/static/images/_snippets/client_details.png'; import new_rows_from_csv from '@site/static/images/_snippets/new_rows_from_csv.png'; -import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; +import SQLConsoleDetail from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_launch_sql_console.md'; +# ClickHouse Cloud クイックスタート \{#clickhouse-cloud-quick-start\} -# ClickHouse Cloud クイックスタート - -> ClickHouse を最も手早く簡単に使い始める方法は、[ClickHouse Cloud](https://console.clickhouse.cloud) で新しいサービスを作成することです。 +> ClickHouse を最も手早く簡単に使い始める方法は、[ClickHouse Cloud](https://console.clickhouse.cloud) で新しいサービスを作成することです。\ > このクイックスタートガイドでは、3 つの簡単なステップでセットアップする手順を説明します。 - ## ClickHouseサービスを作成する + ## ClickHouseサービスを作成する \{#1-create-a-clickhouse-service\} [ClickHouse Cloud](https://console.clickhouse.cloud)で無料のClickHouseサービスを作成するには、以下の手順に従ってサインアップしてください: @@ -58,7 +57,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; おめでとうございます!ClickHouse Cloudサービスが稼働し、オンボーディングが完了しました。データの取り込みとクエリの実行方法については、以下をご参照ください。 - ## ClickHouseに接続する + ## ClickHouseに接続する \{#2-connect-to-clickhouse\} ClickHouseへの接続方法は2つあります: @@ -67,7 +66,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md';
- ### SQLコンソールを使用して接続する + ### SQLコンソールを使用して接続する \{#connect-using-sql-console\} 迅速に開始するには、ClickHouseがWebベースのSQLコンソールを提供しており、オンボーディング完了後に自動的にリダイレクトされます。 @@ -87,7 +86,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; 以上で完了です。新しいClickHouseサービスの使用を開始できます。 - ### アプリケーションへの接続 + ### アプリケーションへの接続 \{#connect-with-your-app\} ナビゲーションメニューから接続ボタンをクリックします。モーダルが開き、サービスの認証情報と、使用するインターフェースまたは言語クライアントでの接続手順が表示されます。 @@ -97,7 +96,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; ご使用の言語クライアントが表示されない場合は、[インテグレーション](/integrations)のリストを参照してください。 - ## データを追加する + ## データを追加する \{#3-add-data\} ClickHouseはデータを取り込むことで真価を発揮します。データを追加する方法は複数あり、そのほとんどはナビゲーションメニューからアクセス可能なData Sourcesページで利用できます。 @@ -113,7 +112,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; * ファイルをアップロード - 対応形式は JSON、CSV、TSV です * ファイルURLからデータをアップロードする - ### ClickPipes + ### ClickPipes \{#clickpipes\} [ClickPipes](http://clickhouse.com/docs/integrations/clickpipes)は、多様なソースからのデータ取り込みを数クリックで実現するマネージド統合プラットフォームです。 最も要求の厳しいワークロードに対応するよう設計されたClickPipesの堅牢でスケーラブルなアーキテクチャは、一貫したパフォーマンスと信頼性を保証します。 ClickPipesは、長期的なストリーミングニーズや一回限りのデータロードジョブに使用できます。 @@ -121,7 +120,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md';
- ### SQLコンソールを使用したデータの追加 + ### SQLコンソールを使用したデータの追加 \{#add-data-using-the-sql-console\} 多くのデータベース管理システムと同様に、ClickHouseはテーブルを論理的に**データベース**にグループ化します。ClickHouseで新しいデータベースを作成するには、[`CREATE DATABASE`](../../sql-reference/statements/create/database.md)コマンドを使用します。 @@ -162,7 +161,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; 選択可能なテーブルエンジンは多数ありますが、単一ノードのClickHouseサーバー上のシンプルなテーブルには、[`MergeTree`](/engines/table-engines/mergetree-family/mergetree.md)が最適な選択となるでしょう。 ::: - #### プライマリキーの簡単な紹介 + #### プライマリキーの簡単な紹介 \{#a-brief-intro-to-primary-keys\} 先に進む前に、ClickHouseにおけるプライマリキーの動作原理を理解しておくことが重要です(プライマリキーの実装は予想外に感じられるかもしれません): @@ -176,7 +175,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; ClickHouseの中核概念について詳しく知るには、["コア概念"](../../managing-data/core-concepts/index.md)を参照してください。 - #### テーブルへのデータの挿入 + #### テーブルへのデータの挿入 \{#insert-data-into-your-table\} ClickHouseでは、おなじみの[`INSERT INTO TABLE`](../../sql-reference/statements/insert-into.md)コマンドを使用できますが、[`MergeTree`](/engines/table-engines/mergetree-family/mergetree.md)テーブルへの各挿入により、ストレージ内に**パート**が作成されることを理解しておく必要があります。 @@ -206,7 +205,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; SELECT * FROM helloworld.my_first_table ``` - ### ClickHouseクライアントを使用してデータを追加する + ### ClickHouseクライアントを使用してデータを追加する \{#add-data-using-the-clickhouse-client\} [**clickhouse client**](/interfaces/cli)というコマンドラインツールを使用して、ClickHouse Cloudサービスに接続することもできます。左側のメニューで`Connect`をクリックし、詳細情報にアクセスしてください。ダイアログのドロップダウンから`Native`を選択します: @@ -286,7 +285,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; exit ``` - ### ファイルのアップロード + ### ファイルのアップロード \{#upload-a-file\} データベースの利用開始時によくあるタスクとして、既存のファイルに保存されているデータの挿入があります。クリックストリームデータを表すサンプルデータをオンラインで提供しており、これを挿入することができます。このデータには、ユーザーID、訪問されたURL、およびイベントのタイムスタンプが含まれています。 @@ -321,9 +320,9 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; ## 次のステップ \{#whats-next\} -- [チュートリアル](/tutorial.md) では、テーブルに 200 万行を挿入し、いくつかの分析クエリを実行します -- [サンプルデータセット](/getting-started/index.md) と、その挿入手順を一覧で提供しています -- [Getting Started with ClickHouse](https://clickhouse.com/company/events/getting-started-with-clickhouse/) の 25 分間の動画をご覧ください -- データが外部ソースから来る場合は、メッセージキュー、データベース、パイプラインなどへの接続方法をまとめた[連携ガイド集](/integrations/index.mdx)を参照してください -- UI/BI 可視化ツールを使用している場合は、[UI を ClickHouse に接続するためのユーザーガイド](/integrations/data-visualization) を参照してください -- [プライマリキー](/guides/best-practices/sparse-primary-indexes.md) に関するユーザーガイドには、プライマリキーについて知っておくべきことと、その定義方法がすべて記載されています \ No newline at end of file +* [チュートリアル](/tutorial.md) では、テーブルに 200 万行を挿入し、いくつかの分析クエリを実行します +* [サンプルデータセット](/getting-started/index.md) と、その挿入手順を一覧で提供しています +* [Getting Started with ClickHouse](https://clickhouse.com/company/events/getting-started-with-clickhouse/) の 25 分間の動画をご覧ください +* データが外部ソースから来る場合は、メッセージキュー、データベース、パイプラインなどへの接続方法をまとめた[連携ガイド集](/integrations/index.mdx)を参照してください +* UI/BI 可視化ツールを使用している場合は、[UI を ClickHouse に接続するためのユーザーガイド](/integrations/data-visualization) を参照してください +* [プライマリキー](/guides/best-practices/sparse-primary-indexes.md) に関するユーザーガイドには、プライマリキーについて知っておくべきことと、その定義方法がすべて記載されています \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx index b02a92d333e..8ccc9bdb73f 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx +++ b/i18n/jp/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx @@ -14,15 +14,14 @@ import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; import {VerticalStepper} from '@clickhouse/click-ui/bundled'; - -# ClickHouse OSS クイックスタート +# ClickHouse OSS クイックスタート \{#clickhouse-oss-quick-start\} > このクイックスタートチュートリアルでは、8 つの簡単なステップで OSS 版 ClickHouse をセットアップします。お使いの OS に適したバイナリをダウンロードし、 -ClickHouse サーバーの起動方法を学び、ClickHouse クライアントを使ってテーブルを作成し、 -そのテーブルにデータを挿入して、そのデータを取得するクエリを実行します。 +> ClickHouse サーバーの起動方法を学び、ClickHouse クライアントを使ってテーブルを作成し、 +> そのテーブルにデータを挿入して、そのデータを取得するクエリを実行します。 - ## ClickHouseのダウンロード + ## ClickHouseのダウンロード \{#download-the-binary\} ClickHouseはLinux、FreeBSD、macOS上でネイティブに動作し、Windowsでは[WSL](https://learn.microsoft.com/en-us/windows/wsl/about)経由で動作します。 ClickHouseをローカルにダウンロードする最も簡単な方法は、以下の`curl`コマンドを実行することです。 このコマンドは使用中のオペレーティングシステムがサポートされているかを判定し、masterブランチからビルドされた適切なClickHouseバイナリをダウンロードします。 @@ -53,7 +52,7 @@ ClickHouse サーバーの起動方法を学び、ClickHouse クライアント Macユーザーの方へ:バイナリの開発者を検証できないというエラーが表示される場合は、["MacOSにおける開発者検証エラーの修正方法"](https://clickhouse.com/docs/knowledgebase/fix-developer-verification-error-in-macos)を参照してください。 ::: - ## サーバーを起動する + ## サーバーを起動する \{#start-the-server\} 以下のコマンドを実行してClickHouseサーバーを起動します: @@ -65,7 +64,7 @@ ClickHouse サーバーの起動方法を学び、ClickHouse クライアント [デフォルトのログレベル](https://clickhouse.com/docs/knowledgebase/why_default_logging_verbose) が`warning`ではなく`trace`に設定されています。 - ## クライアントを起動する + ## クライアントを起動する \{#start-the-client\} `clickhouse-client`を使用してClickHouseサービスに接続します。新しいターミナルを開き、`clickhouse`バイナリが保存されているディレクトリに移動して、以下のコマンドを実行します: @@ -79,7 +78,7 @@ ClickHouse サーバーの起動方法を学び、ClickHouse クライアント my-host :) ``` - ## テーブルを作成する + ## テーブルを作成する \{#create-a-table\} `CREATE TABLE`を使用して新しいテーブルを定義します。一般的なSQL DDLコマンドはClickHouseで動作しますが、1つ追加があります - ClickHouseのテーブルには`ENGINE`句が必要です。ClickHouseのパフォーマンス上の利点を活用するには、[`MergeTree`](/engines/table-engines/mergetree-family/mergetree)を使用してください: @@ -95,7 +94,7 @@ ClickHouse サーバーの起動方法を学び、ClickHouse クライアント PRIMARY KEY (user_id, timestamp) ``` - ## データの挿入 + ## データの挿入 \{#insert-data\} ClickHouseでは一般的な`INSERT INTO TABLE`コマンドを使用できますが、`MergeTree`テーブルへの各挿入によって、ストレージ内にClickHouseで**パート**と呼ばれるものが作成されることを理解しておく必要があります。これらの^^パート^^は後でClickHouseによってバックグラウンドでマージされます。 @@ -111,7 +110,7 @@ ClickHouse サーバーの起動方法を学び、ClickHouse クライアント (101, 'グラニュールは読み取られるデータの最小チャンク', now() + 5, 3.14159 ) ``` - ## 新しいテーブルをクエリする + ## 新しいテーブルをクエリする \{#query-your-new-table\} 他のSQLデータベースと同様に`SELECT`クエリを記述できます: @@ -134,7 +133,7 @@ ClickHouse サーバーの起動方法を学び、ClickHouse クライアント 4行が返されました。経過時間: 0.008秒 ``` - ## 独自データの挿入 + ## 独自データの挿入 \{#insert-your-own-data\} 次のステップは、お客様のデータをClickHouseに取り込むことです。データ取り込み用の[テーブル関数](/sql-reference/table-functions/index.md)と[インテグレーション](/integrations)を多数ご用意しています。以下のタブにいくつかの例を掲載していますが、ClickHouseと統合可能な技術の詳細なリストについては[インテグレーション](/integrations)ページをご確認ください。 @@ -348,7 +347,7 @@ ClickHouse サーバーの起動方法を学び、ClickHouse クライアント - ## 探索 + ## 探索 \{#explore\} * ClickHouse の仕組みの基本を学ぶには、[Core Concepts](/managing-data/core-concepts) セクションを参照してください。 * ClickHouse の主要なコンセプトや機能を、より踏み込んで解説している [Advanced Tutorial](tutorial.md) もご覧ください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/index.md index 476c767ce21..98b80092534 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/index.md @@ -7,12 +7,11 @@ keywords: ['パフォーマンス最適化', 'ベストプラクティス', '最 doc_type: 'reference' --- -import TableOfContents from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; +import TableOfContents from '@site/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; - -# パフォーマンスと最適化 +# パフォーマンスと最適化 {#performance-and-optimizations} このセクションでは、ClickHouse のパフォーマンスを向上させるためのヒントとベストプラクティスを紹介します。 パフォーマンス向上に必要な基本概念を解説している [Core Concepts](/parts) を、このセクションを読む前に参照することを推奨します。 - \ No newline at end of file + \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md index 5b64d277986..83aafe06bab 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md @@ -17,7 +17,7 @@ import visual05 from '@site/static/images/guides/best-practices/prewhere_05.gif' import Image from '@theme/IdealImage'; -# PREWHERE 最適化はどのように動作しますか? +# PREWHERE 最適化はどのように動作しますか? {#how-does-the-prewhere-optimization-work} [PREWHERE 句](/sql-reference/statements/select/prewhere) は、ClickHouse におけるクエリ実行の最適化機構です。不要なデータの読み取りを回避し、フィルタ条件に含まれない列をディスクから読み込む前に関係のないデータを除外することで、I/O を削減しクエリ速度を向上させます。 @@ -109,7 +109,7 @@ ClickHouse はバージョン [23.2](https://clickhouse.com/blog/clickhouse-rele -## PREWHERE の効果を測定する方法 +## PREWHERE の効果を測定する方法 {#how-to-measure-prewhere-impact} PREWHERE がクエリに効果を発揮しているか検証するには、`optimize_move_to_prewhere setting` を有効にした場合と無効にした場合でクエリのパフォーマンスを比較します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md index 8925d292794..2a8fca2439c 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md @@ -11,7 +11,7 @@ import queryOptimizationDiagram1 from '@site/static/images/guides/best-practices import Image from '@theme/IdealImage'; -# クエリ最適化のためのシンプルガイド +# クエリ最適化のためのシンプルガイド {#a-simple-guide-for-query-optimization} このセクションでは、一般的なシナリオを通じて [analyzer](/operations/analyzer)、[query profiling](/operations/optimizing-performance/sampling-query-profiler)、[avoid nullable Columns](/optimize/avoid-nullable-columns) など、さまざまなパフォーマンス最適化手法の使い方を示し、ClickHouse のクエリ性能を向上させる方法を説明します。 @@ -61,7 +61,7 @@ ClickHouse には、クエリがどのように実行され、その実行にど -## データセット +## データセット {#dataset} 実際の例を用いて、クエリ性能へのアプローチを説明します。  @@ -112,9 +112,9 @@ ORDER BY tuple() ``` -## 遅いクエリを見つける +## 遅いクエリを見つける {#spot-the-slow-queries} -### クエリログ +### クエリログ {#query-logs} デフォルトでは、ClickHouse は実行された各クエリに関する情報を収集し、[クエリログ](/operations/system-tables/query_log) に書き込みます。このデータはテーブル `system.query_log` に保存されます。  @@ -431,7 +431,7 @@ _最後に、外れ値には注意してください。ユーザーがアドホ -## 基本的な最適化 +## 基本的な最適化 {#basic-optimization} テスト用のフレームワークが用意できたので、ここから最適化を始めていきます。 @@ -439,7 +439,7 @@ _最後に、外れ値には注意してください。ユーザーがアドホ データをどのように取り込んだかによっては、インジェストされたデータに基づいてテーブルスキーマを推論するために、ClickHouse の[機能](/interfaces/schema-inference)を利用しているかもしれません。これは使い始めるうえでは非常に便利ですが、クエリ性能を最適化したい場合は、ユースケースに最も適した形になるようテーブルスキーマを見直す必要があります。 -### Nullable +### Nullable {#nullable} [ベストプラクティスのドキュメント](/best-practices/select-data-types#avoid-nullable-columns)に記載されているとおり、可能な限り Nullable 列は避けてください。データのインジェスト機構を柔軟にできるため多用したくなりますが、そのたびに余分な列を処理する必要があるため、パフォーマンスに悪影響を与えます。 @@ -485,7 +485,7 @@ dropoff_location_id_nulls: 0 `null` 値を含む列は `mta_tax` と `payment_type` の 2 つだけです。その他のフィールドは `Nullable` 列にする必要はありません。 -### 低カーディナリティ +### 低カーディナリティ {#low-cardinality} String 型に対して簡単に適用できる最適化として、LowCardinality データ型を有効活用する方法があります。低カーディナリティに関しては [ドキュメント](/sql-reference/data-types/lowcardinality) に記載されているとおり、ClickHouse は LowCardinality 型の列に辞書エンコーディングを適用し、クエリ性能を大きく向上させます。  @@ -515,7 +515,7 @@ uniq(vendor_id): 3 カーディナリティが低い場合、これら 4 つのカラム `ratecode_id`、`pickup_location_id`、`dropoff_location_id`、`vendor_id` は、LowCardinality データ型の有力な候補となります。 -### データ型の最適化 +### データ型の最適化 {#optimize-data-type} ClickHouse は多数のデータ型をサポートしています。パフォーマンスを最適化し、ディスク上のデータ保存容量を削減するために、ユースケースに適合する範囲で可能な限り小さいデータ型を選択してください。  @@ -538,7 +538,7 @@ Query id: 4306a8e1-2a9c-4b06-97b4-4d902d2233eb 日付の精度は、データセットに合致し、実行する予定のクエリに最も適したものを選択してください。 -### 最適化を適用する +### 最適化を適用する {#apply-the-optimizations} 最適化済みのスキーマを使用する新しいテーブルを作成し、データを再取り込みします。 @@ -604,7 +604,7 @@ Query id: 72b5eb1c-ff33-4fdb-9d29-dd076ac6f532 新しいテーブルは、以前のテーブルと比べてかなり小さくなっています。テーブル全体のディスク使用量は約 34% 削減されており、7.38 GiB から 4.89 GiB になっています。 -## 主キーの重要性 +## 主キーの重要性 {#the-importance-of-primary-keys} ClickHouse における主キーは、多くの従来型データベースシステムとは異なる動作をします。従来のシステムでは、主キーは一意性とデータ整合性を保証します。重複した主キー値を挿入しようとすると拒否され、通常、高速な検索のために B-tree またはハッシュベースのインデックスが作成されます。  @@ -616,7 +616,7 @@ ClickHouse では、主キーの[目的](/guides/best-practices/sparse-primary-i ClickHouse がサポートしている他のオプション(Projection やマテリアライズドビューなど)を使うことで、同じデータに対して異なる主キーのセットを利用することもできます。このブログシリーズの第 2 部では、この点についてさらに詳しく説明します。  -### 主キーを選択する +### 主キーを選択する {#choose-primary-keys} 正しい主キーのセットを選択することは複雑なテーマであり、最適な組み合わせを見つけるにはトレードオフや試行錯誤が必要になる場合があります。  diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md index 6918a2188e3..fd7dd32a5b0 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md @@ -17,7 +17,7 @@ import visual05 from '@site/static/images/guides/best-practices/query-parallelis import Image from '@theme/IdealImage'; -# ClickHouse がクエリを並列実行する仕組み +# ClickHouse がクエリを並列実行する仕組み {#how-clickhouse-executes-a-query-in-parallel} ClickHouse は [高速に動作するよう設計されています](/concepts/why-clickhouse-is-so-fast)。利用可能なすべての CPU コアを使用し、データを複数の処理レーンに分散させることで、高い並列性でクエリを実行し、多くの場合ハードウェアを限界近くまで活用します。 @@ -66,7 +66,7 @@ ClickHouse Cloud では、同様の並列性を [parallel replicas](https://clic -## クエリの並列実行の監視 +## クエリの並列実行の監視 {#monitoring-query-parallelism} これらのツールを使用して、クエリが利用可能な CPU リソースを十分に活用しているかを確認し、そうでない場合の原因を診断します。 @@ -126,12 +126,12 @@ ClickHouse の [組み込み Web UI](/interfaces/http)(`/play` エンドポイ Note: 可視化は左から右へ読んでください。各行は、データをブロック単位でストリーミングし、フィルタリング、集約、最終処理ステージなどの変換を適用する並列処理レーンを表します。この例では、`max_threads = 4` の設定に対応する 4 本の並列レーンが確認できます。 -### 処理レーン間での負荷分散 +### 処理レーン間での負荷分散 {#load-balancing-across-processing-lanes} 上記の物理プラン内の `Resize` オペレーターは、処理レーン間でデータブロックストリームを[再パーティションおよび再分配](/academic_overview#4-2-multi-core-parallelization)することで、各レーンの利用率を均等に保っている点に注意してください。この再バランシングは、データ範囲ごとにクエリ述語にマッチする行数が異なる場合に特に重要です。そうしないと、一部のレーンだけが過負荷になり、他のレーンがアイドル状態になる可能性があります。作業を再分配することで、速いレーンが遅いレーンを実質的に助ける形となり、クエリ全体の実行時間を最適化できます。 -## なぜ max_threads が常にそのとおりには動作しないのか +## なぜ max_threads が常にそのとおりには動作しないのか {#why-max-threads-isnt-always-respected} 前述のとおり、並列処理レーンの数 `n` は `max_threads` 設定によって制御されます。デフォルトでは、この設定値はサーバー上で ClickHouse が利用可能な CPU コア数と同じになります。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md index 4c2812935cb..6653926f2f0 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md @@ -10,7 +10,7 @@ keywords: ['スキップインデックス', 'データスキップ', 'パフォ -# データスキップインデックスの例 +# データスキップインデックスの例 {#data-skipping-index-examples} このページでは、ClickHouse のデータスキップインデックスの例をまとめ、各インデックスの定義方法、使用すべきタイミング、適用されているかを検証する方法を示します。これらの機能はすべて [MergeTree-family テーブル](/engines/table-engines/mergetree-family/mergetree) で動作します。 @@ -33,7 +33,7 @@ ClickHouse は 5 種類のスキップインデックスをサポートしてい 各セクションではサンプルデータを用いた例を示し、クエリ実行時にインデックスが利用されているかを確認する方法を説明します。 -## MinMax インデックス +## MinMax インデックス {#minmax-index} `minmax` インデックスは、おおまかにソートされたデータや、`ORDER BY` と相関のあるカラムに対する範囲条件に最適です。 @@ -64,7 +64,7 @@ SELECT count() FROM events WHERE ts >= now() - 3600; `EXPLAIN` とプルーニングを用いた[具体例](/best-practices/use-data-skipping-indices-where-appropriate#example)を参照してください。 -## Set インデックス +## Set インデックス {#set-index} ローカル(ブロック単位)のカーディナリティが低い場合に `set` インデックスを使用します。各ブロック内に多数の異なる値が存在する場合には効果がありません。 @@ -81,7 +81,7 @@ SELECT * FROM events WHERE user_id IN (101, 202); 作成/マテリアライズのワークフローと、その適用前後の効果は、[基本的な操作ガイド](/optimize/skipping-indexes#basic-operation)で確認できます。 -## 汎用 Bloom フィルター(スカラー) +## 汎用 Bloom フィルター(スカラー) {#generic-bloom-filter-scalar} `bloom_filter` インデックスは、「干し草の山から針を探すような」等価比較や IN によるメンバーシップ判定に適しています。偽陽性率(デフォルト 0.025)を指定するオプションのパラメータを受け取ります。 @@ -96,7 +96,7 @@ SELECT * FROM events WHERE value IN (7, 42, 99); ``` -## 部分文字列検索用の N-gram Bloom フィルター (ngrambf_v1) +## 部分文字列検索用の N-gram Bloom フィルター (ngrambf_v1) {#n-gram-bloom-filter-ngrambf-v1-for-substring-search} `ngrambf_v1` インデックスは、文字列を N-gram に分割します。`LIKE '%...%'` クエリに対して有効です。String/FixedString/Map(mapKeys/mapValues 経由)をサポートし、サイズ、ハッシュ数、シードを調整できます。詳細については、[N-gram Bloom filter](/engines/table-engines/mergetree-family/mergetree#n-gram-bloom-filter) のドキュメントを参照してください。 @@ -133,7 +133,7 @@ SELECT bfEstimateFunctions(4300, bfEstimateBmSize(4300, 0.0001)) AS k; -- 約13 チューニングに関する完全なガイダンスについては、[パラメータのドキュメント](/engines/table-engines/mergetree-family/mergetree#n-gram-bloom-filter)を参照してください。 -## 単語ベース検索用の Token Bloom フィルタ (tokenbf_v1) +## 単語ベース検索用の Token Bloom フィルタ (tokenbf_v1) {#token-bloom-filter-tokenbf-v1-for-word-based-search} `tokenbf_v1` は、英数字以外の文字で区切られたトークンをインデックス化します。[`hasToken`](/sql-reference/functions/string-search-functions#hasToken)、`LIKE` による単語パターン、または `=` / `IN` 演算子と併用して使用することを推奨します。`String`/`FixedString`/`Map` 型をサポートします。 @@ -153,7 +153,7 @@ SELECT count() FROM logs WHERE hasToken(lower(msg), 'exception'); トークンと ngram に関するオブザーバビリティの例とガイダンスについては、[こちら](/use-cases/observability/schema-design#bloom-filters-for-text-search)を参照してください。 -## CREATE TABLE 時にインデックスを追加する(複数の例) +## CREATE TABLE 時にインデックスを追加する(複数の例) {#add-indexes-during-create-table-multiple-examples} スキップインデックスは、複合式や `Map` / `Tuple` / `Nested` 型もサポートします。これは以下の例で示します。 @@ -175,7 +175,7 @@ ORDER BY u64; ``` -## 既存データのマテリアライズと検証 +## 既存データのマテリアライズと検証 {#materializing-on-existing-data-and-verifying} `MATERIALIZE` を使って既存のデータパーツにインデックスを追加し、以下のように `EXPLAIN` やトレースログでプルーニングの動作を確認できます。 @@ -211,7 +211,7 @@ SET send_logs_level = 'trace'; -## 一時的にインデックスを無視または強制する +## 一時的にインデックスを無視または強制する {#temporarily-ignore-or-force-indexes} テストやトラブルシューティングの際に、個々のクエリごとに名前を指定して特定のインデックスを無効化できます。必要に応じてインデックスの使用を強制するための設定もあります。[`ignore_data_skipping_indices`](/operations/settings/settings#ignore_data_skipping_indices) を参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md index 52cbdb1bcbb..49fff5a86b1 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md @@ -13,7 +13,7 @@ import bad_skip from '@site/static/images/guides/best-practices/bad_skip.png'; import Image from '@theme/IdealImage'; -# ClickHouse のデータスキップインデックスを理解する +# ClickHouse のデータスキップインデックスを理解する {#understanding-clickhouse-data-skipping-indexes} @@ -29,7 +29,7 @@ ClickHouse のクエリパフォーマンスには多くの要因が影響しま -## 基本的な動作 +## 基本的な動作 {#basic-operation} ユーザーが Data Skipping Indexes を使用できるのは、MergeTree ファミリーのテーブルのみです。各データスキップインデックスには、主に次の 4 つの引数があります。 @@ -122,11 +122,11 @@ SET send_logs_level='trace'; default.skip_table (933d4b2c-8cea-4bf9-8c93-c56e900eefd1) (SelectExecutor): インデックス `vix` により、6104 個のグラニュールのうち 6102 個が除外されました。 ``` -## スキップインデックスのタイプ +## スキップインデックスのタイプ {#skip-index-types} {/* vale off */ } -### minmax +### minmax {#minmax} {/* vale on */ } @@ -136,7 +136,7 @@ SET send_logs_level='trace'; {/* vale off */ } -### set +### set {#set} {/* vale on */ } @@ -144,7 +144,7 @@ SET send_logs_level='trace'; このインデックスのコスト、性能、および有効性は、ブロック内のカーディナリティに依存します。各ブロックに多数のユニークな値が含まれる場合、大きなインデックス集合に対してクエリ条件を評価するのが非常に高コストになるか、あるいは `max_size` を超えた結果としてインデックスが空になり、インデックスが適用されない可能性があります。 -### Bloom フィルター型 +### Bloom フィルター型 {#bloom-filter-types} *Bloom フィルター*は、わずかな偽陽性を許容する代わりに、集合への所属(メンバーシップ)を空間効率良くテストできるデータ構造です。スキップインデックスの場合、偽陽性は大きな問題にはなりません。唯一の不利益は、不要なブロックをいくつか読み込むことだけだからです。しかし、偽陽性が起こり得るということは、インデックス化された式が真になることが期待されるケースで使うべきであり、そうでないと有効なデータがスキップされる可能性があることを意味します。 @@ -185,7 +185,7 @@ Bloom フィルターに基づくデータスキッピングインデックス -## スキップインデックスのベストプラクティス +## スキップインデックスのベストプラクティス {#skip-best-practices} スキップインデックスは必ずしも直感的ではなく、特に RDBMS の行ベースのセカンダリインデックスやドキュメントストアの転置インデックスに慣れたユーザーにはわかりにくいものです。効果を得るには、ClickHouse のデータスキップインデックスを適用することで、インデックスを計算するコストを上回るだけの十分なグラニュールの読み取りを回避する必要があります。重要なのは、インデックス化されたブロック内にある値が 1 回でも出現すると、そのブロック全体をメモリに読み込んで評価しなければならず、その場合インデックスのコストが無駄に発生してしまうという点です。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md index 63b75249947..29eab8abf2e 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md @@ -36,7 +36,7 @@ import sparsePrimaryIndexes15b from '@site/static/images/guides/best-practices/s import Image from '@theme/IdealImage'; -# ClickHouse におけるプライマリインデックスの実践入門 +# ClickHouse におけるプライマリインデックスの実践入門 {#a-practical-introduction-to-primary-indexes-in-clickhouse} ## はじめに {#introduction} @@ -73,7 +73,7 @@ ClickHouse の [セカンダリ data skipping インデックス](/engines/table このドキュメントで示しているすべての実行時の数値は、Apple M1 Pro チップと 16GB の RAM を搭載した MacBook Pro 上で ClickHouse 22.2.1 をローカルで実行した際の結果に基づいています。 -### フルテーブルスキャン +### フルテーブルスキャン {#a-full-table-scan} 主キーなしのデータセットに対してクエリがどのように実行されるかを確認するために、次の SQL DDL ステートメントを実行して、MergeTree テーブルエンジンを使用するテーブルを作成します。 @@ -150,7 +150,7 @@ LIMIT 10; └────────────────────────────────┴───────┘ 10 rows in set. Elapsed: 0.022 sec. -# highlight-next-line +# highlight-next-line {#highlight-next-line} 処理行数: 887万行、 70.45 MB (3億9853万行/秒、3.17 GB/秒) ``` @@ -172,7 +172,7 @@ B-Tree インデックスに伴う課題を踏まえ、ClickHouse のテーブ 以下では、ClickHouse がスパースプライマリインデックスをどのように構築・利用しているかを詳細に説明します。記事の後半では、インデックス(プライマリキー列)を構築するために使用するテーブル列の選択・削除・並び替えについて、いくつかのベストプラクティスを解説します。 -### 主キーを持つテーブル +### 主キーを持つテーブル {#a-table-with-a-primary-key} `UserID` と `URL` をキー列とする複合主キーを持つテーブルを作成します。 @@ -494,7 +494,7 @@ SELECT UserID, URL FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID これがクエリ実行性能に与える影響については、このあと詳しく説明します。 -### プライマリインデックスはグラニュールを選択するために使用される +### プライマリインデックスはグラニュールを選択するために使用される {#the-primary-index-is-used-for-selecting-granules} これで、プライマリインデックスを活用してクエリを実行できるようになりました。 @@ -526,7 +526,7 @@ LIMIT 10; └────────────────────────────────┴───────┘ 10行のセット。経過時間: 0.005秒。 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 8.19千行を処理、 740.18 KB (1.53百万行/秒、138.59 MB/秒) ``` @@ -537,13 +537,13 @@ ClickHouse クライアントの出力を見ると、フルテーブルスキャ ```response ...Executor): キー条件: (列 0 が [749927693, 749927693] 内) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): パート all_1_9_2 のインデックス範囲で二分探索を実行中 (1083 マーク) ...Executor): 左境界マークを検出: 176 ...Executor): 右境界マークを検出: 177 ...Executor): 19 ステップで連続範囲を検出 ...Executor): パーティションキーで 1/1 パートを選択、プライマリキーで 1 パートを選択、 -# highlight-next-line +# highlight-next-line {#highlight-next-line} プライマリキーで 1/1083 マークを選択、1 範囲から 1 マークを読み取り ...Reading ...1441792 から開始して約 8192 行を読み取り中 ``` @@ -592,7 +592,7 @@ LIMIT 10; │ UserID │ │ Condition: (UserID in [749927693, 749927693]) │ │ Parts: 1/1 │ -# highlight-next-line +# highlight-next-line {#highlight-next-line} │ Granules: 1/1083 │ └───────────────────────────────────────────────────────────────────────────────────────┘ @@ -711,7 +711,7 @@ ClickHouse は、今回の例のクエリ(UserID が 749.927.693 のインタ -### セカンダリキー列は(必ずしも)非効率とは限らない +### セカンダリキー列は(必ずしも)非効率とは限らない {#secondary-key-columns-can-not-be-inefficient} クエリが複合キーの一部であり、かつ先頭のキー列である列を条件にフィルタリングしている場合、[ClickHouse はそのキー列のインデックスマークに対して二分探索アルゴリズムを実行します](#the-primary-index-is-used-for-selecting-granules)。 @@ -757,7 +757,7 @@ LIMIT 10; └────────────┴───────┘ 10 rows in set. Elapsed: 0.086 sec. -# highlight-next-line +# highlight-next-line {#highlight-next-line} 処理: 881万行、 799.69 MB (1億211万行/秒、9.27 GB/秒) ``` @@ -769,11 +769,11 @@ LIMIT 10; ```response ...Executor): Key condition: (column 1 in ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#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 +# highlight-next-line {#highlight-next-line} 1076/1083 marks by primary key, 1076 marks to read from 5 ranges ...Executor): Reading approx. 8814592 rows with 10 streams ``` @@ -842,7 +842,7 @@ UserID のカーディナリティが高い場合、同じ UserID 値が複数 このサンプルデータセットでは、両方のキー列(UserID, URL)は同程度に高いカーディナリティを持っており、前述のとおり、URL 列の直前のキー列のカーディナリティが高い、あるいは同程度に高い場合には、汎用排他検索アルゴリズムはあまり効果的ではありません。 -### データスキッピングインデックスに関する注意 +### データスキッピングインデックスに関する注意 {#note-about-data-skipping-index} UserID と URL はどちらも同様にカーディナリティが高いため、[URL でのクエリフィルタリング](/guides/best-practices/sparse-primary-indexes#secondary-key-columns-can-not-be-inefficient) についても、[複合主キー (UserID, URL) を持つテーブル](#a-table-with-a-primary-key) の URL 列に [セカンダリのデータスキッピングインデックス](./skipping-indexes.md) を作成しても、得られる効果はそれほど大きくありません。 @@ -906,7 +906,7 @@ UserIDとURLのカーディナリティがともに高いため、この二次 -### オプション 1: セカンダリテーブル +### オプション 1: セカンダリテーブル {#option-1-secondary-tables} @@ -986,7 +986,7 @@ LIMIT 10; └────────────┴───────┘ 10行を取得しました。経過時間: 0.017秒 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 処理行数: 319.49千行、 11.38 MB (18.41百万行/秒、655.75 MB/秒) ``` @@ -1002,13 +1002,13 @@ ClickHouse サーバーのログファイル内に出力される対応する tr ```response ...Executor): Key condition: (column 0 in ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): パート all_1_9_2 のインデックス範囲でバイナリサーチを実行中 (1083 marks) ...Executor): (LEFT) 境界マークを検出: 644 ...Executor): (RIGHT) 境界マークを検出: 683 ...Executor): 19 ステップで連続範囲を検出 ...Executor): パーティションキーで 1/1 parts を選択、プライマリキーで 1 parts を選択、 -# highlight-next-line +# highlight-next-line {#highlight-next-line} プライマリキーで 39/1083 marks、1 ranges から 39 marks を読み取り ...Executor): 2 streams で約 319488 行を読み取り中 ``` @@ -1143,7 +1143,7 @@ LIMIT 10; └────────────┴───────┘ 10行が設定されています。経過時間: 0.026秒。 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 335.87千行を処理しました、 13.54 MB (12.91百万行/秒、520.38 MB/秒) ``` @@ -1156,7 +1156,7 @@ ClickHouse のサーバーログファイル内の対応するトレースログ ```response ...Executor): Key condition: (column 0 in ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): Running binary search on index range ... ... ...Executor): Selected 4/4 parts by partition key, 4 parts by primary key, @@ -1233,7 +1233,7 @@ LIMIT 10; └────────────┴───────┘ 10 rows in set. Elapsed: 0.029 sec. -# highlight-next-line +# highlight-next-line {#highlight-next-line} Processed 319.49 thousand rows, 1 1.38 MB (11.05 million rows/s., 393.58 MB/s.) ``` @@ -1246,14 +1246,14 @@ ClickHouse のサーバーログファイル中の該当トレースログから ```response ...Executor): Key condition: (column 0 in ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#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 +# highlight-next-line {#highlight-next-line} 39/1083 marks by primary key, 39 marks to read from 1 ranges ...Executor): Reading approx. 319488 rows with 2 streams ``` @@ -1444,7 +1444,7 @@ Processed 20.32 thousand rows, その理由は、[汎用除外検索アルゴリズム](https://github.com/ClickHouse/ClickHouse/blob/22.3/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp#L1444) は、直前のキー列のカーディナリティがより低い場合に、その次のセカンダリキー列を用いて [granules](#the-primary-index-is-used-for-selecting-granules) を選択するときに最も効果的に動作するためです。この点については、本ガイドの[前のセクション](#generic-exclusion-search-algorithm)で詳しく説明しました。 -### データファイルの最適な圧縮率 +### データファイルの最適な圧縮率 {#efficient-filtering-on-secondary-key-columns} 次のクエリでは、上記で作成した 2 つのテーブル間における `UserID` 列の圧縮率を比較します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md index 6130bcc0f27..863cc4e6275 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md @@ -19,8 +19,7 @@ import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; どのクエリ言語を使用するかは、`dialect` の設定によって制御されます。 - -## 標準SQL +## 標準SQL {#standard-sql} 標準SQLは ClickHouse のデフォルトのクエリ言語です。 @@ -28,8 +27,7 @@ import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; SET dialect = 'clickhouse' ``` - -## パイプライン型リレーショナルクエリ言語 (PRQL) +## パイプライン型リレーショナルクエリ言語 (PRQL) {#pipelined-relational-query-language-prql} @@ -52,8 +50,7 @@ aggregate { 内部的には、ClickHouse は PRQL クエリを実行する際、PRQL を SQL にトランスパイルして処理します。 - -## Kusto クエリ言語 (KQL) +## Kusto クエリ言語 (KQL) {#kusto-query-language-kql} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md b/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md index 9c61509e8ca..a2e4db08110 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md @@ -6,13 +6,11 @@ keywords: ['マテリアライズドビュー', '集約'] doc_type: 'guide' --- - - -# カスケードするマテリアライズドビュー +# カスケードするマテリアライズドビュー {#cascading-materialized-views} この例では、まずマテリアライズドビューの作成方法を示し、その後、2つ目のマテリアライズドビューを1つ目にカスケードさせる方法を説明します。このページでは、その手順、さまざまな活用方法、および制約について説明します。2つ目のマテリアライズドビューをソースとして使用してマテリアライズドビューを作成することで、さまざまなユースケースに対応できます。 - + + + + allowfullscreen +/> -
+
ClickHouse では JSON を扱うための複数のアプローチを提供しており、それぞれに長所・短所や適したユースケースがあります。このガイドでは、JSON の読み込み方法とスキーマを最適に設計する方法について説明します。このガイドは次のセクションで構成されています。 -- [Loading JSON](/integrations/data-formats/json/loading) - シンプルなスキーマを用いて、ClickHouse で構造化および半構造化 JSON を読み込み、クエリする方法。 -- [JSON schema inference](/integrations/data-formats/json/inference) - JSON schema inference を使用して JSON に対してクエリを実行し、テーブルスキーマを作成する方法。 -- [Designing JSON schema](/integrations/data-formats/json/schema) - JSON スキーマを設計および最適化するための手順。 -- [Exporting JSON](/integrations/data-formats/json/exporting) - JSON をエクスポートする方法。 -- [Handling other JSON Formats](/integrations/data-formats/json/other-formats) - 改行区切り JSON (NDJSON) 以外の JSON フォーマットを扱う際のヒント。 -- [Other approaches to modeling JSON](/integrations/data-formats/json/other-approaches) - JSON をモデリングする従来のアプローチ。**非推奨です。** \ No newline at end of file +* [Loading JSON](/integrations/data-formats/json/loading) - シンプルなスキーマを用いて、ClickHouse で構造化および半構造化 JSON を読み込み、クエリする方法。 +* [JSON schema inference](/integrations/data-formats/json/inference) - JSON schema inference を使用して JSON に対してクエリを実行し、テーブルスキーマを作成する方法。 +* [Designing JSON schema](/integrations/data-formats/json/schema) - JSON スキーマを設計および最適化するための手順。 +* [Exporting JSON](/integrations/data-formats/json/exporting) - JSON をエクスポートする方法。 +* [Handling other JSON Formats](/integrations/data-formats/json/other-formats) - 改行区切り JSON (NDJSON) 以外の JSON フォーマットを扱う際のヒント。 +* [Other approaches to modeling JSON](/integrations/data-formats/json/other-approaches) - JSON をモデリングする従来のアプローチ。**非推奨です。** \ No newline at end of file diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md index 6c35a997f9b..b8229f4a32a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md @@ -17,7 +17,7 @@ doc_type: 'guide' -## 構造化された JSON の読み込み +## 構造化された JSON の読み込み {#loading-structured-json} このセクションでは、JSON データが [`NDJSON`](https://github.com/ndjson/ndjson-spec) (Newline delimited JSON) 形式であり、ClickHouse では [`JSONEachRow`](/interfaces/formats/JSONEachRow) として知られ、かつ列名と型が固定された適切に構造化されたデータであると仮定します。`NDJSON` は、その簡潔さとストレージ効率の良さから JSON を読み込む際に推奨される形式ですが、他の形式も [入力と出力](/interfaces/formats/JSON) の両方でサポートされています。 @@ -124,7 +124,7 @@ FORMAT JSONEachRow これらの例では、`JSONEachRow` 形式の使用を想定しています。その他の一般的な JSON 形式もサポートされており、それらを取り込む例は[こちら](/integrations/data-formats/json/other-formats)にあります。 -## セミ構造化 JSON の読み込み +## セミ構造化 JSON の読み込み {#loading-semi-structured-json} 前の例では、キー名と型がよく分かっている静的な JSON を読み込みました。実際にはそうとは限らず、キーが追加されたり、その型が変化したりします。これは Observability データなどのユースケースでよく見られます。 @@ -200,7 +200,7 @@ LIMIT 2 ここではデータ読み込み時のパフォーマンスの違いに注目してください。`JSON` 列は、挿入時に型推論が必要であり、さらに 1 つの列に複数の型が存在する場合は追加のストレージも必要になります。`JSON` 型は([JSON スキーマの設計](/integrations/data-formats/json/schema)を参照)明示的に列を宣言した場合と同等のパフォーマンスになるように設定できますが、デフォルトではあえて柔軟に使えるように設計されています。しかし、この柔軟性にはある程度のコストが伴います。 -### JSON 型を使用するタイミング +### JSON 型を使用するタイミング {#when-to-use-the-json-type} 次のようなデータの場合は JSON 型を使用します: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md index 6ce5583d5c9..f05cacb0fb5 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md @@ -6,9 +6,7 @@ keywords: ['json', 'formats'] doc_type: 'reference' --- - - -# JSON をモデリングするその他のアプローチ +# JSON をモデリングするその他のアプローチ {#other-approaches-to-modeling-json} **以下は、ClickHouse における JSON モデリングの別手法です。網羅性のために記載していますが、これらは JSON 型が登場する以前に有用だったものであり、現在では多くのユースケースにおいて推奨されず、ほとんどの場合適用されません。** @@ -16,9 +14,7 @@ doc_type: 'reference' 同じスキーマ内でも、オブジェクトごとに異なる手法を適用できます。たとえば、一部のオブジェクトには `String` 型が最適であり、別のものには `Map` 型が最適な場合があります。`String` 型を使用した場合、それ以降にスキーマに関する追加の決定を行う必要はない点に注意してください。逆に、以下で示すように、JSON を表す `String` を含め、サブオブジェクトを `Map` のキーに対応する値としてネストすることも可能です。 ::: - - -## String 型の使用 +## String 型の使用 {#using-string} オブジェクトが非常に動的で、予測可能な構造がなく、任意のネストされたオブジェクトを含む場合は、`String` 型を使用することが推奨されます。値は、以下で示すように、クエリ実行時に JSON 関数を使用して抽出できます。 @@ -95,7 +91,6 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.j 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.) ``` - 例えば、発行年ごとの論文数を集計したいとします。次のクエリを、単一の文字列カラムのみを使う場合と、スキーマの[構造化されたバージョン](/integrations/data-formats/json/inference#creating-tables)を使う場合で比較してみましょう。 ```sql @@ -156,7 +151,7 @@ Peak memory usage: 205.98 MiB. このアプローチは柔軟性が高い一方で、明確なパフォーマンスおよび構文上のコストを伴うため、スキーマ内で非常に動的なオブジェクトに対してのみ使用すべきです。 -### Simple JSON functions +### Simple JSON functions {#simple-json-functions} 上記の例では JSON* 系の関数を使用しています。これらは [simdjson](https://github.com/simdjson/simdjson) に基づく完全な JSON パーサーを利用しており、厳密なパースを行い、異なる階層にネストされた同名フィールドを区別します。これらの関数は、構文的には正しいものの体裁が整っていない JSON(例: キー間に二重スペースがあるなど)も扱うことができます。 @@ -174,7 +169,6 @@ Peak memory usage: 205.98 MiB. 一方、次の例は正しくパースされます。 - ````json {"@timestamp":893964617,"clientip":"40.135.0.0","request":{"method":"GET", "path":"/images/hm_bg.jpg","version":"HTTP/1.0"},"status":200,"size":24736} @@ -209,8 +203,7 @@ LIMIT 10 上記のクエリでは、公開日時は先頭の値のみで十分であるという事実を利用し、`simpleJSONExtractString` を使って `created` キーを抽出しています。この場合、パフォーマンス向上という利点を考えると、`simpleJSON*` 関数の制約は許容できます。 - -## Map 型の使用 +## Map 型の使用 {#using-map} オブジェクトが任意のキーを格納するために使われ、その多くが単一の型である場合は、`Map` 型の使用を検討してください。理想的には、一意なキーの数は数百を超えないことが望まれます。サブオブジェクトを持つオブジェクトについても、サブオブジェクトの型が一様であれば `Map` 型を検討できます。一般的には、ラベルやタグ、たとえばログデータ中の Kubernetes ポッドラベルなどに対して `Map` 型の使用を推奨します。 @@ -224,7 +217,7 @@ LIMIT 10 オブジェクトを `Map` としてモデリングする場合、JSON のキー名を格納するのに `String` キーが使われます。そのため `Map` は常に `Map(String, T)` となり、`T` はデータに応じて決まります。 ::: -#### プリミティブ値 +#### プリミティブ値 {#primitive-values} `Map` の最も単純な適用例は、オブジェクトが同じプリミティブ型を値として含む場合です。多くの場合、値 `T` として `String` 型を使用します。 @@ -281,13 +274,12 @@ SELECT company.labels['type'] AS type FROM people この型をクエリするための `Map` 関数の完全なセットが利用可能であり、[こちら](/sql-reference/functions/tuple-map-functions.md)で説明されています。データの型が一貫していない場合には、[必要な型変換](/sql-reference/functions/type-conversion-functions)を行うための関数が用意されています。 -#### オブジェクト値 +#### オブジェクト値 {#object-values} `Map` 型は、サブオブジェクトを持つオブジェクトにも適用できます。ただし、サブオブジェクト側の型に一貫性がある必要があります。 `persons` オブジェクトの `tags` キーについて、各 `tag` のサブオブジェクトが `name` と `time` 列を持つ、一定の構造である必要があるとします。そのような JSON ドキュメントの単純化した例は、次のようになります。 - ```json { "id": 1, @@ -360,8 +352,7 @@ FORMAT JSONEachRow } ``` - -## Nested 型の使用 +## Nested 型の使用 {#using-nested} [Nested 型](/sql-reference/data-types/nested-data-structures/nested) は、ほとんど変更されない静的オブジェクトをモデリングするために使用でき、`Tuple` や `Array(Tuple)` の代替手段となります。挙動が分かりにくい場合が多いため、JSON に対してこの型を使用するのは一般的に避けることを推奨します。`Nested` の主な利点は、サブカラムを並び替えキー(ORDER BY キー)として使用できることです。 @@ -396,11 +387,11 @@ CREATE table http ) ENGINE = MergeTree() ORDER BY (status, timestamp); ``` -### flatten_nested +### flatten_nested {#flatten_nested} `flatten_nested` 設定は Nested の動作を制御します。 -#### flatten_nested=1 +#### flatten_nested=1 {#flatten_nested1} 値が `1`(デフォルト)の場合、任意のレベルのネストはサポートされません。この値では、ネストされたデータ構造は、同じ長さを持つ複数の [Array](/sql-reference/data-types/array) カラムと考えると分かりやすいです。`method`、`path`、`version` フィールドは、すべて実質的には別々の `Array(Type)` カラムですが、重要な制約が 1 つあります。**`method`、`path`、`version` フィールドの長さはすべて同じでなければなりません。** `SHOW CREATE TABLE` を使用すると、これは次のように示されます。 @@ -471,10 +462,9 @@ SELECT clientip, status, size, `request.method` FROM http WHERE has(request.meth 1 rows in set. Elapsed: 0.002 sec. ``` - サブカラムに `Array` を使用することで、[Array functions](/sql-reference/functions/array-functions) の機能全体を、[`ARRAY JOIN`](/sql-reference/statements/select/array-join) 句も含めて活用できる可能性があります。これは、カラムが複数の値を持つ場合に有用です。 -#### flatten_nested=0 +#### flatten_nested=0 {#flatten_nested0} これは任意のレベルのネストを許可し、ネストされたカラムは単一の `Tuple` 配列として保持されることを意味します。実質的に、それらは `Array(Tuple)` と同じになります。 @@ -546,7 +536,7 @@ SELECT clientip, status, size, `request.method` FROM http WHERE has(request.meth 1 行のセット。経過時間: 0.002 秒。 ``` -### 例 +### 例 {#example} 上記データのより大きなサンプルが、S3 のパブリックバケット `s3://datasets-documentation/http/` に用意されています。 @@ -584,7 +574,6 @@ size FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/doc このデータをクエリするには、リクエストフィールドに配列としてアクセスする必要があります。以下では、一定期間におけるエラーと HTTP メソッドを集計します。 - ```sql SELECT status, request.method[1] AS method, count() AS c FROM http @@ -604,7 +593,7 @@ ORDER BY c DESC LIMIT 5; 5 rows in set. Elapsed: 0.007 sec. ``` -### ペアワイズ配列の使用 +### ペアワイズ配列の使用 {#using-pairwise-arrays} ペアワイズ配列は、JSON を文字列として表現する際の柔軟性と、より構造化されたアプローチによる高い性能とのバランスを提供します。スキーマは柔軟であり、新しいフィールドを任意にルートレベルへ追加することが可能です。しかしその一方で、クエリ構文が大幅に複雑になり、ネストされた構造とは互換性がありません。 @@ -668,7 +657,6 @@ GROUP BY method, status ORDER BY c DESC LIMIT 5; └────────┴────────┴───────┘ ``` - 5 行が返されました。経過時間: 0.383 秒。8.22 百万行、1.97 GB を処理しました (21.45 百万行/秒、5.15 GB/秒)。 ピークメモリ使用量: 51.35 MiB。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md index 94f466a9213..927b493f81b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md @@ -13,11 +13,11 @@ import json_offsets from '@site/static/images/integrations/data-ingestion/data-f import shared_json_column from '@site/static/images/integrations/data-ingestion/data-formats/json_shared_column.png'; -# スキーマの設計 +# スキーマの設計 {#designing-your-schema} [スキーマ推論](/integrations/data-formats/json/inference) を使用すると、JSON データの初期スキーマを確立し、S3 上にあるなどの JSON データファイルをそのままクエリできますが、ユーザーは自分たちのデータに対して、最適化されたバージョン管理済みスキーマを確立することを目指すべきです。以下では、JSON 構造をモデリングする際の推奨アプローチについて説明します。 -## 静的 JSON と動的 JSON +## 静的 JSON と動的 JSON {#static-vs-dynamic-json} JSON のスキーマを定義する際の主なタスクは、各キーの値に対して適切な型を決定することです。各キーに対して適切な型を決定するため、JSON 階層内のそれぞれのキーに以下のルールを再帰的に適用することを推奨します。 @@ -92,7 +92,7 @@ JSON のスキーマを定義する際の主なタスクは、各キーの値に 数百から数千もの静的キーを持つ構造体は、これらの列を静的に宣言するのが現実的でないことが多いため、動的なものと見なすことができます。ただし、可能な箇所では、ストレージと推論の両方のオーバーヘッドを削減するために、不要な[パスをスキップ](#using-type-hints-and-skipping-paths)してください。 ::: -## 静的な構造の扱い方 +## 静的な構造の扱い方 {#handling-static-structures} 静的な構造は名前付きタプル、つまり `Tuple` 型で扱うことを推奨します。オブジェクトの配列は、`Array(Tuple)` のようにタプルの配列として保持できます。タプル内でも、カラムとその型は同じルールに従って定義する必要があります。その結果、以下のように入れ子オブジェクトを表現するためにタプルをネストして用いることになります。 @@ -203,7 +203,7 @@ ORDER BY company.name ``` -### デフォルト値の扱い +### デフォルト値の扱い {#handling-default-values} JSON オブジェクトが構造化されていても、多くの場合は既知のキーの一部しか含まれない疎な形式になることがよくあります。幸い、`Tuple` 型では JSON ペイロード内のすべての列が必須というわけではありません。指定されていない場合にはデフォルト値が使用されます。 @@ -282,7 +282,7 @@ FORMAT PrettyJSONEachRow ::: -### 新しいカラムの扱い +### 新しいカラムの扱い {#handling-new-columns} JSON キーが静的な場合は構造化されたアプローチが最も簡単ですが、スキーマへの変更を事前に計画できる、つまり新しいキーがあらかじめ分かっており、それに応じてスキーマを変更できるのであれば、このアプローチはその場合でも引き続き使用できます。 @@ -360,7 +360,7 @@ SELECT id, nickname FROM people ``` -## 半構造化・動的な構造の扱い +## 半構造化・動的な構造の扱い {#handling-semi-structured-dynamic-structures} JSON データが半構造化されており、キーが動的に追加されたり、複数の型を取りうる場合は、[`JSON`](/sql-reference/data-types/newjson) 型を推奨します。 @@ -491,7 +491,7 @@ JSON データが半構造化されており、キーが動的に追加された - **カラム爆発のリスク回避** - JSON 型はサブカラムを専用カラムとして保存することで潜在的に数千のカラムまでスケールできますが、その結果として過剰な数のカラムファイルが作成され、パフォーマンスに悪影響を与える「カラムファイル爆発」が発生する可能性があります。これを軽減するために、JSON で使用される基盤の [Dynamic 型](/sql-reference/data-types/dynamic) では、[`max_dynamic_paths`](/sql-reference/data-types/newjson#reading-json-paths-as-sub-columns) パラメータが提供されており、個別のカラムファイルとして保存される一意なパスの数を制限します。しきい値に達すると、それ以降のパスはコンパクトなエンコード形式を用いて共有カラムファイル内に保存され、柔軟なデータのインジェストをサポートしつつ、パフォーマンスとストレージ効率を維持します。ただし、この共有カラムファイルへのアクセスは、専用カラムほど高速ではありません。なお、JSON カラムは [type hints](#using-type-hints-and-skipping-paths) と併用できます。「ヒント付き」のカラムは、専用カラムと同等のパフォーマンスを提供します。 - **パスおよび型のインスペクションの容易さ** - JSON 型は、推論された型やパスを判定するための [インスペクション関数](/sql-reference/data-types/newjson#introspection-functions) をサポートしていますが、`DESCRIBE` などを用いた静的な構造のほうが、確認・探索がより簡単な場合があります。 -### 単一の JSON カラム +### 単一の JSON カラム {#single-json-column} この手法はプロトタイピングやデータエンジニアリングのタスクに有用です。本番環境では、必要な場合に限り、動的なサブ構造に対してのみ `JSON` を使用することを推奨します。 @@ -667,7 +667,7 @@ FROM people ``` -### 対象の JSON 列 +### 対象の JSON 列 {#targeted-json-column} プロトタイピングやデータエンジニアリング上の課題に対処するうえでは有用ですが、本番環境では可能な限り明示的なスキーマを使用することを推奨します。 @@ -767,7 +767,7 @@ FORMAT PrettyJsonEachRow ``` -### 型ヒントの使用とパスのスキップ +### 型ヒントの使用とパスのスキップ {#using-type-hints-and-skipping-paths} 型ヒントを使うと、パスとそのサブカラムの型を指定できるため、不必要な型推論を防げます。次の例では、JSON カラム `company.labels` 内の JSON キー `dissolved`、`employees`、`founded` に対して型を指定しています。 @@ -934,7 +934,7 @@ FORMAT PrettyJSONEachRow その結果、大部分が一貫していながらも JSON の柔軟性が有用なデータセットに対して、型ヒントはスキーマやデータ取り込みパイプラインを再構成することなくパフォーマンスを維持する便利な手段となります。 -### 動的パスの設定 +### 動的パスの設定 {#configuring-dynamic-paths} ClickHouse は各 JSON パスを純粋なカラム型レイアウトにおけるサブカラムとして保存し、圧縮、SIMD による高速処理、最小限のディスク I/O といった、従来のカラムと同様のパフォーマンス上の利点を実現します。JSON データ内のそれぞれの一意なパスと型の組み合わせは、それぞれ専用のカラムファイルとしてディスク上に保存されます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md index f84c3b1f965..7556e62ded8 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md @@ -10,7 +10,7 @@ keywords: ['parquet', 'columnar format', 'data format', 'compression', 'apache p -# ClickHouse での Parquet の利用 +# ClickHouse での Parquet の利用 {#working-with-parquet-in-clickhouse} Parquet は、データをカラム指向で効率的に保存できるファイル形式です。 ClickHouse は、Parquet ファイルの読み取りと書き込みの両方をサポートします。 @@ -24,7 +24,7 @@ ClickHouse は、Parquet ファイルの読み取りと書き込みの両方を -## Parquet からのインポート +## Parquet からのインポート {#importing-from-parquet} データをロードする前に、[file()](/sql-reference/functions/files.md/#file) 関数を使用して、[Parquet 形式のサンプルファイル](assets/data.parquet) の構造を確認できます。 @@ -64,7 +64,7 @@ LIMIT 3; ::: -## 既存テーブルへのインポート +## 既存テーブルへのインポート {#importing-to-an-existing-table} Parquet データをインポートするためのテーブルを作成します。 @@ -103,7 +103,7 @@ LIMIT 5; ClickHouse が `date` 列の Parquet の文字列データを自動的に `Date` 型へ変換していることに注目してください。これは、ClickHouse がターゲットテーブルの列の型に基づいて自動的に型変換を行うためです。 -## ローカルファイルをリモートサーバーに挿入する +## ローカルファイルをリモートサーバーに挿入する {#inserting-a-local-file-to-remote-server} ローカルの Parquet ファイルをリモートの ClickHouse サーバーに挿入したい場合は、次のようにファイルの内容を `clickhouse-client` にパイプすることで行えます。 @@ -112,7 +112,7 @@ clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet ``` -## Parquet ファイルから新しいテーブルを作成する +## Parquet ファイルから新しいテーブルを作成する {#creating-new-tables-from-parquet-files} ClickHouse は Parquet ファイルのスキーマを読み取ることができるため、テーブルを動的に作成できます。 @@ -141,7 +141,7 @@ DESCRIBE TABLE imported_from_parquet; デフォルトでは、ClickHouse はカラム名やデータ型、値に対して厳格に動作します。ただし、状況によっては、インポート時に存在しないカラムやサポートされていない値をスキップすることができます。これは [Parquet 設定](/interfaces/formats/Parquet#format-settings) で制御できます。 -## Parquet 形式へのエクスポート +## Parquet 形式へのエクスポート {#exporting-to-parquet-format} :::tip ClickHouse Cloud で `INTO OUTFILE` を使用する場合、ファイルが書き込まれるマシン上で `clickhouse client` を使ってコマンドを実行する必要があります。 @@ -159,7 +159,7 @@ FORMAT Parquet これにより、作業ディレクトリに `export.parquet` ファイルが作成されます。 -## ClickHouse と Parquet のデータ型 +## ClickHouse と Parquet のデータ型 {#clickhouse-and-parquet-data-types} ClickHouse と Parquet のデータ型はほとんど同一ですが、[いくつか違いがあります](/interfaces/formats/Parquet#data-types-matching-parquet)。たとえば、ClickHouse は `DateTime` 型を Parquet 側の `int64` としてエクスポートします。その後それを ClickHouse にインポートし直すと、([time.parquet ファイル](assets/time.parquet) のように)数値として表示されます: diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md index 5aa6cfa68b3..13c61727e27 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md @@ -9,13 +9,13 @@ keywords: ['SQL 形式', 'データエクスポート', 'データインポー -# ClickHouse での SQL データの挿入とダンプ +# ClickHouse での SQL データの挿入とダンプ {#inserting-and-dumping-sql-data-in-clickhouse} ClickHouse は、さまざまな方法で OLTP データベース基盤に容易に統合できます。その 1 つの方法として、SQL ダンプを使用して他のデータベースと ClickHouse 間でデータを転送することが挙げられます。 -## SQL ダンプの作成 +## SQL ダンプの作成 {#creating-sql-dumps} [SQLInsert](/interfaces/formats/SQLInsert) を使用すると、データを SQL 形式でダンプできます。ClickHouse はデータを `INSERT INTO <table name> VALUES(...` 形式で出力し、テーブル名として [`output_format_sql_insert_table_name`](/operations/settings/settings-formats.md/#output_format_sql_insert_table_name) 設定オプションを使用します。 @@ -46,7 +46,7 @@ mysql some_db < dump.sql SET output_format_sql_insert_max_batch_size = 1000; ``` -### 値の集合のエクスポート +### 値の集合のエクスポート {#exporting-a-set-of-values} ClickHouse には [Values](/interfaces/formats/Values) フォーマットがあり、SQL の INSERT 文に似ていますが、`INSERT INTO table VALUES` の部分を省き、値の集合だけを返します。 @@ -59,7 +59,7 @@ SELECT * FROM some_data LIMIT 3 FORMAT Values ``` -## SQLダンプからのデータ挿入 +## SQLダンプからのデータ挿入 {#inserting-data-from-sql-dumps} SQL ダンプを読み込むには、[MySQLDump](/interfaces/formats/MySQLDump) を使用します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md index c02fb8638d9..50a512ac8e0 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md @@ -10,13 +10,13 @@ keywords: ['データ形式', 'テンプレート', '正規表現', 'カスタ -# ClickHouse で Templates と Regex を使用してカスタムテキストデータをインポートおよびエクスポートする +# ClickHouse で Templates と Regex を使用してカスタムテキストデータをインポートおよびエクスポートする {#importing-and-exporting-custom-text-data-using-templates-and-regex-in-clickhouse} 独自テキスト形式のデータ、たとえば非標準的なフォーマット、不正な JSON、壊れた CSV などを扱わなければならないことはよくあります。CSV や JSON といった標準パーサーでは、こうしたすべてのケースを扱えるとは限りません。しかし ClickHouse には強力な Template フォーマットと Regex フォーマットが用意されており、これらのケースにも対応できます。 -## テンプレートに基づくインポート +## テンプレートに基づくインポート {#importing-based-on-a-template} 次の[ログファイル](assets/error.log)からデータをインポートしたいとします。 @@ -88,7 +88,7 @@ GROUP BY request └──────────────────────────────────────────────────┴─────────┘ ``` -### 空白のスキップ +### 空白のスキップ {#skipping-whitespaces} テンプレート内の区切り文字同士の間にある空白を無視できるようにするには、[TemplateIgnoreSpaces](/interfaces/formats/TemplateIgnoreSpaces) の利用を検討してください。 @@ -98,7 +98,7 @@ TemplateIgnoreSpaces --> "p1:${p1:CSV}, p2:${p2:CSV}" ``` -## テンプレートを使用したデータのエクスポート +## テンプレートを使用したデータのエクスポート {#exporting-data-using-templates} テンプレートを使用して任意のテキスト形式でデータをエクスポートすることもできます。この場合は、次の 2 つのファイルを作成する必要があります。 @@ -142,7 +142,7 @@ FORMAT Template SETTINGS format_template_resultset = 'output.results', --- 1000行を0.001380604秒で読み取り --- ``` -### HTML ファイルへのエクスポート +### HTML ファイルへのエクスポート {#exporting-to-html-files} テンプレートベースの結果は、[`INTO OUTFILE`](/sql-reference/statements/select/into-outfile.md) 句を使用してファイルにエクスポートすることもできます。次の [resultset](assets/html.results) および [row](assets/html.row) のフォーマットに基づいて HTML ファイルを生成してみましょう。 @@ -157,7 +157,7 @@ SETTINGS format_template_resultset = 'html.results', format_template_row = 'html.row' ``` -### XML へのエクスポート +### XML へのエクスポート {#exporting-to-xml} Template フォーマットは、XML を含むあらゆるテキスト形式ファイルを生成するために使用できます。適切なテンプレートを用意してエクスポートを実行してください。 @@ -203,7 +203,7 @@ FORMAT XML ``` -## 正規表現に基づくデータのインポート +## 正規表現に基づくデータのインポート {#importing-data-based-on-regular-expressions} [Regexp](/interfaces/formats/Regexp) フォーマットは、入力データをより複雑な方法で解析する必要がある、高度なユースケースに対応します。ここでは [error.log](assets/error.log) のサンプルファイルを解析し、今回はファイル名とプロトコルも抽出して、それぞれ別のカラムに保存します。まず、そのための新しいテーブルを準備します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md index 69351d3e176..d5e5dbc90fc 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md @@ -6,7 +6,7 @@ description: 'データインジェストセクション用ランディングペ doc_type: 'landing-page' --- -# データインジェスト +# データインジェスト {#data-ingestion} ClickHouse は、データ統合および変換のために数多くのソリューションと連携しています。 詳しくは、以下のページを参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md index 27287a524b6..65e9ba1df17 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md @@ -6,7 +6,7 @@ title: 'データソース' doc_type: 'landing-page' --- -# データソース +# データソース {#data-sources} ClickHouse を使用すると、さまざまなソースからデータベースにデータを簡単に取り込むことができます。 詳細については、以下のページを参照してください。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md index b3d6b9c5914..9c6b803dac7 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md @@ -17,7 +17,7 @@ import dynamodb_map_columns from '@site/static/images/integrations/data-ingestio import Image from '@theme/IdealImage'; -# DynamoDB から ClickHouse への CDC +# DynamoDB から ClickHouse への CDC {#cdc-from-dynamodb-to-clickhouse} @@ -50,9 +50,9 @@ import Image from '@theme/IdealImage'; -## 3. スナップショットを ClickHouse に読み込む +## 3. スナップショットを ClickHouse に読み込む {#3-load-the-snapshot-into-clickhouse} -### 必要なテーブルを作成する +### 必要なテーブルを作成する {#create-necessary-tables} DynamoDB からのスナップショットデータはおおよそ次のようになります: @@ -115,7 +115,7 @@ ORDER BY id; * テーブルはパーティションキーをソートキー(`ORDER BY` で指定)として使用する必要があります。 * 同じソートキーを持つ行は、`version` カラムに基づいて重複排除されます。 -### スナップショット用 ClickPipe の作成 +### スナップショット用 ClickPipe の作成 {#create-the-snapshot-clickpipe} ここまでで、S3 から ClickHouse へスナップショットデータをロードするための ClickPipe を作成できます。S3 ClickPipe ガイドは[こちら](/integrations/clickpipes/object-storage)に従いますが、次の設定を使用してください。 @@ -146,7 +146,7 @@ https://{bucket}.s3.amazonaws.com/{prefix}/AWSDynamoDB/{export-id}/data/* -## 5. クリーンアップ(オプション) +## 5. クリーンアップ(オプション) {#5-cleanup-optional} スナップショット ClickPipe の処理が完了したら、スナップショットテーブルとマテリアライズドビューを削除できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md index c3ee1ce5d84..f585ff40b2a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md @@ -16,7 +16,7 @@ import Jdbc02 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-02 import Jdbc03 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-03.png'; -# JDBC を使用して ClickHouse を外部データソースに接続する +# JDBC を使用して ClickHouse を外部データソースに接続する {#connecting-clickhouse-to-external-data-sources-with-jdbc} :::note JDBC を使用するには ClickHouse JDBC Bridge が必要なため、ローカルマシン上で `clickhouse-local` を使用して、データベースから ClickHouse Cloud へデータをストリーミングする必要があります。詳細については、ドキュメントの **Migrate** セクションにある [**Using clickhouse-local**](/cloud/migration/clickhouse-local#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge) ページを参照してください。 @@ -44,7 +44,7 @@ ClickHouse JDBC Bridge は、読み取りと書き込みの両方に使用でき -## ClickHouse JDBC Bridge をローカルにインストールする +## ClickHouse JDBC Bridge をローカルにインストールする {#install-the-clickhouse-jdbc-bridge-locally} ClickHouse JDBC Bridge を使用する最も簡単な方法は、ClickHouse が動作しているのと同じホスト上にインストールして実行することです。ClickHouse JDBC Bridge をローカルにデプロイした構成図 @@ -107,7 +107,7 @@ ClickHouse JDBC Bridge をフォアグラウンドモードで起動しました ::: -## ClickHouse 内から JDBC 接続を使用する +## ClickHouse 内から JDBC 接続を使用する {#use-the-jdbc-connection-from-within-clickhouse} ClickHouse は、[jdbc テーブル関数](/sql-reference/table-functions/jdbc.md) または [JDBC テーブルエンジン](/engines/table-engines/integrations/jdbc.md) を使用して、MySQL のデータにアクセスできます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md index 6a532a86cd2..42c9395c3e7 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md @@ -10,27 +10,24 @@ doc_type: 'guide' import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - -# ClickHouse と PostgreSQL の接続 +# ClickHouse と PostgreSQL の接続 {#connecting-clickhouse-to-postgresql} このページでは、PostgreSQL と ClickHouse を統合するための次のオプションについて説明します。 -- PostgreSQL のテーブルから読み取るための `PostgreSQL` テーブルエンジンの利用 -- PostgreSQL 内のデータベースと ClickHouse 内のデータベースを同期するための、実験的な `MaterializedPostgreSQL` データベースエンジンの利用 +* PostgreSQL のテーブルから読み取るための `PostgreSQL` テーブルエンジンの利用 +* PostgreSQL 内のデータベースと ClickHouse 内のデータベースを同期するための、実験的な `MaterializedPostgreSQL` データベースエンジンの利用 :::tip [ClickPipes](/integrations/clickpipes/postgres) は、PeerDB を基盤とした ClickHouse Cloud 向けのマネージド連携サービスであり、こちらの利用を推奨します。 また、代替手段として [PeerDB](https://github.com/PeerDB-io/peerdb) は、セルフホスト型の ClickHouse および ClickHouse Cloud 双方への PostgreSQL データベースレプリケーション向けに特化して設計された、オープンソースの CDC(変更データキャプチャ)ツールとして利用できます。 ::: - - -## PostgreSQL テーブルエンジンの使用 +## PostgreSQL テーブルエンジンの使用 {#using-the-postgresql-table-engine} `PostgreSQL` テーブルエンジンを使用すると、リモートの PostgreSQL サーバー上に保存されているデータに対して、ClickHouse から **SELECT** および **INSERT** 操作を行うことができます。 この記事では、1 つのテーブルを使った基本的な連携方法を説明します。 -### 1. PostgreSQL のセットアップ +### 1. PostgreSQL のセットアップ {#1-setting-up-postgresql} 1. `postgresql.conf` で、PostgreSQL がネットワークインターフェイスで待ち受けできるようにするため、次の設定を追加します。 @@ -93,7 +90,7 @@ ClickHouse Cloud 上でこの機能を利用している場合、ClickHouse Clou 外向きトラフィックの詳細については、ClickHouse の [Cloud Endpoints API](/cloud/get-started/query-endpoints) を確認してください。 ::: -### 2. ClickHouse にテーブルを定義する +### 2. ClickHouse にテーブルを定義する {#2-define-a-table-in-clickhouse} 1. `clickhouse-client` にログインします: @@ -131,7 +128,7 @@ ENGINE = PostgreSQL('postgres-host.domain.com:5432', 'db_in_psg', 'table1', 'cli 利用可能なパラメータの完全な一覧については、[PostgreSQL table engine](/engines/table-engines/integrations/postgresql) のドキュメントページを参照してください。 ::: -### 3 統合をテストする +### 3 統合をテストする {#3-test-the-integration} 1. ClickHouse で初期の行を表示します: @@ -166,7 +163,6 @@ VALUES SELECT * FROM db_in_ch.table1 ``` - レスポンスは次のとおりです。 ```response @@ -208,8 +204,7 @@ id | column1 この例では、`PostrgeSQL` テーブルエンジンを使用して、PostgreSQL と ClickHouse の間の基本的な連携方法を示しました。 スキーマの指定、特定のカラムのみを返す設定、複数レプリカへの接続など、さらに多くの機能については、[PostgreSQL テーブルエンジンのドキュメントページ](/engines/table-engines/integrations/postgresql) を参照してください。また、ブログ記事 [ClickHouse and PostgreSQL - a match made in data heaven - part 1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres) もあわせてご覧ください。 - -## MaterializedPostgreSQL データベースエンジンの使用 +## MaterializedPostgreSQL データベースエンジンの使用 {#using-the-materializedpostgresql-database-engine} @@ -220,7 +215,7 @@ PostgreSQL データベースエンジンは、PostgreSQL のレプリケーシ ***以下の手順では、PostgreSQL CLI (`psql`) と ClickHouse CLI (`clickhouse-client`) を使用します。PostgreSQL サーバーは Linux 上にインストールされています。以下の内容は、PostgreSQL データベースを新規にテストインストールした場合の最小設定です。*** -### 1. PostgreSQL 側の設定 +### 1. PostgreSQL 側の設定 {#1-in-postgresql} 1. `postgresql.conf` で、最低限の listen 設定、レプリケーション用の `wal_level`、レプリケーションスロットを設定します: @@ -275,7 +270,6 @@ VALUES 7. レプリケーション用に、新しいユーザーが新しいデータベースへ接続できるよう PostgreSQL を設定します。以下は `pg_hba.conf` ファイルに追加する最小限のエントリです。 - ```text # TYPE DATABASE USER ADDRESS METHOD host db1 clickhouse_user 192.168.1.0/24 password @@ -349,7 +343,7 @@ Query id: df2381ac-4e30-4535-b22e-8be3894aaafc └────┴─────────┘ ``` -### 3. 基本的なレプリケーションをテストする +### 3. 基本的なレプリケーションをテストする {#2-in-clickhouse} 1. PostgreSQL に新しい行を追加します: @@ -385,7 +379,7 @@ Query id: b0729816-3917-44d3-8d1a-fed912fb59ce └────┴─────────┘ ``` -### 4. まとめ +### 4. まとめ {#3-test-basic-replication} このインテグレーションガイドでは、テーブルを含むデータベースをレプリケートするためのシンプルな例を扱いましたが、データベース全体をレプリケートしたり、既存のレプリケーションに新しいテーブルやスキーマを追加したりするなど、より高度なオプションも存在します。このレプリケーションでは DDL コマンドはサポートされませんが、エンジンを設定することで変更を検出し、スキーマ変更などの構造的な変更が行われた際にテーブルを再読み込みさせることができます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md index ff672310a6c..65c2460e3fb 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md @@ -40,7 +40,7 @@ import clickhouse_result from '@site/static/images/integrations/data-ingestion/e import Image from '@theme/IdealImage'; -# EMQX と ClickHouse の統合 +# EMQX と ClickHouse の統合 {#integrating-emqx-with-clickhouse} @@ -63,7 +63,7 @@ import Image from '@theme/IdealImage'; -## ClickHouse Cloud サービスを取得する +## ClickHouse Cloud サービスを取得する {#get-your-clickhouse-cloudservice} このセットアップでは、ClickHouse インスタンスを N. Virginia (us-east-1) の AWS 上にデプロイし、同じリージョンに EMQX Cloud インスタンスもデプロイしました。 @@ -153,7 +153,7 @@ Overview ページに戻り、ページの一番下までスクロールする -## EMQX Cloud と ClickHouse Cloud の統合 +## EMQX Cloud と ClickHouse Cloud の統合 {#integration-emqx-cloud-with-clickhouse-cloud} [EMQX Cloud Data Integrations](https://docs.emqx.com/en/cloud/latest/rule_engine/introduction.html#general-flow) 機能は、EMQX のメッセージフローおよびデバイスイベントを処理し応答するためのルールを構成するために使用されます。Data Integrations は、明確かつ柔軟な「設定可能な」アーキテクチャソリューションを提供するだけでなく、開発プロセスを簡素化し、ユーザビリティを向上させ、業務システムと EMQX Cloud 間の結合度を低減します。また、EMQX Cloud 固有機能のカスタマイズに対して優れた基盤インフラストラクチャも提供します。 @@ -163,7 +163,7 @@ EMQX Cloud は、代表的なデータシステム向けに 30 を超えるネ EMQX Cloud ClickHouse Data Integration コネクタの詳細 -### ClickHouse リソースの作成 +### ClickHouse リソースの作成 {#create-clickhouse-resource} 左側メニューの「Data Integrations」をクリックし、「View All Resources」をクリックします。Data Persistence セクションで ClickHouse を見つけるか、ClickHouse を検索します。 @@ -177,7 +177,7 @@ ClickHouse カードをクリックして新しいリソースを作成します 接続情報を入力する EMQX Cloud ClickHouse Resource 設定フォーム -### 新しいルールの作成 +### 新しいルールの作成 {#create-a-new-rule} リソース作成時にポップアップが表示され、「New」をクリックするとルール作成ページに移動します。 @@ -212,7 +212,7 @@ SQL のテスト機能を使ってテストを実行し、結果を確認でき 次に「NEXT」ボタンをクリックします。このステップでは、EMQX Cloud に対して、整形されたデータを ClickHouse データベースにどのように挿入するかを指定します。 -### レスポンスアクションを追加する +### レスポンスアクションを追加する {#add-a-response-action} リソースが 1 つだけの場合は、「Resource」と「Action Type」を変更する必要はありません。 SQL テンプレートを設定するだけで構いません。このチュートリアルで使用している例は次のとおりです。 @@ -225,7 +225,7 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ これは ClickHouse にデータを挿入するためのテンプレートです。ここで変数がどのように利用されているか確認できます。 -### ルールの詳細を表示 +### ルールの詳細を表示 {#view-rules-details} 「Confirm」と「View Details」をクリックします。これで、すべての設定が完了しているはずです。ルール詳細ページから、データ統合が正しく動作していることを確認できます。 @@ -234,13 +234,13 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ `temp_hum/emqx` トピックに送信されたすべての MQTT メッセージは、ClickHouse Cloud データベースに永続化されます。 -## ClickHouse へのデータ保存 +## ClickHouse へのデータ保存 {#saving-data-into-clickhouse} 温度と湿度のデータをシミュレートし、そのデータを MQTT X を介して EMQX Cloud に送信します。その後、EMQX Cloud Data Integrations を使用してデータを ClickHouse Cloud に保存します。 EMQX Cloud から ClickHouse へのワークフローを示すデータフロー図 -### MQTT メッセージを EMQX Cloud にパブリッシュする +### MQTT メッセージを EMQX Cloud にパブリッシュする {#publish-mqtt-messages-to-emqx-cloud} メッセージのパブリッシュには、任意の MQTT クライアントまたは SDK を使用できます。本チュートリアルでは、EMQ が提供するユーザーフレンドリーな MQTT クライアントアプリケーションである [MQTT X](https://mqttx.app/) を使用します。 @@ -274,13 +274,13 @@ EMQX Cloud に送信されたデータは、ルールエンジンによって処 MQTTX Publish MQTT Messages インターフェースにおけるメッセージ作成画面 -### ルール監視を確認する +### ルール監視を確認する {#view-rules-monitoring} ルール監視を開き、成功数が 1 件増えていることを確認します。 EMQX Cloud Rule Monitoring ダッシュボードにおけるメッセージ処理メトリクス -### 永続化されたデータを確認する +### 永続化されたデータを確認する {#check-the-data-persisted} ClickHouse Cloud 上のデータを確認します。理想的には、MQTTX を使って送信したデータは EMQX Cloud に送られ、ネイティブなデータ統合機能により ClickHouse Cloud のデータベースに永続化されます。 @@ -293,6 +293,6 @@ SELECT * FROM emqx.temp_hum; ClickHouse のクエリ結果で永続化された IoT データを表示している画面 -### まとめ +### まとめ {#summary} コードを一行も書くことなく、MQTT データを EMQX Cloud から ClickHouse Cloud へ送れるようになりました。EMQX Cloud と ClickHouse Cloud を使えば、インフラの運用・管理は不要になり、ClickHouse Cloud に安全に保存されたデータを活用して IoT アプリケーションの開発に専念できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md index 6ad9700b285..116e929b94e 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md @@ -25,7 +25,7 @@ import airbyte09 from '@site/static/images/integrations/data-ingestion/etl-tools import PartnerBadge from '@theme/badges/PartnerBadge'; -# AirbyteをClickHouseに接続する +# AirbyteをClickHouseに接続する {#connect-airbyte-to-clickhouse} @@ -70,7 +70,7 @@ ClickHouse用のAirbyteソースおよびデスティネーションは現在ア -## ClickHouse を送信先として追加する +## ClickHouse を送信先として追加する {#2-add-clickhouse-as-a-destination} このセクションでは、ClickHouse インスタンスを送信先として追加する方法を説明します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md index 18cf2d96176..191fae2856a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md @@ -13,7 +13,7 @@ keywords: ['apache beam', 'ストリーム処理', 'バッチ処理', 'JDBC コ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Apache Beam と ClickHouse の統合 +# Apache Beam と ClickHouse の統合 {#integrating-apache-beam-and-clickhouse} @@ -29,9 +29,9 @@ Apache Beam と ClickHouse を統合するために必要なインテグレー -## Apache Beam ClickHouse パッケージのセットアップ +## Apache Beam ClickHouse パッケージのセットアップ {#setup-of-the-apache-beam-clickhouse-package} -### パッケージのインストール +### パッケージのインストール {#package-installation} ご利用のパッケージ管理フレームワークに、次の依存関係を追加します: @@ -50,7 +50,7 @@ Apache Beam と ClickHouse を統合するために必要なインテグレー アーティファクトは [公式 Maven リポジトリ](https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-io-clickhouse)から入手できます。 -### コード例 +### コード例 {#code-example} 次の例では、`input.csv` という名前の CSV ファイルを `PCollection` として読み込み、定義済みのスキーマを使用して `Row` オブジェクトに変換し、`ClickHouseIO` を使用してローカルの ClickHouse インスタンスに挿入します。 @@ -133,6 +133,12 @@ public class Main { | | `Schema.TypeName#DECIMAL` | ❌ | | | | `Schema.TypeName#MAP` | ❌ | | + + + + + + ## ClickHouseIO.Write のパラメータ {#clickhouseiowrite-parameters} 次のセッターメソッドを使用して `ClickHouseIO.Write` の設定を調整できます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md index c8c9a685083..b0e1ded81f7 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md @@ -21,7 +21,7 @@ import bp_ck_9 from '@site/static/images/integrations/data-ingestion/etl-tools/b import PartnerBadge from '@theme/badges/PartnerBadge'; -# BladePipe を ClickHouse に接続する +# BladePipe を ClickHouse に接続する {#connect-bladepipe-to-clickhouse} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md index 0c8a16f8016..afdb75efd5a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md @@ -12,7 +12,7 @@ import TOCInline from '@theme/TOCInline'; import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# 機能と設定 +# 機能と設定 {#features-and-configurations} @@ -22,7 +22,7 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## Profile.yml の設定 +## Profile.yml の設定 {#profile-yml-configurations} dbt から ClickHouse に接続するには、`profiles.yml` ファイルに[プロファイル](https://docs.getdbt.com/docs/core/connect-data-platform/connection-profiles)を追加する必要があります。ClickHouse のプロファイルは、次の構文に従います。 @@ -65,14 +65,14 @@ your_profile_name: compress_block_size: [1048576] # 圧縮有効時の圧縮ブロックサイズ ``` -### スキーマとデータベースの違い +### スキーマとデータベースの違い {#schema-vs-database} dbt モデルのリレーション識別子 `database.schema.table` は ClickHouse では互換性がありません。これは、ClickHouse が `schema` をサポートしていないためです。 そのため、`schema.table` という簡略化したアプローチを使用します。この場合の `schema` は ClickHouse のデータベースを意味します。 `default` データベースの使用は推奨されません。 -### SET ステートメントに関する警告 +### SET ステートメントに関する警告 {#set-statement-warning} 多くの環境では、すべての dbt クエリに対して ClickHouse の設定を永続させる目的で SET ステートメントを使用する方法は信頼性が低く、 予期しない失敗を引き起こす可能性があります。これは特に、ロードバランサーを介して複数ノードにクエリを分散する HTTP 接続 @@ -80,7 +80,7 @@ dbt モデルのリレーション識別子 `database.schema.table` は ClickHou したがって、事前フックの "SET" ステートメントに依存するのではなく、ベストプラクティスとして、dbt プロファイルの "custom_settings" プロパティで必要な ClickHouse の設定を構成することを推奨します。 -### `quote_columns` の設定 +### `quote_columns` の設定 {#setting-quote_columns} 警告が出ないようにするため、`dbt_project.yml` 内で `quote_columns` に値を明示的に設定してください。詳細については、[quote_columns に関するドキュメント](https://docs.getdbt.com/reference/resource-configs/quote_columns) を参照してください。 @@ -90,14 +90,14 @@ seeds: +quote_columns: false # CSV列ヘッダーにスペースが含まれている場合は `true` に設定 ``` -### ClickHouse クラスターについて +### ClickHouse クラスターについて {#about-the-clickhouse-cluster} ClickHouse クラスターを使用する場合、次の 2 点を考慮する必要があります。 * `cluster` 設定を行うこと * 特に複数の `threads` を使用している場合に、書き込み直後の読み取り一貫性を確保すること -#### クラスター設定 +#### クラスター設定 {#cluster-setting} プロファイル内の `cluster` 設定により、dbt-clickhouse は ClickHouse クラスターを対象に実行されます。プロファイルで `cluster` が設定されている場合、**すべてのモデルはデフォルトで `ON CLUSTER` 句付きで作成されます**(**Replicated** エンジンを使用するものを除く)。これには以下が含まれます。 @@ -126,7 +126,7 @@ non-replicated エンジンを使用する table および incremental マテリ モデルが `cluster` 設定なしで作成されている場合、dbt-clickhouse はその状況を検知し、そのモデルに対するすべての DDL/DML を `on cluster` 句なしで実行します。 -#### 書き込み直後の読み取り一貫性 +#### 書き込み直後の読み取り一貫性 {#read-after-write-consistency} dbt は read-after-insert 一貫性モデルに依存しています。これは、すべての操作が同じレプリカに送られることを保証できない場合、複数レプリカを持つ ClickHouse クラスターとは互換性がありません。日常的な dbt の利用においては問題が発生しないこともありますが、この保証を満たすために、クラスターの種類に応じた戦略がいくつかあります。 @@ -134,9 +134,9 @@ dbt は read-after-insert 一貫性モデルに依存しています。これは * 自前でホストしているクラスターを使用している場合は、すべての dbt リクエストが同じ ClickHouse レプリカに送信されるようにしてください。その上にロードバランサーがある場合は、常に同じレプリカに到達できるように、`replica aware routing` / `sticky sessions` メカニズムの利用を検討してください。ClickHouse Cloud 以外のクラスターで `select_sequential_consistency = 1` 設定を追加することは[推奨されません](https://clickhouse.com/docs/operations/settings/settings#select_sequential_consistency)。 -## 機能に関する一般情報 +## 機能に関する一般情報 {#general-information-about-features} -### テーブルの一般的な設定 +### テーブルの一般的な設定 {#general-table-configurations} | Option | Description | Default if any | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | @@ -154,7 +154,7 @@ dbt は read-after-insert 一貫性モデルに依存しています。これは | definer | `sql_security` に `definer` を設定した場合、`definer` 句で既存のユーザーまたは `CURRENT_USER` を指定する必要があります。 | | | projections | 作成する[プロジェクション](/data-modeling/projections)の一覧。[プロジェクションについて](#projections)を参照してください。 | | -#### データスキッピングインデックスについて +#### データスキッピングインデックスについて {#data-skipping-indexes} データスキッピングインデックスは `table` マテリアライゼーションでのみ利用可能です。テーブルにデータスキッピングインデックスの一覧を追加するには、`indexes` 設定を使用します。 @@ -168,7 +168,7 @@ dbt は read-after-insert 一貫性モデルに依存しています。これは ) }} ``` -#### プロジェクションについて +#### プロジェクションについて {#projections} `projections` 設定を使用して、`table` および `distributed_table` マテリアライゼーションに [プロジェクション](/data-modeling/projections) を追加できます。 @@ -186,7 +186,7 @@ dbt は read-after-insert 一貫性モデルに依存しています。これは **注記**: 分散テーブルでは、プロジェクションは分散プロキシテーブルではなく `_local` テーブルに適用されます。 -### サポートされているテーブルエンジン +### サポートされているテーブルエンジン {#supported-table-engines} | 種類 | 詳細 | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -197,7 +197,7 @@ dbt は read-after-insert 一貫性モデルに依存しています。これは | EmbeddedRocksDB | [https://clickhouse.com/docs/en/engines/table-engines/integrations/embedded-rocksdb](https://clickhouse.com/docs/en/engines/table-engines/integrations/embedded-rocksdb) | | Hive | [https://clickhouse.com/docs/en/engines/table-engines/integrations/hive](https://clickhouse.com/docs/en/engines/table-engines/integrations/hive) | -### 実験的サポート対象のテーブルエンジン +### 実験的サポート対象のテーブルエンジン {#experimental-supported-table-engines} | Type | Details | @@ -208,7 +208,7 @@ dbt は read-after-insert 一貫性モデルに依存しています。これは 上記のいずれかのエンジンを使った dbt から ClickHouse への接続で問題が発生した場合は、 [こちら](https://github.com/ClickHouse/dbt-clickhouse/issues) から issue を報告してください。 -### モデル設定についての注意事項 +### モデル設定についての注意事項 {#a-note-on-model-settings} ClickHouse には複数の種類やレベルの「settings(設定)」があります。上記のモデル設定では、そのうち 2 種類を 設定できます。`settings` は、`CREATE TABLE/VIEW` タイプの DDL 文で使用される `SETTINGS` @@ -218,7 +218,7 @@ ClickHouse の設定は数百個あり、「テーブル」設定と「ユーザ 必ずしも明確でないものもあります(ただし後者は一般的に `system.settings` テーブルで確認できます)。 一般的にはデフォルト値の使用が推奨され、これらのプロパティを利用する場合は、事前に十分な調査とテストを行ってください。 -### カラム設定 +### カラム設定 {#column-configuration} > ***NOTE:*** 以下のカラム設定オプションを利用するには、[model contracts](https://docs.getdbt.com/docs/collaborate/govern/model-contracts) が適用・強制されている必要があります。 @@ -227,7 +227,7 @@ ClickHouse の設定は数百個あり、「テーブル」設定と「ユーザ | codec | カラムの DDL 内で `CODEC()` に渡される引数からなる文字列。例: `codec: "Delta, ZSTD"` は `CODEC(Delta, ZSTD)` として解釈されます。 | | | ttl | カラムの DDL 内で TTL ルールを定義する [TTL(time-to-live)式](https://clickhouse.com/docs/guides/developer/ttl) からなる文字列。例: `ttl: ts + INTERVAL 1 DAY` は `TTL ts + INTERVAL 1 DAY` として解釈されます。 | | -#### スキーマ設定の例 +#### スキーマ設定の例 {#example-of-schema-configuration} ```yaml models: @@ -245,7 +245,7 @@ models: ttl: ts + INTERVAL 1 DAY ``` -#### 複合型の追加 +#### 複合型の追加 {#adding-complex-types} dbt は、モデルの定義に用いられた SQL を解析して、各カラムのデータ型を自動的に判定します。ただし、場合によってはこの処理では正確にデータ型を判定できず、コントラクトの `data_type` プロパティで指定された型と矛盾が生じることがあります。これに対処するため、モデルの SQL 内で `CAST()` 関数を使用して、意図した型を明示的に指定することを推奨します。例えば、次のようになります。 @@ -270,9 +270,9 @@ group by event_type ``` -## 機能 +## 機能 {#features} -### マテリアライゼーション: view +### マテリアライゼーション: view {#materialization-view} dbt モデルは [ClickHouse view](https://clickhouse.com/docs/en/sql-reference/table-functions/view/) として作成し、次の構文で設定できます。 @@ -291,7 +291,7 @@ models: {{ config(materialized = "view") }} ``` -### マテリアライゼーション: テーブル +### マテリアライゼーション: テーブル {#materialization-table} dbt モデルは [ClickHouse のテーブル](https://clickhouse.com/docs/en/operations/system-tables/tables/) として作成し、 次の構文で設定できます。 @@ -320,7 +320,7 @@ models: ) }} ``` -### マテリアライゼーション: incremental +### マテリアライゼーション: incremental {#materialization-incremental} テーブルモデルは、dbt が実行されるたびに再構築されます。これは、結果セットが大きい場合や変換が複雑な場合には、実行不可能であったり非常に高コストになることがあります。この課題に対処し、ビルド時間を短縮するために、dbt モデルをインクリメンタルな ClickHouse テーブルとして作成し、次の構文を用いて設定できます。 @@ -352,7 +352,7 @@ models: ) }} ``` -#### 設定 +#### 設定 {#configurations} このマテリアライゼーションタイプに特有の設定は以下のとおりです。 @@ -363,11 +363,11 @@ models: | `incremental_strategy` | インクリメンタルマテリアライゼーションに使用する戦略。`delete+insert`、`append`、`insert_overwrite`、`microbatch` がサポートされています。戦略の詳細については[こちら](/integrations/dbt/features-and-configurations#incremental-model-strategies)を参照してください。 | 任意 (デフォルト: 'default') | | `incremental_predicates` | インクリメンタルマテリアライゼーションに適用される追加条件(`delete+insert` 戦略にのみ適用されます) | 任意 | -#### インクリメンタルモデルの戦略 +#### インクリメンタルモデルの戦略 {#incremental-model-strategies} `dbt-clickhouse` は 3 つのインクリメンタルモデル戦略をサポートしています。 -##### デフォルト(レガシー)戦略 +##### デフォルト(レガシー)戦略 {#default-legacy-strategy} これまで ClickHouse は、非同期の「mutations」という形式による、限定的な更新および削除のサポートしか持っていませんでした。 期待される dbt の挙動をエミュレートするために、 @@ -377,7 +377,7 @@ dbt-clickhouse はデフォルトで、影響を受けない(削除されて 処理が完了する前に問題が発生した場合でも元のリレーションを保持する唯一の戦略ですが、 元のテーブルの完全なコピーを伴うため、非常にコストが高く、実行が遅くなる可能性があります。 -##### Delete+Insert 戦略 +##### Delete+Insert 戦略 {#delete-insert-strategy} ClickHouse はバージョン 22.8 で実験的機能として「lightweight deletes」を追加しました。Lightweight deletes は @@ -456,7 +456,7 @@ WHERE 句/フィルタで除外される場合には、最も高速なアプ この戦略を利用するには、モデル設定で `partition_by` を指定している必要があります。モデル設定におけるその他の戦略固有の パラメータはすべて無視されます。 -### Materialization: materialized_view (Experimental) +### Materialization: materialized_view (Experimental) {#materialized-view} `materialized_view` マテリアライゼーションは、既存の(ソース)テーブルを対象とした `SELECT` 文である必要があります。アダプターはモデル名を用いた ターゲットテーブルと、`_mv` という名前の ClickHouse MATERIALIZED VIEW を作成します。PostgreSQL と異なり、ClickHouse のマテリアライズドビューは @@ -489,7 +489,7 @@ select a,b,c from {{ source('raw', 'table_2') }} > 次の警告が表示されます: > `Warning - Table was detected with the same pattern as model name but was not found in this run. In case it is a renamed mv that was previously part of this model, drop it manually (!!!) ` -#### データのキャッチアップ +#### データのキャッチアップ {#data-catch-up} 現在、マテリアライズドビュー (MV) を作成する場合、MV 自体が作成される前に、ターゲットテーブルはまず履歴データで埋められます。 @@ -506,7 +506,7 @@ MV の作成時に履歴データをプリロードしたくない場合は、`c )}} ``` -#### リフレッシュ可能なマテリアライズドビュー +#### リフレッシュ可能なマテリアライズドビュー {#refreshable-materialized-views} [Refreshable Materialized View](https://clickhouse.com/docs/en/materialized-view/refreshable-materialized-view) を利用するには、 MV モデル内で必要に応じて次の設定を調整してください(これらの設定はすべて、 @@ -538,19 +538,19 @@ refreshable 設定オブジェクト内に記述します)。 }} ``` -#### 制限事項 +#### 制限事項 {#limitations} * 依存関係を持つリフレッシュ可能なマテリアライズドビュー (MV) を ClickHouse で作成する際、指定した依存関係が作成時点で存在しなくても、ClickHouse はエラーをスローしません。代わりに、そのリフレッシュ可能な MV は非アクティブ状態のままとなり、依存関係が満たされるまで更新処理やリフレッシュを開始しません。この挙動は設計によるものですが、必要な依存関係への対応が遅れた場合、データの利用可能性に遅延が生じる可能性があります。ユーザーは、リフレッシュ可能なマテリアライズドビューを作成する前に、すべての依存関係が正しく定義され、実在していることを確認するよう推奨されます。 * 現時点では、MV とその依存関係の間に実際の「dbt linkage」は存在しないため、作成順序は保証されません。 * リフレッシュ可能機能は、同一のターゲットモデルを指す複数の MV に対してはテストされていません。 -### マテリアライゼーション: dictionary(実験的) +### マテリアライゼーション: dictionary(実験的) {#materialization-dictionary} ClickHouse の dictionary 用マテリアライゼーションの実装例については、 [https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/dictionary/test_dictionary.py](https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/dictionary/test_dictionary.py) のテストを参照してください。 -### マテリアライゼーション: distributed_table(実験的) +### マテリアライゼーション: distributed_table(実験的) {#materialization-distributed-table} 分散テーブルは次の手順で作成されます: @@ -563,7 +563,7 @@ ClickHouse の dictionary 用マテリアライゼーションの実装例につ * 下流のインクリメンタルマテリアライゼーション処理が正しく実行されるようにするため、dbt-clickhouse のクエリには自動的に `insert_distributed_sync = 1` 設定が含まれるようになりました。これにより、一部の分散テーブルへの INSERT が想定より遅くなる可能性があります。 -#### 分散テーブルモデルの例 +#### 分散テーブルモデルの例 {#distributed-table-model-example} ```sql {{ @@ -579,7 +579,7 @@ select id, created_at, item from {{ source('db', 'table') }} ``` -#### 生成されたマイグレーション +#### 生成されたマイグレーション {#distributed-table-generated-migrations} ```sql CREATE TABLE db.table_local on cluster cluster ( @@ -599,7 +599,7 @@ CREATE TABLE db.table on cluster cluster ( ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id)); ``` -### materialization: distributed_incremental (experimental) +### materialization: distributed_incremental (experimental) {#materialization-distributed-incremental} 分散テーブルと同様の考え方に基づくインクリメンタルモデルであり、主な難しさはすべてのインクリメンタル戦略を正しく処理することにあります。 @@ -610,7 +610,7 @@ CREATE TABLE db.table on cluster cluster ( 分散テーブルはデータを保持しないため、置き換えられるのはシャードテーブルのみです。 分散テーブルが再読み込みされるのは、`full_refresh` モードが有効になっている場合か、テーブル構造が変更された可能性がある場合のみです。 -#### 分散インクリメンタルモデルの例 +#### 分散インクリメンタルモデルの例 {#distributed-incremental-model-example} ```sql @@ -627,7 +627,7 @@ select id, created_at, item from {{ source('db', 'table') }} ``` -#### 自動生成されたマイグレーション +#### 自動生成されたマイグレーション {#distributed-incremental-generated-migrations} ```sql CREATE TABLE db.table_local on cluster cluster ( @@ -646,7 +646,7 @@ CREATE TABLE db.table on cluster cluster ( ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id)); ``` -### スナップショット +### スナップショット {#snapshot} dbt のスナップショット機能を使用すると、可変なモデルに対する変更を時間の経過とともに記録できます。これにより、アナリストはモデルに対して、モデルの以前の状態を「過去にさかのぼって」確認できる時点指定クエリを実行できます。この機能は ClickHouse コネクタでサポートされており、次の構文で設定します。 @@ -665,7 +665,7 @@ dbt のスナップショット機能を使用すると、可変なモデルに 設定の詳細については、[snapshot configs](https://docs.getdbt.com/docs/build/snapshots#snapshot-configs) のリファレンスページを参照してください。 -### コントラクトと制約 +### コントラクトと制約 {#contracts-and-constraints} 厳密なカラム型コントラクトのみがサポートされます。たとえば、UInt32 カラム型のコントラクトがある場合、モデルが UInt64 もしくはその他の整数型を返すと失敗します。 @@ -673,9 +673,9 @@ ClickHouse は、テーブル/モデル全体に対する `CHECK` 制約*の およびカラムレベルの CHECK 制約はサポートされません。 (プライマリキー/ORDER BY キーについては ClickHouse のドキュメントを参照してください。) -### 追加の ClickHouse マクロ +### 追加の ClickHouse マクロ {#additional-clickhouse-macros} -#### モデルのマテリアライゼーション用ユーティリティマクロ +#### モデルのマテリアライゼーション用ユーティリティマクロ {#model-materialization-utility-macros} ClickHouse 固有のテーブルおよびビューを作成しやすくするために、次のマクロが含まれています。 @@ -692,7 +692,7 @@ ClickHouse 固有のテーブルおよびビューを作成しやすくするた * `ttl_config` -- `ttl` モデル設定プロパティを使用して、ClickHouse のテーブル TTL 式を割り当てます。デフォルトでは TTL は割り当てられません。 -#### s3Source ヘルパーマクロ +#### s3Source ヘルパーマクロ {#s3source-helper-macro} `s3source` マクロは、ClickHouse の S3 テーブル関数を使用して S3 から直接 ClickHouse データを選択する処理を簡素化します。 このマクロは、 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md index 2522503b2af..d9fbf9ae53c 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md @@ -20,7 +20,7 @@ import dbt_07 from '@site/static/images/integrations/data-ingestion/etl-tools/db import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# ガイド +# ガイド {#guides} @@ -39,13 +39,13 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## セットアップ +## セットアップ {#setup} 環境を準備するには、[dbt と ClickHouse アダプターのセットアップ](/integrations/dbt) セクションの手順に従ってください。 **重要: 以下は python 3.9 環境で検証されています。** -### ClickHouse の準備 +### ClickHouse の準備 {#prepare-clickhouse} dbt はリレーショナル性の高いデータのモデリングに優れています。例として、次のようなリレーショナルスキーマを持つ小さな IMDB データセットを用意しています。このデータセットは [relational dataset repository](https://relational.fit.cvut.cz/dataset/IMDb) に由来します。これは dbt で一般的に使われるスキーマと比べると単純ですが、扱いやすいサンプルになっています。 @@ -672,7 +672,7 @@ SELECT * FROM imdb_dbt.actor_summary ORDER BY num_movies DESC LIMIT 2; +------+-------------------+----------+------------------+------+---------+-------------------+ ``` -### 内部動作 +### 内部動作 {#internals} 上記の増分更新を実現するために実行されたステートメントは、ClickHouse のクエリログを参照することで確認できます。 @@ -694,7 +694,7 @@ AND event_time > subtractMinutes(now(), 15) ORDER BY event_time LIMIT 100; この戦略は、非常に大きなモデルでは問題が発生する可能性があります。詳細については [Limitations](/integrations/dbt#limitations) を参照してください。 -### Append Strategy(挿入のみモード) +### Append Strategy(挿入のみモード) {#append-strategy-inserts-only-mode} インクリメンタルモデルにおける大規模データセットの制約を回避するために、アダプターは dbt の設定パラメータ `incremental_strategy` を使用します。これは `append` に設定できます。これを設定すると、更新された行はターゲットテーブル(`imdb_dbt.actor_summary`)に直接挿入され、一時テーブルは作成されません。 注意: Append only モードでは、データが不変であるか、重複を許容できる必要があります。更新された行をサポートするインクリメンタルテーブルモデルが必要な場合、このモードは使用しないでください。 @@ -796,7 +796,7 @@ WHERE id > (SELECT max(id) FROM imdb_dbt.actor_summary) OR updated_at > (SELECT この実行では、新しい行だけが直接 `imdb_dbt.actor_summary` テーブルに追加され、テーブルの作成は行われません。 -### 削除および挿入モード(実験的) +### 削除および挿入モード(実験的) {#deleteinsert-mode-experimental} 歴史的には、ClickHouse は非同期の [Mutations](/sql-reference/statements/alter/index.md) としてのみ、更新および削除を限定的にサポートしていました。これらは非常に I/O 負荷が高く、一般的には避けるべきです。 @@ -821,7 +821,7 @@ This process is shown below: 軽量な delete インクリメンタル -### insert_overwrite mode (experimental) +### insert_overwrite mode (experimental) {#insert_overwrite-mode-experimental} Performs the following steps: @@ -840,7 +840,7 @@ This approach has the following advantages: insert overwrite インクリメンタル -## スナップショットの作成 +## スナップショットの作成 {#creating-a-snapshot} dbt のスナップショット機能を使用すると、更新可能なモデルに対する変更を時間の経過とともに記録できます。これにより、アナリストはモデルに対して任意時点のクエリを実行し、モデルの過去の状態を「遡って」確認できるようになります。これは、行が有効であった期間を記録する from 日付列および to 日付列を持つ [タイプ 2 のゆっくり変化する次元 (Slowly Changing Dimensions)](https://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2:_add_new_row) を使用して実現されます。この機能は ClickHouse アダプターでサポートされており、以下に示します。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md index 8439abea8c7..f228f238aba 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md @@ -95,9 +95,9 @@ ClickHouse 向けの[現在のアダプタ](https://github.com/silentsokolov/dbt -## dbt と ClickHouse アダプターのセットアップ +## dbt と ClickHouse アダプターのセットアップ {#setup-of-dbt-and-the-clickhouse-adapter} -### dbt-core と dbt-clickhouse のインストール +### dbt-core と dbt-clickhouse のインストール {#install-dbt-core-and-dbt-clickhouse} dbt のコマンドラインインターフェイス (CLI) のインストール方法にはいくつかの選択肢があり、詳細は[こちら](https://docs.getdbt.com/dbt-cli/install/overview)に記載されています。dbt と dbt-clickhouse の両方をインストールするには、`pip` の利用を推奨します。 @@ -105,7 +105,7 @@ dbt のコマンドラインインターフェイス (CLI) のインストール pip install dbt-core dbt-clickhouse ``` -### ClickHouse インスタンスへの接続情報を dbt に提供する +### ClickHouse インスタンスへの接続情報を dbt に提供する {#provide-dbt-with-the-connection-details-for-our-clickhouse-instance} `~/.dbt/profiles.yml` ファイル内で `clickhouse-service` プロファイルを構成し、`schema`、`host`、`port`、`user`、`password` プロパティを指定します。接続構成オプションの全一覧は、[機能と設定](/integrations/dbt/features-and-configurations) ページに記載されています。 @@ -125,7 +125,7 @@ clickhouse-service: secure: True # TLS(ネイティブプロトコル)またはHTTPS(httpプロトコル)を使用 ``` -### dbt プロジェクトを作成する +### dbt プロジェクトを作成する {#create-a-dbt-project} これで、このプロファイルを既存のいずれかのプロジェクトで使用することも、次の手順で新しいプロジェクトを作成することもできます。 @@ -139,17 +139,17 @@ dbt init project_name profile: 'clickhouse-service' ``` -### 接続テスト +### 接続テスト {#test-connection} CLI で `dbt debug` を実行し、dbt が ClickHouse に接続できるかどうかを確認します。レスポンスに `Connection test: [OK connection ok]` が含まれていることを確認し、接続が成功していることを確かめてください。 ClickHouse と dbt の連携方法の詳細については、[ガイドページ](/integrations/dbt/guides) を参照してください。 -### モデルのテストとデプロイ (CI/CD) +### モデルのテストとデプロイ (CI/CD) {#testing-and-deploying-your-models-ci-cd} dbt プロジェクトをテストおよびデプロイする方法は多数あります。dbt では、[ベストプラクティスとされるワークフロー](https://docs.getdbt.com/best-practices/best-practice-workflows#pro-tips-for-workflows) や [CI ジョブ](https://docs.getdbt.com/docs/deploy/ci-jobs) に関する提案を提供しています。ここではいくつかの戦略について説明しますが、これらの戦略はユースケースに合わせて大きく調整する必要がある場合がある点に注意してください。 -#### シンプルなデータテストおよびユニットテストによる CI/CD +#### シンプルなデータテストおよびユニットテストによる CI/CD {#ci-with-simple-data-tests-and-unit-tests} CI パイプラインを手軽に立ち上げる方法の 1 つは、ジョブ内で ClickHouse クラスターを起動し、そのクラスターに対してモデルを実行することです。モデルを実行する前に、このクラスターにデモデータを挿入できます。[seed](https://docs.getdbt.com/reference/commands/seed) を使って、本番データのサブセットをステージング環境に投入することもできます。 @@ -157,7 +157,7 @@ CI パイプラインを手軽に立ち上げる方法の 1 つは、ジョブ CD ステップは、本番の ClickHouse クラスターに対して `dbt build` を実行するだけのシンプルなものにできます。 -#### より包括的な CI/CD ステージ: 最新のデータを使用し、影響を受けたモデルのみをテスト +#### より包括的な CI/CD ステージ: 最新のデータを使用し、影響を受けたモデルのみをテスト {#more-complete-ci-stage} 一般的な戦略として、変更されたモデル (およびその上流・下流の依存関係) のみを再デプロイする [Slim CI](https://docs.getdbt.com/best-practices/best-practice-workflows#run-only-modified-models-to-test-changes-slim-ci) ジョブを利用する方法があります。このアプローチでは、本番実行の成果物 (例: [dbt manifest](https://docs.getdbt.com/reference/artifacts/manifest-json)) を利用して、プロジェクトの実行時間を短縮し、環境間でスキーマのずれが生じないようにします。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md index 6207100b4fe..c64f4515c65 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md @@ -10,7 +10,7 @@ doc_type: 'guide' import PartnerBadge from '@theme/badges/PartnerBadge'; -# dlt を ClickHouse に接続する +# dlt を ClickHouse に接続する {#connect-dlt-to-clickhouse} @@ -18,9 +18,9 @@ import PartnerBadge from '@theme/badges/PartnerBadge'; -## ClickHouse と併せて dlt をインストールする +## ClickHouse と併せて dlt をインストールする {#install-dlt-with-clickhouse} -### ClickHouse の依存関係付きで `dlt` ライブラリをインストールするには: +### ClickHouse の依存関係付きで `dlt` ライブラリをインストールするには: {#to-install-the-dlt-library-with-clickhouse-dependencies} ```bash pip install "dlt[clickhouse]" @@ -99,7 +99,7 @@ ClickHouseサーバーが`http_port`で指定されたポートでHTTP接続を ```bash -# tomlファイルの先頭、セクション開始前に記述してください。 +# tomlファイルの先頭、セクション開始前に記述してください。 {#keep-it-at-the-top-of-your-toml-file-before-any-section-starts} destination.clickhouse.credentials="clickhouse://dlt:Dlt*12345789234567@localhost:9000/dlt?secure=1" ``` @@ -157,7 +157,7 @@ ClickHouse は、以下の
GCS テーブル関数 によって自動的に処理されます。 @@ -241,10 +241,10 @@ dlt はこれらの認証情報を ClickHouse に渡し、認証および GCS * filesystem destination を S3 互換モードで GCS と連携できるようにする * Google Cloud Storage ステージングエリアのサポート -### dbt サポート +### dbt サポート {#dbt-support} dbt との連携は、一般に dbt-clickhouse を通じてサポートされています。 -### `dlt` state の同期 +### `dlt` state の同期 {#syncing-of-dlt-state} この destination は、dlt state の同期を完全にサポートしています。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md index 254b24d6158..9f1ed82585a 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md @@ -14,7 +14,7 @@ keywords: ['fivetran', 'データ移動', 'ETL', 'ClickHouse 宛先', '自動化 import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Fivetran と ClickHouse Cloud +# Fivetran と ClickHouse Cloud {#fivetran-and-clickhouse-cloud} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md index 05f92a7548d..bd4aff29010 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md @@ -11,7 +11,7 @@ integration: - category: 'data_ingestion' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; import nifi01 from '@site/static/images/integrations/data-ingestion/etl-tools/nifi_01.png'; import nifi02 from '@site/static/images/integrations/data-ingestion/etl-tools/nifi_02.png'; @@ -31,7 +31,7 @@ import nifi15 from '@site/static/images/integrations/data-ingestion/etl-tools/ni import CommunityMaintainedBadge from '@theme/badges/CommunityMaintained'; -# Apache NiFiをClickHouseに接続する +# Apache NiFiをClickHouseに接続する {#connect-apache-nifi-to-clickhouse} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md index 934779a27bd..fad3e4819f6 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md @@ -18,8 +18,7 @@ import vector01 from '@site/static/images/integrations/data-ingestion/etl-tools/ import vector02 from '@site/static/images/integrations/data-ingestion/etl-tools/vector_02.png'; import PartnerBadge from '@theme/badges/PartnerBadge'; - -# Vector と ClickHouse の統合 +# Vector と ClickHouse の統合 {#integrating-vector-with-clickhouse} @@ -31,214 +30,202 @@ ClickHouse は、優れた圧縮率(ログでは最大 [170x](https://clickhou **前提条件:** -- ClickHouse がすでに稼働していること -- Vector がインストールされていること +* ClickHouse がすでに稼働していること +* Vector がインストールされていること + ## データベースとテーブルを作成する {#1-create-a-database-and-table} + ログイベントを保存するためのテーブルを定義します。 -## データベースとテーブルを作成する - -ログイベントを保存するためのテーブルを定義します。 - -1. まず、`nginxdb` という名前の新しいデータベースを作成します: - -```sql -CREATE DATABASE IF NOT EXISTS nginxdb -``` - -2. ログイベント全体を1つの文字列として挿入します。もちろん、この形式はログデータを分析するのに適したものではありませんが、その点は後ほど***マテリアライズドビュー***を使って解決していきます。 - -```sql -CREATE TABLE IF NOT EXISTS nginxdb.access_logs ( - message String -) -ENGINE = MergeTree() -ORDER BY tuple() -``` - -:::note -**ORDER BY** は、まだ主キーが不要なため、空のタプルである **tuple()** に設定されています。 -::: - - -## Nginx を構成する - -このステップでは、Nginx のログ出力を構成する方法を説明します。 - -1. 次の `access_log` プロパティは、ログを **combined** 形式で `/var/log/nginx/my_access.log` に出力します。 - この値は `nginx.conf` ファイルの `http` セクションに記述します: - -```bash -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - access_log /var/log/nginx/my_access.log combined; - sendfile on; - keepalive_timeout 65; - include /etc/nginx/conf.d/*.conf; -} -``` - -2. `nginx.conf` を変更した場合は、必ず Nginx を再起動してください。 - -3. Web サーバー上のページにアクセスして、アクセスログにログイベントをいくつか生成してください。 - **combined** 形式のログは次のようになります。 - -```bash -192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -192.168.208.1 - - [12/Oct/2021:03:31:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -``` - + 1. まず、`nginxdb` という名前の新しいデータベースを作成します: -## Vector を設定する + ```sql + CREATE DATABASE IF NOT EXISTS nginxdb + ``` -Vector はログ、メトリクス、トレース(**sources** と呼ばれます)を収集・変換・ルーティングし、ClickHouse を含む多数の異なるベンダー(**sinks** と呼ばれます)へ送信します。 -Source と sink は **vector.toml** という名前の設定ファイルで定義します。 + 2. ログイベント全体を1つの文字列として挿入します。もちろん、この形式はログデータを分析するのに適したものではありませんが、その点は後ほど***マテリアライズドビュー***を使って解決していきます。 -1. 次の **vector.toml** ファイルでは、**my_access.log** の末尾を tail する **file** 型の **source** と、上で定義した **access_logs** テーブルを **sink** として定義しています。 + ```sql + CREATE TABLE IF NOT EXISTS nginxdb.access_logs ( + message String + ) + ENGINE = MergeTree() + ORDER BY tuple() + ``` -```bash -[sources.nginx_logs] -type = "file" -include = [ "/var/log/nginx/my_access.log" ] -read_from = "end" + :::note + **ORDER BY** は、まだ主キーが不要なため、空のタプルである **tuple()** に設定されています。 + ::: -[sinks.clickhouse] -type = "clickhouse" -inputs = ["nginx_logs"] -endpoint = "http://clickhouse-server:8123" -database = "nginxdb" -table = "access_logs" -skip_unknown_fields = true -``` + ## Nginx を構成する {#2--configure-nginx} -2. 上記の構成を使用して Vector を起動します。ソースおよびシンクの定義についての詳細は、Vector の[ドキュメント](https://vector.dev/docs/)を参照してください。 + このステップでは、Nginx のログ出力を構成する方法を説明します。 -3. 次のクエリを実行して、アクセスログが ClickHouse に取り込まれていることを確認します。テーブル内にアクセスログが表示されるはずです。 + 1. 次の `access_log` プロパティは、ログを **combined** 形式で `/var/log/nginx/my_access.log` に出力します。 + この値は `nginx.conf` ファイルの `http` セクションに記述します: -```sql -SELECT * FROM nginxdb.access_logs -``` + ```bash + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log /var/log/nginx/my_access.log combined; + sendfile on; + keepalive_timeout 65; + include /etc/nginx/conf.d/*.conf; + } + ``` -テーブル形式で ClickHouse のログを表示する + 2. `nginx.conf` を変更した場合は、必ず Nginx を再起動してください。 + 3. Web サーバー上のページにアクセスして、アクセスログにログイベントをいくつか生成してください。 + **combined** 形式のログは次のようになります。 -## ログをパースする + ```bash + 192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + 192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + 192.168.208.1 - - [12/Oct/2021:03:31:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + ``` -ログを ClickHouse に保存できるのは有用ですが、各イベントを 1 つの文字列として保存するだけでは、十分なデータ分析は行えません。 -次に、[マテリアライズドビュー](/materialized-view/incremental-materialized-view) を使用してログイベントをどのようにパースするかを見ていきます。 + ## Vector を設定する {#3-configure-vector} -**マテリアライズドビュー** は、SQL における INSERT トリガーと同様に機能します。ソーステーブルにデータ行が挿入されると、マテリアライズドビューはそれらの行を変換し、その結果をターゲットテーブルに挿入します。 -マテリアライズドビューを設定して、**access_logs** 内のログイベントのパース済み表現を生成できます。 -そのようなログイベントの 1 つの例を以下に示します。 + Vector はログ、メトリクス、トレース(**sources** と呼ばれます)を収集・変換・ルーティングし、ClickHouse を含む多数の異なるベンダー(**sinks** と呼ばれます)へ送信します。 + Source と sink は **vector.toml** という名前の設定ファイルで定義します。 -```bash -192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -``` - -ClickHouse には、上記の文字列を解析するためのさまざまな関数があります。[`splitByWhitespace`](/sql-reference/functions/splitting-merging-functions#splitByWhitespace) 関数は、文字列を空白文字で分割し、各トークンを配列で返します。 -動作を確認するには、次のコマンドを実行します。 - -```sql title="Query" -SELECT splitByWhitespace('192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') -``` - -```text title="Response" -["192.168.208.1","-","-","[12/Oct/2021:15:32:43","+0000]","\"GET","/","HTTP/1.1\"","304","0","\"-\"","\"Mozilla/5.0","(Macintosh;","Intel","Mac","OS","X","10_15_7)","AppleWebKit/537.36","(KHTML,","like","Gecko)","Chrome/93.0.4577.63","Safari/537.36\""] -``` - -いくつかの文字列には余分な文字が含まれており、ユーザーエージェント(ブラウザ情報)は解析する必要はありませんでしたが、 -結果として得られた配列は、必要なものにかなり近い形になっています。 - -`splitByWhitespace` と同様に、[`splitByRegexp`](/sql-reference/functions/splitting-merging-functions#splitByRegexp) 関数は、正規表現に基づいて文字列を配列に分割します。 -次のコマンドを実行します。2 つの文字列が返されます。 - -```sql -SELECT splitByRegexp('\S \d+ "([^"]*)"', '192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') -``` - -2 番目に返される文字列が、ログから正常に解析されたユーザーエージェントであることに注目してください。 - -```text -["192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] \"GET / HTTP/1.1\" 30"," \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\""] -``` - -最終的な `CREATE MATERIALIZED VIEW` コマンドを見る前に、データをクリーンアップするために使用する、いくつかの関数をさらに確認しておきます。 -たとえば、`RequestMethod` の値は先頭に不要な二重引用符が付いた `"GET` になっています。 -この二重引用符を削除するには、[`trimBoth`(エイリアス `trim`)](/sql-reference/functions/string-functions#trimBoth) 関数を使用できます。 - -```sql -SELECT trim(LEADING '"' FROM '"GET') -``` - -時刻文字列は先頭に角括弧が付いており、ClickHouse が日付として解析できる形式にもなっていません。 -しかし、区切り文字をコロン(**:**)からカンマ(**,**)に変更すると、問題なく解析できるようになります: - -```sql -SELECT parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM '[12/Oct/2021:15:32:43'), ':', ' ')) -``` - - -これでマテリアライズドビューを定義する準備が整いました。 -以下の定義には `POPULATE` 句が含まれており、これは **access_logs** に既に存在する行がすぐに処理され、その場で挿入されることを意味します。 -次の SQL ステートメントを実行してください: - -```sql -CREATE MATERIALIZED VIEW nginxdb.access_logs_view -( - RemoteAddr String, - Client String, - RemoteUser String, - TimeLocal DateTime, - RequestMethod String, - Request String, - HttpVersion String, - Status Int32, - BytesSent Int64, - UserAgent String -) -ENGINE = MergeTree() -ORDER BY RemoteAddr -POPULATE AS -WITH - splitByWhitespace(message) as split, - splitByRegexp('\S \d+ "([^"]*)"', message) as referer -SELECT - split[1] AS RemoteAddr, - split[2] AS Client, - split[3] AS RemoteUser, - parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM split[4]), ':', ' ')) AS TimeLocal, - trim(LEADING '"' FROM split[6]) AS RequestMethod, - split[7] AS Request, - trim(TRAILING '"' FROM split[8]) AS HttpVersion, - split[9] AS Status, - split[10] AS BytesSent, - trim(BOTH '"' from referer[2]) AS UserAgent -FROM - (SELECT message FROM nginxdb.access_logs) -``` - -続いて、正しく動作しているか確認します。 -アクセスログが列ごとにきれいにパースされて表示されるはずです: - -```sql -SELECT * FROM nginxdb.access_logs_view -``` - -パース済みの ClickHouse ログをテーブル形式で表示 - -:::note -上記のレッスンではデータを 2 つのテーブルに保存しましたが、最初の `nginxdb.access_logs` テーブルを [`Null`](/engines/table-engines/special/null) テーブルエンジンを使用するように変更することもできます。 -パース済みデータは変わらず `nginxdb.access_logs_view` テーブルに格納されますが、生のデータはテーブルには保存されません。 -::: + 1. 次の **vector.toml** ファイルでは、**my_access.log** の末尾を tail する **file** 型の **source** と、上で定義した **access_logs** テーブルを **sink** として定義しています。 + ```bash + [sources.nginx_logs] + type = "file" + include = [ "/var/log/nginx/my_access.log" ] + read_from = "end" + + [sinks.clickhouse] + type = "clickhouse" + inputs = ["nginx_logs"] + endpoint = "http://clickhouse-server:8123" + database = "nginxdb" + table = "access_logs" + skip_unknown_fields = true + ``` + + 2. 上記の構成を使用して Vector を起動します。ソースおよびシンクの定義についての詳細は、Vector の[ドキュメント](https://vector.dev/docs/)を参照してください。 + + 3. 次のクエリを実行して、アクセスログが ClickHouse に取り込まれていることを確認します。テーブル内にアクセスログが表示されるはずです。 + + ```sql + SELECT * FROM nginxdb.access_logs + ``` + + テーブル形式で ClickHouse のログを表示する + + ## ログをパースする {#4-parse-the-logs} + + ログを ClickHouse に保存できるのは有用ですが、各イベントを 1 つの文字列として保存するだけでは、十分なデータ分析は行えません。 + 次に、[マテリアライズドビュー](/materialized-view/incremental-materialized-view) を使用してログイベントをどのようにパースするかを見ていきます。 + + **マテリアライズドビュー** は、SQL における INSERT トリガーと同様に機能します。ソーステーブルにデータ行が挿入されると、マテリアライズドビューはそれらの行を変換し、その結果をターゲットテーブルに挿入します。 + マテリアライズドビューを設定して、**access_logs** 内のログイベントのパース済み表現を生成できます。 + そのようなログイベントの 1 つの例を以下に示します。 + + ```bash + 192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + ``` + + ClickHouse には、上記の文字列を解析するためのさまざまな関数があります。[`splitByWhitespace`](/sql-reference/functions/splitting-merging-functions#splitByWhitespace) 関数は、文字列を空白文字で分割し、各トークンを配列で返します。 + 動作を確認するには、次のコマンドを実行します。 + + ```sql title="Query" + SELECT splitByWhitespace('192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') + ``` + + ```text title="Response" + ["192.168.208.1","-","-","[12/Oct/2021:15:32:43","+0000]","\"GET","/","HTTP/1.1\"","304","0","\"-\"","\"Mozilla/5.0","(Macintosh;","Intel","Mac","OS","X","10_15_7)","AppleWebKit/537.36","(KHTML,","like","Gecko)","Chrome/93.0.4577.63","Safari/537.36\""] + ``` + + いくつかの文字列には余分な文字が含まれており、ユーザーエージェント(ブラウザ情報)は解析する必要はありませんでしたが、 + 結果として得られた配列は、必要なものにかなり近い形になっています。 + + `splitByWhitespace` と同様に、[`splitByRegexp`](/sql-reference/functions/splitting-merging-functions#splitByRegexp) 関数は、正規表現に基づいて文字列を配列に分割します。 + 次のコマンドを実行します。2 つの文字列が返されます。 + + ```sql + SELECT splitByRegexp('\S \d+ "([^"]*)"', '192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') + ``` + + 2 番目に返される文字列が、ログから正常に解析されたユーザーエージェントであることに注目してください。 + + ```text + ["192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] \"GET / HTTP/1.1\" 30"," \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\""] + ``` + + 最終的な `CREATE MATERIALIZED VIEW` コマンドを見る前に、データをクリーンアップするために使用する、いくつかの関数をさらに確認しておきます。 + たとえば、`RequestMethod` の値は先頭に不要な二重引用符が付いた `"GET` になっています。 + この二重引用符を削除するには、[`trimBoth`(エイリアス `trim`)](/sql-reference/functions/string-functions#trimBoth) 関数を使用できます。 + + ```sql + SELECT trim(LEADING '"' FROM '"GET') + ``` + + 時刻文字列は先頭に角括弧が付いており、ClickHouse が日付として解析できる形式にもなっていません。 + しかし、区切り文字をコロン(**:**)からカンマ(**,**)に変更すると、問題なく解析できるようになります: + + ```sql + SELECT parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM '[12/Oct/2021:15:32:43'), ':', ' ')) + ``` + + これでマテリアライズドビューを定義する準備が整いました。 + 以下の定義には `POPULATE` 句が含まれており、これは **access_logs** に既に存在する行がすぐに処理され、その場で挿入されることを意味します。 + 次の SQL ステートメントを実行してください: + + ```sql + CREATE MATERIALIZED VIEW nginxdb.access_logs_view + ( + RemoteAddr String, + Client String, + RemoteUser String, + TimeLocal DateTime, + RequestMethod String, + Request String, + HttpVersion String, + Status Int32, + BytesSent Int64, + UserAgent String + ) + ENGINE = MergeTree() + ORDER BY RemoteAddr + POPULATE AS + WITH + splitByWhitespace(message) as split, + splitByRegexp('\S \d+ "([^"]*)"', message) as referer + SELECT + split[1] AS RemoteAddr, + split[2] AS Client, + split[3] AS RemoteUser, + parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM split[4]), ':', ' ')) AS TimeLocal, + trim(LEADING '"' FROM split[6]) AS RequestMethod, + split[7] AS Request, + trim(TRAILING '"' FROM split[8]) AS HttpVersion, + split[9] AS Status, + split[10] AS BytesSent, + trim(BOTH '"' from referer[2]) AS UserAgent + FROM + (SELECT message FROM nginxdb.access_logs) + ``` + + 続いて、正しく動作しているか確認します。 + アクセスログが列ごとにきれいにパースされて表示されるはずです: + + ```sql + SELECT * FROM nginxdb.access_logs_view + ``` + + パース済みの ClickHouse ログをテーブル形式で表示 + + :::note + 上記のレッスンではデータを 2 つのテーブルに保存しましたが、最初の `nginxdb.access_logs` テーブルを [`Null`](/engines/table-engines/special/null) テーブルエンジンを使用するように変更することもできます。 + パース済みデータは変わらず `nginxdb.access_logs_view` テーブルに格納されますが、生のデータはテーブルには保存されません。 + ::: > シンプルなインストールと短時間の設定だけで利用できる Vector を使うと、Nginx サーバーからのログを ClickHouse のテーブルに送信できます。マテリアライズドビューを使用すれば、それらのログを列にパースして、より簡単に分析できるようにできます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md index 3bcf12710e0..0e0d4eafddb 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md @@ -8,13 +8,13 @@ doc_type: 'guide' keywords: ['Google Cloud Storage ClickHouse', 'GCS ClickHouse 統合', 'GCS バックエンド MergeTree', 'ClickHouse GCS ストレージ', 'Google Cloud ClickHouse'] --- -import BucketDetails from '@site/docs/_snippets/_GCS_authentication_and_bucket.md'; +import BucketDetails from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_GCS_authentication_and_bucket.md'; import Image from '@theme/IdealImage'; import GCS_examine_bucket_1 from '@site/static/images/integrations/data-ingestion/s3/GCS-examine-bucket-1.png'; import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestion/s3/GCS-examine-bucket-2.png'; -# Google Cloud Storage を ClickHouse と統合する +# Google Cloud Storage を ClickHouse と統合する {#integrate-google-cloud-storage-with-clickhouse} :::note [Google Cloud](https://cloud.google.com) 上の ClickHouse Cloud を利用している場合、このページは対象外です。サービスはすでに [Google Cloud Storage](https://cloud.google.com/storage) を使用しているためです。GCS から `SELECT` または `INSERT` でデータを扱いたい場合は、[`gcs` テーブル関数](/sql-reference/table-functions/gcs) を参照してください。 @@ -24,13 +24,13 @@ ClickHouse は、ストレージとコンピュートを分離したいユーザ -## GCS バックエンドの MergeTree +## GCS バックエンドの MergeTree {#gcs-backed-mergetree} -### ディスクの作成 +### ディスクの作成 {#creating-a-disk} GCS バケットをディスクとして利用するには、まず `conf.d` 配下のファイルで ClickHouse の設定にディスクを定義する必要があります。GCS ディスク定義の例を以下に示します。この設定には、GCS の「disk」、キャッシュ、およびテーブルを GCS ディスク上に作成する際に DDL クエリで指定されるポリシーを構成するための複数のセクションが含まれます。それぞれについて以下で説明します。 -#### Storage configuration > disks > gcs +#### Storage configuration > disks > gcs {#storage_configuration--disks--gcs} この設定の該当部分はハイライトされているセクションであり、次の内容を指定します。 @@ -68,7 +68,7 @@ GCS バケットをディスクとして利用するには、まず `conf.d` 配
``` -#### ストレージ設定 > disks > cache +#### ストレージ設定 > disks > cache {#storage_configuration--disks--cache} 次の例の設定では、ディスク `gcs` に対して 10Gi のメモリ キャッシュを有効化します。 @@ -106,7 +106,7 @@ GCS バケットをディスクとして利用するには、まず `conf.d` 配
``` -#### Storage configuration > policies > gcs_main +#### Storage configuration > policies > gcs_main {#storage_configuration--policies--gcs_main} ストレージ構成ポリシーを使用すると、データを保存する場所を選択できます。以下でハイライトされているポリシーでは、ポリシー `gcs_main` を指定することで、ディスク `gcs` 上にデータを保存できます。たとえば、`CREATE TABLE ... SETTINGS storage_policy='gcs_main'` のように指定します。 @@ -141,7 +141,7 @@ GCS バケットをディスクとして利用するには、まず `conf.d` 配 このディスク定義に関連するすべての設定項目の一覧は[こちら](/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)にあります。 -### テーブルの作成 +### テーブルの作成 {#creating-a-table} 書き込み権限のあるバケットを使用するようにディスクを設定してあると仮定すると、以下の例のようなテーブルを作成できるはずです。簡潔にするため、NYC タクシー データセットのカラムの一部のみを使用し、データを GCS をバックエンドとするテーブルに直接ストリーミングします。 @@ -179,11 +179,11 @@ INSERT INTO trips_gcs SELECT trip_id, pickup_date, pickup_datetime, dropoff_date SELECT passenger_count, avg(tip_amount) AS avg_tip, avg(total_amount) AS avg_amount FROM trips_gcs GROUP BY passenger_count; ``` -### レプリケーションの処理 +### レプリケーションの処理 {#handling-replication} GCS ディスクを用いたレプリケーションは、`ReplicatedMergeTree` テーブルエンジンを使用することで実現できます。詳細については、[GCS を使用して 2 つの GCP リージョン間で単一シャードをレプリケートする](#gcs-multi-region) ガイドを参照してください。 -### さらに詳しく +### さらに詳しく {#learn-more} [Cloud Storage XML API](https://cloud.google.com/storage/docs/xml-api/overview) は、Amazon Simple Storage Service (Amazon S3) などのサービスで動作する一部のツールおよびライブラリと相互運用性があります。 @@ -305,13 +305,13 @@ ClickHouse Keeper ノードでデプロイメント手順を実行する際は
``` -### ClickHouse サーバーを構成する +### ClickHouse サーバーを構成する {#configure-clickhouse-server} :::note best practice このガイドのいくつかの手順では、設定ファイルを `/etc/clickhouse-server/config.d/` に配置するように求められます。これは、Linux システムにおける設定オーバーライド用ファイルのデフォルトの配置場所です。このディレクトリにファイルを配置すると、ClickHouse はその内容をデフォルト設定とマージします。`config.d` ディレクトリにこれらのファイルを置くことで、アップグレード時に設定が失われるのを防ぐことができます。 ::: -#### ネットワーキング +#### ネットワーキング {#networking} デフォルトでは、ClickHouse はループバックインターフェイスで待ち受けますが、レプリケーション構成ではマシン間のネットワーク接続が必要です。すべてのインターフェイスで待ち受けるには、次のように設定します。 @@ -321,7 +321,7 @@ ClickHouse Keeper ノードでデプロイメント手順を実行する際は ``` -#### リモート ClickHouse Keeper サーバー +#### リモート ClickHouse Keeper サーバー {#remote-clickhouse-keeper-servers} レプリケーションは ClickHouse Keeper によって制御されます。この設定ファイルでは、ClickHouse Keeper ノードをホスト名とポート番号で識別します。 @@ -346,7 +346,7 @@ ClickHouse Keeper ノードでデプロイメント手順を実行する際は ``` -#### リモート ClickHouse サーバー +#### リモート ClickHouse サーバー {#remote-clickhouse-servers} このファイルでは、クラスタ内の各 ClickHouse サーバーのホスト名とポートを設定します。デフォルトの設定ファイルにはサンプルのクラスタ定義が含まれています。完全に構成されたクラスタのみを使用するために、この設定がデフォルト設定とマージされた際に `remote_servers` セクションへ追加されるのではなく、その内容を置き換えるよう、`remote_servers` エントリにはタグ `replace="true"` が追加されています。 @@ -372,7 +372,7 @@ ClickHouse Keeper ノードでデプロイメント手順を実行する際は ``` -#### レプリカの識別 +#### レプリカの識別 {#replica-identification} このファイルでは、ClickHouse Keeper 上のパスに関連する設定を行います。具体的には、データがどのレプリカに属しているかを識別するためのマクロを設定します。1 台目のサーバーではレプリカを `replica_1`、もう一方のサーバーでは `replica_2` と指定します。名前は変更しても構いません。たとえば、1 つのレプリカをサウスカロライナ、もう 1 つをノーザンバージニアに配置する例に基づくと、値は `carolina` と `virginia` のようにしてもかまいません。ただし、各マシンで異なる値になるようにしてください。 @@ -390,7 +390,7 @@ ClickHouse Keeper ノードでデプロイメント手順を実行する際は ``` -#### GCS でのストレージ +#### GCS でのストレージ {#storage-in-gcs} ClickHouse のストレージ構成には `disks` と `policies` が含まれます。以下で構成しているディスク名は `gcs` で、`type` は `s3` です。`type` が s3 になっているのは、ClickHouse が GCS バケットに対して、AWS S3 バケットと同様の方法でアクセスするためです。この構成は 2 部用意し、ClickHouse サーバーノードごとに 1 つずつ使用します。 @@ -438,7 +438,7 @@ ClickHouse のストレージ構成には `disks` と `policies` が含まれま ``` -### ClickHouse Keeper を起動する +### ClickHouse Keeper を起動する {#start-clickhouse-keeper} お使いのオペレーティングシステム向けのコマンドを使用してください。たとえば、次のとおりです。 @@ -448,7 +448,7 @@ sudo systemctl start clickhouse-keeper sudo systemctl status clickhouse-keeper ``` -#### ClickHouse Keeper のステータスを確認する +#### ClickHouse Keeper のステータスを確認する {#check-clickhouse-keeper-status} `netcat` を使って ClickHouse Keeper にコマンドを送信します。たとえば、`mntr` は ClickHouse Keeper クラスターの状態を返します。各 Keeper ノードでこのコマンドを実行すると、1 つがリーダーで、残りの 2 つがフォロワーであることがわかります。 @@ -464,11 +464,11 @@ zk_max_latency 11 zk_min_latency 0 zk_packets_received 1783 zk_packets_sent 1783 -# highlight-start +# highlight-start {#highlight-start} zk_num_alive_connections 2 zk_outstanding_requests 0 zk_server_state leader -# highlight-end +# highlight-end {#highlight-end} zk_znode_count 135 zk_watch_count 8 zk_ephemerals_count 3 @@ -477,13 +477,13 @@ zk_key_arena_size 28672 zk_latest_snapshot_size 0 zk_open_file_descriptor_count 182 zk_max_file_descriptor_count 18446744073709551615 -# highlight-start +# highlight-start {#highlight-start} zk_followers 2 zk_synced_followers 2 -# highlight-end +# highlight-end {#highlight-end} ``` -### ClickHouse サーバーを起動する +### ClickHouse サーバーを起動する {#start-clickhouse-server} `chnode1` と `chnode` で以下を実行します。 @@ -495,9 +495,9 @@ sudo service clickhouse-server start sudo service clickhouse-server status ``` -### 検証 +### 検証 {#verification} -#### ディスク構成の検証 +#### ディスク構成の検証 {#verify-disk-configuration} `system.disks` には、各ディスクのレコードが含まれている必要があります: @@ -565,7 +565,7 @@ cache_path: 3 行が結果セットに含まれています。経過時間: 0.002 秒。 ```` -#### クラスタ上で作成されたテーブルが両ノードに作成されていることを確認する +#### クラスタ上で作成されたテーブルが両ノードに作成されていることを確認する {#verify-that-tables-created-on-the-cluster-are-created-on-both-nodes} ```sql -- highlight-next-line create table trips on cluster 'cluster_1S_2R' ( @@ -600,7 +600,7 @@ SETTINGS storage_policy='gcs_main' 2行のデータセット。経過時間: 0.641秒 ``` -#### データを挿入できることを確認する +#### データを挿入できることを確認する {#verify-that-data-can-be-inserted} ```sql INSERT INTO trips SELECT @@ -621,7 +621,7 @@ FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz' LIMIT 1000000 ``` -#### テーブルでストレージポリシー `gcs_main` が使用されていることを確認します。 +#### テーブルでストレージポリシー `gcs_main` が使用されていることを確認します。 {#verify-that-the-storage-policy-gcs_main-is-used-for-the-table} ```sql SELECT @@ -647,14 +647,14 @@ formatReadableSize(total_bytes): 36.42 MiB 1行を取得しました。経過時間: 0.002秒 ``` -#### Google Cloud コンソールでの確認 +#### Google Cloud コンソールでの確認 {#verify-in-google-cloud-console} バケットを確認すると、`storage.xml` 構成ファイルで指定した名前のフォルダが、各バケット内に作成されていることがわかります。フォルダを展開すると、多数のファイルがあり、これらがデータパーティションを表しています。 -#### レプリカ 1 用バケット +#### レプリカ 1 用バケット {#bucket-for-replica-one} Google Cloud Storage におけるレプリカ 1 のバケット。データパーティションを含むフォルダ構造が表示されている -#### レプリカ 2 用バケット +#### レプリカ 2 用バケット {#bucket-for-replica-two} Google Cloud Storage におけるレプリカ 2 のバケット。データパーティションを含むフォルダ構造が表示されている diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md index e05c5a858e1..170b5f065a5 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md @@ -11,7 +11,7 @@ keywords: ['Google Dataflow ClickHouse', 'Dataflow ClickHouse integration', 'Apa import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Google Dataflow と ClickHouse の統合 +# Google Dataflow と ClickHouse の統合 {#integrating-google-dataflow-with-clickhouse} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md index def78a71397..9262e134ff7 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md @@ -11,7 +11,7 @@ keywords: ['Dataflow Java Runner', 'Google Dataflow ClickHouse', 'Apache Beam Ja import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Dataflow Java ランナー +# Dataflow Java ランナー {#dataflow-java-runner} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md index 03b9690b8ad..45ccd449073 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md @@ -11,7 +11,7 @@ keywords: ['google dataflow', 'gcp', 'データパイプライン', 'テンプ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Google Dataflow テンプレート +# Google Dataflow テンプレート {#google-dataflow-templates} diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md index 13f288394fc..c6f666db706 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md @@ -19,7 +19,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Dataflow BigQuery から ClickHouse へのテンプレート +# Dataflow BigQuery から ClickHouse へのテンプレート {#dataflow-bigquery-to-clickhouse-template} BigQuery から ClickHouse への Dataflow テンプレートは、BigQuery テーブルから ClickHouse テーブルへデータをバッチで取り込むパイプラインです。 このテンプレートは、テーブル全体を読み取ることも、指定された SQL クエリを使用して特定のレコードに絞り込むこともできます。 diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md index 332f305972b..a6bf3d5162b 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md @@ -9,7 +9,7 @@ doc_type: 'guide' keywords: ['ローカルファイル インポート ClickHouse', 'ClickHouse ローカルファイル インポート', 'clickhouse-client ファイルアップロード'] --- -# ローカルファイルの挿入 +# ローカルファイルの挿入 {#insert-local-files} `clickhouse-client` を使用して、ローカルファイルを ClickHouse サービスにストリーミングできます。これにより、ClickHouse が備える数多くの強力かつ便利な関数を使ってデータを前処理できます。例を見てみましょう... @@ -79,7 +79,6 @@ LIMIT 7 結果は以下のとおりです。 - ```response │ 488 │ comment │ mynameishere │ 2007-02-22 14:48:18 │ "It's too bad. Javascript-in-the-browser and Ajax are both nasty hacks that force programmers to do all sorts of shameful things. And the result is--wanky html tricks. Java, for its faults, is fairly clean when run in the applet environment. It has every superiority over JITBAJAX, except for install issues and a chunky load process. Yahoo games seems like just about the only applet success story. Of course, back in the day, non-trivial Applets tended to be too large for the dial-up accounts people had. At least that is changed." │ [454927] │ ['It','s','too','bad','Javascript','in','the','browser','and','Ajax','are','both','nasty','hacks','that','force','programmers','to','do','all','sorts','of','shameful','things','And','the','result','is','wanky','html','tricks','Java','for','its','faults','is','fairly','clean','when','run','in','the','applet','environment','It','has','every','superiority','over','JITBAJAX','except','for','install','issues','and','a','chunky','load','process','Yahoo','games','seems','like','just','about','the','only','applet','success','story','Of','course','back','in','the','day','non','trivial','Applets','tended','to','be','too','large','for','the','dial','up','accounts','people','had','At','least','that','is','changed'] │ │ 575 │ comment │ leoc │ 2007-02-23 00:09:49 │ "I can't find the reference now, but I *think* I've just read something suggesting that the install process for an Apollo applet will involve an "install-this-application?" confirmation dialog followed by a download of 30 seconds or so. If so then Apollo's less promising than I hoped. That kind of install may be low-friction by desktop-app standards but it doesn't compare to the ease of starting a browser-based AJAX or Flash application. (Consider how easy it is to use maps.google.com for the first time.)

Surely it will at least be that Apollo applications will run untrusted by default, and that an already-installed app will start automatically whenever you take your browser to the URL you downloaded it from?" │ [455071] │ ['I','can','t','find','the','reference','now','but','I','think','I','ve','just','read','something','suggesting','that','the','install','process','for','an','Apollo','applet','will','involve','an','34','install','this','application','34','confirmation','dialog','followed','by','a','download','of','30','seconds','or','so','If','so','then','Apollo','s','less','promising','than','I','hoped','That','kind','of','install','may','be','low','friction','by','desktop','app','standards','but','it','doesn','t','compare','to','the','ease','of','starting','a','browser','based','AJAX','or','Flash','application','Consider','how','easy','it','is','to','use','maps','google','com','for','the','first','time','p','Surely','it','will','at','least','be','that','Apollo','applications','will','run','untrusted','by','default','and','that','an','already','installed','app','will','start','automatically','whenever','you','take','your','browser','to','the','URL','you','downloaded','it','from'] │ diff --git a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md index d817065d007..99485d24e43 100644 --- a/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md +++ b/i18n/jp/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md @@ -12,11 +12,11 @@ integration: - website: 'https://clickhouse.com/cloud/clickpipes' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/jp/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; -# Confluent Cloud と ClickHouse との連携 +# Confluent Cloud と ClickHouse との連携 {#integrating-confluent-cloud-with-clickhouse}

\ No newline at end of file + + + + +fullscreen; +picture-in-picture" + allowfullscreen + />
-
+
Существует несколько вариантов миграции данных в ClickHouse Cloud в зависимости от того, где сейчас находятся ваши данные: -- [Self-managed to Cloud](/cloud/migration/clickhouse-to-cloud): используйте функцию `remoteSecure` для переноса данных -- [Another DBMS](/cloud/migration/clickhouse-local): используйте ETL-инструмент [clickhouse-local] вместе с соответствующей табличной функцией ClickHouse для вашей текущей СУБД -- [Anywhere!](/cloud/migration/etl-tool-to-clickhouse): используйте один из множества популярных ETL/ELT-инструментов, которые подключаются к самым разным источникам данных -- [Object Storage](/integrations/migration/object-storage-to-clickhouse): просто загружайте данные из S3 в ClickHouse +* [Self-managed to Cloud](/cloud/migration/clickhouse-to-cloud): используйте функцию `remoteSecure` для переноса данных +* [Another DBMS](/cloud/migration/clickhouse-local): используйте ETL-инструмент [clickhouse-local] вместе с соответствующей табличной функцией ClickHouse для вашей текущей СУБД +* [Anywhere!](/cloud/migration/etl-tool-to-clickhouse): используйте один из множества популярных ETL/ELT-инструментов, которые подключаются к самым разным источникам данных +* [Object Storage](/integrations/migration/object-storage-to-clickhouse): просто загружайте данные из S3 в ClickHouse В примере [Migrate from Redshift](/migrations/redshift/migration-guide) мы приводим три способа миграции данных в ClickHouse. \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md index a95770adac4..d64cbafdc04 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# Сравнение ClickHouse с PostgreSQL +# Сравнение ClickHouse с PostgreSQL {#comparing-clickhouse-and-postgresql} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md index 8b1fb22997e..de3376e2b83 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md @@ -129,7 +129,7 @@ ClickHouse обеспечивает свойства ACID при [огранич -## Сжатие +## Сжатие {#compression} Колоночное хранилище ClickHouse означает, что степень сжатия часто будет значительно выше по сравнению с Postgres. Ниже показано, как отличаются требования к хранилищу для всех таблиц Stack Overflow в обеих базах данных: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md index 251b14c75f0..d9a55d4d96d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md @@ -31,49 +31,49 @@ import Image from '@theme/IdealImage'; ```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 +# posts {#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 +# posthistory {#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 +# postlinks {#postlinks} wget [https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz](https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz) gzip -d postlinks.sql.gz @@ -87,9 +87,9 @@ psql < postlinks.sql ``` -## Миграция данных +## Миграция данных {#migrating-data} -### Репликация в режиме реального времени (CDC) +### Репликация в режиме реального времени (CDC) {#real-time-replication-or-cdc} Обратитесь к этому [руководству](/integrations/clickpipes/postgres), чтобы настроить ClickPipes для PostgreSQL. В нём рассматриваются многие типы исходных экземпляров Postgres. @@ -125,7 +125,7 @@ ORDER BY id; После настройки ClickPipes начинает миграцию всех данных из PostgreSQL в ClickHouse. В зависимости от сети и масштаба развертывания для набора данных Stack Overflow это должно занять всего несколько минут. -### Ручная массовая загрузка с периодическими обновлениями +### Ручная массовая загрузка с периодическими обновлениями {#initial-bulk-load-with-periodic-updates} При использовании ручного подхода первоначальная массовая загрузка набора данных может быть выполнена с помощью: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md index 5e942043279..7eb2f2f4140 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md @@ -21,7 +21,7 @@ doc_type: 'guide' -## Оптимизация запросов в ClickHouse +## Оптимизация запросов в ClickHouse {#optimize-queries-in-clickhouse} Хотя можно выполнить миграцию с минимальной переработкой запросов, рекомендуется использовать возможности ClickHouse, чтобы существенно упростить запросы и дополнительно улучшить их производительность. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md index b3d641f0702..225bb153a08 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md @@ -49,7 +49,7 @@ import Image from '@theme/IdealImage'; -## Партиции +## Партиции {#partitions} Пользователям Postgres знакома концепция партиционирования таблиц, которая используется для повышения производительности и управляемости крупных баз данных за счёт разделения таблиц на более мелкие, удобные в обслуживании части, называемые партициями. Такое партиционирование может выполняться по диапазону значений для указанного столбца (например, по датам), по заданным спискам или по хешу ключа. Это позволяет администраторам организовывать данные на основе конкретных критериев, таких как диапазоны дат или географические регионы. Партиционирование помогает улучшить производительность запросов за счёт более быстрого доступа к данным через отсечение партиций (partition pruning) и более эффективного индексирования. Оно также упрощает задачи обслуживания, такие как резервное копирование и очистка данных, позволяя выполнять операции над отдельными партициями, а не над всей таблицей целиком. Кроме того, партиционирование может существенно повысить масштабируемость баз данных PostgreSQL за счёт распределения нагрузки по нескольким партициям. @@ -76,7 +76,7 @@ PARTITION BY toYear(CreationDate) Для полного описания партиционирования см. ["Партиции таблиц"](/partitions). -### Применение партиционирования +### Применение партиционирования {#applications-of-partitions} Партиционирование в ClickHouse имеет схожие области применения с Postgres, но с некоторыми тонкими отличиями. В частности: @@ -132,7 +132,7 @@ Ok. -## Материализованные представления и проекции +## Материализованные представления и проекции {#materialized-views-vs-projections} Postgres позволяет создавать несколько индексов для одной таблицы, что позволяет оптимизировать ее под различные паттерны доступа. Эта гибкость позволяет администраторам и разработчикам настраивать производительность базы данных под конкретные запросы и операционные потребности. Концепция проекций в ClickHouse, хотя и не является полной аналогией этого, позволяет пользователям задавать несколько выражений `ORDER BY` для таблицы. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md index d46e2ba546a..d92e3e2e0c1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md @@ -12,7 +12,7 @@ import bigquery_1 from '@site/static/images/migrations/bigquery-1.png'; import Image from '@theme/IdealImage'; -# Сравнение ClickHouse Cloud и BigQuery +# Сравнение ClickHouse Cloud и BigQuery {#comparing-clickhouse-cloud-and-bigquery} @@ -186,7 +186,7 @@ ClickHouse использует стандартный SQL с множество -## Массивы +## Массивы {#arrays} По сравнению с восемью функциями работы с массивами в BigQuery, в ClickHouse доступно более 80 [встроенных функций для работы с массивами](/sql-reference/functions/array-functions), которые позволяют элегантно и просто моделировать и решать широкий круг задач. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md index 9354bd14098..4e904afd8dd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md @@ -75,7 +75,7 @@ CDC (фиксация изменений данных) — это процесс -## Проектирование схем +## Проектирование схем {#designing-schemas} Набор данных Stack Overflow содержит ряд связанных таблиц. Рекомендуем сначала сосредоточиться на миграции основной таблицы. Это не обязательно самая большая таблица, а та, по которой вы ожидаете получать больше всего аналитических запросов. Это позволит вам познакомиться с основными концепциями ClickHouse. По мере добавления дополнительных таблиц структура этой таблицы может потребовать пересмотра, чтобы в полной мере использовать возможности ClickHouse и обеспечить оптимальную производительность. Мы рассматриваем этот процесс моделирования в нашей [документации по моделированию данных](/data-modeling/schema-design#next-data-modeling-techniques). @@ -108,7 +108,7 @@ CREATE TABLE stackoverflow.posts ( ); ``` -### Оптимизация типов +### Оптимизация типов {#optimizing-types} Применение процесса, [описанного здесь](/data-modeling/schema-design), приводит к следующей схеме: @@ -174,11 +174,11 @@ INSERT INTO stackoverflow.posts SELECT * FROM gcs( 'gs://clickhouse-public-datas -## Подходы к моделированию данных +## Подходы к моделированию данных {#data-modeling-techniques} Мы рекомендуем пользователям, мигрирующим с BigQuery, ознакомиться с [руководством по моделированию данных в ClickHouse](/data-modeling/schema-design). В этом руководстве используется тот же набор данных Stack Overflow и рассматриваются несколько подходов с использованием возможностей ClickHouse. -### Партиционирование +### Партиционирование {#partitions} Пользователи BigQuery знакомы с концепцией партиционирования таблиц, которая повышает производительность и управляемость крупных баз данных за счёт деления таблиц на более мелкие, удобные для управления части, называемые партициями. Такое партиционирование может осуществляться с использованием диапазона по заданному столбцу (например, по датам), определённых списков или хеша по ключу. Это позволяет администраторам организовывать данные на основе конкретных критериев, таких как диапазоны дат или географическое расположение. @@ -205,7 +205,7 @@ ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) PARTITION BY toYear(CreationDate) ``` -#### Применение +#### Применение {#applications} Разбиение на разделы (partitioning) в ClickHouse имеет сходные области применения с BigQuery, но и некоторые тонкие отличия. В частности: @@ -259,7 +259,7 @@ Ok. -## Материализованные представления и проекции +## Материализованные представления и проекции {#materialized-views-vs-projections} Концепция проекций в ClickHouse позволяет задавать для одной таблицы несколько вариантов `ORDER BY`. @@ -413,7 +413,7 @@ WHERE UserId = 8592047 ``` -## Переписывание запросов BigQuery на ClickHouse +## Переписывание запросов BigQuery на ClickHouse {#rewriting-bigquery-queries-in-clickhouse} Ниже приведены примеры запросов для сравнения BigQuery и ClickHouse. Этот список призван показать, как использовать возможности ClickHouse для значительного упрощения запросов. В примерах используется полный набор данных Stack Overflow (до апреля 2024 года включительно). @@ -481,7 +481,7 @@ LIMIT 5 ``` -## Агрегатные функции +## Агрегатные функции {#aggregate-functions} Где это возможно, пользователям следует использовать агрегатные функции ClickHouse. Ниже показано использование [функции `argMax`](/sql-reference/aggregate-functions/reference/argmax) для вычисления самого просматриваемого вопроса за каждый год. @@ -536,7 +536,7 @@ Peak memory usage: 377.26 MiB. ``` -## Условные выражения и массивы +## Условные выражения и массивы {#conditionals-and-arrays} Условные выражения и функции для работы с массивами значительно упрощают запросы. Следующий запрос вычисляет теги (встречающиеся более 10 000 раз) с наибольшим процентным ростом с 2022 по 2023 год. Обратите внимание, насколько лаконичен следующий запрос ClickHouse благодаря условным выражениям, функциям для работы с массивами и возможности повторно использовать псевдонимы в предложениях `HAVING` и `SELECT`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md index 58487c10548..0907106fb45 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md @@ -30,7 +30,7 @@ _Это руководство подходит для ClickHouse Cloud и дл -## Экспорт данных таблицы в GCS +## Экспорт данных таблицы в GCS {#1-export-table-data-to-gcs} На этом шаге мы используем [рабочую область BigQuery SQL](https://cloud.google.com/bigquery/docs/bigquery-web-ui) для выполнения SQL-команд. Ниже мы экспортируем таблицу BigQuery с именем `mytable` в бакет GCS с помощью оператора [`EXPORT DATA`](https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements). @@ -67,7 +67,7 @@ END WHILE; * Parquet как колоночный формат является более подходящим форматом обмена данными, поскольку он изначально сжат и позволяет BigQuery быстрее выполнять экспорт, а ClickHouse — быстрее выполнять запросы. -## Импорт данных в ClickHouse из GCS +## Импорт данных в ClickHouse из GCS {#2-importing-data-into-clickhouse-from-gcs} После завершения экспорта мы можем импортировать эти данные в таблицу ClickHouse. Вы можете использовать [консоль ClickHouse SQL](/integrations/sql-clients/sql-console) или [`clickhouse-client`](/interfaces/cli) для выполнения приведённых ниже команд. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md index 8a7ad8b4166..9fec245b382 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md @@ -13,7 +13,7 @@ import cloud_architecture from '@site/static/images/cloud/onboard/discover/use_c import Image from '@theme/IdealImage'; -# Миграция с Snowflake на ClickHouse +# Миграция с Snowflake на ClickHouse {#snowflake-to-clickhouse-migration} > Этот документ является введением в миграцию данных из Snowflake в ClickHouse. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md index 974b5cb07dd..419371e52c6 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md @@ -12,7 +12,7 @@ import migrate_snowflake_clickhouse from '@site/static/images/migrations/migrate import Image from '@theme/IdealImage'; -# Миграция из Snowflake в ClickHouse +# Миграция из Snowflake в ClickHouse {#migrate-from-snowflake-to-clickhouse} > В этом руководстве описывается процесс миграции данных из Snowflake в ClickHouse. @@ -24,7 +24,7 @@ import Image from '@theme/IdealImage'; -## Экспорт данных из Snowflake +## Экспорт данных из Snowflake {#1-exporting-data-from-snowflake} Миграция с Snowflake на ClickHouse @@ -62,7 +62,7 @@ COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 heade Для набора данных объемом около 5 ТБ с максимальным размером файла 150 МБ и при использовании виртуального склада Snowflake типа 2X-Large, расположенного в том же регионе AWS `us-east-1`, копирование данных в бакет S3 займет примерно 30 минут. -## Импорт в ClickHouse +## Импорт в ClickHouse {#2-importing-to-clickhouse} После того как данные размещены во временном объектном хранилище, функции ClickHouse, такие как [табличная функция s3](/sql-reference/table-functions/s3), можно использовать для вставки данных в таблицу, как показано ниже. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md index bdfc01b1a38..1cd3450242b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md @@ -10,7 +10,7 @@ doc_type: 'guide' -# Руководство по преобразованию SQL-запросов Snowflake +# Руководство по преобразованию SQL-запросов Snowflake {#snowflake-sql-translation-guide} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md index 88fe3de3174..8365ea362ee 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md @@ -8,6 +8,6 @@ show_related_blogs: true doc_type: 'landing-page' --- -# Миграция с Elasticsearch на ClickHouse +# Миграция с Elasticsearch на ClickHouse {#elasticsearch-to-clickhouse-migration} Для сценариев наблюдаемости см. документацию по миграции [с Elasticsearch на ClickStack](/use-cases/observability/clickstack/migration/elastic). \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md index 860c119f448..852d600c25c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# Миграция с Amazon Redshift на ClickHouse +# Миграция с Amazon Redshift на ClickHouse {#amazon-redshift-to-clickhouse-migration} > Этот документ является вводным руководством по миграции данных из Amazon Redshift в ClickHouse. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md index 54a3d34c932..9c30be7822e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md @@ -7,9 +7,8 @@ title: 'Руководство по миграции с Amazon Redshift на Cli doc_type: 'guide' --- -import MigrationGuide from '@site/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' +import MigrationGuide from '@site/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' +# Руководство по миграции с Amazon Redshift на ClickHouse {#amazon-redshift-to-clickhouse-migration-guide} -# Руководство по миграции с Amazon Redshift на ClickHouse - - \ No newline at end of file + \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md index 92d41d4e724..c03693dc915 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md @@ -9,7 +9,7 @@ doc_type: 'reference' -# Руководство по преобразованию SQL-запросов Amazon Redshift +# Руководство по преобразованию SQL-запросов Amazon Redshift {#amazon-redshift-sql-translation-guide} @@ -65,9 +65,9 @@ String в ClickHouse, таким образом, не имеет огранич -## Синтаксис DDL +## Синтаксис DDL {#compression} -### Ключи сортировки +### Ключи сортировки {#sorting-keys} И в ClickHouse, и в Redshift есть понятие «ключ сортировки», который определяет, как данные упорядочиваются при сохранении. В Redshift ключ сортировки задаётся с помощью diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md index 894633ec6ad..176b740deef 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md @@ -8,7 +8,7 @@ keywords: ['миграция', 'ClickHouse Cloud', 'OSS', 'миграция са --- import Image from '@theme/IdealImage'; -import AddARemoteSystem from '@site/docs/_snippets/_add_remote_ip_access_list_detail.md'; +import AddARemoteSystem from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_add_remote_ip_access_list_detail.md'; import self_managed_01 from '@site/static/images/integrations/migration/self-managed-01.png'; import self_managed_02 from '@site/static/images/integrations/migration/self-managed-02.png'; import self_managed_03 from '@site/static/images/integrations/migration/self-managed-03.png'; @@ -16,16 +16,13 @@ import self_managed_04 from '@site/static/images/integrations/migration/self-man import self_managed_05 from '@site/static/images/integrations/migration/self-managed-05.png'; import self_managed_06 from '@site/static/images/integrations/migration/self-managed-06.png'; +# Миграция между самостоятельно управляемым ClickHouse и ClickHouse Cloud {#migrating-between-self-managed-clickhouse-and-clickhouse-cloud} -# Миграция между самостоятельно управляемым ClickHouse и ClickHouse Cloud - -Миграция самостоятельно управляемого ClickHouse +Миграция самостоятельно управляемого ClickHouse В этом руководстве показано, как выполнить миграцию с самостоятельно управляемого сервера ClickHouse в ClickHouse Cloud, а также как выполнять миграцию между сервисами ClickHouse Cloud. Функция [`remoteSecure`](/sql-reference/table-functions/remote) используется в запросах `SELECT` и `INSERT` для обеспечения доступа к удалённым серверам ClickHouse, что делает миграцию таблиц настолько же простой, как написание запроса `INSERT INTO` с вложенным `SELECT`. - - -## Миграция с самостоятельно управляемого ClickHouse в ClickHouse Cloud +## Миграция с самостоятельно управляемого ClickHouse в ClickHouse Cloud {#migrating-from-self-managed-clickhouse-to-clickhouse-cloud} Migrating Self-managed ClickHouse @@ -36,7 +33,7 @@ import self_managed_06 from '@site/static/images/integrations/migration/self-man В этом примере самостоятельно управляемый сервер ClickHouse является *источником*, а сервис ClickHouse Cloud — *приёмником*. -### Обзор +### Обзор {#overview} Процесс выглядит следующим образом: @@ -46,11 +43,11 @@ import self_managed_06 from '@site/static/images/integrations/migration/self-man 4. Удалить исходный сервер из IP Access List на целевой стороне (если применимо) 5. Удалить пользователя с правами только на чтение из исходного сервиса -### Миграция таблиц из одной системы в другую: +### Миграция таблиц из одной системы в другую: {#migration-of-tables-from-one-system-to-another} Этот пример переносит одну таблицу с самостоятельно управляемого сервера ClickHouse в ClickHouse Cloud. -### На исходной системе ClickHouse (системе, которая в данный момент хранит данные) +### На исходной системе ClickHouse (системе, которая в данный момент хранит данные) {#on-the-source-clickhouse-system-the-system-that-currently-hosts-the-data} * Добавьте пользователя с правами только на чтение, который может читать исходную таблицу (`db.table` в этом примере) @@ -72,7 +69,7 @@ FROM system.tables WHERE database = 'db' AND table = 'table' ``` -### В целевой системе ClickHouse Cloud: +### В целевой системе ClickHouse Cloud: {#on-the-destination-clickhouse-cloud-system} * Создайте целевую базу данных: @@ -119,8 +116,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 'default', 'PASS') SELECT * FROM db.table ``` - -## Миграция между сервисами ClickHouse Cloud +## Миграция между сервисами ClickHouse Cloud {#migrating-between-clickhouse-cloud-services} Миграция самоуправляемого ClickHouse @@ -143,7 +139,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 6. Восстановите IP Access List на сервисе destination 7. Удалите пользователя только для чтения из сервиса source -#### Добавьте пользователя только для чтения в сервис source +#### Добавьте пользователя только для чтения в сервис source {#add-a-read-only-user-to-the-source-service} * Добавьте пользователя только для чтения, который может читать таблицу source (`db.table` в этом примере) @@ -164,7 +160,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', where database = 'db' and table = 'table' ``` -#### Продублируйте структуру таблицы в сервисе destination +#### Продублируйте структуру таблицы в сервисе destination {#duplicate-the-table-structure-on-the-destination-service} В сервисе destination создайте базу данных, если её ещё нет: @@ -181,7 +177,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', CREATE TABLE db.table ... ``` -#### Разрешите удалённый доступ к сервису source +#### Разрешите удалённый доступ к сервису source {#allow-remote-access-to-the-source-service} Чтобы забирать данные из source в destination, сервис source должен разрешать подключения. Временно отключите функциональность "IP Access List" на сервисе source. @@ -191,7 +187,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', Измените allow list и временно разрешите доступ из **Anywhere**. Подробности см. в документации по [IP Access List](/cloud/security/setting-ip-filters). -#### Скопируйте данные из source в destination +#### Скопируйте данные из source в destination {#copy-the-data-from-source-to-destination} * Используйте функцию `remoteSecure` для получения данных из сервиса ClickHouse Cloud source. Подключитесь к destination. Выполните эту команду в сервисе ClickHouse Cloud destination: @@ -203,11 +199,11 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', * Проверьте данные в сервисе destination -#### Восстановите IP Access List на сервисе source +#### Восстановите IP Access List на сервисе source {#re-establish-the-ip-access-list-on-the-source} Если вы ранее экспортировали список доступа, то можете повторно импортировать его с помощью **Share**, иначе заново добавьте свои записи в список доступа. -#### Удалите пользователя только для чтения `exporter` +#### Удалите пользователя только для чтения `exporter` {#remove-the-read-only-exporter-user} ```sql DROP USER exporter diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md index 76a652199ba..ecd078ff360 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md @@ -11,14 +11,14 @@ import Image from '@theme/IdealImage'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; -import AddARemoteSystem from '@site/docs/_snippets/_add_remote_ip_access_list_detail.md'; +import AddARemoteSystem from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_add_remote_ip_access_list_detail.md'; import ch_local_01 from '@site/static/images/integrations/migration/ch-local-01.png'; import ch_local_02 from '@site/static/images/integrations/migration/ch-local-02.png'; import ch_local_03 from '@site/static/images/integrations/migration/ch-local-03.png'; import ch_local_04 from '@site/static/images/integrations/migration/ch-local-04.png'; -# Миграция в ClickHouse с использованием clickhouse-local +# Миграция в ClickHouse с использованием clickhouse-local {#migrating-to-clickhouse-using-clickhouse-local} Миграция в самоуправляемый ClickHouse @@ -94,21 +94,21 @@ ClickHouse предоставляет движки интеграции и та -## Пример 1: Миграция с MySQL в ClickHouse Cloud с использованием интеграционного движка +## Пример 1: Миграция с MySQL в ClickHouse Cloud с использованием интеграционного движка {#example-1-migrating-from-mysql-to-clickhouse-cloud-with-an-integration-engine} Мы будем использовать [интеграционный движок таблиц](/engines/table-engines/integrations/mysql/) (создаваемый на лету с помощью [табличной функции mysql](/sql-reference/table-functions/mysql/)) для чтения данных из исходной базы данных MySQL, а для записи данных в целевую таблицу в вашем облачном сервисе ClickHouse Cloud — [табличную функцию remoteSecure](/sql-reference/table-functions/remote/). Миграция самоуправляемого ClickHouse -### На целевом сервисе ClickHouse Cloud: +### На целевом сервисе ClickHouse Cloud: {#on-the-destination-clickhouse-cloud-service} -#### Создайте целевую базу данных: +#### Создайте целевую базу данных: {#create-the-destination-database} ```sql CREATE DATABASE db ``` -#### Создайте целевую таблицу с такой же схемой, как у таблицы MySQL: +#### Создайте целевую таблицу с такой же схемой, как у таблицы MySQL: {#create-a-destination-table-that-has-a-schema-equivalent-to-the-mysql-table} ```sql CREATE TABLE db.table ... @@ -118,9 +118,9 @@ CREATE TABLE db.table ... Схемы целевой таблицы ClickHouse Cloud и исходной таблицы MySQL должны совпадать (имена и порядок столбцов должны быть одинаковыми, а типы данных столбцов — совместимыми). ::: -### На хосте с clickhouse-local: +### На хосте с clickhouse-local: {#on-the-clickhouse-local-host-machine} -#### Запустите clickhouse-local с миграционным запросом: +#### Запустите clickhouse-local с миграционным запросом: {#run-clickhouse-local-with-the-migration-query} ```sql ./clickhouse-local --query " @@ -135,16 +135,16 @@ SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');" ::: -## Пример 2: миграция с MySQL в ClickHouse Cloud с использованием моста JDBC +## Пример 2: миграция с MySQL в ClickHouse Cloud с использованием моста JDBC {#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge} Мы будем использовать [табличный движок интеграции с JDBC](/engines/table-engines/integrations/jdbc.md) (создаваемый на лету с помощью [табличной функции JDBC](/sql-reference/table-functions/jdbc.md)) вместе с [ClickHouse JDBC Bridge](https://github.com/ClickHouse/clickhouse-jdbc-bridge) и драйвером MySQL JDBC для чтения данных из исходной базы данных MySQL, а также [табличную функцию remoteSecure](/sql-reference/table-functions/remote.md) для записи данных в целевую таблицу в вашем сервисе ClickHouse Cloud. Миграция самоуправляемого ClickHouse -### На целевом сервисе ClickHouse Cloud: +### На целевом сервисе ClickHouse Cloud: {#on-the-destination-clickhouse-cloud-service-1} -#### Создайте целевую базу данных: +#### Создайте целевую базу данных: {#create-the-destination-database-1} ```sql CREATE DATABASE db diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md index 007f7ca232c..86bb2f04640 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md @@ -10,15 +10,14 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import third_party_01 from '@site/static/images/integrations/migration/third-party-01.png'; +# Использование стороннего ETL-инструмента {#using-a-3rd-party-etl-tool} -# Использование стороннего ETL-инструмента - -Миграция самостоятельно управляемого ClickHouse +Миграция самостоятельно управляемого ClickHouse Отличный вариант переноса данных из внешнего источника в ClickHouse — использовать один из многих популярных ETL- и ELT-инструментов. У нас есть документация по следующим решениям: -- [Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) -- [dbt](/integrations/data-ingestion/etl-tools/dbt/index.md) -- [Vector](/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) +* [Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) +* [dbt](/integrations/data-ingestion/etl-tools/dbt/index.md) +* [Vector](/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) Но существует и множество других ETL/ELT-инструментов, которые интегрируются с ClickHouse, поэтому обратитесь к документации используемого вами инструмента за подробной информацией. \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md index 3c75c3a39dd..2d71bc1aa64 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md @@ -9,18 +9,17 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import object_storage_01 from '@site/static/images/integrations/migration/object-storage-01.png'; +# Перенос данных из облачного объектного хранилища в ClickHouse Cloud {#move-data-from-cloud-object-storage-to-clickhouse-cloud} -# Перенос данных из облачного объектного хранилища в ClickHouse Cloud - -Миграция самостоятельно развернутого ClickHouse +Миграция самостоятельно развернутого ClickHouse Если вы используете облачное объектное хранилище как озеро данных и хотите импортировать эти данные в ClickHouse Cloud, или если ваша текущая система управления базами данных может напрямую выгружать данные в облачное объектное хранилище, то вы можете использовать одну из табличных функций для миграции данных, хранящихся в облачном объектном хранилище, в таблицу ClickHouse Cloud: -- [s3](/sql-reference/table-functions/s3.md) или [s3Cluster](/sql-reference/table-functions/s3Cluster.md) -- [gcs](/sql-reference/table-functions/gcs) -- [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage) +* [s3](/sql-reference/table-functions/s3.md) или [s3Cluster](/sql-reference/table-functions/s3Cluster.md) +* [gcs](/sql-reference/table-functions/gcs) +* [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage) Если ваша текущая система управления базами данных не может напрямую выгружать данные в облачное объектное хранилище, вы можете использовать [сторонний ETL/ELT-инструмент](/cloud/migration/etl-tool-to-clickhouse) или [clickhouse-local](/cloud/migration/clickhouse-local) для переноса данных из вашей текущей системы управления базами данных в облачное объектное хранилище, чтобы на втором этапе мигрировать эти данные в таблицу ClickHouse Cloud. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md index e3209d56939..33fd8034d5c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md @@ -7,12 +7,12 @@ hide_title: true doc_type: 'guide' --- -import TableOfContentsBestPractices from '@site/docs/best-practices/_snippets/_table_of_contents.md'; -import TableOfContentsOptimizationAndPerformance from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; -import TableOfContentsSecurity from '@site/docs/cloud/_snippets/_security_table_of_contents.md'; +import TableOfContentsBestPractices from '@site/i18n/ru/docusaurus-plugin-content-docs/current/best-practices/_snippets/_table_of_contents.md'; +import TableOfContentsOptimizationAndPerformance from '@site/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; +import TableOfContentsSecurity from '@site/i18n/ru/docusaurus-plugin-content-docs/current/cloud/_snippets/_security_table_of_contents.md'; -# Обзор ресурсов +# Обзор ресурсов {#resource-tour} В этой статье представлен обзор доступных в документации ресурсов, которые помогут вам максимально эффективно использовать развертывание ClickHouse Cloud. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/index.md index 16834d39c86..870014d9c92 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/onboard/index.md @@ -9,7 +9,7 @@ keywords: ['онбординг', 'начало работы', 'настройк -# Начало работы с ClickHouse Cloud +# Начало работы с ClickHouse Cloud {#get-started-with-clickhouse-cloud} Впервые используете ClickHouse Cloud и не знаете, с чего начать? В этом разделе документации мы покажем вам всё необходимое для быстрого запуска и начала работы. Мы diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/01_changelog.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/01_changelog.md index b75a67a460e..8455857e59e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/01_changelog.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/01_changelog.md @@ -214,7 +214,7 @@ import dashboards from '@site/static/images/cloud/reference/may-30-dashboards.pn созданного для упрощения мониторинга ваших сервисов ClickHouse Cloud. Этот миксин использует наш совместимый с Prometheus конечный API-адрес для бесшовной интеграции метрик ClickHouse в вашу существующую инсталляцию Prometheus и Grafana. В его состав - входит преднастроенная панель мониторинга, которая обеспечивает Обзервабилити в режиме реального времени + входит преднастроенная панель мониторинга, которая обеспечивает наблюдаемость в режиме реального времени за состоянием и производительностью ваших сервисов. Дополнительную информацию см. в [блоге о запуске](https://clickhouse.com/blog/monitor-with-new-prometheus-grafana-mix-in). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md index 45c212b1caa..b88ceca6abc 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md @@ -12,7 +12,7 @@ doc_type: 'changelog' -#### Обратно несовместимое изменение +#### Обратно несовместимое изменение {#backward-incompatible-change} * Теперь выполняется проверка подозрительных/экспериментальных типов во вложенных типах. Ранее такие типы (кроме JSON) не проверялись во вложенных типах, таких как Array/Tuple/Map. [#59385](https://github.com/ClickHouse/ClickHouse/pull/59385) ([Kruglov Pavel](https://github.com/Avogar)). * Условие сортировки `ORDER BY ALL` (введённое в версии 23.12) заменено на `ORDER BY *`. Предыдущий синтаксис слишком часто приводил к ошибкам в таблицах со столбцом `all`. [#59450](https://github.com/ClickHouse/ClickHouse/pull/59450) ([Robert Schulze](https://github.com/rschu1ze)). @@ -29,7 +29,7 @@ doc_type: 'changelog' -#### Новая возможность +#### Новая возможность {#new-feature} * Режим работы topK/topKWeighted, возвращающий количество значений и оценку погрешности. [#54508](https://github.com/ClickHouse/ClickHouse/pull/54508) ([UnamedRus](https://github.com/UnamedRus)). * Добавлен новый синтаксис, позволяющий указать пользователя-определителя в представлении/материализованном представлении. Это позволяет выполнять SELECT/INSERT из представлений без явной выдачи прав на базовые таблицы. [#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) ([pufit](https://github.com/pufit)). @@ -57,7 +57,7 @@ doc_type: 'changelog' -#### Повышение производительности +#### Повышение производительности {#performance-improvement} * Удаляет агрегаторы min/max/any/anyLast по ключам GROUP BY в списке SELECT. [#52230](https://github.com/ClickHouse/ClickHouse/pull/52230) ([JackyWoo](https://github.com/JackyWoo)). * Улучшена производительность метода сериализованной агрегации при работе с несколькими столбцами [nullable]. Это обобщённая версия [#51399](https://github.com/ClickHouse/ClickHouse/issues/51399), не нарушающая целостность абстракции. [#55809](https://github.com/ClickHouse/ClickHouse/pull/55809) ([Amos Bird](https://github.com/amosbird)). @@ -86,7 +86,7 @@ doc_type: 'changelog' -#### Улучшение +#### Улучшение {#improvement} * При выполнении запроса MODIFY COLUMN для материализованных представлений проверьте структуру внутренней таблицы, чтобы убедиться, что все столбцы присутствуют. [#47427](https://github.com/ClickHouse/ClickHouse/pull/47427) ([sunny](https://github.com/sunny19930321)). * Добавлена таблица `system.keywords`, которая содержит все ключевые слова из парсера. Она предназначена главным образом для улучшения фаззинга и подсветки синтаксиса. [#51808](https://github.com/ClickHouse/ClickHouse/pull/51808) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md index d3faa4c8ef6..633c1da6378 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md @@ -10,7 +10,7 @@ doc_type: 'changelog' -# Журнал изменений версии 24.5 для Cloud +# Журнал изменений версии 24.5 для Cloud {#v245-changelog-for-cloud} Актуальные изменения в сервисах ClickHouse Cloud в релизе v24.5. @@ -128,7 +128,7 @@ doc_type: 'changelog' -# Улучшения +# Улучшения {#improvements} * Удалена настройка `optimize_monotonous_functions_in_order_by`, так как она по сути стала пустой операцией (no-op). [#63004](https://github.com/ClickHouse/ClickHouse/pull/63004) (Raúl Marín). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md index 897ddd1ee1b..852f9e8de5d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md @@ -10,7 +10,7 @@ doc_type: 'changelog' -# Журнал изменений v24.6 для Cloud +# Журнал изменений v24.6 для Cloud {#v246-changelog-for-cloud} Актуальные изменения для сервисов ClickHouse Cloud в релизе v24.6. @@ -110,7 +110,7 @@ doc_type: 'changelog' -## Исправление ошибки (некорректное поведение, заметное пользователям, в официальном стабильном релизе) +## Исправление ошибки (некорректное поведение, заметное пользователям, в официальном стабильном релизе) {#bug-fix-user-visible-misbehavior-in-an-official-stable-release} * Исправлена проблема, из-за которой пропускной индекс 'set' не работал с IN и indexHint(). #62083 (Michael Kolupaev). * Исправлены запросы с FINAL, которые давали неверный результат, если таблица не использовала адаптивную гранулярность. #62432 (Duc Canh Le). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md index fb4202315e9..80e11827548 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md @@ -22,7 +22,7 @@ doc_type: 'changelog' -## Новая возможность +## Новая возможность {#new-feature} * Обновляемые материализованные представления готовы к промышленной эксплуатации. [#70550](https://github.com/ClickHouse/ClickHouse/pull/70550) ([Michael Kolupaev](https://github.com/al13n321)). Обновляемые материализованные представления теперь поддерживаются в реплицируемых базах данных. [#60669](https://github.com/ClickHouse/ClickHouse/pull/60669) ([Michael Kolupaev](https://github.com/al13n321)). * Функция `toStartOfInterval()` теперь имеет новую перегрузку, которая эмулирует функцию TimescaleDB `time_bucket()`, а также функцию PostgreSQL `date_bin()` ([#55619](https://github.com/ClickHouse/ClickHouse/issues/55619)). Она позволяет выравнивать значения даты или временной метки по кратным заданному интервалу от *произвольной* точки отсчёта (вместо 0000-01-01 00:00:00.000 как *фиксированной* точки отсчёта). Например, `SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30'));` возвращает `2023-01-01 14:44:30`, которое кратно интервалу в 1 минуту, начиная от точки отсчёта `2023-01-01 14:35:30`. [#56738](https://github.com/ClickHouse/ClickHouse/pull/56738) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/25_08.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/25_08.md index bf872d469b7..86379116691 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/25_08.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/25_08.md @@ -380,7 +380,7 @@ doc_type: 'changelog' * Некоррелированные `EXISTS` выполняются как скалярный подзапрос. Это позволяет использовать кэш скалярного подзапроса и выполнять константное свёртывание результата, что полезно для индексов. Для совместимости добавлена новая настройка `execute_exists_as_scalar_subquery=1`. [#85481](https://github.com/ClickHouse/ClickHouse/pull/85481) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). * Добавлена поддержка большего числа случаев разрешения составных идентификаторов. В частности, это улучшает совместимость `ARRAY JOIN` со старым анализатором. Добавлена новая настройка `analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested` для сохранения старого поведения. [#85492](https://github.com/ClickHouse/ClickHouse/pull/85492) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). -### Системные таблицы и Обзервабилити \{#system-tables-and-observability\} +### Системные таблицы и наблюдаемость \{#system-tables-and-observability\} * Добавлены метрики нагрузки в асинхронные метрики ClickHouse. [#80779](https://github.com/ClickHouse/ClickHouse/pull/80779) ([Xander Garbett](https://github.com/Garbett1)). * Добавлены метрики `MarkCacheEvictedBytes`, `MarkCacheEvictedMarks`, `MarkCacheEvictedFiles` для отслеживания вытеснений из кэша меток (issue [#60989](https://github.com/ClickHouse/ClickHouse/issues/60989)). [#80799](https://github.com/ClickHouse/ClickHouse/pull/80799) ([Shivji Kumar Jha](https://github.com/shiv4289)). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md index a9530916a74..bf883feb215 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md @@ -11,7 +11,7 @@ import Image from '@theme/IdealImage'; import Architecture from '@site/static/images/cloud/reference/architecture.png'; -# Архитектура ClickHouse Cloud +# Архитектура ClickHouse Cloud {#clickhouse-cloud-architecture} Архитектура ClickHouse Cloud diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md index 9334fe0563b..973ac7dd258 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md @@ -181,9 +181,9 @@ ClickHouse Cloud выставляет счета исходя из исполь -## Часто задаваемые вопросы +## Часто задаваемые вопросы {#faqs} -### Что такое ClickHouse Credit (CHC)? +### Что такое ClickHouse Credit (CHC)? {#what-is-chc} ClickHouse Credit — это единица кредита на использование ClickHouse Cloud Клиентом, равная одному (1) доллару США и применяемая на основе актуального опубликованного прайс‑листа ClickHouse. @@ -191,27 +191,27 @@ ClickHouse Credit — это единица кредита на использо Если вы получаете счета через Stripe, то в своём счёте Stripe вы увидите, что 1 CHC равен $0.01 USD. Это необходимо для точного выставления счетов в Stripe из‑за ограничения сервиса, не позволяющего выставлять счета за дробные количества нашей стандартной позиции (SKU) 1 CHC = $1 USD. ::: -### Где я могу найти устаревшие (legacy) цены? +### Где я могу найти устаревшие (legacy) цены? {#find-legacy-pricing} Информацию об устаревших ценах можно найти [здесь](https://clickhouse.com/pricing?legacy=true). -### Как измеряется потребление вычислительных ресурсов (compute)? +### Как измеряется потребление вычислительных ресурсов (compute)? {#how-is-compute-metered} ClickHouse Cloud измеряет потребление вычислительных ресурсов поминутно, с шагом 8 ГБ ОЗУ. Стоимость вычислений зависит от уровня (tier), региона и поставщика облачных услуг. -### Как рассчитывается использование дискового хранилища? +### Как рассчитывается использование дискового хранилища? {#how-is-storage-on-disk-calculated} ClickHouse Cloud использует облачное объектное хранилище, а использование измеряется по сжатому размеру данных, хранящихся в таблицах ClickHouse. Стоимость хранения одинакова для всех уровней и зависит от региона и поставщика облачных услуг. -### Засчитываются ли резервные копии в общий объём хранилища? +### Засчитываются ли резервные копии в общий объём хранилища? {#do-backups-count-toward-total-storage} Хранилище и резервные копии учитываются при расчёте стоимости хранения и тарифицируются отдельными позициями. Все сервисы по умолчанию имеют одну резервную копию с хранением в течение одного дня. Пользователи, которым требуется больше резервных копий, могут настроить дополнительные [резервные копии](/cloud/manage/backups/overview) на вкладке настроек консоли Cloud. -### Как оценить степень сжатия? +### Как оценить степень сжатия? {#how-do-i-estimate-compression} Степень сжатия может различаться для разных наборов данных. Насколько именно — зависит от того, насколько данные вообще поддаются сжатию (количество полей с высокой и низкой кардинальностью) @@ -228,12 +228,12 @@ FROM system.tables WHERE name = <имя_вашей_таблицы> ``` -### Какие инструменты предоставляет ClickHouse для оценки стоимости работы сервиса в облаке, если у меня есть самостоятельное развертывание? +### Какие инструменты предоставляет ClickHouse для оценки стоимости работы сервиса в облаке, если у меня есть самостоятельное развертывание? {#what-tools-does-clickhouse-offer-to-estimate-the-cost-of-running-a-service-in-the-cloud-if-i-have-a-self-managed-deployment} Журнал запросов ClickHouse фиксирует [ключевые метрики](/operations/system-tables/query_log), которые можно использовать для оценки стоимости выполнения рабочей нагрузки в ClickHouse Cloud. Подробнее о миграции с самостоятельного развертывания в ClickHouse Cloud см. в [документации по миграции](/cloud/migration/clickhouse-to-cloud). Если у вас есть дополнительные вопросы, свяжитесь со [службой поддержки ClickHouse Cloud](https://console.clickhouse.cloud/support). -### Какие варианты биллинга доступны для ClickHouse Cloud? +### Какие варианты биллинга доступны для ClickHouse Cloud? {#what-billing-options-are-available-for-clickhouse-cloud} ClickHouse Cloud поддерживает следующие варианты биллинга: @@ -245,11 +245,11 @@ ClickHouse Cloud поддерживает следующие варианты б Кредиты ClickHouse Cloud для PAYG выставляются счетом с шагом $0.01, что позволяет взимать плату с клиентов за доли кредитов ClickHouse в зависимости от фактического использования. Это отличается от кредитов ClickHouse при фиксированном обязательстве по расходам, которые приобретаются авансом целыми единицами по $1. ::: -### Могу ли я удалить свою банковскую карту? +### Могу ли я удалить свою банковскую карту? {#can-i-delete-my-credit-card} Вы не можете удалить банковскую карту в интерфейсе Billing, но в любое время можете обновить данные карты. Это помогает гарантировать, что у вашей организации всегда есть действительный способ оплаты. Если вам необходимо удалить банковскую карту, обратитесь в [службу поддержки ClickHouse Cloud](https://console.clickhouse.cloud/support) за помощью. -### Какова продолжительность расчетного периода (billing cycle)? +### Какова продолжительность расчетного периода (billing cycle)? {#how-long-is-the-billing-cycle} Начисление платежей происходит помесячно, а датой начала считается день создания организации ClickHouse Cloud. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md index b6ff1f73648..7d06f313bdd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md @@ -17,21 +17,19 @@ import aws_marketplace_payg_8 from '@site/static/images/cloud/manage/billing/mar import aws_marketplace_payg_9 from '@site/static/images/cloud/manage/billing/marketplace/aws-marketplace-payg-9.png'; import Image from '@theme/IdealImage'; -Начните работу с ClickHouse Cloud в [AWS Marketplace](https://aws.amazon.com/marketplace) через публичное предложение по модели PAYG (Pay-as-you-go, оплата по мере использования). +Начните работу с ClickHouse Cloud на [AWS Marketplace](https://aws.amazon.com/marketplace), воспользовавшись публичным предложением по модели PAYG (Pay-as-you-go). ## Предварительные требования {#prerequisites} -- Учетная запись AWS с правами на совершение покупок, предоставленными вашим администратором по биллингу. -- Для совершения покупки вы должны войти в AWS Marketplace под этой учетной записью. +- Учетная запись AWS с правами на совершение покупок, предоставленными администратором биллинга. +- Для совершения покупки вы должны быть авторизованы в AWS Marketplace под этой учетной записью. - Чтобы подключить организацию ClickHouse к вашей подписке, вы должны быть администратором этой организации. :::note -Одна учетная запись AWS может оформить только одну подписку «ClickHouse Cloud - Pay As You Go», которую можно связать только с одной организацией ClickHouse. +Одна учетная запись AWS может оформить только одну подписку «ClickHouse Cloud - Pay As You Go», которая может быть связана только с одной организацией ClickHouse. ::: - - ## Этапы регистрации {#steps-to-sign-up} @@ -44,46 +42,47 @@ import Image from '@theme/IdealImage'; ### Просмотрите варианты покупки {#purchase-options} -Нажмите на [страницу продукта](https://aws.amazon.com/marketplace/pp/prodview-p4gwofrqpkltu), а затем на **View purchase options**. +Нажмите на [листинг](https://aws.amazon.com/marketplace/pp/prodview-p4gwofrqpkltu), а затем на **View purchase options**. -Варианты покупки в AWS Marketplace +AWS Marketplace — просмотр вариантов покупки ### Оформите подписку {#subscribe} На следующем экране нажмите **Subscribe**. :::note -**Номер заказа на покупку (PO)** указывать необязательно, его можно не заполнять. +**Номер заказа на покупку (Purchase order, PO)** необязателен, им можно пренебречь. +**В этом листинге доступны два предложения.** Если вы выберете вариант «ClickHouse Cloud - Pay As You Go Free Trial», вы подпишетесь на управляемую AWS 30‑дневную бесплатную пробную версию. Однако по истечении 30 дней подписка на листинг завершится, и вам потребуется повторно оформить подписку уже на другое предложение «ClickHouse Cloud - Pay As You Go» в этом листинге, чтобы продолжить использовать ClickHouse Pay As You Go. ::: Оформление подписки в AWS Marketplace -### Настройте свою учетную запись {#set-up-your-account} +### Настройте учетную запись {#set-up-your-account} -Обратите внимание, что на данном этапе настройка еще не завершена, и вашей организации ClickHouse Cloud пока не выставляются счета через Marketplace. Теперь вам нужно нажать **Set up your account** в вашей подписке Marketplace, чтобы перейти в ClickHouse Cloud и завершить настройку. +Обратите внимание, что на этом этапе настройка еще не завершена, и ваша организация ClickHouse Cloud пока не тарифицируется через AWS Marketplace. Теперь вам нужно нажать **Set up your account** в подписке AWS Marketplace, чтобы перейти в ClickHouse Cloud и завершить настройку. Настройка учетной записи -После перенаправления в ClickHouse Cloud вы можете войти под существующей учетной записью или зарегистрировать новую. Этот шаг очень важен, поскольку он позволяет привязать вашу организацию ClickHouse Cloud к выставлению счетов через AWS Marketplace. +После перехода в ClickHouse Cloud вы можете либо войти с существующей учетной записью, либо зарегистрировать новую. Этот шаг очень важен, поскольку он позволяет привязать вашу организацию ClickHouse Cloud к биллингу AWS Marketplace. :::note[Новые пользователи ClickHouse Cloud] -Если вы новый пользователь ClickHouse Cloud, выполните действия, приведенные ниже. +Если вы новый пользователь ClickHouse Cloud, выполните шаги ниже. :::
Шаги для новых пользователей -Если вы новый пользователь ClickHouse Cloud, нажмите **Register** в нижней части страницы. Вам будет предложено создать нового пользователя и подтвердить адрес электронной почты. После подтверждения электронной почты вы можете закрыть страницу входа в ClickHouse Cloud и войти, используя новое имя пользователя, на https://console.clickhouse.cloud. +Если вы новый пользователь ClickHouse Cloud, нажмите **Register** внизу страницы. Вам будет предложено создать нового пользователя и подтвердить адрес электронной почты. После подтверждения email вы можете закрыть страницу входа ClickHouse Cloud и войти, используя новое имя пользователя, на https://console.clickhouse.cloud. Регистрация в ClickHouse Cloud :::note[Новые пользователи] -Вам также потребуется предоставить некоторую основную информацию о вашей компании. См. скриншоты ниже. +Вам также потребуется предоставить некоторую основную информацию о вашем бизнесе. См. скриншоты ниже. ::: -Прежде чем начать +Перед началом работы -Прежде чем начать, продолжение +Перед началом работы — продолжение
@@ -91,20 +90,18 @@ import Image from '@theme/IdealImage'; ### Добавьте подписку Marketplace к организации {#add-marketplace-subscription} -После успешного входа вы можете выбрать: создать новую организацию для выставления счетов по этой подписке Marketplace или использовать существующую организацию для выставления счетов по этой подписке. +После успешного входа вы можете выбрать, создать ли новую организацию для выставления счетов по этой подписке AWS Marketplace или использовать существующую организацию для выставления счетов по данной подписке. Добавление подписки Marketplace -После завершения этого шага ваша организация будет подключена к этой подписке AWS, и все потребление будет выставляться на оплату через ваш аккаунт AWS. +После завершения этого шага ваша организация будет подключена к этой подписке AWS, и все использование будет тарифицироваться через ваш AWS‑аккаунт. -На странице выставления счетов организации в интерфейсе ClickHouse вы можете убедиться, что биллинг теперь действительно связан с AWS Marketplace. +Вы можете убедиться на странице биллинга организации в интерфейсе ClickHouse, что биллинг теперь действительно связан с AWS Marketplace. -Подтверждение на странице выставления счетов +Подтверждение на странице биллинга
- - ## Поддержка {#support} -Если у вас возникнут какие-либо проблемы, обращайтесь в [нашу службу поддержки](https://clickhouse.com/support/program). +Если у вас возникнут проблемы, обращайтесь в [нашу службу поддержки](https://clickhouse.com/support/program). \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx index 3b558008273..92da42236dd 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx @@ -7,7 +7,7 @@ doc_type: 'guide' keywords: ['выставление счетов', 'передача данных по сети', 'исходящий трафик данных', 'затраты', 'тарифы'] --- -import NetworkPricing from '@site/docs/cloud/reference/_snippets/_network_transfer_rates.md'; +import NetworkPricing from '@site/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/_snippets/_network_transfer_rates.md'; ClickHouse Cloud измеряет объем входящего и исходящего трафика данных. Сюда включаются любые данные, поступающие в ClickHouse Cloud и исходящие из него, а также diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md index fb7196cc702..6c1eb47aa27 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md @@ -7,9 +7,9 @@ keywords: ['выставление счетов', 'платёжные порог doc_type: 'guide' --- -# Платёжные пороги +# Платёжные пороги {#payment-thresholds} -Когда сумма к оплате за расчётный период в ClickHouse Cloud достигает 10 000 долларов США или эквивалентного значения, с вашего способа оплаты автоматически будет списана эта сумма. В случае неудачного списания по истечении льготного периода произойдёт приостановка или прекращение предоставления услуг. +Когда сумма к оплате за расчётный период в ClickHouse Cloud достигает 10 000 долларов США или эквивалентного значения, с вашего способа оплаты автоматически будет списана эта сумма. В случае неудачного списания по истечении льготного периода произойдёт приостановка или прекращение предоставления услуг. :::note Этот платёжный порог не применяется к клиентам, у которых есть контракт с обязательствами по расходам или иное согласованное договорное соглашение с ClickHouse. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md index c8be1b20642..a626d5451a4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md @@ -11,7 +11,7 @@ import billing_compliance from '@site/static/images/cloud/manage/billing_complia import Image from '@theme/IdealImage'; -# Соответствие биллинга ClickHouse Cloud нормативным требованиям +# Соответствие биллинга ClickHouse Cloud нормативным требованиям {#clickhouse-cloud-billing-compliance} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md index 1d55cea14f4..d73ce271c60 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md @@ -10,7 +10,7 @@ doc_type: 'reference' import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge' -# Поддерживаемые регионы облака +# Поддерживаемые регионы облака {#supported-cloud-regions} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md index 76ba9a1f762..b1672c3c75a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md @@ -10,8 +10,7 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import cloud_settings_sidebar from '@site/static/images/cloud/manage/cloud-settings-sidebar.png'; - -# Настройка параметров +# Настройка параметров {#configuring-settings} Чтобы задать настройки для сервиса ClickHouse Cloud для конкретного [пользователя](/operations/access-rights#user-account-management) или [роли](/operations/access-rights#role-management), необходимо использовать [профили настроек на основе SQL](/operations/access-rights#settings-profiles-management). Применение профилей настроек гарантирует, что настроенные вами параметры сохранятся, даже когда ваши сервисы останавливаются, простаивают или обновляются. Чтобы узнать больше о профилях настроек, см. [эту страницу](/operations/settings/settings-profiles.md). @@ -19,4 +18,4 @@ import cloud_settings_sidebar from '@site/static/images/cloud/manage/cloud-setti Чтобы узнать больше о параметрах, которые вы можете задать для сервиса ClickHouse Cloud, ознакомьтесь со всеми возможными настройками по категориям в [нашей документации](/operations/settings). -Боковая панель настроек Cloud \ No newline at end of file +Боковая панель настроек Cloud \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md index edbf038555c..f11b063df23 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md @@ -10,7 +10,7 @@ import BetaBadge from '@theme/badges/BetaBadge'; import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge'; -# Отчеты по безопасности и соответствию требованиям +# Отчеты по безопасности и соответствию требованиям {#security-and-compliance-reports} ClickHouse оценивает потребности наших клиентов в области безопасности и соответствия требованиям и постоянно расширяет программу по мере появления запросов на дополнительные отчеты. Для получения дополнительной информации или загрузки отчетов посетите наш [Центр доверия](https://trust.clickhouse.com). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md index d6deef65810..c9cd437f449 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md @@ -42,7 +42,7 @@ doc_type: 'guide' -## Запрос на закрытие учетной записи +## Запрос на закрытие учетной записи {#request-account-closure} Мы обязаны подтверждать подлинность запросов как на закрытие, так и на удаление. Чтобы обеспечить быструю обработку вашего запроса, выполните шаги, описанные ниже. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/index.md index 981f51e6dce..3f155deeacc 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cloud/reference/index.md @@ -7,7 +7,7 @@ description: 'Посадочная страница справочного ра doc_type: 'landing-page' --- -# Справочник по ClickHouse Cloud +# Справочник по ClickHouse Cloud {#cloud-reference} Этот раздел служит справочным руководством по более техническим аспектам ClickHouse Cloud и содержит следующие страницы: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/concepts/glossary.md b/i18n/ru/docusaurus-plugin-content-docs/current/concepts/glossary.md index a2f99fd44b2..fe2c746f7ac 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/concepts/glossary.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/concepts/glossary.md @@ -10,7 +10,7 @@ doc_type: 'reference' {/* no-glossary */ } -# Глоссарий +# Глоссарий {#glossary} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/concepts/olap.md b/i18n/ru/docusaurus-plugin-content-docs/current/concepts/olap.md index 62f06dd3cdb..4d2ba1dc70c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/concepts/olap.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/concepts/olap.md @@ -10,7 +10,7 @@ doc_type: 'reference' -# Что такое OLAP? +# Что такое OLAP? {#what-is-olap} [OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing) расшифровывается как Online Analytical Processing. Это обобщающий термин, на который можно смотреть с двух точек зрения: технической и с точки зрения бизнеса. На самом базовом уровне можно просто прочитать эти слова в обратном порядке: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx index 1e9f2b6055e..026e1f11fb7 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx @@ -18,7 +18,7 @@ doc_type: 'guide' ## Уровень хранения: одновременные вставки изолированы друг от друга \{#storage-layer-concurrent-inserts-are-isolated-from-each-other\} - + + + + + + + \ No newline at end of file + - + ## Как работают Projections? {#how-do-projections-work} -Практически Projection можно рассматривать как дополнительную, скрытую таблицу -к исходной таблице. Проекция может иметь иной порядок строк и, следовательно, -другой первичный индекс по сравнению с исходной таблицей, а также может -автоматически и по мере вставки данных предварительно вычислять агрегированные значения. -В результате использование Projections дает два «рычага настройки» для -ускорения выполнения запросов: +На практике Projection можно рассматривать как дополнительную скрытую таблицу для +исходной таблицы. Projection может иметь иной порядок строк и, следовательно, +другой первичный индекс по сравнению с исходной таблицей, а также может автоматически +и инкрементально предварительно вычислять агрегированные значения. В результате использование Projections +предоставляет два механизма оптимизации для ускорения выполнения запросов: - **Корректное использование первичных индексов** - **Предварительное вычисление агрегатов** Projections в некотором смысле похожи на [Materialized Views](/materialized-views), -которые также позволяют иметь несколько порядков строк и предварительно -вычислять агрегации во время вставки. +которые также позволяют иметь несколько порядков строк и предварительно вычислять агрегации +в момент вставки. Projections автоматически обновляются и -поддерживаются в актуальном состоянии и синхронизированными с исходной таблицей, -в отличие от Materialized Views, которые обновляются явно. Когда запрос направлен -к исходной таблице, ClickHouse автоматически сэмплирует первичные ключи и -выбирает таблицу, которая может сгенерировать тот же корректный результат, но -требует чтения наименьшего объема данных, как показано на рисунке ниже: +остаются синхронизированными с исходной таблицей, в отличие от Materialized Views, которые +обновляются явно. Когда запрос направлен к исходной таблице, +ClickHouse автоматически выбирает первичные ключи и таблицу, которая может +сгенерировать тот же корректный результат, но требует чтения наименьшего объема данных, как показано на рисунке ниже: Projections в ClickHouse -### Более умное хранение с `_part_offset` {#smarter_storage_with_part_offset} +### Более эффективное хранение с `_part_offset` {#smarter_storage_with_part_offset} -Начиная с версии 25.5, ClickHouse поддерживает виртуальный столбец `_part_offset` -в проекциях, который предлагает новый способ определения проекции. +Начиная с версии 25.5, ClickHouse поддерживает виртуальный столбец `_part_offset` в +проекциях, что предоставляет новый способ определения проекций. -Теперь есть два способа определить проекцию: +Теперь есть два способа определения проекции: - **Хранить полные столбцы (исходное поведение)**: проекция содержит полные - данные и может читаться напрямую, обеспечивая более высокую производительность, - когда фильтры соответствуют порядку сортировки проекции. + данные и может читаться напрямую, обеспечивая более высокую производительность, когда фильтры соответствуют порядку сортировки проекции. - **Хранить только ключ сортировки + `_part_offset`**: проекция работает как индекс. - ClickHouse использует первичный индекс проекции для поиска соответствующих строк, - но читает фактические данные из базовой таблицы. Это снижает накладные расходы - на хранение ценой немного большего объема операций ввода-вывода во время выполнения запроса. + ClickHouse использует первичный индекс проекции, чтобы найти подходящие строки, но читает + фактические данные из базовой таблицы. Это снижает накладные расходы на хранение ценой + немного большего объёма операций ввода-вывода во время выполнения запроса. -Указанные подходы также можно комбинировать, храня часть столбцов в проекции, а +Эти подходы также можно комбинировать, храня часть столбцов в проекции, а остальные — косвенно через `_part_offset`. - - ## Когда использовать проекции? {#when-to-use-projections} -Проекции являются привлекательной возможностью для новых пользователей, поскольку они автоматически -поддерживаются по мере вставки данных. Кроме того, запросы могут отправляться просто к -одной таблице, где проекции при возможности используются для ускорения +Проекции — привлекательная возможность для новых пользователей, так как они автоматически +поддерживаются по мере вставки данных. Более того, запросы могут отправляться +к одной таблице, где проекции по возможности используются для ускорения времени отклика. -В отличие от этого, при использовании материализованных представлений пользователю необходимо выбирать -подходящую оптимизированную целевую таблицу или переписывать запрос в зависимости от -фильтров. Это создает большую нагрузку на пользовательские приложения и увеличивает +В отличие от материализованных представлений, где пользователю необходимо выбирать +соответствующую оптимизированную целевую таблицу или переписывать запрос в зависимости +от фильтров. Это накладывает больше требований на пользовательские приложения и увеличивает сложность на стороне клиента. -Несмотря на эти преимущества, у проекций есть ряд встроенных ограничений, о которых -пользователям следует знать, поэтому их следует использовать избирательно. +Несмотря на эти преимущества, у проекций есть некоторые присущие им ограничения, +о которых пользователям следует знать, поэтому применять их стоит выборочно. - Проекции не позволяют использовать разные TTL для исходной таблицы и - (скрытой) целевой таблицы, тогда как материализованные представления допускают разные TTL. + (скрытой) целевой таблицы, тогда как материализованные представления позволяют задавать разные TTL. - Легковесные операции обновления и удаления не поддерживаются для таблиц с проекциями. -- Материализованные представления можно выстраивать в цепочки: целевая таблица одного материализованного представления - может быть исходной таблицей для другого материализованного представления и так далее. Это +- Материализованные представления можно выстраивать в цепочку: целевая таблица одного материализованного представления + может быть исходной таблицей другого материализованного представления и так далее. Это невозможно для проекций. -- Проекции не поддерживают `JOIN`, тогда как материализованные представления поддерживают. -- Проекции не поддерживают фильтры (клауза `WHERE`), тогда как материализованные представления поддерживают. +- Определения проекций не поддерживают соединения (JOIN), тогда как материализованные представления их поддерживают. Однако запросы к таблицам с проекциями могут свободно использовать соединения. +- Определения проекций не поддерживают фильтры (оператор `WHERE`), тогда как материализованные представления их поддерживают. Однако запросы к таблицам с проекциями могут свободно использовать фильтрацию. Мы рекомендуем использовать проекции, когда: -- Требуется полная переупорядоченная организация данных. Хотя выражение в +- Требуется полное переупорядочивание данных. Хотя выражение в проекции теоретически может использовать `GROUP BY`, материализованные представления более эффективны для поддержки агрегатов. Оптимизатор запросов также с большей вероятностью будет использовать проекции, выполняющие простое переупорядочивание, то есть `SELECT * ORDER BY x`. Пользователи могут выбрать подмножество столбцов в этом выражении, чтобы уменьшить - объем хранимых данных. -- Пользователи готовы к возможному увеличению объема хранимых данных и - накладным расходам на двойную запись данных. Протестируйте влияние на скорость вставки и + занимаемый объём хранения. +- Пользователи готовы к потенциальному увеличению занимаемого объёма хранения и + накладным расходам на двукратную запись данных. Протестируйте влияние на скорость вставки и [оцените накладные расходы на хранение](/data-compression/compression-in-clickhouse). +## Примеры {#examples} - -## Примеры - -### Фильтрация по столбцам, которые не входят в первичный ключ +### Фильтрация по столбцам, которые не входят в первичный ключ {#filtering-without-using-primary-keys} В этом примере мы покажем, как добавить проекцию к таблице. -Мы также рассмотрим, как можно использовать проекцию для ускорения запросов, которые фильтруют +Мы также рассмотрим, как проекция может использоваться для ускорения запросов, которые фильтруют по столбцам, не входящим в первичный ключ таблицы. В этом примере мы будем использовать набор данных New York Taxi Data, доступный на [sql.clickhouse.com](https://sql.clickhouse.com/), который упорядочен по `pickup_datetime`. -Напишем простой запрос, чтобы найти все идентификаторы поездок, в которых пассажиры -дали водителю чаевые свыше 200 $: +Напишем простой запрос, чтобы найти все идентификаторы поездок, для которых пассажиры +дали водителю чаевые свыше $200: ```sql runnable SELECT @@ -140,8 +130,8 @@ FROM nyc_taxi.trips WHERE tip_amount > 200 AND trip_duration_min > 0 ORDER BY tip_amount, trip_id ASC ``` -Обратите внимание, что поскольку мы фильтруем по `tip_amount`, который не участвует в `ORDER BY`, ClickHouse -вынужден выполнить полное сканирование таблицы. Ускорим этот запрос. +Обратите внимание, что из‑за того, что мы фильтруем по `tip_amount`, который не входит в `ORDER BY`, ClickHouse +приходится выполнять полное сканирование таблицы. Давайте ускорим этот запрос. Чтобы сохранить исходную таблицу и результаты, мы создадим новую таблицу и скопируем данные с помощью `INSERT INTO SELECT`: @@ -150,7 +140,7 @@ CREATE TABLE nyc_taxi.trips_with_projection AS nyc_taxi.trips; INSERT INTO nyc_taxi.trips_with_projection SELECT * FROM nyc_taxi.trips; ``` -Чтобы добавить проекцию, мы используем оператор `ALTER TABLE` вместе с оператором `ADD PROJECTION`: +Чтобы добавить проекцию, используем оператор `ALTER TABLE` вместе с оператором `ADD PROJECTION`: ```sql ALTER TABLE nyc_taxi.trips_with_projection @@ -161,9 +151,9 @@ ADD PROJECTION prj_tip_amount ) ``` -После добавления проекции необходимо выполнить оператор `MATERIALIZE PROJECTION`, -чтобы данные в ней были физически упорядочены и перезаписаны -в соответствии с указанным выше запросом: +После добавления проекции необходимо использовать оператор `MATERIALIZE PROJECTION`, +чтобы данные в ней были физически отсортированы и перезаписаны в соответствии +с приведённым выше запросом: ```sql ALTER TABLE nyc.trips_with_projection MATERIALIZE PROJECTION prj_tip_amount @@ -180,9 +170,9 @@ FROM nyc_taxi.trips_with_projection WHERE tip_amount > 200 AND trip_duration_min ORDER BY tip_amount, trip_id ASC ``` -Обратите внимание, что нам удалось существенно сократить время выполнения запроса и при этом сканировать меньше строк. +Обратите внимание, что нам удалось существенно сократить время выполнения запроса и при этом просканировать меньше строк. -Мы можем подтвердить, что приведённый выше запрос действительно использовал созданную нами проекцию, обратившись к таблице `system.query_log`: +Мы можем подтвердить, что наш запрос выше действительно использовал созданную нами проекцию, обратившись к таблице `system.query_log`: ```sql SELECT query, projections @@ -200,18 +190,18 @@ WHERE query_id='' └───────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────┘ ``` -### Использование проекций для ускорения запросов к данным UK Price Paid -Чтобы продемонстрировать, как проекции могут использоваться для ускорения выполнения запросов, рассмотрим пример с использованием реального набора данных. В этом примере мы будем -использовать таблицу из нашего руководства [UK Property Price Paid](https://clickhouse.com/docs/getting-started/example-datasets/uk-price-paid) -с 30,03 миллионами строк. Этот набор данных также доступен в нашей среде -[sql.clickhouse.com](https://sql.clickhouse.com/?query_id=6IDMHK3OMR1C97J6M9EUQS). +### Использование проекций для ускорения запросов к данным UK price paid {#using-projections-to-speed-up-UK-price-paid} -Если вы хотите посмотреть, как была создана таблица и как в неё были вставлены данные, вы можете -обратиться к разделу [«The UK property prices dataset»](/getting-started/example-datasets/uk-price-paid). +Чтобы продемонстрировать, как проекции могут использоваться для ускорения выполнения запросов, +рассмотрим пример на реальном наборе данных. В этом примере мы будем +использовать таблицу из руководства [UK Property Price Paid](https://clickhouse.com/docs/getting-started/example-datasets/uk-price-paid), +содержащую 30,03 миллиона строк. Этот набор данных также доступен в +среде [sql.clickhouse.com](https://sql.clickhouse.com/?query_id=6IDMHK3OMR1C97J6M9EUQS). -Мы можем выполнить два простых запроса к этому набору данных. Первый выводит список графств Лондона, -в которых были заплачены самые высокие цены, а второй вычисляет среднюю цену по этим графствам: +Если вы хотите узнать, как была создана таблица и загружены данные, обратитесь к странице ["Набор данных о ценах на недвижимость в Великобритании"](/getting-started/example-datasets/uk-price-paid). + +Мы можем выполнить два простых запроса к этому набору данных. Первый выводит список районов Лондона с наибольшими суммами оплаты, а второй вычисляет среднюю цену по районам: ```sql runnable SELECT @@ -223,7 +213,6 @@ ORDER BY price DESC LIMIT 3 ``` - ```sql runnable SELECT county, @@ -234,7 +223,7 @@ ORDER BY avg(price) DESC LIMIT 3 ``` -Обратите внимание, что, несмотря на очень высокую скорость выполнения, для обоих запросов был выполнен полный скан всей таблицы с 30,03 миллионами строк из‑за того, что ни `town`, ни `price` не были указаны в нашем операторе `ORDER BY` при создании таблицы: +Обратите внимание, что несмотря на высокую скорость выполнения, для обоих запросов было выполнено полное сканирование всех 30,03 миллионов строк, так как ни `town`, ни `price` не были включены в ORDER BY при создании таблицы: ```sql CREATE TABLE uk.uk_price_paid @@ -246,18 +235,19 @@ ENGINE = MergeTree ORDER BY (postcode1, postcode2, addr1, addr2); ``` -Давайте посмотрим, удастся ли нам ускорить выполнение этого запроса с помощью проекций. +Проверим, можно ли ускорить этот запрос с помощью проекций. -Чтобы сохранить исходную таблицу и результаты, мы создадим новую таблицу и скопируем данные с помощью оператора `INSERT INTO SELECT`: +Чтобы сохранить исходную таблицу и результаты, создадим новую таблицу и скопируем данные с помощью `INSERT INTO SELECT`: ```sql CREATE TABLE uk.uk_price_paid_with_projections AS uk_price_paid; INSERT INTO uk.uk_price_paid_with_projections SELECT * FROM uk.uk_price_paid; ``` -Мы создаём и заполняем проекцию `prj_oby_town_price`, которая создаёт -дополнительную (скрытую) таблицу с первичным индексом и сортировкой по городу и цене, -чтобы оптимизировать запрос, возвращающий графства в конкретном городе по наивысшим ценам: +Создаём и заполняем проекцию `prj_oby_town_price`, которая создаёт +дополнительную (скрытую) таблицу с первичным индексом, упорядоченную по городу и цене, для +оптимизации запроса, который выводит список округов в указанном городе с максимальными +ценами: ```sql ALTER TABLE uk.uk_price_paid_with_projections @@ -276,12 +266,11 @@ ALTER TABLE uk.uk_price_paid_with_projections SETTINGS mutations_sync = 1 ``` -Параметр [`mutations_sync`](/operations/settings/settings#mutations_sync) -используется для принудительного синхронного выполнения. +Настройка [`mutations_sync`](/operations/settings/settings#mutations_sync) используется для принудительного синхронного выполнения. -Мы создаём и заполняем проекцию `prj_gby_county` — дополнительную (скрытую) таблицу, -которая инкрементально предварительно вычисляет агрегатные значения avg(price) для всех 130 существующих -графств Великобритании: +Создаём и заполняем проекцию `prj_gby_county` — дополнительную (скрытую) таблицу, +которая инкрементно предвычисляет агрегированные значения avg(price) для всех существующих +130 округов Великобритании: ```sql ALTER TABLE uk.uk_price_paid_with_projections @@ -301,19 +290,18 @@ SETTINGS mutations_sync = 1 ``` :::note -Если в проекции, как в `prj_gby_county` выше, используется предложение `GROUP BY`, -то базовым движком хранения для (скрытой) таблицы становится `AggregatingMergeTree`, -а все агрегатные функции преобразуются в `AggregateFunction`. Это обеспечивает -корректную инкрементальную агрегацию данных. +Если в проекции используется предложение `GROUP BY`, как в проекции `prj_gby_county` +выше, то базовым движком хранения для (скрытой) таблицы +становится `AggregatingMergeTree`, и все агрегатные функции преобразуются в +`AggregateFunction`. Это обеспечивает правильную инкрементную агрегацию данных. ::: -Рисунок ниже представляет собой визуализацию основной таблицы `uk_price_paid_with_projections` -и её двух проекций: +На рисунке ниже показана визуализация основной таблицы `uk_price_paid_with_projections` +и двух её проекций: -Визуализация основной таблицы uk_price_paid_with_projections и её двух проекций +Визуализация основной таблицы uk_price_paid_with_projections и двух её проекций -Если теперь снова выполнить запрос, который выводит округа Лондона с тремя -наибольшими ценами покупки, мы увидим улучшение производительности запроса: +Если теперь снова выполнить запрос, который выводит районы Лондона с тремя самыми высокими ценами продажи, мы увидим улучшение производительности запроса: ```sql runnable SELECT @@ -325,7 +313,8 @@ ORDER BY price DESC LIMIT 3 ``` -Аналогично для запроса, выводящего графства Великобритании с тремя наибольшими средними ценами покупки: +Аналогично для запроса, который выводит три округа Великобритании с наибольшими +средними ценами: ```sql runnable SELECT @@ -337,21 +326,18 @@ ORDER BY avg(price) DESC LIMIT 3 ``` -Обратите внимание, что оба запроса обращаются к исходной таблице и что оба -запроса привели к полному сканированию таблицы (все 30,03 миллиона строк были -прочитаны с диска) до того, как мы создали две проекции. +Обратите внимание, что оба запроса обращаются к исходной таблице, и оба запроса привели к полному сканированию таблицы (все 30,03 миллиона строк были считаны с диска) до создания двух проекций. -Также обратите внимание, что запрос, который перечисляет графства в Лондоне по -трём самым высоким ценам продажи, считывает (стримит) 2,17 миллиона строк. Когда мы -напрямую использовали вторую таблицу, специально оптимизированную под этот запрос, с диска -было прочитано всего 81,92 тысячи строк. +Также обратите внимание, что запрос, который выводит графства Лондона с тремя +наиболее высокими ценами, считывает в потоковом режиме 2,17 миллиона строк. Когда мы использовали вторую таблицу, +оптимизированную под этот запрос, с диска было прочитано только 81,92 тысячи строк. -Причина этой разницы в том, что в данный момент оптимизация -`optimize_read_in_order`, упомянутая выше, не поддерживается для проекций. +Причина этой разницы в том, что в настоящее время оптимизация `optimize_read_in_order`, +упомянутая выше, не поддерживается для проекций. -Мы проверяем таблицу `system.query_log`, чтобы увидеть, что ClickHouse -автоматически использовал две проекции для двух приведённых выше запросов -(см. столбец projections ниже): +Мы анализируем таблицу `system.query_log` и видим, что ClickHouse +автоматически использовал две проекции для двух приведённых выше запросов (см. столбец +projections ниже): ```sql SELECT @@ -367,10 +353,9 @@ ORDER BY initial_query_start_time DESC FORMAT Vertical ``` - ```response Строка 1: -───────── +────── tables: ['uk.uk_price_paid_with_projections'] query: SELECT county, @@ -384,7 +369,7 @@ read_rows: 132.00 projections: ['uk.uk_price_paid_with_projections.prj_gby_county'] Строка 2: -───────── +────── tables: ['uk.uk_price_paid_with_projections'] query: SELECT county, @@ -398,23 +383,25 @@ query_duration: 11 мс read_rows: 2.29 млн projections: ['uk.uk_price_paid_with_projections.prj_obj_town_price'] -Получено 2 строки. Прошло: 0.006 сек. +2 строки. Затрачено: 0.006 сек. ``` -### Дополнительные примеры -В следующих примерах используется тот же набор данных по ценам в Великобритании, чтобы сравнить запросы с проекциями и без них. +### Дополнительные примеры {#further-examples} -Чтобы сохранить нашу исходную таблицу (и производительность), мы снова создаём копию таблицы с помощью `CREATE AS` и `INSERT INTO SELECT`. +В следующих примерах используется тот же набор данных с ценами в Великобритании, и сравниваются запросы с использованием проекций и без них. + +Чтобы сохранить нашу исходную таблицу (и производительность), мы снова создадим копию таблицы с помощью `CREATE AS` и `INSERT INTO SELECT`. ```sql CREATE TABLE uk.uk_price_paid_with_projections_v2 AS uk.uk_price_paid; INSERT INTO uk.uk_price_paid_with_projections_v2 SELECT * FROM uk.uk_price_paid; ``` -#### Создание проекции -Создадим агрегирующую проекцию по измерениям `toYear(date)`, `district` и `town`: +#### Построим проекцию {#build-projection} + +Давайте создадим агрегатную проекцию по измерениям `toYear(date)`, `district` и `town`: ```sql ALTER TABLE uk.uk_price_paid_with_projections_v2 @@ -434,7 +421,7 @@ ALTER TABLE uk.uk_price_paid_with_projections_v2 ) ``` -Заполните проекцию для существующих данных. (Если не выполнять материализацию, проекция будет создаваться только для вновь вставляемых данных): +Заполните проекцию для существующих данных. (Без материализации проекция будет создаваться только для данных, вставляемых после этого): ```sql ALTER TABLE uk.uk_price_paid_with_projections_v2 @@ -442,9 +429,10 @@ ALTER TABLE uk.uk_price_paid_with_projections_v2 SETTINGS mutations_sync = 1 ``` -Следующие запросы сравнивают производительность с проекциями и без них. Для отключения использования проекций используется настройка [`optimize_use_projections`](/operations/settings/settings#optimize_use_projections), которая включена по умолчанию. +Следующие запросы сравнивают производительность при использовании проекций и без них. Чтобы отключить использование проекций, мы используем настройку [`optimize_use_projections`](/operations/settings/settings#optimize_use_projections), которая включена по умолчанию. + -#### Запрос 1. Средняя цена по годам +#### Запрос 1. Средняя годовая цена {#average-price-projections} ```sql runnable SELECT @@ -468,9 +456,10 @@ ORDER BY year ASC ``` -Результаты должны совпадать, но во втором примере производительность будет лучше! +Результат должен быть таким же, но производительность во втором примере будет лучше! -#### Запрос 2. Средняя цена по годам для Лондона + +#### Запрос 2. Средняя цена по годам в Лондоне {#average-price-london-projections} ```sql runnable SELECT @@ -495,9 +484,10 @@ GROUP BY year ORDER BY year ASC ``` -#### Запрос 3. Самые дорогие районы -Условие (date >= '2020-01-01') необходимо изменить так, чтобы оно соответствовало измерению проекции (`toYear(date) >= 2020)`: +#### Запрос 3. Самые дорогие районы {#most-expensive-neighborhoods-projections} + +Условие (date >= '2020-01-01') нужно изменить так, чтобы оно соответствовало измерению проекции (`toYear(date) >= 2020)`: ```sql runnable SELECT @@ -517,7 +507,6 @@ LIMIT 100 SETTINGS optimize_use_projections=0 ``` - ```sql runnable SELECT town, @@ -535,24 +524,25 @@ ORDER BY price DESC LIMIT 100 ``` -Снова результат тот же, но обратите внимание на улучшение производительности второго запроса. +Результат по-прежнему тот же, но обратите внимание на улучшение производительности второго запроса. -### Комбинирование проекций в одном запросе -Начиная с версии 25.6, на основе поддержки `_part_offset`, -появившейся в предыдущей версии, ClickHouse теперь может использовать несколько -проекций для ускорения одного запроса с несколькими фильтрами. +### Комбинирование проекций в одном запросе {#combining-projections} -Важно, что ClickHouse по-прежнему читает данные только из одной проекции (или базовой таблицы), -но может использовать первичные индексы других проекций, чтобы отбросить ненужные парты до чтения. -Это особенно полезно для запросов, фильтрующих по нескольким столбцам, каждый из которых +Начиная с версии 25.6, на основе поддержки `_part_offset`, добавленной в +предыдущей версии, ClickHouse теперь может использовать несколько проекций для ускорения +одного запроса с несколькими фильтрами. + +Важно, что ClickHouse по‑прежнему считывает данные только из одной проекции (или базовой таблицы), +но может использовать первичные индексы других проекций для отсечения ненужных кусков данных (parts) перед чтением. +Это особенно полезно для запросов, которые фильтруют по нескольким столбцам, при этом каждый из них может соответствовать своей проекции. -> В настоящее время этот механизм позволяет отбрасывать только целые парты. Фильтрация -> на уровне гранул пока не поддерживается. +> В настоящее время этот механизм отсекает только целые части (parts). Отсечение на уровне гранул +> пока не поддерживается. Чтобы продемонстрировать это, мы определим таблицу (с проекциями, использующими столбцы `_part_offset`) -и вставим пять примерных строк, соответствующих диаграммам выше. +и вставим пять примерных строк, соответствующих приведённым выше диаграммам. ```sql CREATE TABLE page_views @@ -594,24 +584,24 @@ INSERT INTO page_views VALUES ( ``` :::note -Примечание: в таблице используются специальные настройки для иллюстрации, -например гранулы размером в одну строку и отключённые слияния частей данных, что не рекомендуется для использования в продакшене. +Примечание: в таблице для наглядности используются нестандартные настройки, такие как гранулы по одной строке +и отключённое слияние частей (parts), что не рекомендуется для использования в продакшене. ::: -Эта конфигурация приводит к следующему: +Эта конфигурация даёт следующий результат: -* Пяти отдельным частям (по одной на каждую вставленную строку) -* По одной записи в первичном индексе на строку (в базовой таблице и в каждой проекции) +* Пять отдельных частей (по одной на каждую вставленную строку) +* По одной записи первичного индекса на строку (в базовой таблице и в каждой проекции) * Каждая часть содержит ровно одну строку -С такой конфигурацией мы выполняем запрос с фильтрацией сразу по `region` и `user_id`. +С такой конфигурацией мы выполняем запрос с фильтрацией и по `region`, и по `user_id`. Поскольку первичный индекс базовой таблицы построен по `event_date` и `id`, он здесь бесполезен, поэтому ClickHouse использует: * `region_proj` для отсечения частей по региону * `user_id_proj` для дополнительного отсечения по `user_id` -Это поведение видно с помощью `EXPLAIN projections = 1`, который показывает, +Это поведение видно при использовании `EXPLAIN projections = 1`, который показывает, как ClickHouse выбирает и применяет проекции. ```sql @@ -619,48 +609,48 @@ EXPLAIN projections=1 SELECT * FROM page_views WHERE region = 'us_west' AND user_id = 107; ``` - ```response ┌─explain────────────────────────────────────────────────────────────────────────────────┐ - 1. │ Expression ((Имена проектов + Проекция)) │ - 2. │ Expression │ + 1. │ Выражение ((Project names + Projection)) │ + 2. │ Выражение │ 3. │ ReadFromMergeTree (default.page_views) │ 4. │ Проекции: │ - 5. │ Имя: region_proj │ - 6. │ Описание: Проекция проанализирована и используется для фильтрации на уровне частей │ - 7. │ Условие: (region in ['us_west', 'us_west']) │ - 8. │ Алгоритм поиска: бинарный поиск │ + 5. │ Название: region_proj │ + 6. │ Описание: проекция проанализирована и используется для фильтрации на уровне частей │ + 7. │ Условие: (region in ['us_west', 'us_west']) │ + 8. │ Алгоритм поиска: двоичный поиск │ 9. │ Части: 3 │ 10. │ Метки: 3 │ -11. │ Диапазоны: 3 │ -12. │ Строки: 3 │ -13. │ Отфильтрованные части: 2 │ -14. │ Имя: user_id_proj │ -15. │ Описание: Проекция проанализирована и используется для фильтрации на уровне частей │ -16. │ Условие: (user_id in [107, 107]) │ -17. │ Алгоритм поиска: бинарный поиск │ +11. │ Диапазоны: 3 │ +12. │ Строки: 3 │ +13. │ Filtered Части: 2 │ +14. │ Название: user_id_proj │ +15. │ Описание: проекция проанализирована и используется для фильтрации на уровне частей │ +16. │ Условие: (user_id in [107, 107]) │ +17. │ Алгоритм поиска: двоичный поиск │ 18. │ Части: 1 │ 19. │ Метки: 1 │ -20. │ Диапазоны: 1 │ -21. │ Строки: 1 │ -22. │ Отфильтрованные части: 2 │ +20. │ Диапазоны: 1 │ +21. │ Строки: 1 │ +22. │ Filtered Части: 2 │ └────────────────────────────────────────────────────────────────────────────────────────┘ ``` -Вывод `EXPLAIN` (показан выше) показывает логический план запроса сверху вниз: +Вывод `EXPLAIN` (показан выше) отображает логический план запроса, сверху вниз: -| Row number | Description | -| ---------- | ------------------------------------------------------------------------------------------------------------------------ | -| 3 | План чтения из базовой таблицы `page_views` | -| 5-13 | Использует `region_proj`, чтобы определить 3 части, где `region = 'us_west'`, отсекая 2 из 5 частей | -| 14-22 | Использует `user_id_proj`, чтобы определить 1 часть, где `user_id = 107`, дополнительно отсекая 2 из 3 оставшихся частей | -В итоге из базовой таблицы читается только **1 часть из 5**. -Комбинируя анализ индексов нескольких проекций, ClickHouse значительно сокращает объём сканируемых данных, -повышая производительность при низких накладных расходах на хранение. +| Номер строки | Описание | +|--------------|--------------------------------------------------------------------------------------------------------| +| 3 | Планирует чтение из базовой таблицы `page_views` | +| 5-13 | Использует `region_proj` для определения 3 частей, где `region = 'us_west'`, отбрасывая 2 из 5 частей | +| 14-22 | Использует `user_id_proj` для определения 1 части, где `user_id = 107`, дополнительно отбрасывая 2 из 3 оставшихся частей | +В итоге из базовой таблицы читается только **1 из 5 частей**. +За счет комбинированного анализа индексов нескольких проекций ClickHouse существенно снижает объем сканируемых данных, +повышая производительность при низких накладных расходах на хранение. ## Связанные материалы {#related-content} + - [Практическое введение в первичные индексы ClickHouse](/guides/best-practices/sparse-primary-indexes#option-3-projections) - [Материализованные представления](/docs/materialized-views) -- [ALTER PROJECTION](/sql-reference/statements/alter/projection) +- [ALTER PROJECTION](/sql-reference/statements/alter/projection) \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md b/i18n/ru/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md index 452575b7335..11853a2f3c5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md @@ -1,97 +1,93 @@ --- slug: /managing-data/materialized-views-versus-projections -sidebar_label: 'Материализованные представления и проекции' +sidebar_label: 'Материализованные представления vs проекции' title: 'Материализованные представления и проекции' hide_title: false -description: 'Статья, сравнивающая материализованные представления и проекции в ClickHouse, включая сценарии использования, производительность и ограничения.' +description: 'Статья, сравнивающая материализованные представления и проекции в ClickHouse, включая их варианты использования, производительность и ограничения.' doc_type: 'reference' keywords: ['materialized views', 'projections', 'differences'] --- -> Один из частых вопросов пользователей — когда следует использовать материализованные представления, а когда проекции. В этой статье мы рассмотрим ключевые различия между ними и объясним, почему в определённых сценариях вы можете предпочесть один вариант другому. +> Один из частых вопросов пользователей — когда следует использовать материализованные представления, а когда +проекции. В этой статье мы рассмотрим ключевые различия между ними и разберёмся, почему в определённых сценариях +стоит предпочесть один подход другому. +## Сводка ключевых различий {#key-differences} - -## Краткое описание ключевых различий {#key-differences} - -В таблице ниже обобщены ключевые различия между материализованными представлениями и проекциями по ряду аспектов. +В таблице ниже приведены ключевые различия между материализованными представлениями и проекциями по различным аспектам. | Аспект | Материализованные представления | Проекции | |----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Хранение данных и их расположение | Сохраняют свои результаты в **отдельной явной целевой таблице**, действуя как триггеры вставки при `INSERT` в исходную таблицу. | Проекции создают оптимизированные схемы хранения данных, которые физически **хранятся рядом с основными данными таблицы** и невидимы для пользователя. | -| Механизм обновления | Работают **синхронно** при `INSERT` в исходную таблицу (для инкрементальных материализованных представлений). Примечание: их также можно **запускать по расписанию** с помощью обновляемых материализованных представлений. | **Асинхронные** обновления в фоновом режиме при `INSERT` в основную таблицу. | -| Взаимодействие с запросами | Работа с материализованными представлениями требует **прямого запроса к целевой таблице**, то есть пользователи должны знать о существовании материализованных представлений при написании запросов. | Проекции **автоматически выбираются** оптимизатором запросов ClickHouse и являются прозрачными в том смысле, что пользователю не нужно изменять свои запросы к таблице с проекцией, чтобы её использовать. Начиная с версии 25.6 также возможно фильтровать более чем по одной проекции. | -| Обработка `UPDATE` / `DELETE` | **Не реагируют автоматически** на операции `UPDATE` или `DELETE` в исходной таблице, поскольку материализованные представления не имеют информации об исходной таблице и действуют только как триггеры вставки _в_ исходную таблицу. Это может привести к потенциальной несогласованности данных между исходной и целевой таблицами и требует обходных решений или периодического полного обновления (через обновляемое материализованное представление). | По умолчанию **несовместимы со строками `DELETED`** (особенно с lightweight‑удалениями). `lightweight_mutation_projection_mode` (v24.7+) может включить совместимость. | -| Поддержка `JOIN` | Да. Обновляемые материализованные представления могут использоваться для сложной денормализации. Инкрементальные материализованные представления срабатывают только при вставках в крайнюю левую таблицу. | Нет. Операции `JOIN` не поддерживаются в определениях проекций для фильтрации материализованных данных. | -| Условие `WHERE` в определении | Да. Условия `WHERE` могут быть включены для фильтрации данных перед материализацией. | Нет. Условия `WHERE` не поддерживаются в определениях проекций для фильтрации материализованных данных. | -| Возможность построения цепочек | Да, целевая таблица одного материализованного представления может быть источником для другого материализованного представления, что позволяет строить многостадийные конвейеры обработки. | Нет. Проекции не могут быть связаны в цепочку. | -| Поддерживаемые движки таблиц | Могут использоваться с различными движками исходных таблиц, но целевые таблицы обычно относятся к семейству `MergeTree`. | **Доступны только** для движков таблиц семейства `MergeTree`. | -| Обработка сбоев | Сбой во время вставки данных означает потерю данных в целевой таблице, что может привести к потенциальной несогласованности. | Сбои **тихо** обрабатываются в фоновом режиме. Запросы могут прозрачно сочетать материализованные и нематериализованные части данных. | -| Операционные накладные расходы | Требуют явного создания целевой таблицы и зачастую ручного начального заполнения. Управление согласованностью при `UPDATE`/`DELETE` повышает сложность. | Проекции автоматически поддерживаются и синхронизируются и, как правило, создают меньшую операционную нагрузку. | -| Совместимость с запросами `FINAL` | В целом совместимы, но часто требуют `GROUP BY` по целевой таблице. | **Не работают** с запросами `FINAL`. | -| Ленивая материализация | Да. | Следите за проблемами совместимости проекций при использовании возможностей ленивой материализации. Возможно, потребуется установить `query_plan_optimize_lazy_materialization = false`. | -| Параллельные реплики | Да. | Нет. | -| [`optimize_read_in_order`](/operations/settings/settings#optimize_read_in_order) | Да. | Да. | -| Лёгкие (lightweight) операции обновления и удаления | Да. | Нет. | - - +| Data storage and location | Сохраняют свои результаты в **отдельной, явно заданной целевой таблице**, выступая в роли триггеров вставки при `INSERT` в исходную таблицу. | Проекции создают оптимизированные структуры данных, которые физически **хранятся рядом с основными данными таблицы** и невидимы для пользователя. | +| Update mechanism | Работают **синхронно** при `INSERT` в исходную таблицу (для инкрементальных материализованных представлений). Примечание: их также можно **планировать по расписанию** с помощью обновляемых материализованных представлений. | **Асинхронные** обновления в фоновом режиме при `INSERT` в основную таблицу. | +| Query interaction | Работа с материализованными представлениями требует прямого выполнения запросов к **целевой таблице**, то есть пользователи должны знать о существовании материализованных представлений при написании запросов. | Проекции **автоматически выбираются** оптимизатором запросов ClickHouse и являются прозрачными в том смысле, что пользователю не нужно изменять свои запросы к таблице с проекцией, чтобы её использовать. Начиная с версии 25.6 также можно фильтровать более чем по одной проекции. | +| Handling `UPDATE` / `DELETE` | **Не реагируют автоматически** на операции `UPDATE` или `DELETE` над исходной таблицей, так как материализованные представления не обладают информацией об исходной таблице и работают только как триггеры вставки _в_ исходную таблицу. Это может приводить к потенциальной несвежести данных между исходной и целевой таблицами и требует обходных решений или периодического полного обновления (через обновляемое материализованное представление). | По умолчанию **несовместимы с удалёнными (`DELETED`) строками** (особенно с облегчёнными удалениями — lightweight deletes). Параметр `lightweight_mutation_projection_mode` (v24.7+) может включить совместимость. | +| `JOIN` support | Да. Обновляемые материализованные представления могут использоваться для сложной денормализации. Инкрементальные материализованные представления срабатывают только при вставках в самую левую таблицу. | Нет. Операции `JOIN` не поддерживаются в определениях проекций для фильтрации материализованных данных. Однако запросы, которые делают `JOIN` таблиц с проекциями, работают нормально — проекции оптимизируют доступ к отдельным таблицам. | +| `WHERE` clause in definition | Да. Условия `WHERE` могут быть включены для фильтрации данных до материализации. | Нет. Условия `WHERE` не поддерживаются в определениях проекций для фильтрации материализованных данных. | +| Chaining capabilities | Да, целевая таблица одного материализованного представления может быть источником для другого материализованного представления, что позволяет строить многоступенчатые конвейеры. | Нет. Проекции нельзя связывать в цепочку. | +| Applicable table engines | Могут использоваться с различными движками исходных таблиц, но целевые таблицы обычно принадлежат семейству `MergeTree`. | **Доступны только** для движков таблиц семейства `MergeTree`. | +| Failure handling | Сбой во время вставки данных означает потерю данных в целевой таблице, что может привести к несогласованности данных. | Сбои **тихо** обрабатываются в фоновом режиме. Запросы могут бесшовно комбинировать материализованные и нематериализованные части данных. | +| Operational overhead | Требуют явного создания целевой таблицы и часто ручного дозаполнения (backfill). Управление согласованностью данных при `UPDATE`/`DELETE` повышает сложность. | Проекции автоматически поддерживаются и синхронизируются и, как правило, создают меньшую операционную нагрузку. | +| `FINAL` query compatibility | В целом совместимы, но часто требуют `GROUP BY` по целевой таблице. | **Не работают** с запросами `FINAL`. | +| Lazy materialization | Да. | Следите за проблемами совместимости проекций при использовании механизмов ленивой материализации. Возможно, потребуется установить `query_plan_optimize_lazy_materialization = false`. | +| Parallel replicas | Да. | Нет. | +| [`optimize_read_in_order`](/operations/settings/settings#optimize_read_in_order) | Да. | Да. | +| Lightweight updates and deletes | Да. | Нет. | ## Сравнение материализованных представлений и проекций {#choose-between} -### Когда выбирать материализованные представления {#choosing-materialized-views} +### Когда стоит выбирать материализованные представления {#choosing-materialized-views} -Рассмотрите возможность использования материализованных представлений, когда: +Использование материализованных представлений стоит рассмотреть, когда: -- Вы работаете с **ETL в реальном времени и многостадийными конвейерами обработки данных:** необходимо выполнять сложные преобразования, агрегации или маршрутизацию данных по мере их поступления, потенциально через несколько стадий путём связывания представлений в цепочку. -- Вам требуется **сложная денормализация**: необходимо предварительно объединять данные из нескольких источников (таблиц, подзапросов или словарей) в одну таблицу, оптимизированную для запросов, особенно если допустимы периодические полные обновления с использованием обновляемых материализованных представлений. -- Вам нужен **явный контроль схемы**: требуется отдельная целевая таблица с собственной схемой и движком для предвычисленных результатов, что обеспечивает большую гибкость при моделировании данных. -- Вы хотите **фильтровать на этапе приёма данных**: необходимо отфильтровать данные _до того_, как они материализуются, уменьшая объём данных, записываемых в целевую таблицу. +- Вы работаете с **ETL в режиме реального времени и многостадийными конвейерами обработки данных:** Нужно выполнять сложные преобразования, агрегации или маршрутизацию данных по мере их поступления, возможно, через несколько стадий, связывая представления в цепочки. +- Вам требуется **сложная денормализация**: Нужно заранее объединить данные из нескольких источников (таблиц, подзапросов или словарей) в одну таблицу, оптимизированную для запросов, особенно если допустимы периодические полные обновления с использованием обновляемых материализованных представлений. +- Вам нужен **явный контроль над схемой**: Требуется отдельная целевая таблица с собственной схемой и движком для предварительно вычисленных результатов, что обеспечивает большую гибкость при моделировании данных. +- Вы хотите **фильтровать на этапе ингестии**: Нужно отфильтровать данные _до того_, как они будут материализованы, уменьшая объём данных, записываемых в целевую таблицу. ### Когда следует избегать материализованных представлений {#avoid-materialized-views} -Рассмотрите возможность отказа от использования материализованных представлений, когда: +Следует рассмотреть отказ от использования материализованных представлений, когда: -- **Исходные данные часто обновляются или удаляются**: без дополнительных стратегий обеспечения согласованности между исходной и целевой таблицами инкрементные материализованные представления могут устаревать и становиться несогласованными. -- **Предпочтительны простота и автоматическая оптимизация**: если вы хотите избежать управления отдельными целевыми таблицами. +- **Исходные данные часто обновляются или удаляются**: Без дополнительных стратегий поддержания согласованности между исходными и целевыми таблицами инкрементальные материализованные представления могут устаревать и становиться несогласованными. +- **Предпочитаются простота и автоматическая оптимизация**: Если вы не хотите управлять отдельными целевыми таблицами. -### Когда выбирать проекции {#choosing-projections} +### Когда следует использовать проекции {#choosing-projections} -Рассмотрите возможность использования проекций, когда: +Рекомендуется рассматривать использование проекций, когда: -- **Оптимизируются запросы к одной таблице**: ваша основная цель — ускорить запросы к одной базовой таблице за счёт предоставления альтернативных порядков сортировки, оптимизации фильтрации по столбцам, не входящим в первичный ключ, или предвычисления агрегатов для одной таблицы. -- Вам нужна **прозрачность запросов**: вы хотите, чтобы запросы по-прежнему были нацелены на исходную таблицу без модификаций, полагаясь на ClickHouse при выборе наилучшего формата данных для конкретного запроса. +- **Оптимизируете запросы для одной таблицы**: ваша основная цель — ускорить запросы к одной базовой таблице за счёт задания альтернативных порядков сортировки, оптимизации фильтров по столбцам, которые не входят в первичный ключ, или предварительного вычисления агрегаций для одной таблицы. +- Вам нужна **прозрачность запросов**: вы хотите, чтобы запросы по-прежнему выполнялись к исходной таблице без изменений, полагаясь на ClickHouse при выборе наилучшего расположения данных для конкретного запроса. ### Когда следует избегать проекций {#avoid-projections} -Рассмотрите возможность отказа от использования проекций, когда: - -- **Требуются сложные преобразования данных или многостадийный ETL**: проекции не поддерживают операции `JOIN` в своих определениях, не могут изменяться для построения многошаговых конвейеров и не поддерживают некоторые возможности SQL, такие как оконные функции или сложные выражения `CASE`. Поэтому они не подходят для сложных преобразований данных. -- **Нужно явное фильтрование материализованных данных**: проекции не поддерживают `WHERE` в определении для фильтрации данных, которые материализуются в самой проекции. -- **Используются таблицы на движках, отличных от MergeTree**: проекции доступны исключительно для таблиц, использующих семейство движков `MergeTree`. -- `FINAL`-запросы имеют ключевое значение: проекции не работают с `FINAL`-запросами, которые иногда используются для дедупликации. -- Вам нужны [параллельные реплики](/deployment-guides/parallel-replicas), так как они не поддерживаются проекциями. - +Рекомендуется избегать использования проекций в следующих случаях: +- **Требуется сложная трансформация данных или многоэтапный ETL**: Определения проекций не поддерживают операции `JOIN`, не могут быть объединены в цепочки для построения многошаговых конвейеров и не работают с некоторыми возможностями SQL, такими как оконные функции или сложные выражения `CASE`. Хотя запросы к таблицам с проекциями могут свободно использовать `JOIN`, сами проекции не подходят для сложной трансформации данных. +- **Нужна явная фильтрация материализованных данных**: Проекции не поддерживают использование предложения `WHERE` в определении для фильтрации данных, которые материализуются в саму проекцию. +- **Используются табличные движки, отличные от MergeTree**: Проекции доступны исключительно для таблиц, использующих семейство движков `MergeTree`. +- Запросы с `FINAL` являются критически важными: проекции не работают с запросами `FINAL`, которые иногда используются для дедупликации. +- Вам нужны [параллельные реплики](/deployment-guides/parallel-replicas), так как они не поддерживаются при использовании проекций. ## Резюме {#summary} -Материализованные представления и проекции — оба мощных инструмента в вашем арсенале -для оптимизации запросов и преобразования данных, и в целом мы не рекомендуем рассматривать -их использование как взаимоисключающий выбор. Вместо этого их можно применять -взаимодополняющим образом, чтобы получить максимум от ваших запросов. Таким образом, выбор -между материализованными представлениями и проекциями в ClickHouse действительно зависит -от вашего конкретного сценария использования и паттернов доступа. - -В качестве общего практического правила вам следует рассматривать использование -материализованных представлений, когда нужно агрегировать данные из одной или -нескольких исходных таблиц в целевую таблицу или выполнять сложные преобразования -в больших масштабах. Материализованные представления отлично подходят для переноса выполнения -дорогостоящих агрегаций с времени выполнения запроса на время вставки. Они являются -отличным выбором для ежедневных или ежемесячных сводок, дашбордов в реальном времени или -сводной информации по данным. - -С другой стороны, вам следует использовать проекции, когда нужно оптимизировать -запросы, которые фильтруют по другим столбцам, чем те, которые используются в первичном -ключе таблицы и определяют физический порядок данных на диске. Они особенно полезны, -когда больше нет возможности изменить первичный ключ таблицы или когда ваши паттерны -доступа более разнообразны, чем то, что может обеспечить первичный ключ. +Материализованные представления и проекции — это мощные инструменты в вашем арсенале +для оптимизации запросов и преобразования данных, и в целом мы не рекомендуем +рассматривать их использование как взаимоисключающий выбор. Вместо этого их можно +применять взаимодополняющим образом, чтобы получить максимальную отдачу от запросов. +Таким образом, выбор между материализованными представлениями и проекциями в ClickHouse +на самом деле зависит от конкретного сценария использования и паттернов доступа. + +В качестве общего практического правила стоит рассматривать использование +материализованных представлений, когда вам нужно агрегировать данные из одной или нескольких +исходных таблиц в целевую таблицу или выполнять сложные преобразования в больших масштабах. +Материализованные представления отлично подходят для переноса работы по выполнению +ресурсоёмких агрегирующих вычислений с момента выполнения запроса на момент вставки данных. +Это отличный выбор для ежедневных или ежемесячных сводок, дашбордов в реальном времени +или агрегированных обзоров данных. + +С другой стороны, имеет смысл использовать проекции, когда необходимо оптимизировать запросы, +которые фильтруют по другим столбцам, чем те, что используются в первичном ключе таблицы, +определяющем физический порядок данных на диске. Они особенно полезны, когда изменить +первичный ключ таблицы больше невозможно или когда ваши паттерны доступа более разнообразны, +чем то, что может обеспечить первичный ключ. \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/index.md index 8a88b6e12d5..0cc75531d29 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/index.md @@ -6,7 +6,7 @@ keywords: ['руководства по развертыванию', 'масшт doc_type: 'landing-page' --- -# Развертывание и масштабирование +# Развертывание и масштабирование {#deployment-and-scaling} В этом разделе рассматриваются следующие темы: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx index 3b2ba9bedcf..d47248021a3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx @@ -20,15 +20,14 @@ import image_9 from '@site/static/images/deployment-guides/parallel-replicas-9.p - ## Введение \{#introduction\} -ClickHouse обрабатывает запросы чрезвычайно быстро, но как эти запросы -распределяются и выполняются параллельно на нескольких серверах? +ClickHouse обрабатывает запросы чрезвычайно быстро, но как эти запросы +распределяются и выполняются параллельно на нескольких серверах? > В этом руководстве мы сначала рассмотрим, как ClickHouse распределяет запрос -по нескольким шардам с помощью распределённых таблиц, а затем как запрос может -задействовать несколько реплик при выполнении. +> по нескольким шардам с помощью распределённых таблиц, а затем как запрос может +> задействовать несколько реплик при выполнении. ## Шардированная архитектура \{#sharded-architecture\} @@ -48,24 +47,27 @@ ClickHouse обрабатывает запросы чрезвычайно быс На рисунке выше показано, что происходит, когда клиент отправляет запрос к распределённой таблице:
    -
  1. - Запрос SELECT отправляется к распределённой таблице на произвольный узел - (по стратегии round-robin или после маршрутизации балансировщиком нагрузки - на конкретный сервер). Этот узел теперь будет выступать координатором. -
  2. -
  3. - Узел определяет, какие шарды должны выполнить запрос, - используя информацию, указанную в распределённой таблице, и отправляет - запрос на каждый шард. -
  4. -
  5. - Каждый шард локально читает, фильтрует и агрегирует данные, а затем - отправляет агрегируемое состояние координатору. -
  6. -
  7. - Координирующий узел объединяет данные и затем отправляет ответ - обратно клиенту. -
  8. +
  9. + Запрос SELECT отправляется к распределённой таблице на произвольный узел + (по стратегии round-robin или после маршрутизации балансировщиком нагрузки + на конкретный сервер). Этот узел теперь будет выступать координатором. +
  10. + +
  11. + Узел определяет, какие шарды должны выполнить запрос, + используя информацию, указанную в распределённой таблице, и отправляет + запрос на каждый шард. +
  12. + +
  13. + Каждый шард локально читает, фильтрует и агрегирует данные, а затем + отправляет агрегируемое состояние координатору. +
  14. + +
  15. + Координирующий узел объединяет данные и затем отправляет ответ + обратно клиенту. +
Когда мы добавляем реплики, процесс в целом остаётся похожим, с единственным @@ -75,7 +77,7 @@ ClickHouse обрабатывает запросы чрезвычайно быс ## Нешардированная архитектура \{#non-sharded-architecture\} ClickHouse Cloud имеет архитектуру, существенно отличающуюся от представленной выше. -(См. раздел ["ClickHouse Cloud Architecture"](https://clickhouse.com/docs/cloud/reference/architecture) +(См. раздел ["ClickHouse Cloud Architecture"](https://clickhouse.com/docs/cloud/reference/architecture) для получения более подробной информации). Благодаря разделению вычислительных ресурсов и хранилища, а также практически неограниченному объёму хранилища, необходимость в шардах во многом отпадает. @@ -112,26 +114,30 @@ ClickHouse Cloud имеет архитектуру, существенно от При использовании параллельных реплик:
    -
  1. - Запрос от клиента отправляется на один узел после прохождения через - балансировщик нагрузки. Этот узел становится координатором для данного запроса. -
  2. -
  3. - Узел анализирует индекс каждой партиции и выбирает подходящие партиции и - гранулы для обработки. -
  4. -
  5. - Координатор разбивает нагрузку на набор гранул, который можно - распределить между разными репликами. -
  6. -
  7. - Каждый набор гранул обрабатывается соответствующими репликами, и по - завершении на координатор отправляется состояние, пригодное для слияния. -
  8. -
  9. - Наконец, координатор объединяет все результаты от реплик и - возвращает ответ клиенту. -
  10. +
  11. + Запрос от клиента отправляется на один узел после прохождения через + балансировщик нагрузки. Этот узел становится координатором для данного запроса. +
  12. + +
  13. + Узел анализирует индекс каждой партиции и выбирает подходящие партиции и + гранулы для обработки. +
  14. + +
  15. + Координатор разбивает нагрузку на набор гранул, который можно + распределить между разными репликами. +
  16. + +
  17. + Каждый набор гранул обрабатывается соответствующими репликами, и по + завершении на координатор отправляется состояние, пригодное для слияния. +
  18. + +
  19. + Наконец, координатор объединяет все результаты от реплик и + возвращает ответ клиенту. +
Вышеописанные шаги показывают, как параллельные реплики работают в теории. @@ -139,22 +145,25 @@ ClickHouse Cloud имеет архитектуру, существенно от идеальной работе такого механизма:
    -
  1. - Некоторые реплики могут быть недоступны. -
  2. -
  3. - Репликация в ClickHouse асинхронная, поэтому в какой-то момент времени - на некоторых репликах могут отсутствовать те же самые части. -
  4. -
  5. - Нужно как‑то обрабатывать «хвостовые» задержки между репликами. -
  6. -
  7. - Кэш файловой системы различается от реплики к реплике в зависимости - от активности на каждой реплике, поэтому случайное назначение - задач может привести к менее оптимальной производительности с точки - зрения локальности кэша. -
  8. +
  9. + Некоторые реплики могут быть недоступны. +
  10. + +
  11. + Репликация в ClickHouse асинхронная, поэтому в какой-то момент времени + на некоторых репликах могут отсутствовать те же самые части. +
  12. + +
  13. + Нужно как‑то обрабатывать «хвостовые» задержки между репликами. +
  14. + +
  15. + Кэш файловой системы различается от реплики к реплике в зависимости + от активности на каждой реплике, поэтому случайное назначение + задач может привести к менее оптимальной производительности с точки + зрения локальности кэша. +
В следующих разделах мы рассмотрим, как удаётся преодолеть эти факторы. @@ -167,30 +176,33 @@ ClickHouse Cloud имеет архитектуру, существенно от Объявления
    -
  1. - Запрос от клиента после прохождения через балансировщик нагрузки - отправляется на один из узлов. Этот узел становится координатором для данного запроса. -
  2. -
  3. - Узел-координатор отправляет запрос на получение объявлений от всех - реплик в кластере. У реплик могут быть немного разные представления о - текущем наборе частей (parts) таблицы. Поэтому нам нужно - собрать эту информацию, чтобы избежать неверных решений при - планировании. -
  4. -
  5. - Затем узел-координатор использует объявления, чтобы определить набор - гранул, которые можно назначить различным репликам. Здесь, например, - мы видим, что ни одна гранула из part 3 не была назначена - реплике 2, потому что эта реплика не указала эту часть в своем - объявлении. Также обратите внимание, что реплике 3 не были назначены - никакие задачи, потому что она не предоставила объявление. -
  6. -
  7. - После того как каждая реплика обработала запрос на своем подмножестве - гранул и объединяемое состояние было отправлено обратно координатору, - координатор объединяет результаты, и ответ отправляется клиенту. -
  8. +
  9. + Запрос от клиента после прохождения через балансировщик нагрузки + отправляется на один из узлов. Этот узел становится координатором для данного запроса. +
  10. + +
  11. + Узел-координатор отправляет запрос на получение объявлений от всех + реплик в кластере. У реплик могут быть немного разные представления о + текущем наборе частей (parts) таблицы. Поэтому нам нужно + собрать эту информацию, чтобы избежать неверных решений при + планировании. +
  12. + +
  13. + Затем узел-координатор использует объявления, чтобы определить набор + гранул, которые можно назначить различным репликам. Здесь, например, + мы видим, что ни одна гранула из part 3 не была назначена + реплике 2, потому что эта реплика не указала эту часть в своем + объявлении. Также обратите внимание, что реплике 3 не были назначены + никакие задачи, потому что она не предоставила объявление. +
  14. + +
  15. + После того как каждая реплика обработала запрос на своем подмножестве + гранул и объединяемое состояние было отправлено обратно координатору, + координатор объединяет результаты, и ответ отправляется клиенту. +
### Динамическая координация \{#dynamic-coordination\} @@ -208,42 +220,46 @@ ClickHouse Cloud имеет архитектуру, существенно от Динамическая координация — часть 1
    -
  1. - Реплики уведомляют узел-координатор, что они готовы обрабатывать - задания, также они могут указать, какой объём работы могут выполнить. -
  2. -
  3. - Координатор назначает задания репликам. -
  4. +
  5. + Реплики уведомляют узел-координатор, что они готовы обрабатывать + задания, также они могут указать, какой объём работы могут выполнить. +
  6. + +
  7. + Координатор назначает задания репликам. +
Динамическая координация — часть 2
    -
  1. - Реплики 1 и 2 могут очень быстро завершить свои задания. Они - запрашивают у узла-координатора новое задание. -
  2. -
  3. - Координатор назначает новые задания репликам 1 и 2. -
  4. +
  5. + Реплики 1 и 2 могут очень быстро завершить свои задания. Они + запрашивают у узла-координатора новое задание. +
  6. + +
  7. + Координатор назначает новые задания репликам 1 и 2. +
Динамическая координация — часть 3
    -
  1. - Все реплики завершили обработку своих заданий. Они - запрашивают дополнительные задания. -
  2. -
  3. - Координатор, используя объявления, проверяет, какие задания - ещё нужно обработать, но оставшихся заданий нет. -
  4. -
  5. - Координатор сообщает репликам, что всё обработано. - Теперь он объединит все состояния, подлежащие слиянию, и вернёт ответ на запрос. -
  6. +
  7. + Все реплики завершили обработку своих заданий. Они + запрашивают дополнительные задания. +
  8. + +
  9. + Координатор, используя объявления, проверяет, какие задания + ещё нужно обработать, но оставшихся заданий нет. +
  10. + +
  11. + Координатор сообщает репликам, что всё обработано. + Теперь он объединит все состояния, подлежащие слиянию, и вернёт ответ на запрос. +
### Управление локальностью кэша \{#managing-cache-locality\} @@ -253,34 +269,38 @@ ClickHouse Cloud имеет архитектуру, существенно от реплику? В предыдущем примере у нас были назначены следующие задачи: - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Реплика 1Реплика 2Реплика 3
Часть 1g1, g6, g7g2, g4, g5g3
Часть 2g1g2, g4, г5g3
Часть 3g1, g6g2, g4, g5g3
+ + Реплика 1Реплика 2Реплика 3
Часть 1g1, g6, g7g2, g4, g5g3
Часть 2g1g2, g4, г5g3
Часть 3g1, g6g2, g4, g5g3
Чтобы гарантировать, что одни и те же задачи назначаются одним и тем же репликам и могут @@ -322,13 +342,13 @@ ClickHouse Cloud имеет архитектуру, существенно от | Setting | Description | |----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `enable_parallel_replicas` | `0`: отключено
`1`: включено
`2`: принудительное использование параллельных реплик, будет сгенерировано исключение, если они не используются. | +| `enable_parallel_replicas` | `0`: отключено
`1`: включено
`2`: принудительное использование параллельных реплик, будет сгенерировано исключение, если они не используются. | | `cluster_for_parallel_replicas` | Имя кластера, используемого для параллельной репликации; если вы используете ClickHouse Cloud, используйте `default`. | | `max_parallel_replicas` | Максимальное количество реплик, используемых для выполнения запроса на нескольких репликах; если указано число, меньшее количества реплик в кластере, узлы будут выбираться случайным образом. Это значение также может быть завышено с учетом горизонтального масштабирования. | -| `parallel_replicas_min_number_of_rows_per_replica` | Позволяет ограничить количество используемых реплик на основе числа строк, которые необходимо обработать. Количество реплик определяется как:
`estimated rows to read` / `min_number_of_rows_per_replica`. | -| `allow_experimental_analyzer` | `0`: использовать старый анализатор
`1`: использовать новый анализатор.

Поведение параллельных реплик может изменяться в зависимости от используемого анализатора. | +| `parallel_replicas_min_number_of_rows_per_replica` | Позволяет ограничить количество используемых реплик на основе числа строк, которые необходимо обработать. Количество реплик определяется как:
`estimated rows to read` / `min_number_of_rows_per_replica`. | +| `allow_experimental_analyzer` | `0`: использовать старый анализатор
`1`: использовать новый анализатор.

Поведение параллельных реплик может изменяться в зависимости от используемого анализатора. | -## Диагностика проблем с параллельными репликами +## Диагностика проблем с параллельными репликами \{#investigating-issues-with-parallel-replicas\} Вы можете проверить, какие настройки используются для каждого запроса, в таблице [`system.query_log`](/docs/operations/system-tables/query_log). Также можно @@ -345,7 +365,6 @@ FROM clusterAllReplicas('default', system.events) WHERE event ILIKE '%ParallelReplicas%' ``` -
Ответ @@ -407,7 +426,6 @@ WHERE query_id = 'ad40c712-d25d-45c4-b1a1-a28ba8d4019c' ORDER BY event_time_microseconds ASC ``` -
Ответ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md index 422b9c6299b..a296abf4133 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md @@ -9,19 +9,19 @@ keywords: ['репликация', 'высокая доступность', 'н --- import Image from '@theme/IdealImage'; -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; import ReplicationArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/replication.png'; -import ConfigFileNote from '@site/docs/_snippets/_config-files.md'; -import KeeperConfigFileNote from '@site/docs/_snippets/_keeper-config-files.md'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import ServerParameterTable from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigFileNote from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_keeper-config-files.md'; +import ConfigExplanation from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import ServerParameterTable from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; +import KeeperConfig from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > В этом примере вы узнаете, как настроить простой кластер ClickHouse, > который реплицирует данные. Настроено пять серверов. Два из них используются для @@ -34,7 +34,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## Предварительные требования {#pre-requisites} - Ранее вы уже развернули [локальный сервер ClickHouse](/install) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md index 7427ef5c9a6..58bcf8416d9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md @@ -9,19 +9,19 @@ keywords: ['шардинг', 'горизонтальное масштабиро --- import Image from '@theme/IdealImage'; -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; import ShardingArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/sharding.png'; -import ConfigFileNote from '@site/docs/_snippets/_config-files.md'; -import KeeperConfigFileNote from '@site/docs/_snippets/_keeper-config-files.md'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import ServerParameterTable from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigFileNote from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_keeper-config-files.md'; +import ConfigExplanation from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import ServerParameterTable from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; +import KeeperConfig from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > В этом примере вы узнаете, как настроить простой масштабируемый кластер ClickHouse. > Настроено пять серверов: два используются для шардинга данных, @@ -33,7 +33,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## Предварительные требования {#pre-requisites} - Вы уже развернули [локальный сервер ClickHouse](/install) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md index cb9c3396663..39f4926da33 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md @@ -10,14 +10,14 @@ keywords: ['развертывание кластера', 'репликация' import Image from '@theme/IdealImage'; import SharedReplicatedArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/both.png'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigExplanation from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import KeeperConfig from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > В этом примере вы узнаете, как развернуть простой кластер ClickHouse, который > одновременно обеспечивает репликацию и масштабирование. Он состоит из двух шардов и двух реплик, @@ -30,7 +30,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## Предварительные требования {#prerequisites} - Вы уже развернули [локальный сервер ClickHouse](/install) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md index 79c7c7312a7..939fb1924f7 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md @@ -8,7 +8,7 @@ doc_type: 'guide' keywords: ['развертывание', 'архитектура', 'репликация', 'шардинг', 'настройка кластера'] --- -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; Примеры развертывания в этом разделе основаны на рекомендациях, которые организация ClickHouse Support and Services предоставляет пользователям ClickHouse. Это рабочие примеры, и мы рекомендуем опробовать их, а затем адаптировать под свои нужды. Возможно, вы найдете здесь пример, который точно соответствует вашим требованиям. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/architecture.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/architecture.md deleted file mode 100644 index 15fe339f87b..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/architecture.md +++ /dev/null @@ -1,324 +0,0 @@ ---- -description: 'Подробный обзор архитектуры ClickHouse и его колоночной архитектуры' -sidebar_label: 'Обзор архитектуры' -sidebar_position: 50 -slug: /development/architecture -title: 'Обзор архитектуры' -doc_type: 'reference' ---- - - - -# Обзор архитектуры - -ClickHouse — это по-настоящему колоночная СУБД. Данные хранятся по столбцам и при выполнении запросов обрабатываются массивами (векторами или чанками столбцов). -По возможности операции выполняются над массивами, а не над отдельными значениями. -Это называется «векторизованное выполнение запросов» и помогает снизить стоимость фактической обработки данных. - -Эта идея не нова. -Она восходит к `APL` (A programming language, 1957) и его потомкам: `A +` (диалект APL), `J` (1990), `K` (1993) и `Q` (язык программирования от Kx Systems, 2003). -Программирование на массивах (array programming) используется в научной обработке данных. Эта идея также не нова и для реляционных баз данных. Например, она используется в системе `VectorWise` (также известной как Actian Vector Analytic Database от компании Actian Corporation). - -Существуют два разных подхода к ускорению обработки запросов: векторизованное выполнение запросов и генерация кода во время выполнения. Второй подход убирает все косвенные обращения и динамическую диспетчеризацию. Ни один из этих подходов не является однозначно лучшим по сравнению с другим. Генерация кода во время выполнения может быть лучше, когда она объединяет множество операций, тем самым полностью используя исполнительные блоки и конвейер CPU. Векторизованное выполнение запросов может быть менее практичным, поскольку оно предполагает использование временных векторов, которые нужно записывать в кэш и считывать обратно. Если временные данные не помещаются в кэш L2, это становится проблемой. Но векторизованное выполнение запросов проще использует SIMD-возможности CPU. [Исследовательская работа](http://15721.courses.cs.cmu.edu/spring2016/papers/p5-sompolski.pdf), написанная нашими коллегами, показывает, что лучше комбинировать оба подхода. ClickHouse использует векторизованное выполнение запросов и имеет ограниченную начальную поддержку генерации кода во время выполнения. - - - -## Столбцы {#columns} - -Интерфейс `IColumn` используется для представления столбцов в памяти (точнее, фрагментов столбцов). Этот интерфейс предоставляет вспомогательные методы для реализации различных реляционных операторов. Почти все операции являются неизменяемыми: они не модифицируют исходный столбец, а создают новый, изменённый. Например, метод `IColumn :: filter` принимает байтовую маску фильтра. Он используется реляционными операторами `WHERE` и `HAVING`. Дополнительные примеры: метод `IColumn :: permute` для поддержки `ORDER BY`, метод `IColumn :: cut` для поддержки `LIMIT`. - -Различные реализации `IColumn` (`ColumnUInt8`, `ColumnString` и т. д.) отвечают за размещение столбцов в памяти. Размещение в памяти обычно представляет собой непрерывный массив. Для целочисленных столбцов это просто один непрерывный массив, подобный `std :: vector`. Для столбцов `String` и `Array` это два вектора: один — для всех элементов массива, размещённых последовательно, и второй — для смещений до начала каждого массива. Также есть `ColumnConst`, который хранит в памяти только одно значение, но выглядит как столбец. - - - -## Field {#field} - -Тем не менее, можно работать и с отдельными (одиночными) значениями. Для представления отдельного значения используется `Field`. `Field` — это просто дискриминирующее объединение типов `UInt64`, `Int64`, `Float64`, `String` и `Array`. В `IColumn` есть метод `operator []` для получения n-го значения в виде `Field` и метод `insert` для добавления `Field` в конец столбца. Эти методы не очень эффективны, поскольку требуют работы с временными объектами `Field`, представляющими отдельное значение. Существуют более эффективные методы, такие как `insertFrom`, `insertRangeFrom` и другие. - -`Field` не содержит достаточно информации о конкретном типе данных в таблице. Например, `UInt8`, `UInt16`, `UInt32` и `UInt64` все представляются как `UInt64` в `Field`. - - - -## Протекающие абстракции {#leaky-abstractions} - -`IColumn` содержит методы для распространённых реляционных преобразований данных, но они не покрывают всех потребностей. Например, в `ColumnUInt64` нет метода для вычисления суммы двух столбцов, а в `ColumnString` — метода для поиска подстроки. Эти многочисленные процедуры реализуются вне `IColumn`. - -Различные функции над столбцами могут быть реализованы обобщённым, но неэффективным способом — с использованием методов `IColumn` для извлечения значений `Field`, либо специализированным способом — с учётом внутренней структуры хранения данных в конкретной реализации `IColumn`. Для этого в самих функциях выполняется приведение столбцов к конкретному типу `IColumn` и непосредственная работа с его внутренним представлением. Например, `ColumnUInt64` имеет метод `getData`, который возвращает ссылку на внутренний массив, после чего отдельная процедура читает или заполняет этот массив напрямую. Мы используем «протекающие абстракции», чтобы обеспечить эффективные специализации различных процедур. - - - -## Типы данных {#data_types} - -`IDataType` отвечает за сериализацию и десериализацию: за чтение и запись фрагментов столбцов или отдельных значений в бинарном или текстовом виде. `IDataType` напрямую соответствует типам данных в таблицах. Например, существуют `DataTypeUInt32`, `DataTypeDateTime`, `DataTypeString` и так далее. - -`IDataType` и `IColumn` связаны друг с другом лишь слабо. Разные типы данных могут быть представлены в памяти одними и теми же реализациями `IColumn`. Например, и `DataTypeUInt32`, и `DataTypeDateTime` представлены `ColumnUInt32` или `ColumnConstUInt32`. Кроме того, один и тот же тип данных может быть представлен разными реализациями `IColumn`. Например, `DataTypeUInt8` может быть представлен `ColumnUInt8` или `ColumnConstUInt8`. - -`IDataType` хранит только метаданные. Например, `DataTypeUInt8` вообще ничего не хранит (кроме виртуального указателя `vptr`), а `DataTypeFixedString` хранит только `N` (размер строк фиксированной длины). - -`IDataType` имеет вспомогательные методы для различных форматов данных. В качестве примера можно привести методы для сериализации значения с возможным заключением в кавычки, сериализации значения для JSON и сериализации значения как части формата XML. Прямого соответствия форматам данных нет. Например, разные форматы данных `Pretty` и `TabSeparated` могут использовать один и тот же вспомогательный метод `serializeTextEscaped` из интерфейса `IDataType`. - - - -## Block {#block} - -`Block` — это контейнер, представляющий подмножество (чанк) таблицы в памяти. Фактически это набор троек: `(IColumn, IDataType, column name)`. Во время выполнения запроса данные обрабатываются объектами `Block`. Если у нас есть `Block`, у нас есть данные (в объекте `IColumn`), есть информация об их типе (в `IDataType`), которая говорит нам, как работать с этим столбцом, и есть имя столбца. Это может быть либо исходное имя столбца из таблицы, либо искусственное имя, назначенное для получения временных результатов вычислений. - -Когда мы вычисляем некоторую функцию над столбцами в блоке, мы добавляем в блок ещё один столбец с результатом и не изменяем столбцы, являющиеся аргументами функции, поскольку операции над ними считаются неизменяемыми. Позже ненужные столбцы могут быть удалены из блока, но не изменены. Это удобно для устранения общих подвыражений. - -Блоки создаются для каждого обрабатываемого чанка данных. Обратите внимание, что для одного и того же типа вычислений имена и типы столбцов остаются одинаковыми для разных блоков, меняются только данные столбцов. Лучше отделить данные блока от заголовка блока, потому что при маленьких размерах блоков возникают значительные накладные расходы на временные строки для копирования `shared_ptr` и имён столбцов. - - - -## Процессоры {#processors} - -См. описание в файле [https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/IProcessor.h](https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/IProcessor.h). - - - -## Форматы {#formats} - -Форматы данных реализуются процессорами. - - - -## Ввод/вывод {#io} - -Для байтоориентированного ввода/вывода используются абстрактные классы `ReadBuffer` и `WriteBuffer`. Они применяются вместо потоков ввода-вывода C++ (`iostream`). Не беспокойтесь: в каждом зрелом C++‑проекте по веским причинам используется что‑то иное, а не `iostream`. - -`ReadBuffer` и `WriteBuffer` — это просто непрерывный буфер и курсор, указывающий на позицию в этом буфере. Реализации могут владеть или не владеть памятью для буфера. Есть виртуальный метод для заполнения буфера следующими данными (для `ReadBuffer`) или для сброса содержимого буфера куда‑либо (для `WriteBuffer`). Виртуальные методы вызываются редко. - -Реализации `ReadBuffer`/`WriteBuffer` используются для работы с файлами, файловыми дескрипторами и сетевыми сокетами, для реализации сжатия (`CompressedWriteBuffer` инициализируется другим `WriteBuffer` и выполняет сжатие перед записью данных в него), а также для других целей — названия `ConcatReadBuffer`, `LimitReadBuffer` и `HashingWriteBuffer` говорят сами за себя. - -Read/WriteBuffers работают только с байтами. Для форматирования ввода/вывода есть функции в заголовочных файлах `ReadHelpers` и `WriteHelpers`. Например, есть вспомогательные функции для записи числа в десятичном формате. - -Рассмотрим, что происходит, когда вы хотите вывести набор результатов в формате `JSON` в стандартный вывод (stdout). -У вас есть набор результатов, готовый к выборке из вытягивающего `QueryPipeline`. -Сначала вы создаёте `WriteBufferFromFileDescriptor(STDOUT_FILENO)` для записи байтов в stdout. -Затем вы подключаете результат из конвейера запросов к `JSONRowOutputFormat`, который инициализируется этим `WriteBuffer`, чтобы записывать строки в формате `JSON` в stdout. -Это можно сделать через метод `complete`, который превращает вытягивающий `QueryPipeline` в завершённый `QueryPipeline`. -Внутри `JSONRowOutputFormat` будет записывать различные JSON‑разделители и вызывать метод `IDataType::serializeTextJSON` со ссылкой на `IColumn` и номер строки в качестве аргументов. В свою очередь, `IDataType::serializeTextJSON` вызовет метод из `WriteHelpers.h`: например, `writeText` для числовых типов и `writeJSONString` для `DataTypeString`. - - - -## Таблицы {#tables} - -Интерфейс `IStorage` представляет таблицы. Разные реализации этого интерфейса — это разные движки таблиц. Примеры: `StorageMergeTree`, `StorageMemory` и так далее. Экземпляры этих классов — это сами таблицы. - -Ключевые методы в `IStorage` — это `read` и `write`, а также другие, такие как `alter`, `rename` и `drop`. Метод `read` принимает следующие аргументы: набор столбцов для чтения из таблицы, `AST`‑запрос, который следует учитывать, и желаемое количество потоков. Он возвращает `Pipe`. - -В большинстве случаев метод `read` отвечает только за чтение указанных столбцов из таблицы, а не за последующую обработку данных. -Вся дальнейшая обработка данных выполняется другой частью конвейера, которая выходит за рамки ответственности `IStorage`. - -Однако есть важные исключения: - -- `AST`‑запрос передается в метод `read`, и движок таблицы может использовать его, чтобы определить, как использовать индексы, и тем самым сократить объем данных, читаемых из таблицы. -- Иногда движок таблицы может обрабатывать данные самостоятельно до определённой стадии. Например, `StorageDistributed` может отправить запрос на удалённые серверы, попросить их обработать данные до стадии, на которой данные с разных удалённых серверов можно объединить, и вернуть эти предварительно обработанные данные. Интерпретатор запроса затем завершает обработку данных. - -Метод `read` таблицы может возвращать `Pipe`, состоящий из нескольких процессоров (`Processor`). Эти процессоры могут читать из таблицы параллельно. -Затем вы можете соединить эти процессоры с различными другими преобразованиями (такими как вычисление выражений или фильтрация), которые могут выполняться независимо. -А затем создать поверх них `QueryPipeline` и выполнить его через `PipelineExecutor`. - -Существуют также табличные функции (`TableFunction`). Это функции, которые возвращают временный объект `IStorage` для использования в секции `FROM` запроса. - -Чтобы быстро понять, как реализовать свой движок таблицы, посмотрите на что‑нибудь простое, например `StorageMemory` или `StorageTinyLog`. - -> В результате работы метода `read` `IStorage` возвращает `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` является «тянущий» `QueryPipeline`, который имеет специальный выходной порт для чтения результирующего набора данных. -Результатом запроса `INSERT` является «толкающий» `QueryPipeline` с входным портом для записи данных для вставки. -А результат интерпретации запроса `INSERT SELECT` — «завершённый» `QueryPipeline`, который не имеет входов и выходов, но одновременно копирует данные из `SELECT` в `INSERT`. - -`InterpreterSelectQuery` использует механизм `ExpressionAnalyzer` и `ExpressionActions` для анализа и трансформаций запросов. Именно здесь выполняется большинство основанных на правилах оптимизаций запросов. `ExpressionAnalyzer` довольно запутан и должен быть переписан: различные преобразования и оптимизации запросов следует выделить в отдельные классы, чтобы обеспечить модульные трансформации запроса. - -Для решения проблем, существующих в интерпретаторах, был разработан новый `InterpreterSelectQueryAnalyzer`. Это новая версия `InterpreterSelectQuery`, которая не использует `ExpressionAnalyzer` и вводит дополнительный уровень абстракции между `AST` и `QueryPipeline`, называемый `QueryTree`. Он полностью готов к использованию в продакшене, но на всякий случай его можно отключить, установив настройку `enable_analyzer` в значение `false`. - - - -## Функции {#functions} - -Существуют обычные функции и агрегатные функции. Об агрегатных функциях см. в следующем разделе. - -Обычные функции не изменяют количество строк — они работают так, как будто обрабатывают каждую строку независимо. На самом деле функции вызываются не для отдельных строк, а для блоков данных (`Block`), чтобы реализовать векторизованное выполнение запросов. - -Существуют различные вспомогательные функции, такие как [blockSize](/sql-reference/functions/other-functions#blockSize), [rowNumberInBlock](/sql-reference/functions/other-functions#rowNumberInBlock) и [runningAccumulate](/sql-reference/functions/other-functions#runningAccumulate), которые используют блочную обработку и нарушают независимость строк. - -В ClickHouse строгая типизация, поэтому не выполняется неявное приведение типов. Если функция не поддерживает определённую комбинацию типов, она выбрасывает исключение. При этом функции могут работать (быть перегруженными) для множества различных комбинаций типов. Например, функция `plus` (реализующая оператор `+`) работает для любой комбинации числовых типов: `UInt8` + `Float32`, `UInt16` + `Int8` и так далее. Кроме того, некоторые вариадические функции могут принимать произвольное число аргументов, например функция `concat`. - -Реализация функции может быть немного неудобной, потому что функция явно осуществляет диспетчеризацию по поддерживаемым типам данных и поддерживаемым `IColumns`. Например, для функции `plus` код генерируется инстанцированием шаблона C++ для каждой комбинации числовых типов и для константных или неконстантных левого и правого аргументов. - -Это отличное место для реализации генерации кода во время выполнения, чтобы избежать разрастания шаблонного кода. Это также позволяет добавлять комбинированные (fused) функции, такие как fused multiply-add, или выполнять несколько сравнений за одну итерацию цикла. - -Из-за векторизованного выполнения запросов функции не используют укороченное вычисление (short-circuit). Например, если вы пишете `WHERE f(x) AND g(y)`, обе части будут вычислены, даже для строк, для которых `f(x)` равно нулю (за исключением случая, когда `f(x)` — нулевое константное выражение). Но если селективность условия `f(x)` высока, а вычисление `f(x)` значительно дешевле, чем `g(y)`, лучше реализовать многопроходное вычисление. Сначала будет вычислено `f(x)`, затем по результату будут отфильтрованы столбцы, и только после этого `g(y)` будет вычисляться лишь для меньших, отфильтрованных фрагментов данных. - - - -## Агрегатные функции {#aggregate-functions} - -Агрегатные функции — это функции с состоянием. Они накапливают переданные значения во внутреннем состоянии и позволяют получать результаты на основе этого состояния. Управление ими осуществляется через интерфейс `IAggregateFunction`. Состояния могут быть довольно простыми (состояние для `AggregateFunctionCount` — это всего лишь одно значение типа `UInt64`) или достаточно сложными (состояние `AggregateFunctionUniqCombined` — это комбинация линейного массива, хеш-таблицы и вероятностной структуры данных `HyperLogLog`). - -Состояния размещаются в `Arena` (пуле памяти) для работы с несколькими состояниями при выполнении запроса `GROUP BY` с высокой кардинальностью. Состояния могут иметь нетривиальные конструктор и деструктор: например, сложные состояния агрегации могут самостоятельно выделять дополнительную память. Это требует аккуратности при создании и уничтожении состояний, а также при корректной передаче владения ими и соблюдении порядка их уничтожения. - -Состояния агрегации могут быть сериализованы и десериализованы для передачи по сети во время распределённого выполнения запросов или для записи на диск при недостатке оперативной памяти. Они могут даже храниться в таблице с типом `DataTypeAggregateFunction`, чтобы обеспечивать инкрементальную агрегацию данных. - -> В настоящий момент формат сериализации данных состояний агрегатных функций не версионируется. Это приемлемо, если агрегатные состояния хранятся только временно. Но у нас есть движок таблиц `AggregatingMergeTree` для инкрементальной агрегации, и он уже используется в продакшене. Именно поэтому при изменении формата сериализации для любой агрегатной функции в будущем требуется обратная совместимость. - - - -## Сервер {#server} - -Сервер реализует несколько различных интерфейсов: - -- HTTP‑интерфейс для любых внешних клиентов. -- TCP‑интерфейс для нативного клиента ClickHouse и для межсерверного взаимодействия при выполнении распределённых запросов. -- Интерфейс для передачи данных при репликации. - -Внутри это просто примитивный многопоточный сервер без корутин или файберов. Поскольку сервер спроектирован не для обработки большого числа простых запросов, а для обработки относительно небольшого числа сложных запросов, каждый из них может обрабатывать огромный объём данных для аналитики. - -Сервер инициализирует класс `Context` с необходимой средой для выполнения запросов: списком доступных баз данных, пользователей и прав доступа, настройками, кластерами, списком процессов, журналом запросов и т. д. Интерпретаторы используют эту среду. - -Мы поддерживаем полную прямую и обратную совместимость для серверного TCP‑протокола: старые клиенты могут работать с новыми серверами, а новые клиенты — со старыми серверами. Но мы не намерены поддерживать её бесконечно и удаляем поддержку старых версий примерно через год. - -:::note -Для большинства внешних приложений мы рекомендуем использовать HTTP‑интерфейс, поскольку он простой и удобный. TCP‑протокол более тесно связан с внутренними структурами данных: он использует внутренний формат для передачи блоков данных и собственный протокол фрейминга для сжатых данных. Мы не выпускали C‑библиотеку для этого протокола, потому что для этого требуется линковать большую часть кодовой базы ClickHouse, что на практике нецелесообразно. -::: - - - -## Конфигурация {#configuration} - -Сервер ClickHouse построен на основе POCO C++ Libraries и использует `Poco::Util::AbstractConfiguration` для представления своей конфигурации. Конфигурация хранится в классе `Poco::Util::ServerApplication`, от которого наследуется класс `DaemonBase`, а уже от него наследуется класс `DB::Server`, реализующий непосредственно clickhouse-server. Таким образом, к конфигурации можно обратиться через метод `ServerApplication::config()`. - -Конфигурация считывается из нескольких файлов (в формате XML или YAML) и объединяется в единый объект `AbstractConfiguration` с помощью класса `ConfigProcessor`. Конфигурация загружается при старте сервера и может быть перезагружена позже, если один из файлов конфигурации был обновлён, удалён или добавлен. Класс `ConfigReloader` отвечает за периодический мониторинг этих изменений, а также за процедуру перезагрузки. Запрос `SYSTEM RELOAD CONFIG` также инициирует перезагрузку конфигурации. - -Для запросов и подсистем помимо `Server` конфигурация доступна через метод `Context::getConfigRef()`. Каждая подсистема, способная перезагружать свою конфигурацию без перезапуска сервера, должна зарегистрировать себя в callback-функции перезагрузки в методе `Server::main()`. Обратите внимание, что если новая конфигурация содержит ошибку, большинство подсистем проигнорируют её, запишут предупреждения в журнал и продолжат работу с ранее загруженной конфигурацией. В силу особенностей `AbstractConfiguration` невозможно передать ссылку на отдельный раздел, поэтому вместо этого обычно используется строковый префикс `config_prefix`. - - - -## Потоки и задания {#threads-and-jobs} - -Для выполнения запросов и вспомогательных операций ClickHouse выделяет потоки из одного из пулов потоков, чтобы избежать частого создания и уничтожения потоков. Существует несколько пулов потоков, которые выбираются в зависимости от назначения и структуры задания: -* Серверный пул для входящих клиентских сессий. -* Глобальный пул потоков для задач общего назначения, фоновой активности и автономных потоков. -* IO‑пул потоков для задач, которые в основном блокируются на операциях ввода‑вывода и не являются ресурсоёмкими по CPU. -* Фоновые пулы для периодических задач. -* Пулы для прерываемых задач, которые можно разбить на шаги. - -Серверный пул — это экземпляр класса `Poco::ThreadPool`, определённый в методе `Server::main()`. Он может иметь не более `max_connection` потоков. Каждый поток закреплён за одним активным соединением. - -Глобальный пул потоков — это синглтон‑класс `GlobalThreadPool`. Для выделения потока из него используется `ThreadFromGlobalPool`. Он имеет интерфейс, похожий на `std::thread`, но берёт поток из глобального пула и выполняет всю необходимую инициализацию. Он настраивается следующими параметрами: -* `max_thread_pool_size` — ограничение на количество потоков в пуле. -* `max_thread_pool_free_size` — ограничение на количество простаивающих потоков, ожидающих новых задач. -* `thread_pool_queue_size` — ограничение на количество запланированных задач. - -Глобальный пул является универсальным, и все пулы, описанные ниже, реализованы поверх него. Это можно рассматривать как иерархию пулов. Любой специализированный пул берёт свои потоки из глобального пула с помощью класса `ThreadPool`. Таким образом, основная задача любого специализированного пула — задать ограничение на число одновременных задач и выполнять планирование задач. Если задач запланировано больше, чем потоков в пуле, `ThreadPool` накапливает задачи в очереди с приоритетами. Каждая задача имеет целочисленный приоритет. Приоритет по умолчанию — ноль. Все задачи с более высоким значением приоритета запускаются раньше любых задач с более низким значением приоритета. Однако между уже выполняющимися задачами различий нет, поэтому приоритет имеет значение только тогда, когда пул перегружен. - -IO‑пул потоков реализован как обычный `ThreadPool`, доступный через метод `IOThreadPool::get()`. Он настраивается так же, как глобальный пул, с помощью параметров `max_io_thread_pool_size`, `max_io_thread_pool_free_size` и `io_thread_pool_queue_size`. Основная цель IO‑пула потоков — не допустить исчерпания глобального пула IO‑задачами, что могло бы помешать запросам полностью использовать CPU. Резервное копирование в S3 выполняет значительный объём операций ввода‑вывода, и чтобы избежать влияния на интерактивные запросы, существует отдельный `BackupsIOThreadPool`, настраиваемый параметрами `max_backups_io_thread_pool_size`, `max_backups_io_thread_pool_free_size` и `backups_io_thread_pool_queue_size`. - -Для выполнения периодических задач существует класс `BackgroundSchedulePool`. Вы можете регистрировать задачи с использованием объектов `BackgroundSchedulePool::TaskHolder`, и пул гарантирует, что ни одна задача не запустит два задания одновременно. Он также позволяет отложить выполнение задачи до определённого момента в будущем или временно деактивировать задачу. Глобальный `Context` предоставляет несколько экземпляров этого класса для различных целей. Для задач общего назначения используется `Context::getSchedulePool()`. - -Существуют также специализированные пулы потоков для прерываемых задач. Такая задача `IExecutableTask` может быть разбита на упорядоченную последовательность заданий, называемых шагами. Для планирования этих задач таким образом, чтобы короткие задачи имели приоритет над длинными, используется `MergeTreeBackgroundExecutor`. Как следует из названия, он применяется для фоновых операций, связанных с MergeTree, таких как слияния, мутации, выборки и перемещения. Экземпляры пулов доступны через `Context::getCommonExecutor()` и другие похожие методы. - -Независимо от того, какой пул используется для задания, при запуске для этого задания создаётся экземпляр `ThreadStatus`. Он инкапсулирует всю информацию на уровне потока: идентификатор потока, идентификатор запроса, счётчики производительности, потребление ресурсов и множество других полезных данных. Задание может получить к нему доступ через потоковую локальную переменную с помощью вызова `CurrentThread::get()`, поэтому нам не нужно передавать его в каждую функцию. - -Если поток относится к выполнению запроса, то наиболее важной сущностью, связанной с `ThreadStatus`, является контекст запроса `ContextPtr`. Каждый запрос имеет свой основной поток в серверном пуле. Основной поток выполняет привязку, удерживая объект `ThreadStatus::QueryScope query_scope(query_context)`. Основной поток также создаёт группу потоков, представленную объектом `ThreadGroupStatus`. Каждый дополнительный поток, выделенный во время выполнения этого запроса, привязывается к своей группе потоков вызовом `CurrentThread::attachTo(thread_group)`. Группы потоков используются для агрегирования счётчиков событий профилирования и отслеживания потребления памяти всеми потоками, выделенными для одной задачи (подробнее см. классы `MemoryTracker` и `ProfileEvents::Counters`). - - - -## Контроль параллелизма - -Запрос, который может выполняться параллельно, использует настройку `max_threads`, чтобы ограничить количество потоков. Значение по умолчанию для этой настройки выбирается таким образом, чтобы один запрос мог наилучшим образом использовать все ядра CPU. Но что, если есть несколько одновременно выполняющихся запросов, и каждый из них использует значение `max_threads` по умолчанию? Тогда запросы будут делить ресурсы CPU. ОС будет обеспечивать справедливое распределение, постоянно переключая потоки, что вносит дополнительные накладные расходы и снижает производительность. `ConcurrencyControl` помогает снизить эти накладные расходы и избежать создания слишком большого числа потоков. Настройка конфигурации `concurrent_threads_soft_limit_num` используется для ограничения того, сколько одновременно выполняющихся потоков может быть выделено до начала применения механизма ограничения нагрузки на CPU. - -Вводится понятие CPU-`slot`. Слот — это единица параллелизма: для запуска потока запрос должен заранее получить слот и освободить его, когда поток завершает работу. Количество слотов глобально ограничено на сервере. Несколько одновременно выполняющихся запросов конкурируют за CPU-слоты, если их суммарный спрос превышает общее количество слотов. `ConcurrencyControl` отвечает за разрешение этой конкуренции, выполняя планирование CPU-слотов справедливым образом. - -Каждый слот можно рассматривать как независимый конечный автомат со следующими состояниями: - -* `free`: слот доступен для выделения любому запросу. -* `granted`: слот `allocated` (выделен) для конкретного запроса, но еще не захвачен никаким потоком. -* `acquired`: слот `allocated` (выделен) для конкретного запроса и захвачен потоком. - -Обратите внимание, что `allocated` слот может находиться в двух разных состояниях: `granted` и `acquired`. Первое является переходным состоянием, которое на практике должно быть коротким (от момента, когда слот выделен запросу, до момента, когда процедура масштабирования вверх — увеличения числа потоков — запускается любым потоком этого запроса). - -```mermaid -stateDiagram-v2 - direction LR - [*] --> свободный - свободный --> выделенный: выделить - state выделенный { - direction LR - [*] --> предоставленный - предоставленный --> полученный: получить - полученный --> [*] - } - выделенный --> свободный: освободить -``` - -API `ConcurrencyControl` состоит из следующих функций: - -1. Создать распределение ресурсов для запроса: `auto slots = ConcurrencyControl::instance().allocate(1, max_threads);`. Оно выделит как минимум 1 и не более `max_threads` слотов. Обратите внимание, что первый слот предоставляется немедленно, а оставшиеся слоты могут быть выданы позже. Таким образом, лимит является мягким, потому что каждый запрос получит как минимум один поток. -2. Для каждого потока необходимо получить слот из ранее выделенного распределения: `while (auto slot = slots->tryAcquire()) spawnThread([slot = std::move(slot)] { ... });`. -3. Обновить общее количество слотов: `ConcurrencyControl::setMaxConcurrency(concurrent_threads_soft_limit_num)`. Может выполняться во время работы сервера, без его перезапуска. - -Этот интерфейс позволяет запросам запускаться как минимум с одним потоком (в условиях нагрузки на CPU), а затем масштабироваться до `max_threads`. - - -## Распределённое выполнение запросов {#distributed-query-execution} - -Серверы в кластерной конфигурации в основном независимы. Вы можете создать таблицу `Distributed` на одном или на всех серверах в кластере. Таблица `Distributed` не хранит данные сама по себе – она только предоставляет «представление» ко всем локальным таблицам на нескольких узлах кластера. Когда вы выполняете SELECT из таблицы `Distributed`, ClickHouse переписывает этот запрос, выбирает удалённые узлы в соответствии с настройками балансировки нагрузки и отправляет им запрос. Таблица `Distributed` запрашивает у удалённых серверов выполнение запроса лишь до той стадии, на которой можно объединить промежуточные результаты с разных серверов. Затем она получает эти промежуточные результаты и объединяет их. Таблица `Distributed` старается распределить как можно больше работы на удалённые серверы и не пересылать по сети значительные объёмы промежуточных данных. - -Ситуация усложняется, когда у вас есть подзапросы в выражениях IN или JOIN, и каждый из них использует таблицу `Distributed`. Для выполнения таких запросов существуют разные стратегии. - -Глобального плана запроса для распределённого выполнения запросов не существует. Каждый узел имеет свой локальный план запроса для своей части работы. Поддерживается только простое однопроходное распределённое выполнение запроса: мы отправляем запросы на удалённые узлы, а затем объединяем результаты. Но это становится непригодным для сложных запросов с `GROUP BY` высокой кардинальности или с большим объёмом временных данных для JOIN. В таких случаях необходимо «перераспределять» данные между серверами, что требует дополнительной координации. ClickHouse не поддерживает такой тип выполнения запросов, и это ещё предстоит реализовать. - - - -## Merge tree {#merge-tree} - -`MergeTree` — это семейство движков хранения, поддерживающих индексацию по первичному ключу. Первичный ключ может быть произвольным кортежем столбцов или выражений. Данные в таблице `MergeTree` хранятся в «частях» (parts). Каждая часть хранит данные в порядке первичного ключа, поэтому данные отсортированы лексикографически по кортежу первичного ключа. Все столбцы таблицы хранятся в отдельных файлах `column.bin` в этих частях. Файлы состоят из сжатых блоков. Каждый блок обычно содержит от 64 КБ до 1 МБ несжатых данных, в зависимости от среднего размера значения. Блоки состоят из значений столбцов, размещённых подряд друг за другом. Значения столбцов идут в одном и том же порядке для каждого столбца (порядок задаётся первичным ключом), поэтому при проходе по нескольким столбцам вы получаете значения для соответствующих строк. - -Сам первичный ключ является «разреженным». Он ссылается не на каждую отдельную строку, а только на некоторые диапазоны данных. Отдельный файл `primary.idx` содержит значение первичного ключа для каждой N-й строки, где N называется `index_granularity` (обычно N = 8192). Также для каждого столбца имеются файлы `column.mrk` с «метками» (marks), которые представляют собой смещения до каждой N-й строки в файле данных. Каждая метка — это пара: смещение в файле до начала сжатого блока и смещение в распакованном блоке до начала данных. Обычно сжатые блоки выровнены по меткам, и смещение в распакованном блоке равно нулю. Данные из `primary.idx` всегда находятся в памяти, а данные из файлов `column.mrk` кэшируются. - -Когда нам нужно прочитать что‑то из части в `MergeTree`, мы смотрим на данные `primary.idx` и находим диапазоны, которые могут содержать запрошенные данные, затем смотрим на данные `column.mrk` и вычисляем смещения, с которых нужно начать чтение этих диапазонов. Из‑за разрежённости может быть прочитано избыточное количество данных. ClickHouse не подходит для высокой нагрузки простыми точечными (point) запросами, поскольку для каждого ключа должен быть прочитан целый диапазон из `index_granularity` строк, и для каждого столбца должен быть декомпрессирован целый сжатый блок. Мы сделали индекс разрежённым, потому что нам нужно иметь возможность хранить триллионы строк на одном сервере без заметного потребления памяти под индекс. Кроме того, поскольку первичный ключ разрежённый, он не уникален: он не может проверить существование ключа в таблице во время INSERT. В таблице может быть много строк с одним и тем же ключом. - -Когда вы выполняете `INSERT` пакета данных в `MergeTree`, этот пакет сортируется по порядку первичного ключа и формирует новую часть. Фоновые потоки периодически выбирают некоторые части и сливают их в одну отсортированную часть, чтобы поддерживать относительно небольшое количество частей. Поэтому движок и называется `MergeTree`. Разумеется, слияние приводит к «усилению записи» (write amplification). Все части являются неизменяемыми: они только создаются и удаляются, но не модифицируются. При выполнении SELECT удерживается снимок таблицы (набор частей). После слияния мы также какое‑то время храним старые части, чтобы упростить восстановление после сбоя, поэтому если мы видим, что некоторая слитая часть, вероятно, повреждена, мы можем заменить её исходными частями. - -`MergeTree` не является LSM‑деревом, поскольку он не содержит MEMTABLE и LOG: вставленные данные записываются напрямую в файловую систему. Такое поведение делает MergeTree гораздо более подходящим для пакетных вставок данных. Поэтому частая вставка небольших объёмов строк не является оптимальной для MergeTree. Например, пара строк в секунду — это приемлемо, но выполнять такую вставку тысячу раз в секунду — не лучший вариант для MergeTree. Однако существует режим асинхронных вставок для небольших вставок, который позволяет обойти это ограничение. Мы реализовали это таким образом ради простоты и потому, что в наших приложениях мы уже вставляем данные пакетами. - -Существуют движки MergeTree, которые выполняют дополнительную работу во время фоновых слияний. Примеры: `CollapsingMergeTree` и `AggregatingMergeTree`. Это можно рассматривать как специализированную поддержку обновлений. Имейте в виду, что это не настоящие обновления, поскольку пользователи обычно не контролируют момент выполнения фоновых слияний, и данные в таблице `MergeTree` почти всегда хранятся более чем в одной части, а не в полностью слитом виде. - - - -## Репликация {#replication} - -Репликация в ClickHouse может настраиваться на уровне отдельных таблиц. На одном и том же сервере у вас могут быть как реплицируемые, так и нереплицируемые таблицы. Также вы можете использовать разные схемы репликации для разных таблиц, например, одну таблицу с двухкратной репликацией, а другую — с трехкратной. - -Репликация реализована в движке хранения `ReplicatedMergeTree`. Путь в `ZooKeeper` указывается как параметр движка хранения. Все таблицы с одинаковым путем в `ZooKeeper` становятся репликами друг друга: они синхронизируют свои данные и поддерживают согласованность. Реплики могут динамически добавляться и удаляться простым созданием или удалением таблицы. - -Репликация использует асинхронную multi-master-схему. Вы можете вставлять данные в любую реплику, у которой есть сессия с `ZooKeeper`, и данные асинхронно реплицируются на все остальные реплики. Поскольку ClickHouse не поддерживает UPDATE-запросы, репликация является бесконфликтной. Так как по умолчанию нет кворумного подтверждения вставок, только что вставленные данные могут быть потеряны при отказе одного узла. Кворум вставки можно включить с помощью настройки `insert_quorum`. - -Метаданные для репликации хранятся в ZooKeeper. Существует журнал репликации, в котором перечислены действия, которые необходимо выполнить. Действия включают: получить часть; слить части; удалить партицию и т. д. Каждая реплика копирует журнал репликации в свою очередь (очередь реплики), а затем выполняет действия из очереди. Например, при вставке в журнале создается действие «получить часть», и каждая реплика загружает эту часть. Слияния координируются между репликами для получения байт‑идентичных результатов. Все части сливаются одинаковым образом на всех репликах. Один из лидеров первым инициирует новое слияние и записывает действия «merge parts» в журнал. Одновременно лидерами могут быть несколько реплик (или все). Реплику можно запретить назначать лидером, используя настройку `merge_tree` `replicated_can_become_leader`. Лидеры отвечают за планирование фоновых слияний. - -Репликация является физической: между узлами передаются только сжатые части, а не запросы. В большинстве случаев слияния обрабатываются на каждой реплике независимо, чтобы снизить сетевые издержки и избежать сетевой амплификации. Крупные слитые части отправляются по сети только в случаях значительной задержки репликации. - -Кроме того, каждая реплика хранит свое состояние в ZooKeeper в виде набора частей и их контрольных сумм. Когда состояние на локальной файловой системе расходится с эталонным состоянием в ZooKeeper, реплика восстанавливает согласованность, загружая недостающие и поврежденные части с остальных реплик. Если в локальной файловой системе обнаруживаются неожиданные или поврежденные данные, ClickHouse не удаляет их, а перемещает в отдельный каталог и «забывает» о них. - -:::note -Кластер ClickHouse состоит из независимых шардов, и каждый шард состоит из реплик. Кластер **не является эластичным**, поэтому после добавления нового шарда данные не перераспределяются между шардами автоматически. Вместо этого предполагается, что нагрузка на кластер будет намеренно неравномерной. Такая реализация дает больше контроля и подходит для относительно небольших кластеров, например, из нескольких десятков узлов. Но для кластеров из сотен узлов, которые мы используем в продакшене, этот подход становится существенным недостатком. Нам следует реализовать движок таблиц, охватывающий весь кластер, с динамически реплицируемыми областями, которые могли бы автоматически разбиваться и балансироваться между кластерами. -::: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-arm.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-arm.md deleted file mode 100644 index f501a0db522..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-arm.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -description: 'Руководство по сборке ClickHouse из исходного кода для архитектуры AARCH64' -sidebar_label: 'Сборка на Linux для AARCH64' -sidebar_position: 25 -slug: /development/build-cross-arm -title: 'Как собрать ClickHouse на Linux для AARCH64' -doc_type: 'guide' ---- - -# Как собрать ClickHouse на Linux для AArch64 - -Для сборки ClickHouse для AArch64 на машине с архитектурой AArch64 не требуются специальные действия. - -Чтобы выполнить кросс-компиляцию ClickHouse для AArch64 на машине x86 с Linux, передайте в `cmake` следующий флаг: `-DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake` \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md deleted file mode 100644 index 81da9c998c9..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: 'Руководство по сборке ClickHouse из исходного кода для архитектуры LoongArch64' -sidebar_label: 'Сборка на Linux для LoongArch64' -sidebar_position: 35 -slug: /development/build-cross-loongarch -title: 'Сборка на Linux для LoongArch64' -doc_type: 'guide' ---- - - - -# Сборка под Linux для LoongArch64 - -ClickHouse экспериментально поддерживает LoongArch64 - - - -## Сборка ClickHouse - -Для сборки требуется версия LLVM не ниже 19.1.0. - -```bash -cd ClickHouse -mkdir build-loongarch64 -CC=clang-19 CXX=clang++-19 cmake . -Bbuild-loongarch64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-loongarch64.cmake -ninja -C build-loongarch64 -``` - -Полученный бинарный файл будет работать только под Linux на архитектуре процессора LoongArch64. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-osx.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-osx.md deleted file mode 100644 index c60419fe21c..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-osx.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: 'Руководство по кросс-компиляции ClickHouse на Linux под macOS' -sidebar_label: 'Сборка на Linux для macOS' -sidebar_position: 20 -slug: /development/build-cross-osx -title: 'Сборка на Linux для macOS' -doc_type: 'guide' ---- - - - -# Как собрать ClickHouse на Linux для macOS - -Этот документ описывает случай, когда у вас есть машина под управлением Linux, и вы хотите использовать её для сборки бинарного файла `clickhouse`, который будет запускаться на OS X. -Основной сценарий использования — проверки в системе непрерывной интеграции, выполняющиеся на Linux-машинах. -Если вы хотите собирать ClickHouse непосредственно на macOS, перейдите к [инструкциям по нативной сборке](../development/build-osx.md). - -Кросс-компиляция для macOS основана на [инструкциях по сборке](../development/build.md), сначала выполните шаги, описанные там. - -В следующих разделах приведено пошаговое руководство по сборке ClickHouse для `x86_64` macOS. -Если вы нацеливаетесь на архитектуру ARM, просто замените все вхождения `x86_64` на `aarch64`. -Например, замените `x86_64-apple-darwin` на `aarch64-apple-darwin` на всех этапах. - - - -## Установите набор инструментов для кросс-компиляции - -Запомните путь, по которому установлен `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 -``` - -Также нужно загрузить SDK macOS X в рабочее дерево. - -```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 - -```bash -cd ClickHouse -mkdir build-darwin -cd build-darwin -CC=clang-19 CXX=clang++-19 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/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md deleted file mode 100644 index 2dc84d6b925..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: 'Руководство по сборке ClickHouse из исходного кода для архитектуры RISC-V 64' -sidebar_label: 'Сборка на Linux для RISC-V 64' -sidebar_position: 30 -slug: /development/build-cross-riscv -title: 'Как собрать ClickHouse на Linux для RISC-V 64' -doc_type: 'guide' ---- - - - -# Как собрать ClickHouse на Linux для RISC-V 64 - -В ClickHouse есть экспериментальная поддержка архитектуры RISC-V. Доступны не все возможности. - - - -## Сборка ClickHouse - -Для кросс-компиляции под RISC-V на машине, не основанной на RISC-V: - -```bash -cd ClickHouse -mkdir build-riscv64 -CC=clang-19 CXX=clang++-19 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 -``` - -Полученный бинарный файл будет работать только в операционной системе Linux на архитектуре RISC-V 64. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md deleted file mode 100644 index f746fd08ccf..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -description: 'Руководство по сборке ClickHouse из исходного кода для архитектуры s390x' -sidebar_label: 'Сборка на Linux для s390x (zLinux)' -sidebar_position: 30 -slug: /development/build-cross-s390x -title: 'Сборка на Linux для s390x (zLinux)' -doc_type: 'guide' ---- - - - -# Сборка в Linux для s390x (zLinux) - -В ClickHouse имеется экспериментальная поддержка архитектуры s390x. - - - -## Сборка ClickHouse для s390x - -Для s390x есть две опции сборки, связанные с OpenSSL: - -* По умолчанию OpenSSL на s390x собирается как динамическая библиотека. Это отличается от всех остальных платформ, где OpenSSL собирается как статическая библиотека. -* Чтобы, несмотря на это, собрать OpenSSL как статическую библиотеку, передайте `-DENABLE_OPENSSL_DYNAMIC=0` в CMake. - -В этих инструкциях предполагается, что хост‑система — 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, установите целевой таргет Rust для архитектуры s390x: - -```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](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, запустите ClickHouse под QEMU в отладочном режиме: - -```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: Включить отладочную информацию - buildType: Debug - release: - short: Release - long: Оптимизировать генерируемый код - buildType: Release - relwithdebinfo: - short: RelWithDebInfo - long: Релиз с отладочной информацией - buildType: RelWithDebInfo - tsan: - short: MinSizeRel - long: Релиз минимального размера - buildType: MinSizeRel - -toolchain: - default: default - description: Выберите набор инструментов - 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) Запуск s390x с qemu", - "targetCreateCommands": ["target create ${command:cmake.launchTargetPath}"], - "processCreateCommands": ["gdb-remote 2159"], - "preLaunchTask": "Запустить 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 'Запуск сеанса отладчика' -cd $1 -qemu-s390x-static -g 2159 -L /usr/s390x-linux-gnu $2 $3 $4 -``` - -#### tasks.json - -Определяет задачу для запуска скомпилированного исполняемого файла в режиме `server` в папке `tmp` рядом с бинарными файлами, с использованием конфигурации из `programs/server/config.xml`. - -```json -{ - "version": "2.0.0", - "tasks": [ - { - "label": "Запустить 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": "^Начало сеанса отладки", - "endsPattern": ".*" - } - } - ] - } - ] -} -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-e2k.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build-e2k.md deleted file mode 100644 index 55afd833d76..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-e2k.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -description: 'Руководство по сборке ClickHouse из исходников для архитектуры E2K' -sidebar_label: 'Сборка на Linux для E2K' -sidebar_position: 35 -slug: /development/build-e2k -title: 'Сборка на Linux для E2K' -doc_type: 'guide' ---- - - - -# Сборка на Linux для E2K - -В ClickHouse имеется крайне экспериментальная поддержка архитектуры E2K (Эльбрус‑2000), и он может быть скомпилирован только в нативном режиме с минимальной конфигурацией, используя специально собранные для E2K библиотеки, такие как Boost, CRoaring, libunwind, Zstd. - - - -## Сборка ClickHouse - -Требуемая версия LLVM для сборки должна быть не ниже 20.1.8. - -```bash -cd ClickHouse -mkdir build-e2k -cmake -DCMAKE_CROSSCOMPILING=OFF -DCOMPILER_CACHE=disabled \ - -DCMAKE_C_COMPILER=/usr/lib/llvm-20/bin/clang -DCMAKE_CXX_COMPILER=/usr/lib/llvm-20/bin/clang++ \ - -DLLD_PATH=/usr/lib/llvm-20/bin/ld.lld \ - -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \ - -DGLIBC_COMPATIBILITY=OFF -DENABLE_JEMALLOC=OFF -DENABLE_LIBRARIES=OFF \ - -DENABLE_SSL=OFF -DWERROR=OFF -DUSE_SIMDJSON=OFF -DENABLE_TESTS=OFF -DBOOST_USE_UCONTEXT=ON .. -ninja -j8 -``` - -Полученный бинарный файл будет работать только в Linux на процессорах с архитектурой E2K. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-osx.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build-osx.md deleted file mode 100644 index 256755ec317..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build-osx.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -description: 'Руководство по сборке ClickHouse из исходных кодов в системах macOS' -sidebar_label: 'Сборка на macOS для macOS' -sidebar_position: 15 -slug: /development/build-osx -title: 'Сборка на macOS для macOS' -keywords: ['MacOS', 'Mac', 'build'] -doc_type: 'guide' ---- - - - -# Как собрать ClickHouse на macOS для macOS - -:::info Вам не нужно собирать ClickHouse самостоятельно! -Вы можете установить предварительно собранный ClickHouse, как описано в разделе [Quick Start](https://clickhouse.com/#quick-start). -::: - -ClickHouse можно скомпилировать на macOS x86_64 (Intel) и arm64 (Apple Silicon) под управлением macOS 10.15 (Catalina) или более поздней версии. - -В качестве компилятора поддерживается только Clang из Homebrew. - - - -## Установка необходимых компонентов - -Сначала ознакомьтесь с общей [документацией по предварительным требованиям](developer-instruction.md). - -Затем установите [Homebrew](https://brew.sh/) и запустите - -Затем выполните: - -```bash -brew update -brew install ccache cmake ninja libtool gettext llvm lld binutils grep findutils nasm bash rust rustup -``` - -:::note -Apple по умолчанию использует файловую систему, нечувствительную к регистру. Хотя это обычно не влияет на компиляцию (особенно на разовые сборки через `make`), тем не менее это может приводить к некорректной работе таких операций с файлами, как `git mv`. -Для серьёзной разработки на macOS убедитесь, что исходный код хранится на томе диска, чувствительном к регистру. См., например, [эти инструкции](https://brianboyko.medium.com/a-case-sensitive-src-folder-for-mac-programmers-176cc82a3830). -::: - - -## Сборка ClickHouse {#build-clickhouse} - -Для сборки необходимо использовать компилятор Clang из Homebrew: - - - -```bash -cd ClickHouse -mkdir build -export PATH=$(brew --prefix llvm)/bin:$PATH -cmake -S . -B build -cmake --build build -# Итоговый исполняемый файл будет создан по пути: build/programs/clickhouse -``` - -:::note -Если при линковке вы сталкиваетесь с ошибками вида `ld: archive member '/' not a mach-o file in ...`, вам может понадобиться -использовать llvm-ar, указав флаг `-DCMAKE_AR=/opt/homebrew/opt/llvm/bin/llvm-ar`. -::: - - -## Особенности - -Если вы планируете запускать `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`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/build.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/build.md deleted file mode 100644 index 2c7bead66c9..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/build.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -description: 'Пошаговое руководство по сборке ClickHouse из исходного кода на Linux-системах' -sidebar_label: 'Сборка на Linux' -sidebar_position: 10 -slug: /development/build -title: 'Как собрать ClickHouse на Linux' -doc_type: 'guide' ---- - - - -# Как собрать ClickHouse под Linux - -:::info Вам не обязательно собирать ClickHouse самостоятельно! -Вы можете установить уже собранный ClickHouse, как описано в разделе [Quick Start](https://clickhouse.com/#quick-start). -::: - -ClickHouse можно собрать на следующих платформах: - -- x86_64 -- AArch64 -- PowerPC 64 LE (экспериментально) -- s390/x (экспериментально) -- RISC-V 64 (экспериментально) - - - -## Предположения {#assumptions} - -Данное руководство основано на Ubuntu Linux, но при соответствующих изменениях оно должно работать и на любом другом дистрибутиве Linux. -Минимально рекомендуемая версия Ubuntu для разработки — 24.04 LTS. - -В руководстве предполагается, что у вас локально клонирован репозиторий ClickHouse со всеми подмодулями. - - - -## Установка предварительных требований - -Сначала ознакомьтесь с общей [документацией по предварительным требованиям](developer-instruction.md). - -ClickHouse при сборке использует CMake и Ninja. - -При желании вы можете установить ccache, чтобы сборка повторно использовала уже скомпилированные объектные файлы. - -```bash -sudo apt-get update -sudo apt-get install build-essential git cmake ccache python3 ninja-build nasm yasm gawk lsb-release wget software-properties-common gnupg -``` - - -## Установите компилятор Clang - -Чтобы установить Clang на Ubuntu/Debian, используйте скрипт автоматической установки LLVM с сайта [apt.llvm.org](https://apt.llvm.org/). - -```bash -sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" -``` - -Для других дистрибутивов Linux проверьте, доступны ли для установки какие-либо [предварительно собранные пакеты LLVM](https://releases.llvm.org/download.html). - -По состоянию на март 2025 года требуется Clang 19 или новее. -GCC и другие компиляторы не поддерживаются. - - -## Установите компилятор Rust (необязательно) {#install-the-rust-compiler-optional} - -:::note -Rust является необязательной зависимостью ClickHouse. -Если Rust не установлен, некоторые возможности ClickHouse не будут включены в сборку. -::: - -Сначала выполните шаги из официальной [документации по Rust](https://www.rust-lang.org/tools/install), чтобы установить `rustup`. - -Как и для зависимостей C++, ClickHouse использует vendoring, чтобы точно контролировать, что именно устанавливается, и избежать зависимости от сторонних сервисов (таких как реестр `crates.io`). - -Хотя в режиме release любая современная версия toolchain в rustup для Rust должна работать с этими зависимостями, если вы планируете включить санитайзеры, необходимо использовать версию, которая использует точно такую же `std`, как и та, что применяется в CI (для которой мы вендорим crates): - - - -```bash -rustup toolchain install nightly-2025-07-07 -rustup default nightly-2025-07-07 -rustup component add rust-src -``` - -## Сборка ClickHouse - -Рекомендуем создать отдельный каталог `build` внутри `ClickHouse`, в котором будут находиться все артефакты сборки: - -```sh -mkdir build -cd build -``` - -Вы можете создавать несколько разных каталогов (например, `build_release`, `build_debug` и т.д.) для различных типов сборки. - -Необязательно: если у вас установлено несколько версий компилятора, вы можете при необходимости указать, какой компилятор использовать. - -```sh -export CC=clang-19 -export CXX=clang++-19 -``` - -Для разработки рекомендуется использовать отладочные сборки. -По сравнению с релизными сборками, у них ниже уровень оптимизации компилятора (`-O`), что обеспечивает более удобную отладку. -Кроме того, внутренние исключения типа `LOGICAL_ERROR` приводят к немедленному падению вместо корректной обработки ошибки. - -```sh -cmake -D CMAKE_BUILD_TYPE=Debug .. -``` - -:::note -Если вы хотите использовать отладчик, например gdb, добавьте `-D DEBUG_O_LEVEL="0"` к приведённой выше команде, чтобы отключить все оптимизации компилятора, которые могут мешать gdb просматривать и получать доступ к переменным. -::: - -Запустите ninja для сборки: - -```sh -ninja clickhouse -``` - -Если вы хотите собрать все бинарные артефакты (утилиты и тесты), запустите ninja без параметров: - -```sh -ninja -``` - -Вы можете управлять количеством параллельных задач сборки с помощью параметра `-j`: - -```sh -ninja -j 1 clickhouse-server clickhouse-client -``` - -:::tip -CMake предоставляет сокращённые формы для приведённых выше команд: - -```sh -cmake -S . -B build # конфигурация сборки, запускается из корневого каталога репозитория -cmake --build build # компиляция -``` - -::: - - -## Запуск исполняемого файла ClickHouse - -После успешного завершения сборки вы найдете исполняемый файл в `ClickHouse//programs/`: - -Сервер ClickHouse пытается найти файл конфигурации `config.xml` в текущем каталоге. -Также вы можете указать файл конфигурации в командной строке с помощью параметра `-C`. - -Чтобы подключиться к серверу ClickHouse с помощью `clickhouse-client`, откройте другой терминал, перейдите в `ClickHouse/build/programs/` и выполните `./clickhouse client`. - -Если вы видите сообщение `Connection refused` на macOS или FreeBSD, попробуйте указать адрес хоста 127.0.0.1: - -```bash -clickhouse client --host 127.0.0.1 -``` - - -## Расширенные параметры - -### Минимальная сборка - -Если вам не нужна функциональность, предоставляемая сторонними библиотеками, вы можете ещё больше ускорить сборку: - -```sh -cmake -DENABLE_LIBRARIES=OFF -``` - -В случае проблем вам придётся разбираться самостоятельно ... - -Для работы Rust требуется подключение к интернету. Чтобы отключить поддержку Rust: - -```sh -cmake -DENABLE_RUST=OFF -``` - -### Запуск исполняемого файла ClickHouse - -Вы можете заменить продакшн-версию бинарного файла ClickHouse, установленную в вашей системе, скомпилированным бинарным файлом ClickHouse. -Для этого установите ClickHouse на свою машину, следуя инструкциям на официальном веб‑сайте. -Затем выполните: - -```bash -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, установленного в вашей системе: - -```bash -sudo service clickhouse-server stop -sudo -u clickhouse ClickHouse/build/programs/clickhouse server --config-file /etc/clickhouse-server/config.xml -``` - -### Сборка на любом дистрибутиве Linux - -Установите необходимые компоненты в дистрибутиве 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, с помощью: - -```bash -python -m ci.praktika "BUILD_JOB_NAME" -``` - -где BUILD_JOB_NAME — это имя job'а, отображаемое в отчёте CI, например: "Build (arm_release)", "Build (amd_debug)" - -Эта команда загружает соответствующий Docker-образ `clickhouse/binary-builder` со всеми необходимыми зависимостями -и запускает внутри него скрипт сборки: `./ci/jobs/build_clickhouse.py` - -Результат сборки будет размещён в `./ci/tmp/`. - -Команда работает как на архитектуре AMD, так и на ARM и не требует дополнительных зависимостей, кроме Docker. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md deleted file mode 100644 index dbf56a721c2..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -description: 'Как собрать ClickHouse и запустить бенчмарк с кодеком DEFLATE_QPL' -sidebar_label: 'Сборка и тестирование DEFLATE_QPL' -sidebar_position: 73 -slug: /development/building_and_benchmarking_deflate_qpl -title: 'Сборка ClickHouse с DEFLATE_QPL' -doc_type: 'guide' ---- - - - -# Сборка ClickHouse с DEFLATE_QPL - -- Убедитесь, что ваша хост-система удовлетворяет требуемым для QPL [предварительным требованиям](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#prerequisites) -- deflate_qpl включён по умолчанию при сборке с помощью CMake. Если вы случайно изменили это, пожалуйста, проверьте флаг сборки: ENABLE_QPL=1 - -- Для общих требований обратитесь к общим [инструкциям по сборке](/development/build.md) ClickHouse - - - -# Запуск бенчмарка с DEFLATE_QPL - - - -## Список файлов {#files-list} - -Папки `benchmark_sample` в составе [qpl-cmake](https://github.com/ClickHouse/ClickHouse/tree/master/contrib/qpl-cmake) содержат примеры запуска бенчмарка с помощью Python-скриптов: - -`client_scripts` содержит Python-скрипты для запуска типичного бенчмарка, например: -- `client_stressing_test.py`: Python-скрипт для стресс‑тестирования запросов с 1–4 экземплярами сервера. -- `queries_ssb.sql`: файл, в котором перечислены все запросы для [Star Schema Benchmark](/getting-started/example-datasets/star-schema/). -- `allin1_ssb.sh`: shell-скрипт, который автоматически выполняет весь процесс бенчмарка «all in one». - -`database_files` означает, что там будут храниться файлы базы данных в соответствии с кодеками lz4/deflate/zstd. - - - -## Автоматический запуск бенчмарка для схемы «звезда»: - -```bash -$ cd ./benchmark_sample/client_scripts -$ sh run_ssb.sh -``` - -После завершения выполнения проверьте все результаты в этой папке: `./output/` - -Если возникнет ошибка, запустите бенчмарк вручную, как описано в разделах ниже. - - -## Определение {#definition} - -[CLICKHOUSE_EXE] — это путь к исполняемому файлу ClickHouse. - - - -## Среда - -* CPU: Sapphire Rapids -* Требования к ОС см. раздел [System Requirements for QPL](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#system-requirements) -* Настройку IAA см. раздел [Accelerator Configuration](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#accelerator-configuration) -* Установите модули Python: - -```bash -pip3 install clickhouse_driver numpy -``` - -[Самопроверка IAA] - -```bash -$ accel-config list | grep -P 'iax|state' -``` - -Ожидаемый результат будет выглядеть следующим образом: - -```bash - "dev":"iax1", - "state":"включен", - "state":"включен", -``` - -Если вывода нет, это означает, что IAA еще не готов к работе. Пожалуйста, проверьте настройку IAA. - - -## Генерация необработанных данных - -```bash -$ cd ./benchmark_sample -$ mkdir rawdata_dir && cd rawdata_dir -``` - -Используйте [`dbgen`](/getting-started/example-datasets/star-schema) для генерации набора данных объемом 100 миллионов строк с параметром: --s 20 - -Файлы с расширением `*.tbl` должны быть сгенерированы в каталоге `./benchmark_sample/rawdata_dir/ssb-dbgen`: - - -## Настройка базы данных - -Настройте базу данных с использованием кодека LZ4 - -```bash -$ cd ./database_dir/lz4 -$ [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -В консоли должно появиться сообщение `Connected to ClickHouse server`, что означает, что клиент успешно установил соединение с сервером. - -Выполните три шага, указанные в [Star Schema Benchmark](/getting-started/example-datasets/star-schema): - -* Создайте таблицы в ClickHouse -* Вставьте данные. Для этого используйте `./benchmark_sample/rawdata_dir/ssb-dbgen/*.tbl` в качестве входных данных. -* Преобразуйте «звёздную схему» в денормализованную «плоскую схему» - -Настройте базу данных с кодеком IAA Deflate - -```bash -$ cd ./database_dir/deflate -$ [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -Выполните те же три шага, что и для lz4, описанных выше - -Настройте базу данных с кодеком ZSTD - -```bash -$ cd ./database_dir/zstd -$ [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -Выполните три шага так же, как для lz4 выше - -[self-check] -Для каждого кодека (lz4/zstd/deflate) выполните следующий запрос, чтобы убедиться, что базы данных созданы успешно: - -```sql -SELECT count() FROM lineorder_flat -``` - -Вы должны увидеть следующий результат: - -```sql -┌───count()─┐ -│ 119994608 │ -└───────────┘ -``` - -[Самопроверка кодека IAA Deflate] - -При первом выполнении операции вставки или запроса с клиента в консоли сервера ClickHouse должно появиться следующее сообщение в логе: - -```text -Аппаратно-ускоренный кодек DeflateQpl готов! -``` - -Если это сообщение так и не появится, но вы увидите другую запись лога, как показано ниже: - -```text -Не удалось инициализировать аппаратно-ускоренный кодек DeflateQpl -``` - -Это означает, что устройства IAA не готовы; вам нужно заново проверить их настройку. - - -## Тестирование производительности с одним экземпляром - -* Перед началом бенчмарка отключите режим C6 и переведите регулятор частоты CPU в режим `performance` - -```bash -$ cpupower idle-set -d 3 -$ cpupower frequency-set -g performance -``` - -* Чтобы устранить влияние ограничений пропускной способности памяти между NUMA‑сокетами, мы используем `numactl`, чтобы привязать сервер к одному сокету, а клиент — к другому. -* Под одиночным экземпляром подразумевается один сервер, подключенный к одному клиенту. - -Теперь запустите бенчмарк для LZ4/Deflate/ZSTD соответственно: - -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > lz4.log -``` - -Сжатие IAA (deflate): - -```bash -$ cd ./database_dir/deflate -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > deflate.log -``` - -ZSTD: - -```bash -$ cd ./database_dir/zstd -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > zstd.log -``` - -Теперь должны выводиться три лога, как и ожидалось: - -```text -lz4.log -deflate.log -zstd.log -``` - -Как проверить метрики производительности: - -Нас интересует показатель QPS. Найдите по ключевому слову `QPS_Final` и соберите статистику. - - -## Тестирование производительности с несколькими инстансами - -* Чтобы снизить влияние ограничений по памяти при использовании слишком большого числа потоков, мы рекомендуем запускать тестирование производительности с несколькими инстансами. -* Конфигурация с несколькими инстансами означает использование нескольких (2 или 4) серверов, каждый из которых подключён к своему клиенту. -* Ядра одного сокета должны быть поровну разделены и соответственно закреплены за серверами. -* Для конфигурации с несколькими инстансами необходимо создать отдельную папку для каждого кодека и загрузить в неё набор данных, следуя шагам, аналогичным запуску с одним инстансом. - -Есть 2 отличия: - -* На стороне клиента вам нужно запускать ClickHouse с назначенным портом при создании таблицы и вставке данных. -* На стороне сервера вам нужно запускать ClickHouse с определённым xml-файлом конфигурации, в котором уже назначен порт. Все пользовательские xml-файлы конфигурации для нескольких инстансов находятся в ./server_config. - -Здесь мы предполагаем, что на один сокет приходится 60 ядер и в качестве примера берём 2 инстанса. -Запуск сервера для первого инстанса -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -``` - -ZSTD: - -```bash -$ cd ./database_dir/zstd -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -``` - -Сжатие IAA Deflate: - -```bash -$ cd ./database_dir/deflate -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -``` - -[Запуск сервера для второго экземпляра] - -LZ4: - -```bash -$ cd ./database_dir && mkdir lz4_s2 && cd lz4_s2 -$ cp ../../server_config/config_lz4_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null& -``` - -ZSTD: - -```bash -$ cd ./database_dir && mkdir zstd_s2 && cd zstd_s2 -$ cp ../../server_config/config_zstd_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null& -``` - -IAA Deflate: - -```bash -$ cd ./database_dir && mkdir deflate_s2 && cd deflate_s2 -$ cp ../../server_config/config_deflate_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null& -``` - -Создание таблиц и загрузка данных для второго экземпляра - -Создание таблиц: - -```bash -$ [CLICKHOUSE_EXE] client -m --port=9001 -``` - -Вставка данных: - -```bash -$ [CLICKHOUSE_EXE] client --query "INSERT INTO [TBL_FILE_NAME] FORMAT CSV" < [TBL_FILE_NAME].tbl --port=9001 -``` - -* [TBL_FILE_NAME] обозначает имя файла, соответствующее регулярному выражению `*.tbl` в каталоге `./benchmark_sample/rawdata_dir/ssb-dbgen`. -* `--port=9001` — порт, назначенный экземпляру сервера, который также задан в config_lz4_s2.xml/config_zstd_s2.xml/config_deflate_s2.xml. Для дополнительных экземпляров его нужно заменить на значение 9002/9003, которые соответствуют экземплярам s3/s4 соответственно. Если вы его не укажете, по умолчанию будет использоваться порт 9000, который уже занят первым экземпляром. - -Тестирование производительности с двумя экземплярами - -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ cd ./database_dir/lz4_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > lz4_2insts.log -``` - -ZSTD: - - -```bash -$ cd ./database_dir/zstd -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ cd ./database_dir/zstd_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > zstd_2insts.log -``` - -IAA deflate - -```bash -$ cd ./database_dir/deflate -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ cd ./database_dir/deflate_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > deflate_2insts.log -``` - -Здесь последний аргумент `2` в client_stressing_test.py обозначает количество экземпляров. Для большего числа экземпляров нужно заменить его на значение 3 или 4. Этот скрипт поддерживает до 4 экземпляров. - -Теперь три лога должны быть выведены, как ожидается: - -```text -lz4_2insts.log -deflate_2insts.log -zstd_2insts.log -``` - -Как проверить метрики производительности: - -Мы фокусируемся на QPS, найдите ключевое слово `QPS_Final` и соберите статистику. - -Конфигурация бенчмарка для 4 инстансов аналогична конфигурации для 2 инстансов выше. -Мы рекомендуем использовать данные бенчмарка для 2 инстансов в качестве итогового отчёта для рассмотрения. - - -## Советы - -Каждый раз перед запуском нового сервера ClickHouse убедитесь, что не осталось запущенных фоновых процессов ClickHouse; при необходимости найдите и завершите старые процессы: - -```bash -$ ps -aux| grep clickhouse -$ kill -9 [PID] -``` - -Сравнив список запросов в ./client_scripts/queries_ssb.sql с официальным [Star Schema Benchmark](/getting-started/example-datasets/star-schema), вы увидите, что три запроса отсутствуют: Q1.2/Q1.3/Q3.4. Это связано с тем, что загрузка CPU для этих запросов очень низкая — менее 10 %, поэтому на них нельзя продемонстрировать различия в производительности. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/continuous-integration.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/continuous-integration.md deleted file mode 100644 index b9b73dc23ec..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/continuous-integration.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -description: 'Обзор системы непрерывной интеграции ClickHouse' -sidebar_label: 'Непрерывная интеграция (CI)' -sidebar_position: 55 -slug: /development/continuous-integration -title: 'Непрерывная интеграция (CI)' -doc_type: 'reference' ---- - - - -# Непрерывная интеграция (CI) - -Когда вы отправляете pull request, для вашего кода выполняются автоматические проверки системой ClickHouse [непрерывной интеграции (CI)](tests.md#test-automation). -Это происходит после того, как сопровождающий репозитория (кто‑то из команды ClickHouse) просмотрел ваш код и добавил к вашему pull request метку `can be tested`. -Результаты проверок перечислены на странице pull request в GitHub, как описано в [документации по проверкам GitHub](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-status-checks). -Если проверка завершилась с ошибкой, возможно, вам потребуется её исправить. -На этой странице приведён обзор проверок, с которыми вы можете столкнуться, и того, что можно сделать для их исправления. - -Если кажется, что сбой проверки не связан с вашими изменениями, это может быть временной ошибкой или проблемой с инфраструктурой. -Запушьте пустой коммит в pull request, чтобы перезапустить проверки CI: - -```shell -git reset -git commit --allow-empty -git push -``` - -Если вы не уверены, как поступить, обратитесь за помощью к мейнтейнеру проекта. - - -## Объединение с master {#merge-with-master} - -Проверяет, что PR может быть объединён с веткой master. -Если это невозможно, проверка завершится с ошибкой `Cannot fetch mergecommit`. -Чтобы пройти эту проверку, разрешите конфликт, как описано в [документации GitHub](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github), или выполните слияние ветки `master` в ветку вашего pull request с помощью git. - - - -## Проверка документации {#docs-check} - -Эта проверка пытается собрать сайт документации ClickHouse. -Она может завершиться с ошибкой, если вы изменили что-то в документации. -Наиболее вероятная причина — некорректная перекрёстная ссылка в документации. -Перейдите к отчёту проверки и найдите сообщения `ERROR` и `WARNING`. - - - -## Проверка описания {#description-check} - -Убедитесь, что описание вашего pull request соответствует шаблону [PULL_REQUEST_TEMPLATE.md](https://github.com/ClickHouse/ClickHouse/blob/master/.github/PULL_REQUEST_TEMPLATE.md). -Вы должны указать категорию изменения для changelog (например, Bug Fix) и написать понятное пользователю сообщение, описывающее изменение, для [CHANGELOG.md](../whats-new/changelog/index.md) - - - -## Docker-образ {#docker-image} - -Собирает Docker-образы сервера ClickHouse и Keeper, чтобы проверить, что они корректно собираются. - -### Тесты официальной библиотеки Docker {#official-docker-library-tests} - -Запускает тесты из [официальной библиотеки Docker](https://github.com/docker-library/official-images/tree/master/test#alternate-config-files), чтобы проверить, что Docker-образ `clickhouse/clickhouse-server` работает корректно. - -Чтобы добавить новые тесты, создайте каталог `ci/jobs/scripts/docker_server/tests/$test_name` и скрипт `run.sh` в нём. - -Дополнительные сведения о тестах можно найти в [документации по скриптам заданий CI](https://github.com/ClickHouse/ClickHouse/tree/master/ci/jobs/scripts/docker_server). - - - -## Проверка маркера {#marker-check} - -Эта проверка означает, что система CI начала обрабатывать pull request. -Когда у неё статус «pending», это означает, что ещё не все проверки были запущены. -После того как все проверки будут запущены, её статус изменится на «success». - - - -## Проверка стиля - -Выполняет различные проверки стиля кода. - -В задаче Style Check выполняются следующие базовые проверки: - -##### cpp - -Выполняет простые проверки стиля кода на основе регулярных выражений с помощью скрипта [`ci/jobs/scripts/check_style/check_cpp.sh`](https://github.com/ClickHouse/ClickHouse/blob/master/ci/jobs/scripts/check_style/check_cpp.sh) (его также можно запускать локально).\ -Если проверка завершается с ошибкой, исправьте проблемы со стилем в соответствии с [руководством по стилю кода](style.md). - -##### codespell, aspell - -Проверяют грамматические ошибки и опечатки. - -##### mypy - -Выполняет статическую проверку типов для кода на Python. - -### Запуск задачи проверки стиля локально - -Всю задачу *Style Check* можно запустить локально в Docker-контейнере с помощью: - -```sh -python -m ci.praktika run "Style check" -``` - -Чтобы выполнить отдельную проверку (например, проверку *cpp*): - -```sh -python -m ci.praktika run "Style check" --test cpp -``` - -Эти команды скачивают Docker-образ `clickhouse/style-test` и запускают задачу в контейнеризованной среде. -Дополнительные зависимости не требуются — достаточно Python 3 и Docker. - - -## Быстрый тест - -Обычно это первая проверка, которая запускается для PR. -Она собирает ClickHouse и запускает большинство [stateless-функциональных тестов](tests.md#functional-tests), пропуская некоторые. -Если она не проходит, последующие проверки не запускаются, пока проблема не будет устранена. -Ознакомьтесь с отчетом, чтобы увидеть, какие тесты завершились с ошибкой, затем воспроизведите сбой локально, как описано [здесь](/development/tests#running-a-test-locally). - -#### Запуск быстрого теста локально: - -```sh -python -m ci.praktika run "Fast test" [--test имя_теста] -``` - -Эти команды загружают Docker-образ `clickhouse/fast-test` и запускают задачу в контейнеризированной среде. -Никаких зависимостей, кроме Python 3 и Docker, не требуется. - - -## Проверка сборки - -Выполняет сборку ClickHouse в различных конфигурациях для использования на следующих шагах. - -### Локальный запуск сборки - -Сборку можно запустить локально в среде, имитирующей CI, с помощью: - -```bash -python -m ci.praktika run "<ИМЯ_ЗАДАНИЯ_СБОРКИ>" -``` - -Никаких дополнительных зависимостей, кроме Python 3 и Docker, не требуется. - -#### Доступные задания сборки - -Имена заданий сборки указаны в точности так, как они отображаются в отчёте CI: - -**Сборки AMD64:** - -* `Build (amd_debug)` - отладочная сборка с символами -* `Build (amd_release)` - оптимизированная релизная сборка -* `Build (amd_asan)` - сборка с Address Sanitizer -* `Build (amd_tsan)` - сборка с Thread Sanitizer -* `Build (amd_msan)` - сборка с Memory Sanitizer -* `Build (amd_ubsan)` - сборка с Undefined Behavior Sanitizer -* `Build (amd_binary)` - быстрая релизная сборка без Thin LTO -* `Build (amd_compat)` - совместимая сборка для более старых систем -* `Build (amd_musl)` - сборка с musl libc -* `Build (amd_darwin)` - сборка для macOS -* `Build (amd_freebsd)` - сборка для FreeBSD - -**Сборки ARM64:** - -* `Build (arm_release)` - оптимизированная релизная сборка ARM64 -* `Build (arm_asan)` - сборка ARM64 с Address Sanitizer -* `Build (arm_coverage)` - сборка ARM64 с инструментированием для покрытия -* `Build (arm_binary)` - быстрая релизная сборка ARM64 без Thin LTO -* `Build (arm_darwin)` - сборка macOS ARM64 -* `Build (arm_v80compat)` - сборка совместимости ARMv8.0 - -**Другие архитектуры:** - -* `Build (ppc64le)` - PowerPC, 64-бит, порядок байтов Little Endian -* `Build (riscv64)` - RISC-V, 64-бит -* `Build (s390x)` - IBM System/390, 64-бит -* `Build (loongarch64)` - LoongArch, 64-бит - -Если задание выполнено успешно, результаты сборки будут доступны в каталоге `/ci/tmp/build`. - -**Примечание:** Для сборок, не относящихся к категории «Другие архитектуры» (сборки из категории «Другие архитектуры» используют кросс-компиляцию), архитектура вашей локальной машины должна совпадать с типом сборки, чтобы она была выполнена так, как запрошено в `BUILD_JOB_NAME`. - -#### Пример - -Чтобы выполнить локальную отладочную сборку: - -```bash -python -m ci.praktika run "Build (amd_debug)" -``` - - -Если описанный выше подход вам не подходит, используйте параметры cmake из лога сборки и следуйте [общему процессу сборки](../development/build.md). -## Functional stateless tests {#functional-stateless-tests} - -Запускает [функциональные stateless-тесты](tests.md#functional-tests) для бинарных файлов ClickHouse, собранных в различных конфигурациях — release, debug, с санитайзерами и т. д. -Изучите отчёт, чтобы увидеть, какие тесты завершаются с ошибкой, затем воспроизведите сбой локально, как описано [здесь](/development/tests#functional-tests). -Обратите внимание, что для воспроизведения необходимо использовать правильную конфигурацию сборки — тест может падать под AddressSanitizer, но проходить в Debug. -Скачайте бинарный файл со [страницы проверок сборки CI](/install/advanced) или соберите его локально. - - - -## Интеграционные тесты {#integration-tests} - -Выполняет [интеграционные тесты](tests.md#integration-tests). - - - -## Проверка исправления ошибки {#bugfix-validate-check} - -Проверяет, что либо добавлен новый тест (функциональный или интеграционный), либо есть изменённые тесты, которые падают при использовании бинарника, собранного из ветки master. -Эта проверка запускается, когда у pull request есть метка "pr-bugfix". - - - -## Стресс-тест {#stress-test} - -Запускает функциональные тесты без сохранения состояния одновременно с нескольких клиентов для выявления ошибок, связанных с конкурентным выполнением. Если тест завершился неуспешно: - - * Сначала исправьте все остальные ошибки тестов; - * Ознакомьтесь с отчетом, найдите журналы сервера и проверьте их на возможные причины - ошибки. - - - -## Проверка совместимости {#compatibility-check} - -Проверяет, запускается ли бинарный файл `clickhouse` на дистрибутивах со старыми версиями libc. -Если проверка не проходит, обратитесь за помощью к мейнтейнеру. - - - -## AST fuzzer {#ast-fuzzer} - -Выполняет случайно сгенерированные запросы для обнаружения ошибок в программе. -Если он завершится с ошибкой, обратитесь за помощью к мейнтейнеру. - - - -## Тесты производительности {#performance-tests} - -Измеряйте, как изменяется производительность запросов. -Это самая длительная проверка, она занимает чуть меньше 6 часов. -Отчёт о тестах производительности подробно описан [здесь](https://github.com/ClickHouse/ClickHouse/tree/master/docker/test/performance-comparison#how-to-read-the-report). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/contrib.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/contrib.md deleted file mode 100644 index 5ea6eb0e29f..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/contrib.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: 'Страница, описывающая использование сторонних библиотек в ClickHouse и порядок их добавления и сопровождения.' -sidebar_label: 'Сторонние библиотеки' -sidebar_position: 60 -slug: /development/contrib -title: 'Сторонние библиотеки' -doc_type: 'reference' ---- - - - -# Сторонние библиотеки - -ClickHouse использует сторонние библиотеки для различных целей, например, для подключения к другим базам данных, декодирования/кодирования данных при чтении/записи с диска/на диск или для реализации отдельных специализированных SQL‑функций. -Чтобы не зависеть от набора библиотек, доступных в целевой системе, каждая сторонняя библиотека импортируется как подмодуль Git в дерево исходного кода ClickHouse и затем компилируется и компонуется вместе с ClickHouse. -Список сторонних библиотек и их лицензий можно получить следующим запросом: - -```sql -SELECT library_name, license_type, license_path FROM system.licenses ORDER BY library_name COLLATE 'en'; -``` - -Обратите внимание, что перечисленные библиотеки — это те, которые находятся в каталоге `contrib/` репозитория ClickHouse. -В зависимости от параметров сборки некоторые библиотеки могли не собираться и, как следствие, их функциональность может быть недоступна во время выполнения. - -[Пример](https://sql.clickhouse.com?query_id=478GCPU7LRTSZJBNY3EJT3) - - -## Добавление и сопровождение сторонних библиотек {#adding-and-maintaining-third-party-libraries} - -Каждая сторонняя библиотека должна находиться в отдельном каталоге внутри каталога `contrib/` репозитория ClickHouse. -Избегайте простого копирования внешнего кода в каталог библиотеки. -Вместо этого создайте Git‑подмодуль, чтобы подтягивать сторонний код из внешнего upstream‑репозитория. - -Все подмодули, используемые ClickHouse, перечислены в файле `.gitmodule`. -- Если библиотекой можно пользоваться как есть (сценарий по умолчанию), вы можете ссылаться напрямую на upstream‑репозиторий. -- Если библиотеку необходимо пропатчить, создайте форк upstream‑репозитория в [организации ClickHouse на GitHub](https://github.com/ClickHouse). - -Во втором случае мы стремимся максимально изолировать собственные патчи от upstream‑коммитов. -Для этого создайте ветку с префиксом `ClickHouse/` от ветки или тега, который вы хотите интегрировать, например `ClickHouse/2024_2` (для ветки `2024_2`) или `ClickHouse/release/vX.Y.Z` (для тега `release/vX.Y.Z`). -Избегайте слежения за upstream‑ветками разработки `master` / `main` / `dev` (то есть создания веток с префиксом `ClickHouse/master` / `ClickHouse/main` / `ClickHouse/dev` в форке). -Такие ветки являются «движущимися целями» и осложняют корректное версионирование. -«Префиксные ветки» гарантируют, что подтягивание изменений из upstream‑репозитория во форк не затронет пользовательские ветки `ClickHouse/`. -Подмодули в `contrib/` должны отслеживать только ветки `ClickHouse/` форкнутых сторонних репозиториев. - -Патчи применяются только к веткам `ClickHouse/` внешних библиотек. - -Сделать это можно двумя способами: -- вам нужно внести новое исправление в ветку с префиксом `ClickHouse/` во форкнутом репозитории, например исправление для sanitizer‑а. В этом случае отправьте исправление как ветку с префиксом `ClickHouse/`, например `ClickHouse/fix-sanitizer-disaster`. Затем создайте PR из новой ветки в пользовательскую отслеживающую ветку, например `ClickHouse/2024_2 <-- ClickHouse/fix-sanitizer-disaster`, и влейте PR. -- вы обновляете подмодуль и вам нужно повторно применить более ранние патчи. В этом случае пересоздавать старые PR избыточно. Вместо этого просто сделайте cherry-pick старых коммитов в новую ветку `ClickHouse/` (соответствующую новой версии). При необходимости можно объединить (squash) коммиты PR‑ов, которые содержали несколько коммитов. В идеале мы уже отправили пользовательские патчи обратно в upstream, и тогда эти патчи можно опустить в новой версии. - -После обновления подмодуля обновите ссылку на подмодуль в ClickHouse так, чтобы она указывала на новый хеш во форке. - -Создавайте патчи к сторонним библиотекам с учётом официального репозитория и рассматривайте возможность отправить патч обратно в upstream‑репозиторий. -Это гарантирует, что другие тоже смогут воспользоваться патчем, и он не станет обузой для команды ClickHouse с точки зрения сопровождения. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/developer-instruction.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/developer-instruction.md deleted file mode 100644 index b87e28ac2b4..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/developer-instruction.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: 'Предварительные требования и инструкции по настройке среды разработки ClickHouse' -sidebar_label: 'Предварительные требования' -sidebar_position: 5 -slug: /development/developer-instruction -title: 'Предварительные требования для разработчиков' -doc_type: 'guide' ---- - - - -# Предварительные требования - -ClickHouse можно собирать под Linux, FreeBSD и macOS. -Если вы используете Windows, вы всё равно можете собирать ClickHouse в виртуальной машине с Linux, например, в [VirtualBox](https://www.virtualbox.org/) с Ubuntu. - - - -## Создание репозитория на GitHub - -Чтобы начать вносить вклад в разработку ClickHouse, вам понадобится учетная запись на [GitHub](https://www.github.com/). -Также сгенерируйте локально SSH-ключ (если у вас его ещё нет) и загрузите открытый ключ в GitHub, так как это является необходимым условием для отправки патчей. - -Затем форкните [репозиторий ClickHouse](https://github.com/ClickHouse/ClickHouse/) в свой личный аккаунт, нажав кнопку «fork» в правом верхнем углу. - -Чтобы внести изменения, например, исправление ошибки или новую функциональность, сначала закоммитьте свои изменения в ветку в вашем форке, затем создайте «Pull Request» с этими изменениями в основной репозиторий. - -Для работы с 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). - - -## Клонируйте репозиторий на свою локальную машину - -Сначала скачайте исходные файлы на локальную машину, то есть клонируйте репозиторий: - -```sh -git clone git@github.com:your_github_username/ClickHouse.git # замените заполнитель своим именем пользователя GitHub -cd ClickHouse -``` - -Эта команда создаёт директорию `ClickHouse/`, содержащую исходный код, тесты и другие файлы. -Вы можете указать собственную директорию для клонирования после URL, но важно, чтобы этот путь не содержал пробелов, так как это может привести к сбою сборки на более позднем этапе. - -Git-репозиторий ClickHouse использует подмодули для подключения сторонних библиотек. -Подмодули по умолчанию не клонируются. -Вы можете: - -* запустить `git clone` с опцией `--recurse-submodules`, - -* если `git clone` запущен без `--recurse-submodules`, выполнить `git submodule update --init --jobs `, чтобы явно клонировать все подмодули. (`` можно, например, установить в `12`, чтобы параллелизировать загрузку.) - -* если `git clone` запущен без `--recurse-submodules` и вы хотите использовать [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/) клонирование подмодулей, чтобы исключить ненужные файлы и историю в подмодулях и сэкономить место (около 5 GB вместо примерно 15 GB), выполните `./contrib/update-submodules.sh`. Этот вариант используется в CI, но не рекомендуется для локальной разработки, так как делает работу с подмодулями менее удобной и более медленной. - -Чтобы проверить состояние Git-подмодулей, выполните `git submodule status`. - -Если вы видите следующее сообщение об ошибке - -```bash -Permission denied (publickey). -fatal: Could not read from remote repository. - -Убедитесь, что у вас настроены корректные права доступа -и репозиторий существует. -``` - -Отсутствуют SSH-ключи для подключения к GitHub. -Обычно эти ключи находятся в `~/.ssh`. -Чтобы SSH-ключи были приняты, необходимо добавить их в настройках GitHub. - -Вы также можете клонировать репозиторий по протоколу HTTPS: - -```sh -git clone https://github.com/ClickHouse/ClickHouse.git -``` - -Однако это не позволит вам отправлять свои изменения на сервер. -Вы всё равно можете временно использовать его и позже добавить SSH-ключи, заменив удалённый URL репозитория с помощью команды `git remote`. - -Вы также можете добавить оригинальный URL репозитория ClickHouse в свой локальный репозиторий, чтобы получать оттуда обновления: - -```sh -git remote add upstream git@github.com:ClickHouse/ClickHouse.git -``` - -После успешного выполнения этой команды вы сможете получать обновления из основного репозитория ClickHouse, выполняя `git pull upstream master`. - -:::tip -Пожалуйста, не запускайте просто `git push`, иначе вы можете отправить изменения в неправильный удалённый репозиторий и/или в неправильную ветку. -Лучше явно указывать имена удалённого репозитория и ветки, например: `git push origin my_branch_name`. -::: - - -## Написание кода {#writing-code} - -Ниже вы найдёте несколько полезных ссылок, которые могут пригодиться при написании кода для ClickHouse: - -- [Архитектура ClickHouse](/development/architecture/). -- [Руководство по стилю кода](/development/style/). -- [Сторонние библиотеки](/development/contrib#adding-and-maintaining-third-party-libraries) -- [Написание тестов](/development/tests/) -- [Открытые задачи](https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aopen+is%3Aissue+label%3A%22easy+task%22) - -### IDE {#ide} - -[Visual Studio Code](https://code.visualstudio.com/) и [Neovim](https://neovim.io/) — два варианта, которые хорошо зарекомендовали себя для разработки ClickHouse. Если вы используете VS Code, мы рекомендуем установить [расширение clangd](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd) вместо IntelliSense, так как оно значительно быстрее и производительнее. - -[CLion](https://www.jetbrains.com/clion/) — ещё одна хорошая альтернатива. Однако на крупных проектах, таких как ClickHouse, он может работать медленнее. Несколько моментов, которые стоит учитывать при использовании CLion: - -- CLion создаёт собственный каталог `build` и автоматически выбирает `debug` в качестве типа сборки -- используется версия CMake, определённая в CLion, а не установленная вами -- CLion будет использовать `make` для выполнения задач сборки вместо `ninja` (это ожидаемое поведение) - -Другие IDE, которые вы можете использовать, — [Sublime Text](https://www.sublimetext.com/), [Qt Creator](https://www.qt.io/product/development-tools) или [Kate](https://kate-editor.org/). - - - -## Создание pull request {#create-a-pull-request} - -Перейдите к вашему форк-репозиторию в интерфейсе GitHub. -Если вы разрабатывали в отдельной ветке, вам нужно выбрать именно эту ветку. -На экране будет кнопка «Pull request». -По сути это означает «создать запрос на принятие моих изменений в основной репозиторий». - -Pull request можно создать, даже если работа еще не завершена. -В этом случае, пожалуйста, добавьте слово «WIP» (work in progress) в начало заголовка, его можно будет изменить позже. -Это полезно для совместного ревью и обсуждения изменений, а также для запуска всех доступных тестов. -Важно, чтобы вы добавили краткое описание ваших изменений — позже оно будет использовано для формирования списка изменений (changelog) релиза. - -Тестирование начнется, как только сотрудники ClickHouse пометят ваш PR меткой «can be tested». -Результаты некоторых первичных проверок (например, стиля кода) появятся в течение нескольких минут. -Результаты проверки сборки будут доступны в течение получаса. -Основной набор тестов сообщит о результатах примерно в течение часа. - -Система подготовит отдельные бинарные сборки ClickHouse для вашего pull request. -Чтобы получить эти сборки, нажмите ссылку «Details» рядом с пунктом «Builds» в списке проверок. -Там вы найдете прямые ссылки на собранные .deb-пакеты ClickHouse, которые вы можете развернуть даже на своих production-серверах (если не боитесь). - - - -## Написание документации {#write-documentation} - -Каждый pull request, добавляющий новую функцию, должен сопровождаться соответствующей документацией. -Если вы хотите предварительно просмотреть изменения в документации, инструкции по локальной сборке страницы документации доступны в файле README.md [здесь](https://github.com/ClickHouse/clickhouse-docs). -При добавлении новой функции в ClickHouse вы можете использовать приведённый ниже шаблон в качестве ориентира: - - - -````markdown -# newFunctionName - -Краткое описание функции. Здесь следует кратко описать её назначение и типичный сценарий использования. - -**Синтаксис** - -\```sql -newFunctionName(arg1, arg2[, arg3]) -\``` - -**Аргументы** - -- `arg1` — Описание аргумента. [DataType](../data-types/float.md) -- `arg2` — Описание аргумента. [DataType](../data-types/float.md) -- `arg3` — Описание необязательного аргумента. [DataType](../data-types/float.md) - -**Особенности реализации** - -Описание деталей реализации, если это применимо. - -**Возвращаемое значение** - -- Возвращает {укажите, что именно возвращает функция}. [DataType](../data-types/float.md) - -**Пример** - -Запрос: - -\```sql -SELECT 'укажите здесь пример запроса'; -\``` - -Ответ: - -\```response -┌───────────────────────────────────┐ -│ результат запроса │ -└───────────────────────────────────┘ -\``` -```` - - -## Использование тестовых данных - -Разработка ClickHouse часто требует загрузки реалистичных наборов данных. -Это особенно важно для тестирования производительности. -Мы подготовили специальный набор обезличенных данных по веб‑аналитике. -Для него требуется дополнительно около 3 ГБ свободного дискового пространства. - -```sh - 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 -``` - -В клиенте clickhouse-client: - -```sql -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); - -```` - -Импортируйте данные: - -```bash -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 -```` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/index.md deleted file mode 100644 index 8551d98399f..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/index.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -description: 'Главная страница раздела «Разработка и участие»' -slug: /development/ -title: 'Разработка и участие' -doc_type: 'landing-page' ---- - -В этом разделе документации представлены следующие страницы: - -{/* Приведённое ниже оглавление автоматически генерируется из полей YAML - front matter: title, description, slug с помощью скрипта, расположенного здесь: - - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - - Если вы заметили ошибку или хотите улучшить описания, отредактируйте - соответствующие файлы напрямую. - */ } - -{/*AUTOGENERATED_START*/ } - -| Страница | Описание | -| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| [Developer Prerequisites](/development/developer-instruction) | Требования и инструкции по настройке среды разработки ClickHouse | -| [How to Build ClickHouse on Linux](/development/build) | Пошаговое руководство по сборке ClickHouse из исходного кода на Linux-системах | -| [Build on macOS for macOS](/development/build-osx) | Руководство по сборке ClickHouse из исходного кода на системах macOS | -| [Build on Linux for macOS](/development/build-cross-osx) | Руководство по кросс-компиляции ClickHouse на Linux для систем macOS | -| [How to Build ClickHouse on Linux for AARCH64](/development/build-cross-arm) | Руководство по сборке ClickHouse из исходного кода для архитектуры AARCH64 | -| [How to Build ClickHouse on Linux for RISC-V 64](/development/build-cross-riscv) | Руководство по сборке ClickHouse из исходного кода для архитектуры RISC-V 64 | -| [Build on Linux for s390x (zLinux)](/development/build-cross-s390x) | Руководство по сборке ClickHouse из исходного кода для архитектуры s390x | -| [Build on Linux for E2K](/development/build-e2k) | Руководство по сборке ClickHouse из исходного кода для архитектуры E2K | -| [Build on Linux for LoongArch64](/development/build-cross-loongarch) | Руководство по сборке ClickHouse из исходного кода для архитектуры LoongArch64 | -| [Testing ClickHouse](/development/tests) | Руководство по тестированию ClickHouse и запуску набора тестов | -| [Architecture Overview](/development/architecture) | Подробный обзор архитектуры ClickHouse и его колонко-ориентированной организации данных | -| [Continuous Integration (CI)](/development/continuous-integration) | Обзор системы непрерывной интеграции (CI) ClickHouse | -| [Third-Party Libraries](/development/contrib) | Страница, описывающая использование сторонних библиотек в ClickHouse и порядок их добавления и сопровождения | -| [C++ Style Guide](/development/style) | Рекомендации по стилю кодирования для разработки ClickHouse на C++ | -| [Build Clickhouse with DEFLATE_QPL](/development/building_and_benchmarking_deflate_qpl) | Как собрать ClickHouse и запустить бенчмарк с кодеком DEFLATE_QPL | -| [Integrating Rust Libraries](/development/integrating_rust_libraries) | Руководство по интеграции библиотек Rust в ClickHouse | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md deleted file mode 100644 index 855b7814529..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -description: 'Руководство по интеграции библиотек на Rust в ClickHouse' -sidebar_label: 'Библиотеки Rust' -slug: /development/integrating_rust_libraries -title: 'Интеграция библиотек на Rust' -doc_type: 'guide' ---- - -# Библиотеки Rust - -Интеграция библиотеки Rust будет описана на примере интеграции хеш-функции BLAKE3. - -Первым шагом интеграции является добавление библиотеки в каталог /rust. Для этого нужно создать пустой Rust-проект и подключить требуемую библиотеку в Cargo.toml. Также необходимо настроить компиляцию новой библиотеки как статической, добавив `crate-type = ["staticlib"]` в Cargo.toml. - -Далее нужно связать библиотеку с CMake с использованием библиотеки Corrosion. Сначала нужно добавить каталог библиотеки в CMakeLists.txt внутри каталога /rust. После этого следует добавить файл CMakeLists.txt в каталог библиотеки. В нём необходимо вызвать функцию импорта Corrosion. Для импорта BLAKE3 использовались следующие строки: - -```CMake -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) -``` - -Таким образом, мы создадим корректную цель CMake с помощью Corrosion, а затем переименуем её в более удобное имя. Обратите внимание, что имя `_ch_rust_blake3` берётся из Cargo.toml, где оно используется как имя проекта (`name = "_ch_rust_blake3"`). - -Поскольку типы данных Rust несовместимы с типами данных C/C++, мы будем использовать наш пустой библиотечный проект для создания адаптеров (shim-методов) для преобразования данных, полученных из C/C++, вызова методов библиотеки и обратного преобразования выходных данных. Например, этот метод был написан для BLAKE3: - -```rust -#[no_mangle] -pub unsafe extern "C" fn blake3_apply_shim( - begin: *const c_char, - _size: u32, - out_char_data: *mut u8, -``` - -```rust -#[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("входные данные являются нулевым указателем").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-скрипт build.rs и подключить cbindgen как build-зависимость. - -Пример build-скрипта, который может автоматически сгенерировать заголовочный файл: - -```rust - 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) - } - } -``` - -Также следует использовать атрибут #[no_mangle] и `extern "C"` для каждого 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. \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/development/style.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/style.md deleted file mode 100644 index 4fdfe3eb18a..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/style.md +++ /dev/null @@ -1,892 +0,0 @@ ---- -description: 'Руководство по стилю кода при разработке на C++ в ClickHouse' -sidebar_label: 'Руководство по стилю C++' -sidebar_position: 70 -slug: /development/style -title: 'Руководство по стилю C++' -doc_type: 'guide' ---- - - - -# Руководство по стилю кода C++ - - - -## Общие рекомендации {#general-recommendations} - -Ниже приведены рекомендации, а не требования. -Если вы редактируете код, имеет смысл придерживаться форматирования существующего кода. -Стиль кода нужен для обеспечения единообразия. Единообразие упрощает чтение кода, а также облегчает поиск по коду. -Многие правила не имеют логического обоснования; они продиктованы устоявшейся практикой. - - - -## Форматирование - -**1.** Большая часть форматирования выполняется автоматически с помощью `clang-format`. - -**2.** Ширина отступа — 4 пробела. Настройте свою среду разработки так, чтобы нажатие клавиши Tab добавляло четыре пробела. - -**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: - /// Версия объекта для использования. shared_ptr управляет временем жизни версии. - using Version = std::shared_ptr; - ... -} -``` - -**16.** Если одно и то же `namespace` используется для всего файла и нет ничего иного примечательного, отступ внутри `namespace` не обязателен. - -**17.** Если блок для выражения `if`, `for`, `while` или другого состоит из одного `statement`, фигурные скобки можно опустить. Вместо этого разместите `statement` на отдельной строке. Это правило также применяется к вложенным `if`, `for`, `while`, ... - -Но если вложенный `statement` содержит фигурные скобки или `else`, внешний блок следует оформлять в фигурных скобках. - -```cpp -/// Завершить запись. -for (auto & stream : streams) - stream.second->finalize(); -``` - -**18.** В конце строк не должно быть пробелов. - -**19.** Исходные файлы используют кодировку UTF-8. - - -**20.** В строковых литералах можно использовать символы, выходящие за пределы ASCII. - -```cpp -<< ", " << (timer.elapsed() / chunks_stats.hits) << " μsec/hit."; -``` - -**21.** Не пишите несколько выражений в одной строке. - -**22.** Группируйте блоки кода внутри функций и разделяйте их не более чем одной пустой строкой. - -**23.** Разделяйте функции, классы и т. д. одной или двумя пустыми строками. - -**24.** Модификатор `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) -``` - - -## Комментарии - -**1.** Обязательно добавляйте комментарии ко всем нетривиальным фрагментам кода. - -Это очень важно. Написание комментария может помочь вам понять, что этот участок кода не нужен или что он спроектирован неправильно. - -```cpp -/** Часть области памяти, которая может быть использована. - * Например, если internal_buffer имеет размер 1 МБ, а из файла в буфер было загружено только 10 байт для чтения, - * то working_buffer будет иметь размер только 10 байт - * (working_buffer.end() будет указывать на позицию сразу после этих 10 доступных для чтения байт). - */ -``` - -**2.** Комментарии могут быть настолько подробными, насколько необходимо. - -**3.** Размещайте комментарии перед кодом, который они описывают. В редких случаях комментарии могут располагаться после кода, на одной строке. - -```cpp -/** Разбирает и выполняет запрос. -*/ -void executeQuery( - ReadBuffer & istr, /// Откуда читать запрос (и данные для INSERT, если применимо) - WriteBuffer & ostr, /// Куда записывать результат - Context & context, /// БД, таблицы, типы данных, движки, функции, агрегатные функции... - BlockInputStreamPtr & query_plan, /// Здесь может быть записано описание выполнения запроса - QueryProcessingStage::Enum stage = QueryProcessingStage::Complete /// До какой стадии обрабатывать SELECT-запрос - ) -``` - -**4.** Комментарии должны быть написаны только на английском языке. - -**5.** Если вы пишете библиотеку, добавляйте подробные комментарии, объясняющие её, в основной заголовочный файл. - -**6.** Не добавляйте комментарии, которые не несут дополнительной информации. В частности, не оставляйте пустые комментарии вроде этого: - -```cpp -/* -* Имя процедуры: -* Исходное имя процедуры: -* Автор: -* Дата создания: -* Даты модификации: -* Авторы модификаций: -* Исходное имя файла: -* Назначение: -* Назначение: -* Обозначение: -* Используемые классы: -* Константы: -* Локальные переменные: -* Параметры: -* Дата создания: -* Назначение: -*/ -``` - -Пример заимствован с сайта [http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/](http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/). - -**7.** Не пишите мусорные комментарии (автор, дата создания и т. д.) в начале каждого файла. - -**8.** Однострочные комментарии начинаются с трёх слэшей: `///`, а многострочные — с `/**`. Такие комментарии считаются «документацией». - -Примечание: вы можете использовать Doxygen для генерации документации из этих комментариев. Но Doxygen обычно не используют, потому что удобнее просматривать код в IDE. - -**9.** Многострочные комментарии не должны иметь пустых строк в начале и в конце (кроме строки, которая закрывает многострочный комментарий). - -**10.** Для закомментирования кода используйте обычные комментарии, а не «документирующие» комментарии. - -**11.** Удаляйте закомментированные части кода перед коммитом. - -**12.** Не используйте ненормативную лексику в комментариях или коде. - -**13.** Не пишите ЗАГЛАВНЫМИ БУКВАМИ. Не используйте избыточную пунктуацию. - -```cpp -/// ЧТО ЗА ОШИБКА??? -``` - -**14.** Не используйте комментарии в качестве разделителей. - -```cpp -///****************************************************** -``` - -**15.** Не начинайте обсуждения в комментариях. - -```cpp -/// Зачем вы это сделали? -``` - -**16.** Нет необходимости писать в конце блока комментарий, поясняющий, чему он посвящён. - -```cpp -/// for -``` - - -## Имена - -**1.** Используйте строчные буквы и символ нижнего подчеркивания в именах переменных и членов классов. - -```cpp -size_t max_block_size; -``` - -**2.** Для имен функций (методов) используйте стиль camelCase, начиная с строчной буквы. - -```cpp -std::string getName() const override { return "Memory"; } -``` - -**3.** Для имен классов и структур используйте CamelCase, начиная с заглавной буквы. Для интерфейсов не используются префиксы, кроме 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`. - - -## Как писать код - -**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, "Не удалось закрыть файл {}", file_name); -``` - -Вы можете использовать `assert` для проверки инвариантов в коде. - -**4.** Типы исключений. - -Нет необходимости использовать сложную иерархию исключений в прикладном коде. Текст исключения должен быть понятен системному администратору. - -**5.** Выбрасывание исключений из деструкторов. - -Это не рекомендуется, но допускается. - -Используйте следующие подходы: - -* Создайте функцию (`done()` или `finalize()`), которая заранее выполнит всю работу, способную привести к возникновению исключения. Если эта функция была вызвана, в деструкторе впоследствии не должно возникать исключений. -* Задачи, которые слишком сложны (например, отправка сообщений по сети), можно вынести в отдельный метод, который пользователь класса должен будет вызвать до разрушения объекта. -* Если в деструкторе возникает исключение, лучше записать его в лог, чем скрывать (если логгер доступен). -* В простых приложениях допустимо полагаться на `std::terminate` (в случаях `noexcept` по умолчанию в C++11) для завершения работы при возникновении исключений. - -**6.** Анонимные блоки кода. - -Вы можете создать отдельный блок кода внутри одной функции, чтобы сделать определённые переменные локальными, чтобы деструкторы были вызваны при выходе из блока. - -```cpp -Block block = data.in->read(); - -{ - std::lock_guard lock(mutex); - data.ready = true; - data.block = block; -} - -ready_any.set(); -``` - -**7.** Многопоточность. - -В программах для офлайн-обработки данных: - -* Старайтесь добиться максимально возможной производительности на одном ядре CPU. При необходимости затем можно распараллелить код. - -В серверных приложениях: - -* Используйте пул потоков для обработки запросов. На данный момент у нас не было задач, требующих переключения контекста в пространстве пользователя. - -`fork` не используется для распараллеливания. - -**8.** Синхронизация потоков. - -Часто можно организовать работу так, чтобы разные потоки использовали разные ячейки памяти (ещё лучше — разные кэш-линии) и не требовали синхронизации (кроме `joinAll`). - -Если синхронизация необходима, в большинстве случаев достаточно использовать мьютекс с `lock_guard`. - -В остальных случаях используйте системные примитивы синхронизации. Не используйте активное ожидание (busy wait). - -Атомарные операции следует использовать только в самых простых случаях. - -Не пытайтесь реализовывать неблокирующие структуры данных, если это не ваша основная область экспертизы. - -**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.** Логирование. - -Смотрите примеры в коде. - -Перед коммитом удаляйте все бессмысленные и отладочные логи, а также любые другие виды отладочного вывода. - -Логирования в циклах следует избегать, даже на уровне Trace. - -Логи должны быть читаемыми на любом уровне логирования. - -В основном используйте логирование только в прикладном коде. - -Сообщения логов должны быть написаны на английском языке. - -Желательно, чтобы лог был понятен системному администратору. - -Не используйте ненормативную лексику в логе. - -Используйте в логе кодировку UTF-8. В редких случаях можно использовать в логе не-ASCII-символы. - -**20.** Ввод-вывод. - -Не используйте `iostreams` во внутренних циклах, критичных для производительности приложения (и никогда не используйте `stringstream`). - -Вместо этого используйте библиотеку `DB/IO`. - -**21.** Дата и время. - -См. библиотеку `DateLUT`. - -**22.** include. - -Всегда используйте `#pragma once` вместо include guards. - -**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` в базовом классе, а в производных классах пишите `override` вместо `virtual`. - - -## Неиспользуемые возможности C++ - -**1.** Виртуальное наследование не используется. - -**2.** Конструкции, для которых в современном C++ есть удобный синтаксический сахар, например, - -```cpp -// Традиционный способ без синтаксического сахара -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) // автовыведение возвращаемого типа (C++14) -{ - if (elements.contains(e)) // проверка принадлежности через .contains в C++20 - { - // ... - } - - elements.erase_if( - elements, - [&](const auto x){ - return x == 1; - }); // std::erase_if из C++20 - - 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`. На момент написания (март 2025 года) код компилируется с помощью clang версии не ниже 19. - -Используется стандартная библиотека (`libc++`). - -**4.** ОС: Ubuntu Linux, не старше Precise. - -**5.** Код пишется для архитектуры процессора x86_64. - -Набор инструкций процессора — минимальный поддерживаемый среди наших серверов. В данный момент это 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.** Коммиты в `master` не должны ломать сборку. - -Хотя рабочими считаются только отдельные ревизии. - -**8.** Делайте коммиты как можно чаще, даже если код готов лишь частично. - -Для этого используйте ветки. - -Если ваш код в ветке `master` пока не собирается, исключите его из сборки перед `push`. Вам нужно будет доделать его или удалить в течение нескольких дней. - -**9.** Для нетривиальных изменений используйте ветки и публикуйте их на сервере. - -**10.** Неиспользуемый код удаляется из репозитория. - - - -## Библиотеки {#libraries} - -**1.** Используется стандартная библиотека C++20 (допускаются экспериментальные расширения), а также фреймворки `boost` и `Poco`. - -**2.** Не допускается использование библиотек из пакетов ОС. Также не допускается использование предустановленных в системе библиотек. Все библиотеки должны быть размещены в виде исходного кода в каталоге `contrib` и собираться вместе с ClickHouse. Подробности см. в разделе [Рекомендации по добавлению сторонних библиотек](/development/contrib#adding-and-maintaining-third-party-libraries). - -**3.** Всегда следует отдавать предпочтение библиотекам, которые уже используются. - - - -## Общие рекомендации {#general-recommendations-1} - -**1.** Пишите как можно меньше кода. - -**2.** Старайтесь выбирать самое простое решение. - -**3.** Не пишите код, пока не будете понимать, как он будет работать и как будет устроен внутренний цикл. - -**4.** В простейших случаях используйте `using` вместо классов или структур. - -**5.** По возможности не определяйте конструкторы копирования, операторы присваивания, деструкторы (кроме виртуального, если класс содержит хотя бы одну виртуальную функцию), конструкторы перемещения или операторы присваивания перемещением. Другими словами, сгенерированные компилятором функции должны работать корректно. Можно использовать `default`. - -**6.** Упрощение кода поощряется. По возможности минимизируйте объём кода. - - - -## Дополнительные рекомендации - -**1.** Явное указание `std::` для типов из `stddef.h` - -не рекомендуется. Другими словами, мы рекомендуем писать `size_t` вместо `std::size_t`, потому что так короче. - -Тем не менее, допускается добавлять `std::`. - -**2.** Явное указание `std::` для функций из стандартной библиотеки C - -не рекомендуется. Другими словами, пишите `memcpy` вместо `std::memcpy`. - -Причина в том, что есть похожие нестандартные функции, такие как `memmem`. Мы иногда используем эти функции. Эти функции отсутствуют в `namespace std`. - -Если вы будете везде писать `std::memcpy` вместо `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/i18n/ru/docusaurus-plugin-content-docs/current/development/tests.md b/i18n/ru/docusaurus-plugin-content-docs/current/development/tests.md deleted file mode 100644 index 994e55b38f0..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/development/tests.md +++ /dev/null @@ -1,549 +0,0 @@ ---- -description: 'Руководство по тестированию ClickHouse и запуску набора тестов' -sidebar_label: 'Тестирование' -sidebar_position: 40 -slug: /development/tests -title: 'Тестирование ClickHouse' -doc_type: 'guide' ---- - - - -# Проверка ClickHouse - - - -## Функциональные тесты - -Функциональные тесты — наиболее простые и удобные в использовании. -Большинство возможностей ClickHouse можно протестировать с их помощью, и их обязательно использовать для каждого изменения в коде ClickHouse, которое может быть протестировано таким образом. - -Каждый функциональный тест отправляет один или несколько запросов на запущенный сервер ClickHouse и сравнивает результат с эталонным. - -Тесты расположены в каталоге `./tests/queries`. - -Каждый тест может быть одного из двух типов: `.sql` и `.sh`. - -* Тест `.sql` — это простой SQL‑скрипт, который подаётся на вход `clickhouse-client`. -* Тест `.sh` — это скрипт, который запускается самостоятельно. - -Тесты на SQL обычно предпочтительнее тестов `.sh`. -Используйте тесты `.sh` только в тех случаях, когда нужно проверить функциональность, которую невозможно покрыть чистым SQL, например, подачу входных данных в `clickhouse-client` через pipe или тестирование `clickhouse-local`. - -:::note -Распространённая ошибка при тестировании типов данных `DateTime` и `DateTime64` — предполагать, что сервер использует конкретный часовой пояс (например, «UTC»). Это не так: часовые пояса в CI‑запусках тестов преднамеренно выбираются случайным образом. Самое простое решение — явно указывать часовой пояс для тестовых значений, например: `toDateTime64(val, 3, 'Europe/Amsterdam')`. -::: - -### Запуск теста локально - -Запустите сервер ClickHouse локально, прослушивающий порт по умолчанию (9000). -Чтобы запустить, например, тест `01428_hash_set_nan_key`, перейдите в каталог репозитория и выполните следующую команду: - -```sh -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`. -Вы можете запустить все тесты или только их подмножество, указав фильтр по именам тестов: `./clickhouse-test substring`. -Также есть параметры для запуска тестов параллельно или в случайном порядке. - -### Добавление нового теста - -Чтобы добавить новый тест, сначала создайте файл `.sql` или `.sh` в директории `queries/0_stateless`. -Затем сгенерируйте соответствующий файл `.reference`, используя `clickhouse-client < 12345_test.sql > 12345_test.reference` или `./12345_test.sh > ./12345_test.reference`. - -Тесты должны только создавать, удалять, выполнять `SELECT` и т.п. над таблицами в базе данных `test`, которая создаётся автоматически заранее. -Допускается использование временных таблиц. - -Чтобы локально настроить такое же окружение, как в CI, установите тестовые конфигурации (они будут использовать mock-реализацию Zookeeper и скорректируют некоторые настройки). - -```sh -cd /tests/config -sudo ./install.sh -``` - -:::note -Тесты должны: - -* быть минимальными: создавать только минимально необходимые таблицы, столбцы и минимальную необходимую сложность, -* быть быстрыми: выполняться не дольше нескольких секунд (лучше — доли секунды), -* быть корректными и детерминированными: падать тогда и только тогда, когда тестируемая функциональность не работает, -* быть изолированными/без сохранения состояния: не полагаться на окружение и время выполнения, -* быть исчерпывающими: покрывать крайние случаи, такие как нули, `null`, пустые множества, исключения (отрицательные тесты, для этого используйте синтаксис `-- { serverError xyz }` и `-- { clientError xyz }`), -* очищать таблицы в конце теста (на случай оставшихся данных), -* удостоверяться, что другие тесты не проверяют то же самое (т.е. сначала выполните grep). - ::: - -### Ограничение запусков тестов - -Тест может иметь ноль или более *тегов*, задающих ограничения, в каких контекстах тест запускается в CI. - -Для тестов `.sql` теги размещаются в первой строке в виде комментария SQL: - -```sql --- Tags: no-fasttest, no-replicated-database --- no-fasttest: <укажите_причину_для_этого_тега> --- no-replicated-database: <укажите_причину_здесь> - -SELECT 1 -``` - -Для тестов `.sh` теги указываются в комментарии на второй строке: - - -```bash -#!/usr/bin/env bash -# Tags: no-fasttest, no-replicated-database -# - no-fasttest: <укажите причину для данного тега> -# - no-replicated-database: <укажите причину для данного тега> -``` - -Список доступных тегов: - -| Tag name | Назначение | Пример использования | -| --------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------- | -| `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` | Тест не выполняется в режиме [Fast test](continuous-integration.md#fast-test) | Тест использует движок таблиц `MySQL`, который отключён в Fast test | -| `fasttest-only` | Тест выполняется только в режиме [Fast test](continuous-integration.md#fast-test) | | -| `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` | | | - -В дополнение к приведённым выше настройкам вы можете использовать флаги `USE_*` из `system.build_options` для указания использования отдельных возможностей ClickHouse. -Например, если ваш тест использует таблицу MySQL, вам следует добавить тег `use-mysql`. - -### Указание ограничений для случайных настроек - -Тест может задавать минимальные и максимальные допустимые значения для настроек, которые могут случайным образом изменяться во время выполнения теста. - -Для `.sh`‑тестов ограничения записываются в виде комментария в строке рядом с тегами или во второй строке, если теги не указаны: - - -```bash -#!/usr/bin/env bash -# Теги: no-fasttest -# Ограничения случайных настроек: max_block_size=(1000, 10000); index_granularity=(100, None) -``` - -Для `.sql`-тестов теги размещаются как SQL-комментарий в строке рядом с тестом или в первой строке: - -```sql --- Теги: no-fasttest --- Ограничения случайных настроек: max_block_size=(1000, 10000); index_granularity=(100, None) -SELECT 1 -``` - -Если вам нужно указать только одно ограничение, вы можете использовать `None` для второго. - -### Выбор имени теста - -Имя теста начинается с пятизначного префикса, за которым следует описательное имя, например `00422_hash_function_constexpr.sql`. -Чтобы выбрать префикс, найдите наибольший префикс, уже присутствующий в каталоге, и увеличьте его на единицу. - -```sh -ls tests/queries/0_stateless/[0-9]*.reference | tail -n 1 -``` - -Параллельно могут быть добавлены другие тесты с тем же числовым префиксом, но это допустимо и не приводит к каким-либо проблемам; впоследствии ничего менять не нужно. - -### Проверка ошибки, которая должна произойти - -Иногда требуется протестировать, что для некорректного запроса возникает ошибка сервера. В SQL-тестах для этого поддерживаются специальные аннотации следующего вида: - -```sql -SELECT x; -- { serverError 49 } -``` - -Этот тест проверяет, что сервер возвращает ошибку с кодом 49 о неизвестном столбце `x`. -Если ошибки нет или код ошибки другой, тест завершится неуспешно. -Если вы хотите убедиться, что ошибка возникает на стороне клиента, вместо этого используйте аннотацию `clientError`. - -Не проверяйте конкретную формулировку сообщения об ошибке — она может измениться в будущем, и тест будет без необходимости ломаться. -Проверяйте только код ошибки. -Если существующий код ошибки недостаточно точен для ваших нужд, рассмотрите возможность добавления нового. - -### Тестирование распределённого запроса - -Если вы хотите использовать распределённые запросы в функциональных тестах, вы можете воспользоваться табличной функцией `remote` с адресами `127.0.0.{1..2}`, чтобы сервер выполнял запрос к самому себе; либо вы можете использовать предопределённые тестовые кластеры в конфигурационном файле сервера, такие как `test_shard_localhost`. -Не забудьте добавить слова `shard` или `distributed` в имя теста, чтобы он запускался в CI в корректных конфигурациях, где сервер настроен на поддержку распределённых запросов. - -### Работа с временными файлами - -Иногда в shell-тесте может потребоваться на лету создать файл для работы. -Имейте в виду, что некоторые проверки в CI запускают тесты параллельно, поэтому если вы создаёте или удаляете временный файл в своём скрипте без уникального имени, это может привести к сбоям некоторых проверок CI, таких как Flaky. -Чтобы избежать этого, следует использовать переменную окружения `$CLICKHOUSE_TEST_UNIQUE_NAME`, чтобы давать временным файлам имя, уникальное для выполняющегося теста. -Таким образом вы можете быть уверены, что файл, который вы создаёте при подготовке или удаляете при очистке, используется только этим тестом, а не каким-либо другим тестом, выполняющимся параллельно. - - -## Известные ошибки {#known-bugs} - -Если нам известны ошибки, которые можно легко воспроизвести функциональными тестами, мы помещаем соответствующие функциональные тесты в директорию `tests/queries/bugs`. -После исправления ошибок эти тесты переносятся в `tests/queries/0_stateless`. - - - -## Интеграционные тесты {#integration-tests} - -Интеграционные тесты позволяют проверять работу ClickHouse в кластерной конфигурации и его взаимодействие с другими серверами, такими как MySQL, Postgres, MongoDB. -Они полезны для имитации сетевых разрывов, потерь пакетов и т. д. -Эти тесты запускаются в Docker и создают несколько контейнеров с различным программным обеспечением. - -См. `tests/integration/README.md` для получения информации о запуске этих тестов. - -Обратите внимание, что интеграция ClickHouse со сторонними драйверами не тестируется. -Также в настоящее время у нас нет интеграционных тестов для наших JDBC- и ODBC-драйверов. - - - -## Модульные тесты - -Модульные тесты полезны, когда вы хотите протестировать не 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`, который просто выполняет токенизацию stdin и выводит результат с подсветкой в stdout. -Вы можете использовать такие инструменты как примеры кода, а также для изучения и ручного тестирования. - - - -## Прочие тесты {#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. -По этим причинам кворумный тест должен быть переписан и перенесён в интеграционные тесты. - - - -## Ручное тестирование - -Когда вы разрабатываете новую функциональность, имеет смысл также протестировать её вручную. -Вы можете сделать это, выполнив следующие шаги: - -Соберите 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` в корневом каталоге исходников ClickHouse. -Затем запустите сервер командой `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.xml` (или переопределить их в файле в директории `config.d`), указать соответствующий путь к данным и запустить его. - -Исполняемый файл `clickhouse` практически не имеет зависимостей и работает на широком спектре дистрибутивов Linux. -Для быстрого чернового тестирования своих изменений на сервере вы можете просто передать на него свежесобранный исполняемый файл `clickhouse` с помощью `scp`, а затем запустить его, как показано в примерах выше. - - -## Тесты сборки {#build-tests} - -Тесты сборки позволяют проверить, что сборка не ломается на различных альтернативных конфигурациях и на некоторых сторонних системах. -Эти тесты также автоматизированы. - -Примеры: -- кросс-компиляция для Darwin x86_64 (macOS) -- кросс-компиляция для FreeBSD x86_64 -- кросс-компиляция для Linux AArch64 -- сборка на Ubuntu с библиотеками из системных пакетов (не рекомендуется) -- сборка с динамическим (shared) связыванием библиотек (не рекомендуется) - -Например, сборка с использованием системных пакетов — плохая практика, потому что мы не можем гарантировать, какая именно версия пакетов будет установлена в системе. -Но это действительно необходимо мейнтейнерам Debian. -По этой причине мы как минимум должны поддерживать этот вариант сборки. -Другой пример: динамическое связывание — распространённый источник проблем, но оно необходимо для некоторых энтузиастов. - -Хотя мы не можем запускать все тесты на всех вариантах сборки, мы хотим по крайней мере убедиться, что различные варианты сборки не сломаны. -Для этого мы используем тесты сборки. - -Мы также проверяем, что нет единиц трансляции, которые слишком долго компилируются или требуют слишком много оперативной памяти. - -Мы также проверяем, что нет слишком больших кадров стека. - - - -## Тестирование совместимости протокола {#testing-for-protocol-compatibility} - -Когда мы расширяем сетевой протокол ClickHouse, мы вручную проверяем, что старый clickhouse-client работает с новым clickhouse-server и новый clickhouse-client работает со старым clickhouse-server (просто запуская исполняемые файлы из соответствующих пакетов). - -Мы также автоматически проверяем ряд сценариев с помощью интеграционных тестов: -- могут ли данные, записанные старой версией ClickHouse, быть успешно прочитаны новой версией; -- работают ли распределённые запросы в кластере с разными версиями ClickHouse. - - - -## Помощь от компилятора {#help-from-the-compiler} - -Основная часть кода ClickHouse (расположенная в каталоге `src`) собирается с флагами `-Wall -Wextra -Werror` и с некоторыми дополнительными включёнными предупреждениями. -Однако эти опции не включены для сторонних библиотек. - -В Clang есть ещё больше полезных предупреждений — вы можете просмотреть их с помощью `-Weverything` и выбрать некоторые из них для использования по умолчанию при сборке. - -Мы всегда используем clang для сборки ClickHouse как при разработке, так и в продакшене. -Вы можете собирать ClickHouse на своей машине в отладочном режиме (чтобы экономить заряд батареи ноутбука), но обратите внимание, что компилятор способен генерировать больше предупреждений при сборке с оптимизацией `-O3` благодаря более качественному анализу потока управления и межпроцедурному анализу. -При сборке с clang в отладочном режиме используется отладочная версия `libc++`, которая позволяет отлавливать больше ошибок во время выполнения. - - - -## Санитайзеры {#sanitizers} - -:::note -Если процесс (сервер или клиент ClickHouse) падает при локальном запуске, возможно, вам нужно отключить рандомизацию расположения адресного пространства: `sudo sysctl kernel.randomize_va_space=0` -::: - -### Address sanitizer {#address-sanitizer} - -Мы запускаем функциональные, интеграционные, стрессовые и модульные тесты под ASan для каждого коммита. - -### Thread sanitizer {#thread-sanitizer} - -Мы запускаем функциональные, интеграционные, стрессовые и модульные тесты под TSan для каждого коммита. - -### Memory sanitizer {#memory-sanitizer} - -Мы запускаем функциональные, интеграционные, стрессовые и модульные тесты под MSan для каждого коммита. - -### Undefined behaviour sanitizer {#undefined-behaviour-sanitizer} - -Мы запускаем функциональные, интеграционные, стрессовые и модульные тесты под UBSan для каждого коммита. -Код некоторых сторонних библиотек не проверяется на неопределённое поведение (UB). - -### Valgrind (memcheck) {#valgrind-memcheck} - -Раньше мы запускали функциональные тесты под Valgrind каждую ночь, но сейчас больше этого не делаем. -Это занимает несколько часов. -В настоящее время есть одно известное ложноположительное срабатывание в библиотеке `re2`, см. [эту статью](https://research.swtch.com/sparse). - - - -## Фаззинг {#fuzzing} - -Фаззинг ClickHouse реализован как с использованием [libFuzzer](https://llvm.org/docs/LibFuzzer.html), так и с помощью случайных SQL‑запросов. -Все фазз‑тесты должны выполняться с санитайзерами (Address и Undefined). - -LibFuzzer используется для изолированного фазз‑тестирования библиотечного кода. -Фаззеры реализованы как часть тестового кода и имеют суффикс имени "_fuzzer". -Пример фаззера можно найти в `src/Parsers/fuzzers/lexer_fuzzer.cpp`. -Специальные для LibFuzzer конфигурации, словари и корпус хранятся в `tests/fuzz`. -Мы рекомендуем писать фазз‑тесты для каждой функции, обрабатывающей пользовательский ввод. - -Фаззеры по умолчанию не собираются. -Для сборки фаззеров должны быть установлены оба параметра: `-DENABLE_FUZZING=1` и `-DENABLE_TESTS=1`. -Мы рекомендуем отключить Jemalloc при сборке фаззеров. -Конфигурацию, используемую для интеграции фаззинга ClickHouse с -Google OSS-Fuzz, можно найти в `docker/fuzz`. - -Мы также используем простой фазз‑тест для генерации случайных SQL‑запросов и проверки, что сервер не падает при их выполнении. -Вы можете найти его в `00746_sql_fuzzy.pl`. -Этот тест следует запускать непрерывно (на ночь и дольше). - -Мы также используем продвинутый AST‑ориентированный фаззер запросов, который способен находить огромное количество граничных случаев. -Он выполняет случайные перестановки и подстановки в AST запросов. -Он запоминает узлы AST из предыдущих тестов, чтобы использовать их для фаззинга последующих тестов, обрабатывая их в случайном порядке. -Вы можете узнать больше об этом фаззере в [этой статье блога](https://clickhouse.com/blog/fuzzing-click-house). - - - -## Стресс-тест {#stress-test} - -Стресс-тесты — это ещё один вид фаззинга. -Он выполняет все функциональные тесты параллельно в случайном порядке на одном сервере. -Результаты тестов не проверяются. - -Проверяется, что: -- сервер не падает, не срабатывают отладочные ловушки или ловушки санитайзеров; -- нет взаимоблокировок; -- структура базы данных остаётся консистентной; -- сервер может успешно остановиться после теста и снова запуститься без исключений. - -Существует пять вариантов (Debug, ASan, TSan, MSan, UBSan). - - - -## Thread fuzzer {#thread-fuzzer} - -Thread Fuzzer (пожалуйста, не путайте с Thread Sanitizer) — это ещё один вид фаззинга, который позволяет случайным образом менять порядок выполнения потоков. -Он помогает обнаружить ещё больше краевых случаев. - - - -## Аудит безопасности {#security-audit} - -Наша команда по безопасности провела первичный обзор возможностей 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` для статического анализа shell-скриптов. - - - -## Повышение защищённости {#hardening} - -В отладочной сборке используется собственный аллокатор, выполняющий ASLR пользовательских выделений памяти. - -Мы также вручную защищаем области памяти, которые после выделения должны быть только для чтения. - -В отладочной сборке мы дополнительно используем модифицированную libc, которая гарантирует, что не вызываются «вредные» (устаревшие, небезопасные, не потокобезопасные) функции. - -Отладочные проверки (assertions) используются повсеместно. - -В отладочной сборке, если выбрасывается исключение с кодом «logical error» (что подразумевает наличие ошибки в коде), программа принудительно завершается. -Это позволяет использовать исключения в релизной сборке, но трактовать их как assertion в отладочной сборке. - -Отладочная версия jemalloc используется для отладочных сборок. -Отладочная версия libc++ используется для отладочных сборок. - - - -## Проверки целостности во время работы {#runtime-integrity-checks} - -Данные, хранящиеся на диске, защищены с помощью контрольных сумм. -Данные в таблицах MergeTree одновременно* проверяются тремя способами (для сжатых блоков данных, для несжатых блоков данных и общей контрольной суммой по всем блокам). -Данные, передаваемые по сети между клиентом и сервером или между серверами, также защищены контрольными суммами. -Репликация обеспечивает побитовое совпадение данных на репликах. - -Это необходимо для защиты от неисправного оборудования (битовой коррозии (bit rot) на носителях, переворотов битов в RAM на сервере, переворотов битов в RAM сетевого контроллера, переворотов битов в RAM сетевого коммутатора, переворотов битов в RAM клиента, переворотов битов в линии связи). -Обратите внимание, что перевороты битов — обычное явление и с высокой вероятностью будут происходить даже при использовании ECC RAM и при наличии контрольных сумм TCP (если вы эксплуатируете тысячи серверов, обрабатывающих петабайты данных каждый день). -[См. видео (на русском)](https://www.youtube.com/watch?v=ooBAQIe0KlQ). - -ClickHouse предоставляет средства диагностики, которые помогут инженерам по эксплуатации найти неисправное оборудование. - -\* и это не замедляет работу. - - - -## Стиль кода {#code-style} - -Правила стиля кода описаны [здесь](style.md). - -Чтобы проверить некоторые распространённые нарушения стиля, вы можете использовать скрипт `utils/check-style`. - -Чтобы принудительно привести ваш код к правильному стилю, вы можете использовать `clang-format`. -Файл `.clang-format` находится в корне исходников. -Он в основном соответствует нашему фактическому стилю кода. -Но не рекомендуется применять `clang-format` к уже существующим файлам, так как это может ухудшить форматирование. -Вы можете использовать инструмент `clang-format-diff`, который можно найти в репозитории исходного кода clang. - -В качестве альтернативы вы можете попробовать инструмент `uncrustify` для переформатирования кода. -Конфигурация находится в `uncrustify.cfg` в корне исходников. -Он менее тщательно протестирован, чем `clang-format`. - -В `CLion` есть собственный форматтер кода, который необходимо настроить под наш стиль кода. - -Мы также используем `codespell` для поиска опечаток в коде. -Эта проверка также автоматизирована. - - - -## Покрытие тестами {#test-coverage} - -Мы также отслеживаем покрытие тестами, но только для функциональных тестов clickhouse-server. -Измерение покрытия выполняется ежедневно. - - - -## Тесты для тестов {#tests-for-tests} - -Выполняется автоматическая проверка на нестабильные (flaky) тесты. -Она запускает все новые тесты 100 раз (для функциональных тестов) или 10 раз (для интеграционных тестов). -Если хотя бы один раз тест завершился с ошибкой, он считается нестабильным. - - - -## Автоматизация тестирования {#test-automation} - -Мы запускаем тесты с помощью [GitHub Actions](https://github.com/features/actions). - -Задания сборки и тесты выполняются в среде Sandbox на каждый коммит. -Полученные пакеты и результаты тестов публикуются в GitHub и их можно скачать по прямым ссылкам. -Артефакты хранятся в течение нескольких месяцев. -Когда вы отправляете pull request на GitHub, мы помечаем его как «can be tested», и наша CI‑система собирает для вас пакеты ClickHouse (release, debug, с address sanitizer и т. д.). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/dictionary/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/dictionary/index.md index b9ca5aa5de7..ebaf4f79298 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/dictionary/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/dictionary/index.md @@ -2,7 +2,7 @@ slug: /dictionary title: 'Словарь' keywords: ['словарь', 'словари'] -description: 'Словарь предоставляет представление данных в формате ключ-значение для быстрого поиска.' +description: 'Словарь представляет данные в формате ключ-значение для быстрого поиска.' doc_type: 'reference' --- @@ -11,36 +11,35 @@ import dictionaryLeftAnyJoin from '@site/static/images/dictionary/dictionary-lef import Image from '@theme/IdealImage'; -# Словарь +# Словарь {#dictionary} -Словарь в ClickHouse предоставляет представление данных в оперативной памяти в формате [key-value](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) из различных [внутренних и внешних источников](/sql-reference/dictionaries#dictionary-sources), оптимизированное для запросов с крайне низкой задержкой поиска. +Словарь в ClickHouse предоставляет хранящееся в памяти представление данных в формате [key-value](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) из различных [внутренних и внешних источников](/sql-reference/dictionaries#dictionary-sources), оптимизированное для операций поиска с крайне низкой задержкой. Словари полезны для: -- Повышения производительности запросов, особенно при использовании в операциях `JOIN` -- Обогащения данных на лету в процессе ингестии, не замедляя её -Сценарии использования словарей в ClickHouse +- Повышения производительности запросов, особенно при использовании с операциями `JOIN` +- Обогащения поступающих данных «на лету» без замедления процесса ингестии +Сценарии использования словаря в ClickHouse +## Ускорение соединений с использованием словаря {#speeding-up-joins-using-a-dictionary} -## Ускорение соединений с помощью Dictionary +Словари можно использовать для ускорения определённого типа операции `JOIN`: типа [`LEFT ANY`](/sql-reference/statements/select/join#supported-types-of-join), когда ключ соединения совпадает с ключевым атрибутом подлежащего хранилища ключ-значение. -Dictionary можно использовать для ускорения определённого типа `JOIN`: [`LEFT ANY`](/sql-reference/statements/select/join#supported-types-of-join), когда ключ соединения должен совпадать с ключевым атрибутом базового key-value-хранилища. +Использование словаря с LEFT ANY JOIN -Использование Dictionary с LEFT ANY JOIN +В таком случае ClickHouse может использовать словарь для выполнения [Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join). Это самый быстрый алгоритм соединения в ClickHouse, применимый, когда базовый [движок таблицы](/engines/table-engines) для таблицы справа поддерживает запросы к хранилищу ключ-значение с низкой задержкой. В ClickHouse есть три движка таблиц, которые это поддерживают: [Join](/engines/table-engines/special/join) (по сути, предварительно вычисленная хеш-таблица), [EmbeddedRocksDB](/engines/table-engines/integrations/embedded-rocksdb) и [Dictionary](/engines/table-engines/special/dictionary). Мы опишем подход, основанный на словаре, но механика одинакова для всех трёх движков. -В таком случае ClickHouse может использовать Dictionary для выполнения [Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join). Это самый быстрый алгоритм соединения в ClickHouse, и он применим, когда базовый [движок таблицы](/engines/table-engines) для таблицы правой части поддерживает key-value-запросы с низкой задержкой. В ClickHouse есть три движка таблиц, обеспечивающие это: [Join](/engines/table-engines/special/join) (по сути, предварительно вычисленная хеш-таблица), [EmbeddedRocksDB](/engines/table-engines/integrations/embedded-rocksdb) и [Dictionary](/engines/table-engines/special/dictionary). Мы опишем подход на основе Dictionary, но механика одинакова для всех трёх движков. +Алгоритм Direct Join требует, чтобы правая таблица опиралась на словарь, благодаря чему данные для соединения из этой таблицы уже находятся в памяти в виде структуры данных хранилища ключ-значение с низкой задержкой. -Алгоритм Direct Join требует, чтобы правая таблица была реализована на основе Dictionary, так, чтобы данные, которые нужно присоединять из этой таблицы, уже находились в памяти в виде key-value-структуры данных с низкой задержкой. +### Пример {#example} -### Пример - -Используя набор данных Stack Overflow, ответим на вопрос: +Используя [датасет Stack Overflow](/getting-started/example-datasets/stackoverflow), ответим на вопрос: *Какой пост, касающийся SQL, является самым спорным на Hacker News?* -Мы будем считать пост спорным, если у него схожее количество голосов «за» и «против». Мы вычислим эту абсолютную разницу, где значение, ближе к нулю, означает большую спорность. Будем считать, что у поста должно быть как минимум 10 голосов «за» и 10 «против» — посты, за которые почти не голосуют, не слишком спорные. +Мы будем считать пост спорным, если у него схожее количество голосов «за» и «против». Мы вычислим абсолютную разницу между ними: чем ближе значение к 0, тем сильнее спорность. Также будем считать, что у поста должно быть как минимум 10 голосов «за» и 10 голосов «против» — посты, за которые почти не голосуют, вряд ли можно считать спорными. -При нормализованных данных этот запрос в текущем виде требует `JOIN` с использованием таблиц `posts` и `votes`: +При нормализованных данных этот запрос требует `JOIN` с использованием таблиц `posts` и `votes`: ```sql WITH PostIds AS @@ -79,38 +78,38 @@ UpVotes: 13 DownVotes: 13 Controversial_ratio: 0 -1 строка в наборе. Прошло: 1.283 сек. Обработано 418.44 млн строк, 7.23 ГБ (326.07 млн строк/с., 5.63 ГБ/с.) -Пиковое использование памяти: 3.18 ГиБ. +Обработана 1 строка. Затрачено: 1,283 сек. Обработано 418,44 млн строк, 7,23 ГБ (326,07 млн строк/с., 5,63 ГБ/с.) +Пиковое использование памяти: 3,18 ГиБ. ``` -> **Используйте меньшие наборы данных в правой части `JOIN`**: Этот запрос может показаться избыточно многословным, так как фильтрация по `PostId` выполняется и во внешнем, и во вложенном запросах. Это оптимизация производительности, которая обеспечивает быстрое время отклика запроса. Для оптимальной производительности всегда следите за тем, чтобы правая сторона `JOIN` была меньшим набором и по возможности как можно меньшего размера. Советы по оптимизации производительности `JOIN` и обзору доступных алгоритмов приведены в [этой серии статей в блоге](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1). +> **Используйте меньшие наборы данных в правой части `JOIN`**: Этот запрос может показаться более многословным, чем требуется, поскольку фильтрация по `PostId` выполняется как во внешнем, так и во вложенном запросе. Это оптимизация производительности, которая обеспечивает быстрое время ответа. Для оптимальной производительности всегда следите за тем, чтобы правая сторона `JOIN` была меньшим набором данных и оставалась как можно меньше. Советы по оптимизации производительности JOIN и обзору доступных алгоритмов приведены в [этой серии статей в блоге](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1). -Хотя этот запрос работает быстро, он требует от нас аккуратного использования `JOIN`, чтобы достичь хорошей производительности. В идеале мы бы просто отфильтровали посты по тем, которые содержат «SQL», прежде чем анализировать значения `UpVote` и `DownVote` для этого подмножества блогов, чтобы вычислить нашу метрику. +Хотя этот запрос и работает быстро, он требует от нас аккуратного использования `JOIN`, чтобы добиться хорошей производительности. В идеале мы бы просто отфильтровали записи до тех, которые содержат «SQL», прежде чем смотреть на значения `UpVote` и `DownVote` для подмножества блогов, чтобы вычислить нашу метрику. -#### Применение словаря -Чтобы продемонстрировать эти концепции, мы используем словарь для наших данных о голосах. Поскольку словари обычно хранятся в памяти ([ssd_cache](/sql-reference/dictionaries#ssd_cache) — исключение), пользователям следует учитывать размер данных. Проверим размер нашей таблицы `votes`: +#### Применение словаря {#applying-a-dictionary} +Чтобы продемонстрировать эти концепции, мы используем словарь для наших данных о голосовании. Поскольку словари обычно хранятся в памяти ([ssd_cache](/sql-reference/dictionaries#ssd_cache) — исключение), пользователям следует учитывать объём данных. Проверим размер нашей таблицы `votes`: ```sql SELECT table, - formatReadableSize(sum(data_compressed_bytes)) AS размер_сжатых_данных, - formatReadableSize(sum(data_uncompressed_bytes)) AS размер_несжатых_данных, - round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS коэффициент + 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───────────┬─размер_сжатых_данных─┬─размер_несжатых_данных─┬─коэффициент─┐ -│ votes │ 1.25 GiB │ 3.79 GiB │ 3.04 │ -└─────────────────┴──────────────────────┴────────────────────────┴─────────────┘ +┌─table───────────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ votes │ 1.25 GiB │ 3.79 GiB │ 3.04 │ +└─────────────────┴─────────────────┴───────────────────┴───────┘ ``` -Данные будут храниться в нашем словаре без сжатия, поэтому нам требуется как минимум 4 ГБ памяти, если бы мы сохраняли все столбцы (мы этого делать не будем) в словаре. Словарь будет реплицирован по нашему кластеру, поэтому этот объём памяти нужно зарезервировать *на каждый узел*. +Данные будут храниться в нашем словаре без сжатия, поэтому нам потребуется как минимум 4 ГБ памяти, если бы мы собирались хранить все столбцы (мы не будем) в словаре. Словарь будет реплицирован по нашему кластеру, поэтому этот объём памяти должен быть зарезервирован *на каждый узел*. -> В приведённом ниже примере данные для нашего словаря берутся из таблицы ClickHouse. Хотя это и является наиболее распространённым источником словарей, поддерживается [ряд источников](/sql-reference/dictionaries#dictionary-sources), включая файлы, HTTP и базы данных, в том числе [Postgres](/sql-reference/dictionaries#postgresql). Как мы покажем, словари могут автоматически обновляться, что является идеальным способом обеспечить доступность небольших наборов данных, подверженных частым изменениям, для прямых JOIN-ов. +> В примере ниже данные для нашего словаря поступают из таблицы ClickHouse. Хотя это и является наиболее распространённым источником словарей, поддерживается [ряд источников](/sql-reference/dictionaries#dictionary-sources), включая файлы, HTTP и базы данных, в том числе [Postgres](/sql-reference/dictionaries#postgresql). Как мы покажем, словари могут автоматически обновляться, что делает их идеальным способом обеспечить доступность небольших наборов данных, подверженных частым изменениям, для прямых JOIN. -Для нашего словаря необходим первичный ключ, по которому будут выполняться поиски. Концептуально он идентичен первичному ключу в транзакционной базе данных и должен быть уникальным. Наш запрос выше требует поиска по ключу соединения — `PostId`. Словарь, в свою очередь, должен быть заполнен суммарным количеством голосов «за» и «против» для каждого `PostId` из нашей таблицы `votes`. Ниже приведён запрос для получения данных для этого словаря: +Для нашего словаря требуется первичный ключ, по которому будут выполняться обращения. Концептуально это идентично первичному ключу транзакционной базы данных и должно быть уникальным. Наш запрос выше требует обращения по ключу соединения — `PostId`. Словарь, в свою очередь, должен быть заполнен суммарными значениями голосов «за» и «против» по `PostId` из нашей таблицы `votes`. Ниже приведён запрос для получения данных этого словаря: ```sql SELECT PostId, @@ -120,7 +119,7 @@ FROM votes GROUP BY PostId ``` -Чтобы создать наш словарь, потребуется следующий DDL — обратите внимание на использование нашего запроса, приведённого выше: +Для создания нашего словаря используем следующий DDL — обратите внимание на использование приведённого выше запроса: ```sql CREATE DICTIONARY votes_dict @@ -137,9 +136,9 @@ LAYOUT(HASHED()) 0 строк в наборе. Затрачено: 36.063 сек. ``` -> В самоуправляемой установке OSS приведённую выше команду необходимо выполнить на всех узлах. В ClickHouse Cloud словарь будет автоматически реплицирован на все узлы. Эту операцию выполняли на узле ClickHouse Cloud с 64 ГБ ОЗУ, загрузка заняла 36 с. +> В самоуправляемой OSS-установке указанную выше команду нужно выполнить на всех узлах. В ClickHouse Cloud словарь будет автоматически реплицирован на все узлы. Эта команда была выполнена на узле ClickHouse Cloud с 64 ГБ ОЗУ, загрузка заняла 36 секунд. -Чтобы проверить объём памяти, потребляемой нашим словарём: +Чтобы подтвердить объём памяти, потребляемый нашим словарём: ```sql SELECT formatReadableSize(bytes_allocated) AS size @@ -151,7 +150,8 @@ WHERE name = 'votes_dict' └──────────┘ ``` -Теперь получение голосов «за» и «против» для конкретного `PostId` сводится к использованию простой функции `dictGet`. Ниже показано, как получить значения для поста `11227902`: +Получить количество голосов «за» и «против» для конкретного `PostId` теперь можно с помощью простой функции `dictGet`. Ниже мы получаем значения для поста `11227902`: + ```sql SELECT dictGet('votes_dict', ('UpVotes', 'DownVotes'), '11227902') AS votes @@ -181,12 +181,12 @@ LIMIT 3 Пиковое использование памяти: 552.26 МиБ. ``` -Мало того, что этот запрос значительно проще, он ещё и более чем вдвое быстрее! Его можно дополнительно оптимизировать, загружая в словарь только посты с более чем 10 голосами «за» и «против» и сохраняя лишь заранее вычисленное значение спорности. +Этот запрос не только гораздо проще, но и более чем в два раза быстрее! Его можно дополнительно оптимизировать, загружая в словарь только посты с более чем 10 голосами «за» и «против» и сохраняя только предварительно вычисленное значение степени спорности. -## Обогащение данных при выполнении запроса +## Обогащение при выполнении запроса {#query-time-enrichment} -Словари можно использовать для поиска значений в момент выполнения запроса. Эти значения могут возвращаться в результатах запроса или использоваться в агрегациях. Предположим, мы создаём словарь для сопоставления идентификаторов пользователей с их местоположением: +Словари можно использовать для поиска значений при выполнении запроса. Эти значения могут возвращаться в результатах или использоваться в агрегациях. Предположим, мы создаём словарь для отображения идентификаторов пользователей на их местоположения: ```sql CREATE DICTIONARY users_dict @@ -200,7 +200,7 @@ LIFETIME(MIN 600 MAX 900) LAYOUT(HASHED()) ``` -Мы можем использовать этот словарь для обогащения результатов: +Мы можем использовать этот словарь для обогащения результатов по постам: ```sql SELECT @@ -213,18 +213,18 @@ LIMIT 5 FORMAT PrettyCompactMonoBlock ┌───────Id─┬─Title─────────────────────────────────────────────────────────┬─Location──────────────┐ -│ 52296928 │ Сравнение двух строк в ClickHouse │ Spain │ -│ 52345137 │ Как использовать файл для миграции данных из MySQL в ClickHouse? │ 中国江苏省Nanjing Shi │ -│ 61452077 │ Как изменить PARTITION в ClickHouse │ Guangzhou, 广东省中国 │ -│ 55608325 │ Выбор последней записи в ClickHouse без max() для всей таблицы │ Moscow, Russia │ -│ 55758594 │ Создание временной таблицы в ClickHouse │ Perm', Russia │ +│ 52296928 │ Comparison 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 строк. Затрачено: 0,033 сек. Обработано 4,25 млн строк, 82,84 МБ (130,62 млн строк/с., 2,55 ГБ/с.) Пиковое использование памяти: 249,32 МиБ. ``` -Аналогично приведённому выше примеру join, мы можем использовать тот же словарь, чтобы эффективно определить, откуда происходит большинство постов: +Аналогично нашему примеру выше с JOIN, мы можем использовать тот же словарь, чтобы эффективно определить, откуда происходит большинство постов: ```sql SELECT @@ -249,13 +249,13 @@ LIMIT 5 ``` -## Обогащение во время индексации +## Обогащение на этапе вставки (index time) {#index-time-enrichment} -В приведённом выше примере мы использовали словарь на этапе выполнения запроса, чтобы убрать `JOIN`. Словари также можно использовать для обогащения строк на этапе вставки. Это обычно уместно, если значение для обогащения не меняется и существует во внешнем источнике, который можно использовать для заполнения словаря. В таком случае обогащение строки на этапе вставки позволяет избежать обращения к словарю во время выполнения запроса. +В приведённом выше примере мы использовали словарь на этапе выполнения запроса, чтобы убрать операцию JOIN. Словари также можно использовать для обогащения строк на этапе вставки. Это обычно целесообразно, если значение для обогащения не меняется и существует во внешнем источнике, который можно использовать для заполнения словаря. В этом случае обогащение строки на этапе вставки позволяет избежать поиска в словаре во время выполнения запроса. -Предположим, что `Location` пользователя в Stack Overflow никогда не меняется (в реальности это не так), а именно столбец `Location` таблицы `users`. Допустим, мы хотим выполнить аналитический запрос к таблице `posts` по местоположению. В этой таблице есть столбец `UserId`. +Предположим, что `Location` пользователя в Stack Overflow никогда не меняется (в реальности это не так), а именно столбец `Location` таблицы `users`. Допустим, мы хотим выполнить аналитический запрос к таблице `posts` по местоположению. В ней содержится столбец `UserId`. -Словарь предоставляет соответствие между идентификатором пользователя и его местоположением, используя таблицу `users`: +Словарь задаёт соответствие между идентификатором пользователя и его местоположением, опираясь на таблицу `users`: ```sql CREATE DICTIONARY users_dict @@ -269,9 +269,9 @@ LIFETIME(MIN 600 MAX 900) LAYOUT(HASHED()) ``` -> Мы исключаем пользователей с `Id < 0`, что позволяет использовать тип словаря `Hashed`. Пользователи с `Id < 0` — это системные пользователи. +> Мы исключаем пользователей с `Id < 0`, что позволяет нам использовать тип словаря `Hashed`. Пользователи с `Id < 0` являются системными пользователями. -Чтобы задействовать этот словарь на этапе вставки данных в таблицу posts, необходимо изменить схему: +Чтобы использовать этот словарь при вставке данных в таблицу posts, нам нужно изменить схему: ```sql CREATE TABLE posts_with_location @@ -285,11 +285,11 @@ ENGINE = MergeTree ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) ``` -В приведённом выше примере `Location` объявлен как столбец `MATERIALIZED`. Это означает, что значение может быть передано в запросе `INSERT` и всегда будет вычислено. +В приведённом выше примере `Location` объявлен как столбец типа `MATERIALIZED`. Это означает, что значение может быть указано в запросе `INSERT` и при этом всегда будет вычислено. -> ClickHouse также поддерживает [столбцы с типом `DEFAULT`](/sql-reference/statements/create/table#default_values) (когда значение может быть явно указано при вставке или вычислено, если не задано). +> ClickHouse также поддерживает [`DEFAULT` столбцы](/sql-reference/statements/create/table#default_values) (когда значение может быть вставлено или вычислено, если оно не указано). -Чтобы заполнить таблицу, мы можем использовать обычный `INSERT INTO SELECT` из S3: +Чтобы заполнить таблицу, мы можем использовать привычный `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') @@ -297,7 +297,7 @@ INSERT INTO posts_with_location SELECT Id, PostTypeId::UInt8, AcceptedAnswerId, 0 строк в наборе. Затрачено: 36.830 сек. Обработано 238.98 млн строк, 2.64 ГБ (6.49 млн строк/с., 71.79 МБ/с.) ``` -Теперь мы можем определить название местоположения, откуда поступает большинство сообщений: +Теперь мы можем узнать название места, из которого поступает большинство записей: ```sql SELECT Location, count() AS c @@ -314,29 +314,29 @@ LIMIT 4 │ London, United Kingdom │ 538738 │ └────────────────────────┴────────┘ -Получено 4 строки. Время выполнения: 0.142 сек. Обработано 59.82 млн строк, 1.08 ГБ (420.73 млн строк/с., 7.60 ГБ/с.) -Пиковое потребление памяти: 666.82 МиБ. +Получено 4 строки. Прошло: 0.142 сек. Обработано 59.82 млн строк, 1.08 ГБ (420.73 млн строк/сек., 7.60 ГБ/сек.) +Пиковое использование памяти: 666.82 МиБ. ``` -## Расширенные темы по словарям {#advanced-dictionary-topics} +## Расширенные темы о словарях {#advanced-dictionary-topics} ### Выбор `LAYOUT` словаря {#choosing-the-dictionary-layout} -Секция `LAYOUT` управляет внутренней структурой данных словаря. Существует несколько вариантов, которые описаны [здесь](/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory). Некоторые рекомендации по выбору подходящего варианта структуры можно найти [здесь](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout). +Клауза `LAYOUT` управляет внутренней структурой данных словаря. Существует несколько вариантов, описанных [здесь](/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory). Некоторые рекомендации по выбору подходящего `LAYOUT` можно найти [здесь](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout). ### Обновление словарей {#refreshing-dictionaries} -Мы указали для словаря `LIFETIME` со значением `MIN 600 MAX 900`. LIFETIME — это интервал обновления словаря; в данном случае значения приводят к периодической перезагрузке через случайный интервал между 600 и 900 с. Этот случайный интервал необходим для распределения нагрузки на источник словаря при обновлении на большом количестве серверов. Во время обновления старая версия словаря по‑прежнему может запрашиваться; только начальная загрузка блокирует запросы. Обратите внимание, что установка `(LIFETIME(0))` предотвращает обновление словарей. -Словари можно принудительно перезагрузить с помощью команды `SYSTEM RELOAD DICTIONARY`. +Мы указали для словаря `LIFETIME` со значением `MIN 600 MAX 900`. LIFETIME — это интервал обновления словаря; в данном случае значения приводят к периодической перезагрузке через случайный интервал между 600 и 900 секундами. Такой случайный интервал необходим для распределения нагрузки на источник словаря при обновлении на большом числе серверов. Во время обновления старая версия словаря по-прежнему может использоваться в запросах, при этом только начальная загрузка блокирует запросы. Обратите внимание, что задание `(LIFETIME(0))` предотвращает обновление словарей. +Принудительную перезагрузку словарей можно выполнить с помощью команды `SYSTEM RELOAD DICTIONARY`. -Для источников баз данных, таких как ClickHouse и Postgres, можно настроить запрос, который будет обновлять словари только в том случае, если они действительно изменились (это определяется ответом запроса), а не через фиксированный периодический интервал. Дополнительные сведения можно найти [здесь](/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime). +Для источников данных, таких как ClickHouse и Postgres, вы можете настроить запрос, который будет обновлять словари только в том случае, если они действительно изменились (это определяется ответом на запрос), а не с периодическим интервалом. Дополнительные подробности можно найти [здесь](/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime). ### Другие типы словарей {#other-dictionary-types} -ClickHouse также поддерживает [иерархические словари](/sql-reference/dictionaries#hierarchical-dictionaries), [полигональные словари](/sql-reference/dictionaries#polygon-dictionaries) и словари на основе [регулярных выражений](/sql-reference/dictionaries#regexp-tree-dictionary). +ClickHouse также поддерживает [иерархические](/sql-reference/dictionaries#hierarchical-dictionaries), [многоугольные](/sql-reference/dictionaries#polygon-dictionaries) и [словарі на основе регулярных выражений](/sql-reference/dictionaries#regexp-tree-dictionary) словари. -### Дополнительные материалы {#more-reading} +### Дополнительные материалы для чтения {#more-reading} - [Использование словарей для ускорения запросов](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) -- [Расширенная конфигурация словарей](/sql-reference/dictionaries) +- [Расширенная конфигурация словарей](/sql-reference/dictionaries) \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md deleted file mode 100644 index 42c51c80d44..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -description: 'Движок `Atomic` поддерживает неблокирующее выполнение запросов `DROP TABLE` и `RENAME TABLE`, а также атомарные операции `EXCHANGE TABLES`. Движок базы данных `Atomic` используется по умолчанию.' -sidebar_label: 'Atomic' -sidebar_position: 10 -slug: /engines/database-engines/atomic -title: 'Atomic' -doc_type: 'reference' ---- - - - -# Atomic - -Движок `Atomic` поддерживает неблокирующие запросы [`DROP TABLE`](#drop-detach-table) и [`RENAME TABLE`](#rename-table), а также атомарные запросы [`EXCHANGE TABLES`](#exchange-tables). Движок базы данных `Atomic` по умолчанию используется в open-source версии ClickHouse. - -:::note -В ClickHouse Cloud по умолчанию используется [движок базы данных `Shared`](/cloud/reference/shared-catalog#shared-database-engine), который также поддерживает вышеупомянутые операции. -::: - - - -## Создание базы данных - -```sql -CREATE DATABASE test [ENGINE = Atomic] [SETTINGS disk=...]; -``` - - -## Особенности и рекомендации - -### UUID таблицы - -Каждая таблица в базе данных `Atomic` имеет постоянный идентификатор [UUID](../../sql-reference/data-types/uuid.md) и хранит свои данные в следующем каталоге: - -```text -/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_table_uuid_in_table_create_query_if_not_nil](../../operations/settings/settings.md#show_table_uuid_in_table_create_query_if_not_nil), чтобы отображать UUID в запросе `SHOW CREATE`. -::: - -### RENAME TABLE - -Запросы [`RENAME`](../../sql-reference/statements/rename.md) не изменяют UUID и не перемещают данные таблицы. Эти запросы выполняются сразу и не ждут завершения других запросов, использующих таблицу. - -### 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`](../../sql-reference/statements/exchange.md) атомарно меняет местами таблицы или словари. Например, вместо этой неатомарной операции: - -```sql title="Non-atomic" -RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table; -``` - -можно использовать атомарный вариант: - -```sql title="Atomic" -EXCHANGE TABLES новая_таблица AND старая_таблица; -``` - -### ReplicatedMergeTree в базе данных Atomic - -Для таблиц [`ReplicatedMergeTree`](/engines/table-engines/mergetree-family/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 автоматически генерируются уникальные пути. - -### Диск для метаданных - -Если в `SETTINGS` указан `disk`, этот диск используется для хранения файлов метаданных таблицы. -Например: - -```sql -CREATE TABLE db (n UInt64) ENGINE = Atomic SETTINGS disk=disk(type='local', path='/var/lib/clickhouse-disks/db_disk'); -``` - -Если не указано, по умолчанию используется диск, определённый в `database_disk.disk`. - - -## См. также {#see-also} - -- системная таблица [system.databases](../../operations/system-tables/databases.md) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md deleted file mode 100644 index fe431c7cba0..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -description: 'Позволяет мгновенно подключать таблицы и базы данных из резервных копий в режиме только чтения.' -sidebar_label: 'Backup' -sidebar_position: 60 -slug: /engines/database-engines/backup -title: 'Backup' -doc_type: 'reference' ---- - - - -# Backup - -База данных Backup позволяет мгновенно подключить таблицу или базу данных из [резервных копий](../../operations/backup) в режиме только для чтения. - -База данных Backup работает как с инкрементными, так и с неинкрементными резервными копиями. - - - -## Создание базы данных - -```sql -CREATE DATABASE backup_database -ENGINE = Backup('database_name_inside_backup', 'backup_destination') -``` - -Назначением резервной копии может быть любой допустимый [пункт назначения](../../operations/backup#configure-a-backup-destination), например `Disk`, `S3`, `File`. - -Если в качестве пункта назначения резервной копии используется `Disk`, запрос на создание базы данных из резервной копии выглядит следующим образом: - -```sql -CREATE DATABASE backup_database -ENGINE = Backup('database_name_inside_backup', Disk('disk_name', 'backup_name')) -``` - -**Параметры движка** - -* `database_name_inside_backup` — Имя базы данных внутри резервной копии. -* `backup_destination` — Место размещения резервной копии. - - -## Пример использования - -Рассмотрим пример с местом назначения резервных копий типа `Disk`. Сначала настроим диск для резервных копий в `storage.xml`: - -```xml - - - - local - /home/ubuntu/ClickHouseWorkDir/backups/ - - - - - backups - /home/ubuntu/ClickHouseWorkDir/backups/ - -``` - -Пример использования. Давайте создадим тестовую базу данных и таблицы, вставим немного данных, а затем создадим резервную копию: - -```sql -CREATE DATABASE test_database; - -CREATE TABLE test_database.test_table_1 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_1 VALUES (0, 'test_database.test_table_1'); - -CREATE TABLE test_database.test_table_2 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_2 VALUES (0, 'test_database.test_table_2'); - -CREATE TABLE test_database.test_table_3 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_3 VALUES (0, 'test_database.test_table_3'); - -BACKUP DATABASE test_database TO Disk('backups', 'test_database_backup'); -``` - -Теперь, когда у нас есть резервная копия `test_database_backup`, создадим резервную копию базы данных: - -```sql -CREATE DATABASE test_database_backup ENGINE = Backup('test_database', Disk('backups', 'test_database_backup')); -``` - -Теперь мы можем выполнять запросы к любым таблицам в базе данных: - -```sql -SELECT id, value FROM test_database_backup.test_table_1; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_1 │ -└────┴────────────────────────────┘ - -SELECT id, value FROM test_database_backup.test_table_2; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_2 │ -└────┴────────────────────────────┘ - -SELECT id, value FROM test_database_backup.test_table_3; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_3 │ -└────┴────────────────────────────┘ -``` - -Также можно работать с этой резервной копией базы данных как с обычной базой. Например, выполнять в ней запросы к таблицам: - -```sql -SELECT database, name FROM system.tables WHERE database = 'test_database_backup': - -┌─database─────────────┬─name─────────┐ -│ test_database_backup │ test_table_1 │ -│ test_database_backup │ test_table_2 │ -│ test_database_backup │ test_table_3 │ -└──────────────────────┴──────────────┘ -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md deleted file mode 100644 index 437d1c815d9..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -description: 'Движок базы данных DataLakeCatalog позволяет подключать ClickHouse к внешним каталогам данных и выполнять запросы к данным в открытых форматах таблиц' -sidebar_label: 'DataLakeCatalog' -slug: /engines/database-engines/datalakecatalog -title: 'DataLakeCatalog' -doc_type: 'reference' ---- - - - -# DataLakeCatalog - -Движок базы данных `DataLakeCatalog` позволяет подключить ClickHouse к внешним -каталогам данных и выполнять запросы к данным в открытых табличных форматах без необходимости дублирования данных. -Это превращает ClickHouse в мощный движок запросов, который бесшовно работает -с инфраструктурой вашего существующего дата-лейка. - - - -## Поддерживаемые каталоги {#supported-catalogs} - -Движок `DataLakeCatalog` поддерживает следующие каталоги данных: - -- **AWS Glue Catalog** — для таблиц Iceberg в средах AWS -- **Databricks Unity Catalog** — для таблиц Delta Lake и Iceberg -- **Hive Metastore** — традиционный каталог экосистемы Hadoop -- **REST Catalogs** — любой каталог, поддерживающий спецификацию REST для Iceberg - - - -## Создание базы данных - -Чтобы использовать движок `DataLakeCatalog`, необходимо включить приведённые ниже настройки: - -```sql -SET allow_experimental_database_iceberg = 1; -SET allow_experimental_database_unity_catalog = 1; -SET allow_experimental_database_glue_catalog = 1; -SET allow_experimental_database_hms_catalog = 1; -``` - -Базы данных с движком `DataLakeCatalog` можно создавать с помощью следующего синтаксиса: - -```sql -CREATE DATABASE имя_базы_данных -ENGINE = DataLakeCatalog(адрес_каталога[, пользователь, пароль]) -SETTINGS -тип_каталога, -[...] -``` - -Поддерживаются следующие настройки: - -| Setting | Description | -| ----------------------- | ------------------------------------------------------------------------------------------------------ | -| `catalog_type` | Тип каталога: `glue`, `unity` (Delta), `rest` (Iceberg), `hive`, `onelake` (Iceberg) | -| `warehouse` | Имя хранилища/базы данных, которое будет использоваться в каталоге. | -| `catalog_credential` | Учетные данные для аутентификации в каталоге (например, API-ключ или токен) | -| `auth_header` | Пользовательский HTTP-заголовок для аутентификации в сервисе каталога | -| `auth_scope` | Область действия OAuth2 для аутентификации (если используется OAuth) | -| `storage_endpoint` | URL конечной точки базового хранилища | -| `oauth_server_uri` | URI сервера авторизации OAuth2 для аутентификации | -| `vended_credentials` | Логический флаг, указывающий, использовать ли выдаваемые учетные данные (специфично для AWS) | -| `aws_access_key_id` | Идентификатор ключа доступа AWS для доступа к S3/Glue (если не используются выдаваемые учетные данные) | -| `aws_secret_access_key` | Секретный ключ доступа AWS для доступа к S3/Glue (если не используются выдаваемые учетные данные) | -| `region` | Регион AWS для сервиса (например, `us-east-1`) | - - -## Примеры - -Ниже приведены примеры использования движка `DataLakeCatalog`: - -* [Unity Catalog](/use-cases/data-lake/unity-catalog) -* [Glue Catalog](/use-cases/data-lake/glue-catalog) -* OneLake Catalog\ - может использоваться при включении `allow_experimental_database_iceberg` или `allow_database_iceberg`. - -```sql -CREATE DATABASE database_name -ENGINE = DataLakeCatalog(catalog_endpoint) -SETTINGS - catalog_type = 'onelake', - warehouse = warehouse, - onelake_tenant_id = tenant_id, - oauth_server_uri = server_uri, - auth_scope = auth_scope, - onelake_client_id = client_id, - onelake_client_secret = client_secret; -SHOW TABLES IN databse_name; -SELECT count() from database_name.table_name; -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/index.md deleted file mode 100644 index 4b07f0477e1..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -description: 'Документация по движкам баз данных' -slug: /engines/database-engines/ -toc_folder_title: 'Движки баз данных' -toc_priority: 27 -toc_title: 'Введение' -title: 'Движки баз данных' -doc_type: 'landing-page' ---- - - - -# Движки баз данных - -Движки баз данных позволяют работать с таблицами. По умолчанию ClickHouse использует движок базы данных [Atomic](../../engines/database-engines/atomic.md), который предоставляет настраиваемые [движки таблиц](../../engines/table-engines/index.md) и [диалект SQL](../../sql-reference/syntax.md). - -Ниже приведён полный список доступных движков баз данных. Перейдите по ссылкам, чтобы получить дополнительную информацию: - -{/* Оглавление для этой страницы автоматически генерируется скриптом - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - на основе полей фронтматтера YAML: slug, description, title. - - Если вы заметили ошибку, отредактируйте YML-фронтматтер самих страниц. - */ } - -{/*АВТОГЕНЕРИРОВАНО_НАЧАЛО*/ } - -| Страница | Описание | -| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Shared](/engines/database-engines/shared) | Страница, описывающая движок базы данных `Shared`, доступный в ClickHouse Cloud. | -| [Atomic](/engines/database-engines/atomic) | Движок `Atomic` поддерживает неблокирующие запросы `DROP TABLE` и `RENAME TABLE`, а также атомарные запросы `EXCHANGE TABLES`. Движок базы данных `Atomic` используется по умолчанию. | -| [Lazy](/engines/database-engines/lazy) | Хранит таблицы в оперативной памяти только `expiration_time_in_seconds` секунд после последнего обращения. Может использоваться только с таблицами типа Log. | -| [Replicated](/engines/database-engines/replicated) | Движок основан на движке Atomic. Он поддерживает репликацию метаданных через DDL-лог, который записывается в ZooKeeper и выполняется на всех репликах заданной базы данных. | -| [PostgreSQL](/engines/database-engines/postgresql) | Позволяет подключаться к базам данных на удалённом сервере PostgreSQL. | -| [MySQL](/engines/database-engines/mysql) | Позволяет подключаться к базам данных на удалённом сервере MySQL и выполнять запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и MySQL. | -| [SQLite](/engines/database-engines/sqlite) | Позволяет подключаться к базам данных SQLite и выполнять запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и SQLite. | -| [MaterializedPostgreSQL](/engines/database-engines/materialized-postgresql) | Создаёт базу данных ClickHouse на основе таблиц из базы данных PostgreSQL. | -| [Backup](/engines/database-engines/backup) | Позволяет мгновенно подключать таблицы/базы данных из резервных копий в режиме только чтения. | -| [DataLakeCatalog](/engines/database-engines/datalakecatalog) | Движок базы данных DataLakeCatalog позволяет подключать ClickHouse к внешним каталогам данных и выполнять запросы к данным в формате открытых таблиц. | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md deleted file mode 100644 index 806de8919fa..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: 'Удерживает таблицы в оперативной памяти только в течение `expiration_time_in_seconds` секунд после последнего обращения. Может использоваться только с таблицами типа Log.' -sidebar_label: 'Lazy' -sidebar_position: 20 -slug: /engines/database-engines/lazy -title: 'Lazy' -doc_type: 'reference' ---- - - - -# Lazy - -Удерживает таблицы в RAM только в течение `expiration_time_in_seconds` секунд после последнего обращения. Может использоваться только с таблицами типа \*Log. - -Оптимизирован для хранения множества небольших таблиц \*Log, между обращениями к которым проходят большие промежутки времени. - - - -## Создание базы данных - -```sql -CREATE DATABASE testlazy -ENGINE = Lazy(expiration_time_in_seconds); -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md deleted file mode 100644 index 0708017bdc9..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md +++ /dev/null @@ -1,308 +0,0 @@ ---- -description: 'Создаёт базу данных ClickHouse на основе таблиц из базы данных PostgreSQL.' -sidebar_label: 'MaterializedPostgreSQL' -sidebar_position: 60 -slug: /engines/database-engines/materialized-postgresql -title: 'MaterializedPostgreSQL' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MaterializedPostgreSQL - - - - - -:::note -Пользователям ClickHouse Cloud рекомендуется использовать [ClickPipes](/integrations/clickpipes) для репликации PostgreSQL в ClickHouse. Этот сервис нативно поддерживает высокопроизводительный CDC (фиксацию изменений данных) для PostgreSQL. -::: - -Создаёт базу данных ClickHouse с таблицами из базы данных PostgreSQL. Сначала база данных с движком `MaterializedPostgreSQL` создаёт снимок базы данных PostgreSQL и загружает необходимые таблицы. Необходимые таблицы могут включать любое подмножество таблиц из любого подмножества схем указанной базы данных. Вместе со снимком движок базы данных получает LSN и, как только начальная выгрузка таблиц выполнена, начинает получать обновления из WAL. После создания базы данных вновь добавляемые таблицы в базе данных PostgreSQL не добавляются в репликацию автоматически. Их нужно добавлять вручную с помощью запроса `ATTACH TABLE db.table`. - -Репликация реализована с использованием протокола логической репликации PostgreSQL (PostgreSQL Logical Replication Protocol), который не позволяет реплицировать DDL, но позволяет определить, произошли ли изменения, нарушающие репликацию (изменения типов столбцов, добавление/удаление столбцов). Такие изменения обнаруживаются, и соответствующие таблицы прекращают получать обновления. В этом случае следует использовать запросы `ATTACH` / `DETACH PERMANENTLY` для полной перезагрузки таблицы. Если DDL не нарушает репликацию (например, переименование столбца), таблица по-прежнему будет получать обновления (вставка выполняется по позиции). - -:::note -Этот движок базы данных является экспериментальным. Чтобы его использовать, установите `allow_experimental_database_materialized_postgresql` в значение 1 в ваших конфигурационных файлах или с помощью команды `SET`: - -```sql -SET allow_experimental_database_materialized_postgresql=1 -``` - -::: - - -## Создание базы данных - -```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` — пароль пользователя. - - -## Пример использования - -```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; -``` - - -## Динамическое добавление новых таблиц в репликацию - -После создания базы данных `MaterializedPostgreSQL` она не будет автоматически обнаруживать новые таблицы в соответствующей базе данных PostgreSQL. Такие таблицы можно добавить вручную: - -```sql -ATTACH TABLE postgres_database.new_table; -``` - -:::warning -До версии 22.1 добавление таблицы в репликацию оставляло неудалённый временный слот репликации (с именем `{db_name}_ch_replication_slot_tmp`). Если вы подключаете таблицы в ClickHouse версии ниже 22.1, обязательно удалите этот слот вручную (`SELECT pg_drop_replication_slot('{db_name}_ch_replication_slot_tmp')`). В противном случае будет расти использование дискового пространства. Эта проблема исправлена в версии 22.1. -::: - - -## Динамическое исключение таблиц из репликации - -Можно исключить отдельные таблицы из репликации: - -```sql -DETACH TABLE postgres_database.table_to_remove PERMANENTLY; -``` - - -## Схема PostgreSQL - -Схемы PostgreSQL ([schema](https://www.postgresql.org/docs/9.1/ddl-schemas.html)) можно настраивать тремя способами (начиная с версии 21.12). - -1. Одна схема для одного движка базы данных `MaterializedPostgreSQL`. Требуется использовать настройку `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`; -``` - -Предупреждение: в данном случае точки в имени таблицы не допускаются. - - -## Требования - -1. Параметр [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) должен иметь значение `logical`, а параметр `max_replication_slots` — значение не менее `2` в конфигурационном файле PostgreSQL. - -2. Каждая реплицируемая таблица должна иметь один из следующих вариантов [replica identity](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) не поддерживается. Будет использоваться значение по умолчанию для данного типа данных. -::: - - -## Настройки - -### `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_list` - -Значение по умолчанию: пустой список (используется схема по умолчанию). - -### `materialized_postgresql_max_block_size` - -Задаёт количество строк, собираемых в памяти перед сбросом данных в таблицу базы данных PostgreSQL. - -Возможные значения: - -* Положительное целое число. - -Значение по умолчанию: `65536`. - -### `materialized_postgresql_replication_slot` - -Слот репликации, созданный пользователем. Должен использоваться вместе с `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` - -Использует уникальный идентификатор потребителя при репликации. Значение по умолчанию — `0`. -Если установлено в `1`, позволяет настроить несколько таблиц `MaterializedPostgreSQL`, указывающих на одну и ту же таблицу `PostgreSQL`. - - -## Заметки {#notes} - -### Переключение (failover) логического слота репликации {#logical-replication-slot-failover} - -Логические слоты репликации, которые существуют на первичном сервере, недоступны на резервных репликах. -Поэтому при переключении ролей новый первичный (бывший физический standby) не будет знать о слотах, которые существовали на старом первичном сервере. Это приведёт к нарушению репликации из 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. Дождитесь готовности слота репликации, затем начните транзакцию и экспортируйте идентификатор снимка транзакции (snapshot): - - ```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. Убедитесь, что репликация продолжается после переключения: - - ```bash - kubectl exec acid-demo-cluster-0 -c postgres -- su postgres -c 'patronictl failover --candidate acid-demo-cluster-1 --force' - ``` - -### Необходимые привилегии {#required-permissions} - -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) — требуется быть владельцем публикации (`username` в самом движке MaterializedPostgreSQL). - -Можно избежать выполнения команд `2` и `3` и необходимости в этих привилегиях. Используйте настройки `materialized_postgresql_replication_slot` и `materialized_postgresql_snapshot`, но с большой осторожностью. - -Доступ к таблицам: - -1. pg_publication - -2. pg_replication_slots - -3. pg_publication_tables diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md deleted file mode 100644 index 27bd9dbfb1a..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -description: 'Позволяет подключаться к базам данных на удалённом сервере MySQL и выполнять - запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и MySQL.' -sidebar_label: 'MySQL' -sidebar_position: 50 -slug: /engines/database-engines/mysql -title: 'MySQL' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок базы данных MySQL - - - -Позволяет подключаться к базам данных на удалённом сервере MySQL и выполнять запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и MySQL. - -Движок базы данных `MySQL` транслирует запросы на сервер MySQL, поэтому вы можете выполнять такие операции, как `SHOW TABLES` или `SHOW CREATE TABLE`. - -Вы не можете выполнять следующие запросы: - -- `RENAME` -- `CREATE TABLE` -- `ALTER` - - - -## Создание базы данных - -```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). - - - -## Поддержка глобальных переменных - -Для лучшей совместимости вы можете обращаться к глобальным переменным в стиле MySQL — через `@@identifier`. - -Поддерживаются следующие переменные: - -* `version` -* `max_allowed_packet` - -:::note -На данный момент эти переменные являются заглушками и ни к чему не привязаны. -::: - -Пример: - -```sql -SELECT @@version; -``` - - -## Примеры использования - -Таблица в MySQL: - -```text -mysql> USE test; -База данных изменена - -mysql> CREATE TABLE `mysql_table` ( - -> `int_id` INT NOT NULL AUTO_INCREMENT, - -> `float` FLOAT NOT NULL, - -> PRIMARY KEY (`int_id`)); -Запрос выполнен, затронуто строк: 0 (0,09 сек.) - -mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2); -Запрос выполнен, затронута 1 строка (0,00 сек.) - -mysql> select * from mysql_table; -+------+-----+ -| int_id | value | -+------+-----+ -| 1 | 2 | -+------+-----+ -Строк в результате: 1 (0,00 сек.) -``` - -База данных ClickHouse, обменивающаяся данными с сервером MySQL: - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md deleted file mode 100644 index f0e0ee1274c..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -description: 'Позволяет подключаться к базам данных на удалённом сервере PostgreSQL.' -sidebar_label: 'PostgreSQL' -sidebar_position: 40 -slug: /engines/database-engines/postgresql -title: 'PostgreSQL' -doc_type: 'guide' ---- - - - -# PostgreSQL - -Позволяет подключаться к базам данных на удалённом сервере [PostgreSQL](https://www.postgresql.org). Поддерживает операции чтения и записи (запросы `SELECT` и `INSERT`) для обмена данными между ClickHouse и PostgreSQL. - -Обеспечивает доступ в режиме реального времени к списку таблиц и их структуре на удалённом сервере PostgreSQL с помощью запросов `SHOW TABLES` и `DESCRIBE TABLE`. - -Поддерживает модификацию структуры таблиц (`ALTER TABLE ... ADD|DROP COLUMN`). Если параметр `use_table_cache` (см. параметры движка ниже) установлен в `1`, структура таблиц кэшируется и не проверяется на наличие изменений, но может быть обновлена с помощью запросов `DETACH` и `ATTACH`. - - - -## Создание базы данных - -```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) | - - - -## Примеры использования - -База данных в 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) │ -└────────┴───────────────────┘ -``` - - -## Связанные материалы {#related-content} - -- Блог: [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/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md deleted file mode 100644 index 2208376ea83..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -description: 'Движок основан на движке Atomic. Он поддерживает репликацию метаданных - посредством DDL-журнала, который записывается в ZooKeeper и исполняется на всех репликах - данной базы данных.' -sidebar_label: 'Replicated' -sidebar_position: 30 -slug: /engines/database-engines/replicated -title: 'Replicated' -doc_type: 'reference' ---- - - - -# Replicated - -Движок основан на движке [Atomic](../../engines/database-engines/atomic.md). Он поддерживает репликацию метаданных по журналу DDL, который записывается в ZooKeeper и выполняется на всех репликах заданной базы данных. - -Один сервер ClickHouse может одновременно запускать и обновлять несколько реплицируемых баз данных. Однако для одной и той же реплицируемой базы данных не может существовать несколько реплик. - - - -## Создание базы данных - -```sql -CREATE DATABASE testdb [UUID '...'] ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...] -``` - -**Параметры движка** - -* `zoo_path` — путь в ZooKeeper. Один и тот же путь в ZooKeeper соответствует одной базе данных. -* `shard_name` — имя шарда. Реплики базы данных группируются в шарды по `shard_name`. -* `replica_name` — имя реплики. Имена реплик должны отличаться для всех реплик одного и того же шарда. - -Параметры можно опустить, в этом случае отсутствующие параметры будут подставлены по умолчанию. - -Если `zoo_path` содержит макрос `{uuid}`, необходимо указать явный UUID или добавить [ON CLUSTER](../../sql-reference/distributed-ddl.md) к оператору CREATE, чтобы гарантировать, что все реплики используют один и тот же UUID для этой базы данных. - -Для таблиц [ReplicatedMergeTree](/engines/table-engines/mergetree-family/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}` раскрываются в значения из конфигурации сервера, а не из аргументов движка базы данных. В будущем можно будет использовать `shard_name` и `replica_name` реплицируемой базы данных. - - -## Особенности и рекомендации {#specifics-and-recommendations} - -DDL-запросы с базой данных `Replicated` работают аналогично запросам [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) содержит кластер с именем, совпадающим с именем реплицируемой базы данных, который состоит из всех реплик этой базы данных. Этот кластер автоматически обновляется при создании/удалении реплик и может использоваться для таблиц [Distributed](/engines/table-engines/special/distributed). - -При создании новой реплики базы данных эта реплика создаёт таблицы самостоятельно. Если реплика была недоступна долгое время и отстала от журнала репликации, она сверяет свои локальные метаданные с текущими метаданными в ZooKeeper, перемещает лишние таблицы с данными в отдельную нереплицируемую базу данных (чтобы не удалить что-либо лишнее по ошибке), создаёт недостающие таблицы, обновляет имена таблиц, если они были переименованы. Данные реплицируются на уровне `ReplicatedMergeTree`, т. е. если таблица не является реплицируемой, данные реплицироваться не будут (база данных отвечает только за метаданные). - -Запросы [`ALTER TABLE FREEZE|ATTACH|FETCH|DROP|DROP DETACHED|DETACH PARTITION|PART`](../../sql-reference/statements/alter/partition.md) разрешены, но не реплицируются. Движок базы данных будет добавлять/получать/удалять раздел/часть только на текущей реплике. Однако, если сама таблица использует реплицируемый движок таблицы, то данные будут реплицированы после использования `ATTACH`. - -Если вам необходимо только настроить кластер без поддержки репликации таблиц, воспользуйтесь функцией [Cluster Discovery](../../operations/cluster-discovery.md). - - - -## Пример использования - -Создание кластера с тремя хостами: - -```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}'); -``` - -Создание базы данных на кластере с неявно заданными параметрами: - -```sql -CREATE DATABASE r ON CLUSTER default ENGINE=Replicated; -``` - -Выполнение 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] │ -└───────┴───────────────┘ -``` - -Добавление реплики на дополнительном хосте: - -```sql -node4 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','r2'); -``` - -Добавление реплики на дополнительном хосте, если макрос `{uuid}` используется в `zoo_path`: - -```sql -node1 :) SELECT uuid FROM system.databases WHERE database='r'; -node4 :) CREATE DATABASE r UUID '' ENGINE=Replicated('some/path/{uuid}','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] │ -└───────┴───────────────┘ -``` - - -## Параметры - -Поддерживаются следующие параметры: - -| Setting | Default | Description | -| ---------------------------------------------------------------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `max_broken_tables_ratio` | 1 | Не восстанавливать реплику автоматически, если отношение числа повреждённых таблиц к общему числу таблиц больше заданного значения | -| `max_replication_lag_to_enqueue` | 50 | Реплика будет генерировать исключение при попытке выполнить запрос, если её лаг репликации больше заданного значения | -| `wait_entry_commited_timeout_sec` | 3600 | Реплики попытаются отменить запрос, если истёк таймаут, но инициирующий хост ещё не выполнил его | -| `collection_name` | | Имя коллекции, определённой в конфигурации сервера, в которой задана вся информация для аутентификации в кластере | -| `check_consistency` | true | Проверять согласованность локальных метаданных и метаданных в Keeper, выполнять восстановление реплики при обнаружении несогласованности | -| `max_retries_before_automatic_recovery` | 10 | Максимальное число попыток выполнить запись в очереди перед пометкой реплики как потерянной и её восстановлением из снимка (0 означает неограниченное число попыток) | -| `allow_skipping_old_temporary_tables_ddls_of_refreshable_materialized_views` | false | Если включено, при обработке DDL в реплицируемых базах данных по возможности пропускается создание и обмен DDL временных таблиц обновляемых материализованных представлений | -| `logs_to_keep` | 1000 | Количество записей журнала по умолчанию, которое нужно хранить в ZooKeeper для реплицируемой базы данных. | -| `default_replica_path` | `/clickhouse/databases/{uuid}` | Путь к базе данных в ZooKeeper. Используется при создании базы данных, если аргументы опущены. | -| `default_replica_shard_name` | `{shard}` | Имя шарда реплики в базе данных. Используется при создании базы данных, если аргументы опущены. | -| `default_replica_name` | `{replica}` | Имя реплики в базе данных. Используется при создании базы данных, если аргументы опущены. | - -Значения по умолчанию могут быть переопределены в конфигурационном файле. - -```xml - - - 0.75 - 100 - 1800 - postgres1 - false - 5 - /clickhouse/databases/{uuid} - {shard} - {replica} - - -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md deleted file mode 100644 index 03f815ab6f6..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: 'Страница, описывающая движок базы данных `Shared`, доступный в ClickHouse Cloud' -sidebar_label: 'Shared' -sidebar_position: 10 -slug: /engines/database-engines/shared -title: 'Shared' -doc_type: 'reference' ---- - -import CloudOnlyBadge from '@theme/badges/CloudOnlyBadge'; - - - - -# Движок базы данных Shared - -Движок базы данных `Shared` работает совместно с Shared Catalog для управления базами данных, таблицы которых используют stateless‑движки таблиц, такие как [`SharedMergeTree`](/cloud/reference/shared-merge-tree). -Эти движки таблиц не записывают постоянное состояние на диск и совместимы с динамическими вычислительными средами. - -Движок базы данных `Shared` в Cloud устраняет необходимость в локальных дисках. -Это движок, полностью работающий в памяти (in-memory), которому требуются только CPU и память. - - - -## Как это работает? {#how-it-works} - -Движок базы данных `Shared` хранит все определения баз данных и таблиц в централизованном каталоге Shared Catalog, работающем на базе Keeper. Вместо записи на локальный диск он поддерживает единое версионируемое глобальное состояние, общее для всех вычислительных узлов. - -Каждый узел отслеживает только последнюю применённую версию и при запуске получает актуальное состояние без необходимости в локальных файлах или ручной настройке. - - - -## Синтаксис - -Для конечных пользователей работа с Shared Catalog и движком базы данных Shared не требует дополнительной конфигурации. Создание базы данных выполняется как обычно: - -```sql -CREATE DATABASE my_database; -``` - -ClickHouse Cloud автоматически назначает базам данных движок Shared. Любые таблицы, созданные в такой базе данных с использованием stateless-движков, автоматически используют преимущества механизмов репликации и координации Shared Catalog. - -:::tip -Для получения подробной информации о Shared Catalog и его преимуществах см. раздел ["Shared catalog and shared database engine"](/cloud/reference/shared-catalog) в справочном разделе Cloud. -::: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md deleted file mode 100644 index 1807def09b5..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -description: 'Позволяет подключаться к базам данных SQLite и выполнять операторы `INSERT` и `SELECT` - для обмена данными между ClickHouse и SQLite.' -sidebar_label: 'SQLite' -sidebar_position: 55 -slug: /engines/database-engines/sqlite -title: 'SQLite' -doc_type: 'reference' ---- - - - -# SQLite - -Позволяет подключаться к базе данных [SQLite](https://www.sqlite.org/index.html) и выполнять запросы `INSERT` и `SELECT` для обмена данными между ClickHouse и SQLite. - - - -## Создание базы данных - -```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` и паролей. Контроль доступа осуществляется с помощью разрешений файловой системы, заданных непосредственно для файла базы данных. - - - -## Пример использования - -База данных в 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 │ -└───────┴──────┘ -``` - -Запись данных в таблицу SQLite из таблицы ClickHouse: - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/index.md deleted file mode 100644 index 99b0c7cc00a..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -description: 'Страница оглавления для движков' -slug: /engines -title: 'Движки' -doc_type: 'landing-page' ---- - -| Страница | Описание | -|---------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Database Engines](../engines/database-engines/index.md) | Движки баз данных в ClickHouse позволяют работать с таблицами и определяют, как данные хранятся и обрабатываются. Узнайте больше о различных движках баз данных, доступных в ClickHouse. | -| [Table Engines](../engines/table-engines/index.md) | Движки таблиц в ClickHouse — это базовое понятие, определяющее, как данные хранятся, записываются и читаются. Узнайте больше о различных движках таблиц, доступных в ClickHouse. | \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/index.md deleted file mode 100644 index 561f2e07e52..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/index.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -description: 'Справочная документация по движкам таблиц' -slug: /engines/table-engines/ -toc_folder_title: 'Движки таблиц' -toc_priority: 26 -toc_title: 'Введение' -title: 'Движки таблиц' -doc_type: 'reference' ---- - - - -# Движки таблиц - -Движок таблицы (тип таблицы) определяет: - -- Как и где хранятся данные, куда они записываются и откуда читаются. -- Какие запросы поддерживаются и как. -- Возможность конкурентного доступа к данным. -- Использование индексов, если они есть. -- Возможно ли многопоточное выполнение запросов. -- Параметры репликации данных. - - - -## Семейства движков {#engine-families} - -### MergeTree {#mergetree} - -Наиболее универсальные и функциональные движки таблиц для задач с высокой нагрузкой. Общим свойством этих движков является быстрая вставка данных с последующей фоновой обработкой. Движки семейства `MergeTree` поддерживают репликацию данных (через версии движков [Replicated\*](/engines/table-engines/mergetree-family/replication)), партиционирование, вторичные пропускающие индексы и другие возможности, которые недоступны в других движках. - -Движки в семействе: - -| Движки MergeTree | -|-------------------------------------------------------------------------------------------------------------------------------------------| -| [MergeTree](/engines/table-engines/mergetree-family/mergetree) | -| [ReplacingMergeTree](/engines/table-engines/mergetree-family/replacingmergetree) | -| [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree) | -| [AggregatingMergeTree](/engines/table-engines/mergetree-family/aggregatingmergetree) | -| [CollapsingMergeTree](/engines/table-engines/mergetree-family/collapsingmergetree) | -| [VersionedCollapsingMergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) | -| [GraphiteMergeTree](/engines/table-engines/mergetree-family/graphitemergetree) | -| [CoalescingMergeTree](/engines/table-engines/mergetree-family/coalescingmergetree) | - -### Log {#log} - -Облегчённые [движки](../../engines/table-engines/log-family/index.md) с минимальной функциональностью. Они наиболее эффективны, когда нужно быстро записать множество небольших таблиц (примерно до 1 миллиона строк) и затем читать их целиком. - -Движки в семействе: - -| Движки Log | -|----------------------------------------------------------------------------| -| [TinyLog](/engines/table-engines/log-family/tinylog) | -| [StripeLog](/engines/table-engines/log-family/stripelog) | -| [Log](/engines/table-engines/log-family/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} - -Движки в семействе: - - - -| Специальные движки | -|---------------------------------------------------------------| -| [Distributed](/engines/table-engines/special/distributed) | -| [Dictionary](/engines/table-engines/special/dictionary) | -| [Merge](/engines/table-engines/special/merge) | -| [Executable](/engines/table-engines/special/executable) | -| [File](/engines/table-engines/special/file) | -| [Null](/engines/table-engines/special/null) | -| [Set](/engines/table-engines/special/set) | -| [Join](/engines/table-engines/special/join) | -| [URL](/engines/table-engines/special/url) | -| [View](/engines/table-engines/special/view) | -| [Memory](/engines/table-engines/special/memory) | -| [Buffer](/engines/table-engines/special/buffer) | -| [Внешние данные](/engines/table-engines/special/external-data) | -| [GenerateRandom](/engines/table-engines/special/generate) | -| [KeeperMap](/engines/table-engines/special/keeper-map) | -| [FileLog](/engines/table-engines/special/filelog) | - - - -## Виртуальные столбцы {#table_engines-virtual_columns} - -Виртуальный столбец — это неотъемлемый атрибут движка таблицы, определённый в исходном коде движка. - -Не следует указывать виртуальные столбцы в запросе `CREATE TABLE`, и их нельзя увидеть в результатах запросов `SHOW CREATE TABLE` и `DESCRIBE TABLE`. Виртуальные столбцы также доступны только для чтения, поэтому в них нельзя вставлять данные. - -Чтобы выбрать данные из виртуального столбца, необходимо указать его имя в запросе `SELECT`. `SELECT *` не возвращает значения из виртуальных столбцов. - -Если вы создаёте таблицу со столбцом, имя которого совпадает с именем одного из виртуальных столбцов таблицы, этот виртуальный столбец становится недоступным. Мы не рекомендуем так делать. Чтобы избежать конфликтов, имена виртуальных столбцов обычно имеют префикс в виде подчёркивания. - -- `_table` — содержит имя таблицы, из которой были прочитаны данные. Тип: [String](../../sql-reference/data-types/string.md). - - Независимо от используемого движка таблицы, каждая таблица включает универсальный виртуальный столбец с именем `_table`. - - При выполнении запроса к таблице с движком Merge вы можете задать константные условия по `_table` в предложении `WHERE/PREWHERE` (например, `WHERE _table='xyz'`). В этом случае операция чтения выполняется только для тех таблиц, для которых условие по `_table` выполняется, так что столбец `_table` фактически выступает в роли индекса. - - При использовании запросов вида `SELECT ... FROM (... UNION ALL ...)` можно определить, из какой фактической таблицы получены возвращаемые строки, указав столбец `_table`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md deleted file mode 100644 index 4e51b90f647..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -description: 'Движок `ExternalDistributed` позволяет выполнять запросы `SELECT` - к данным, которые хранятся на удалённых серверах MySQL или PostgreSQL. Использует - табличные движки MySQL или PostgreSQL в качестве аргумента, что позволяет реализовать шардинг.' -sidebar_label: 'ExternalDistributed' -sidebar_position: 55 -slug: /engines/table-engines/integrations/ExternalDistributed -title: 'Табличный движок ExternalDistributed' -doc_type: 'reference' ---- - - - -# Движок таблицы ExternalDistributed - -Движок `ExternalDistributed` позволяет выполнять запросы `SELECT` к данным, которые хранятся на удалённых серверах с MySQL или PostgreSQL. Принимает в качестве аргумента движки [MySQL](../../../engines/table-engines/integrations/mysql.md) или [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md), поэтому возможен шардинг. - - - -## Создание таблицы - -```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). - -Структура таблицы может отличаться от структуры исходной таблицы: - -* Имена столбцов должны совпадать с именами в исходной таблице, но вы можете использовать только часть этих столбцов и в любом порядке. -* Типы столбцов могут отличаться от типов в исходной таблице. ClickHouse пытается [привести](/sql-reference/functions/type-conversion-functions#cast) значения к типам данных ClickHouse. - -**Параметры движка** - -* `engine` — Движок таблицы `MySQL` или `PostgreSQL`. -* `host:port` — Адрес сервера MySQL или PostgreSQL. -* `database` — Имя удалённой базы данных. -* `table` — Имя удалённой таблицы. -* `user` — Имя пользователя. -* `password` — Пароль пользователя. - - -## Детали реализации - -Поддерживаются несколько реплик; их необходимо перечислять через `|`, а шарды — через `,`. Например: - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md deleted file mode 100644 index 45138339727..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -description: 'Движок позволяет выполнять запросы к удалённым наборам данных через Apache Arrow Flight.' -sidebar_label: 'ArrowFlight' -sidebar_position: 186 -slug: /engines/table-engines/integrations/arrowflight -title: 'Табличный движок ArrowFlight' -doc_type: 'reference' ---- - - - -# Движок таблицы ArrowFlight - -Движок таблицы ArrowFlight позволяет ClickHouse выполнять запросы к удалённым наборам данных по протоколу [Apache Arrow Flight](https://arrow.apache.org/docs/format/Flight.html). -Эта интеграция даёт возможность ClickHouse получать данные с внешних серверов с поддержкой Flight в колонном формате Arrow с высокой производительностью. - - - -## Создание таблицы - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name (name1 [type1], name2 [type2], ...) - ENGINE = ArrowFlight('host:port', 'dataset_name' [, 'username', 'password']); -``` - -**Параметры движка** - -* `host:port` — адрес удалённого сервера Arrow Flight. -* `dataset_name` — идентификатор набора данных на сервере Flight. -* `username` — имя пользователя для базовой HTTP-аутентификации. -* `password` — пароль для базовой HTTP-аутентификации. - Если `username` и `password` не указаны, это означает, что аутентификация не используется - (это будет работать только в том случае, если сервер Arrow Flight это допускает). - - -## Пример использования - -В этом примере показано, как создать таблицу для чтения данных с удалённого сервера Arrow Flight: - -```sql -CREATE TABLE remote_flight_data -( - id UInt32, - name String, - value Float64 -) ENGINE = ArrowFlight('127.0.0.1:9005', 'sample_dataset'); -``` - -Запросите удалённые данные так же, как локальную таблицу: - -```sql -SELECT * FROM remote_flight_data ORDER BY id; -``` - -```text -┌─id─┬─name────┬─value─┐ -│ 1 │ foo │ 42.1 │ -│ 2 │ bar │ 13.3 │ -│ 3 │ baz │ 77.0 │ -└────┴─────────┴───────┘ -``` - - -## Примечания {#notes} - -* Схема, определённая в ClickHouse, должна соответствовать схеме, возвращаемой сервером Flight. -* Этот движок подходит для федеративных запросов, виртуализации данных и разделения хранения и вычислений. - - - -## См. также {#see-also} - -* [Apache Arrow Flight SQL](https://arrow.apache.org/docs/format/FlightSql.html) -* [Интеграция формата Arrow в ClickHouse](/interfaces/formats/Arrow) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md deleted file mode 100644 index db9d948a95a..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -description: 'Этот движок обеспечивает интеграцию с экосистемой Azure Blob Storage, - позволяя выполнять потоковый импорт данных.' -sidebar_label: 'AzureQueue' -sidebar_position: 181 -slug: /engines/table-engines/integrations/azure-queue -title: 'Табличный движок AzureQueue' -doc_type: 'reference' ---- - - - -# Движок таблицы 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). - -Аналогично движку таблиц [AzureBlobStorage](/engines/table-engines/integrations/azureBlobStorage), можно использовать эмулятор Azurite для локальной разработки с Azure Storage. Подробнее [здесь](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=docker-hub%2Cblob-storage). - -**Пример** - -```sql -CREATE TABLE azure_queue_engine_table -( - `key` UInt64, - `data` String -) -ENGINE = AzureQueue('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', 'testcontainer', '*', 'CSV') -SETTINGS mode = 'unordered' -``` - - -## Настройки {#settings} - -Набор поддерживаемых настроек совпадает с настройками движка таблиц `S3Queue`, но без префикса `s3queue_`. См. [полный список настроек](../../../engines/table-engines/integrations/s3queue.md#settings). -Чтобы получить список настроек, настроенных для таблицы, используйте таблицу `system.azure_queue_settings`. Доступно начиная с версии `24.10`. - - -## Description {#description} - -`SELECT` не особенно полезен для потоковой загрузки данных (за исключением отладки), поскольку каждый файл может быть импортирован только один раз. Более практичным является создание потоков обработки в реальном времени с использованием [материализованных представлений](../../../sql-reference/statements/create/view.md). Для этого: - -1. Используйте движок для создания таблицы, которая будет получать данные из указанного пути в S3, и рассматривайте её как поток данных. -2. Создайте таблицу с требуемой структурой. -3. Создайте материализованное представление, которое преобразует данные из движка и помещает их в ранее созданную таблицу. - -Когда `MATERIALIZED VIEW` подключается к движку, оно начинает собирать данные в фоновом режиме. - -Пример: - -```sql -CREATE TABLE azure_queue_engine_table (key UInt64, data String) - ENGINE=AzureQueue('', 'CSV', 'gzip') - SETTINGS - mode = 'unordered'; - -CREATE TABLE stats (key UInt64, data String) - ENGINE = MergeTree() ORDER BY key; - -CREATE MATERIALIZED VIEW consumer TO stats - AS SELECT key, data FROM azure_queue_engine_table; - -SELECT * FROM stats ORDER BY key; -``` - - -## Виртуальные столбцы {#virtual-columns} - -- `_path` — Путь к файлу. -- `_file` — Имя файла. - -Подробнее о виртуальных столбцах см. [здесь](../../../engines/table-engines/index.md#table_engines-virtual_columns). - - -## Интроспекция {#introspection} - -Включите логирование для таблицы с помощью настройки таблицы `enable_logging_to_queue_log=1`. - -Возможности интроспекции аналогичны [движку таблиц S3Queue](/engines/table-engines/integrations/s3queue#introspection) с несколькими существенными отличиями: - -1. Используйте `system.azure_queue` для хранения состояния очереди в памяти для версий сервера >= 25.1. Для более старых версий используйте `system.s3queue` (она также будет содержать информацию для таблиц `azure`). -2. Включите `system.azure_queue_log` через основной конфигурационный файл ClickHouse, например: - -```xml - - system - azure_queue_log
-
-``` - -Эта персистентная таблица содержит ту же информацию, что и `system.s3queue`, но для обработанных и неудачно обработанных файлов. - -Таблица имеет следующую структуру: - -```sql - -CREATE TABLE system.azure_queue_log -( - `hostname` LowCardinality(String) COMMENT 'Имя хоста', - `event_date` Date COMMENT 'Дата события записи этой строки лога', - `event_time` DateTime COMMENT 'Время события записи этой строки лога', - `database` String COMMENT 'Имя базы данных, в которой находится текущая таблица S3Queue.', - `table` String COMMENT 'Имя таблицы S3Queue.', - `uuid` String COMMENT 'UUID таблицы S3Queue', - `file_name` String COMMENT 'Имя обрабатываемого файла', - `rows_processed` UInt64 COMMENT 'Количество обработанных строк', - `status` Enum8('Processed' = 0, 'Failed' = 1) COMMENT 'Статус обработки файла', - `processing_start_time` Nullable(DateTime) COMMENT 'Время начала обработки файла', - `processing_end_time` Nullable(DateTime) COMMENT 'Время окончания обработки файла', - `exception` String COMMENT 'Сообщение об исключении, если произошло' -) -ENGINE = MergeTree -PARTITION BY toYYYYMM(event_date) -ORDER BY (event_date, event_time) -SETTINGS index_granularity = 8192 -COMMENT 'Содержит записи логирования с информацией о файлах, обработанных движком S3Queue.' - -``` - -Пример: - -```sql -SELECT * -FROM system.azure_queue_log -LIMIT 1 -FORMAT Vertical - -Row 1: -────── -hostname: clickhouse -event_date: 2024-12-16 -event_time: 2024-12-16 13:42:47 -database: default -table: azure_queue_engine_table -uuid: 1bc52858-00c0-420d-8d03-ac3f189f27c8 -file_name: test_1.csv -rows_processed: 3 -status: Processed -processing_start_time: 2024-12-16 13:42:47 -processing_end_time: 2024-12-16 13:42:47 -exception: - -1 row in set. Elapsed: 0.002 sec. - -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md deleted file mode 100644 index 05dbb08786b..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -description: 'Этот движок обеспечивает интеграцию с экосистемой Azure Blob Storage.' -sidebar_label: 'Azure Blob Storage' -sidebar_position: 10 -slug: /engines/table-engines/integrations/azureBlobStorage -title: 'Табличный движок AzureBlobStorage' -doc_type: 'reference' ---- - - - -# Табличный движок 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_strategy, partition_columns_in_data_file, extra_credentials(client_id=, tenant_id=)]) - [PARTITION BY expr] - [SETTINGS ...] -``` - -### Параметры движка - -* `endpoint` — URL конечной точки AzureBlobStorage с контейнером и префиксом. Дополнительно может содержать `account_name`, если это требуется используемому методу аутентификации (`http://azurite1:{port}/[account_name]{container_name}/{data_prefix}`), либо эти параметры могут быть переданы отдельно с помощью `storage_account_url`, `account_name` и `container`. Для указания префикса должен использоваться `endpoint`. -* `endpoint_contains_account_name` — флаг, указывающий, содержит ли `endpoint` `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` — путь к файлу. Поддерживает следующие шаблоны (wildcards) в режиме только для чтения: `*`, `**`, `?`, `{abc,def}` и `{N..M}`, где `N`, `M` — числа, `'abc'`, `'def'` — строки. -* `account_name` — если используется `storage_account_url`, то имя учетной записи можно указать здесь. -* `account_key` — если используется `storage_account_url`, то ключ учетной записи можно указать здесь. -* `format` — [формат](/interfaces/formats.md) файла. -* `compression` — поддерживаемые значения: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. По умолчанию тип сжатия определяется автоматически по расширению файла (то же, что и установка `auto`). -* `partition_strategy` – варианты: `WILDCARD` или `HIVE`. `WILDCARD` требует наличия `{_partition_id}` в пути, который будет заменён на ключ партиции. `HIVE` не допускает шаблоны, предполагает, что путь — это корень таблицы, и генерирует каталоги партиций в стиле Hive с идентификаторами Snowflake в качестве имён файлов и форматом файла в качестве расширения. По умолчанию используется `WILDCARD`. -* `partition_columns_in_data_file` — используется только со стратегией партиционирования `HIVE`. Сообщает ClickHouse, следует ли ожидать, что столбцы партиционирования будут записаны в файл данных. По умолчанию `false`. -* `extra_credentials` — используйте `client_id` и `tenant_id` для аутентификации. Если заданы `extra_credentials`, они имеют приоритет над `account_name` и `account_key`. - -**Пример** - -Пользователи могут использовать эмулятор Azurite для локальной разработки с Azure Storage. Дополнительные сведения — [здесь](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=docker-hub%2Cblob-storage). При использовании локального экземпляра Azurite пользователям может потребоваться заменить `http://localhost:10000` на `http://azurite1:10000` в командах ниже, если предполагается, что Azurite доступен по хосту `azurite1`. - -```sql -CREATE TABLE test_table (key UInt64, data String) - ENGINE = AzureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', 'testcontainer', 'test_table', 'CSV'); - -INSERT INTO test_table VALUES (1, 'a'), (2, 'b'), (3, 'c'); - -SELECT * FROM test_table; -``` - -```text -┌─ключ─┬─данные─┐ -│ 1 │ a │ -│ 2 │ b │ -│ 3 │ c │ -└──────┴───────┘ -``` - - -## Виртуальные столбцы {#virtual-columns} - -- `_path` — Путь к файлу. Тип: `LowCardinality(String)`. -- `_file` — Имя файла. Тип: `LowCardinality(String)`. -- `_size` — Размер файла в байтах. Тип: `Nullable(UInt64)`. Если размер неизвестен, значение равно `NULL`. -- `_time` — Время последнего изменения файла. Тип: `Nullable(DateTime)`. Если время неизвестно, значение равно `NULL`. - - - -## Аутентификация - -В настоящее время есть три способа аутентификации: - -* `Managed Identity` — может использоваться при указании `endpoint`, `connection_string` или `storage_account_url`. -* `SAS Token` — может использоваться при указании `endpoint`, `connection_string` или `storage_account_url`. Определяется по наличию символа '?' в URL. См. раздел [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage#using-shared-access-signatures-sas-sas-tokens) с примерами. -* `Workload Identity` — может использоваться при указании `endpoint` или `storage_account_url`. Если параметр `use_workload_identity` установлен в конфигурации, для аутентификации используется механизм [workload identity](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#authenticate-azure-hosted-applications). - -### Кэш данных - -Движок таблиц `Azure` поддерживает кэширование данных на локальном диске. -Параметры конфигурации и использование кэша файловой системы описаны в этом [разделе](/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/;', 'testcontainer', 'test_table', 'CSV') -SETTINGS filesystem_cache_name = 'cache_for_azure', enable_filesystem_cache = 1; -``` - -1. добавьте следующий раздел в конфигурационный файл ClickHouse: - -```xml - - - - путь к каталогу кэша - 10Gi - - - -``` - -2. повторно используйте конфигурацию кеша (и, соответственно, хранилище кеша) из секции `storage_configuration` ClickHouse, [описанной здесь](/operations/storing-data.md/#using-local-cache) - -### PARTITION BY - -`PARTITION BY` — необязательный параметр. В большинстве случаев ключ партиционирования не нужен, а когда он все же требуется, обычно нет необходимости делать его более детализированным, чем по месяцам. Партиционирование не ускоряет выполнение запросов (в отличие от выражения ORDER BY). Не следует использовать слишком детализированное партиционирование. Не партиционируйте данные по идентификаторам или именам клиентов (вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY). - -Для партиционирования по месяцам используйте выражение `toYYYYMM(date_column)`, где `date_column` — это столбец с датой типа [Date](/sql-reference/data-types/date.md). Имена партиций в этом случае имеют формат `"YYYYMM"`. - -#### Стратегия партиционирования - -`WILDCARD` (по умолчанию): заменяет подстановочный шаблон `{_partition_id}` в пути к файлу фактическим ключом партиции. Чтение не поддерживается. - -`HIVE` реализует партиционирование в стиле Hive для операций чтения и записи. Чтение реализовано с использованием рекурсивного glob-шаблона. Запись генерирует файлы в следующем формате: `//.`. - -Примечание: при использовании стратегии партиционирования `HIVE` настройка `use_hive_partitioning` не влияет на поведение. - -Пример стратегии партиционирования `HIVE`: - -```sql -arthur :) create table azure_table (year UInt16, country String, counter UInt8) ENGINE=AzureBlobStorage(account_name='devstoreaccount1', account_key='Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==', storage_account_url = 'http://localhost:30000/devstoreaccount1', container='cont', blob_path='hive_partitioned', format='Parquet', compression='auto', partition_strategy='hive') PARTITION BY (year, country); - -arthur :) insert into azure_table values (2020, 'Russia', 1), (2021, 'Brazil', 2); - -arthur :) select _path, * from azure_table; -``` - - -┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐ - -1. │ cont/hive_partitioned/year=2020/country=Russia/7351305360873664512.parquet │ 2020 │ Russia │ 1 │ -2. │ cont/hive_partitioned/year=2021/country=Brazil/7351305360894636032.parquet │ 2021 │ Brazil │ 2 │ - └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘ - -``` -``` - - -## См. также {#see-also} - -[Табличная функция Azure Blob Storage](/sql-reference/table-functions/azureBlobStorage) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md deleted file mode 100644 index 3e530298ff5..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -description: 'Этот движок предоставляет доступ только для чтения к существующим таблицам Delta Lake в Amazon S3.' -sidebar_label: 'DeltaLake' -sidebar_position: 40 -slug: /engines/table-engines/integrations/deltalake -title: 'Движок таблиц DeltaLake' -doc_type: 'reference' ---- - - - -# Табличный движок DeltaLake - -Этот табличный движок обеспечивает доступ только для чтения к существующим таблицам [Delta Lake](https://github.com/delta-io/delta) в Amazon S3. - - - -## Создание таблицы - -Учтите, что таблица Delta Lake уже должна существовать в S3: эта команда не принимает параметры DDL для создания новой таблицы. - -```sql -CREATE TABLE deltalake - ENGINE = DeltaLake(url, [aws_access_key_id, aws_secret_access_key,]) -``` - -**Параметры движка** - -* `url` — URL-адрес бакета с путём к существующей таблице Delta Lake. -* `aws_access_key_id`, `aws_secret_access_key` — долгосрочные учетные данные пользователя аккаунта [AWS](https://aws.amazon.com/). Вы можете использовать их для аутентификации своих запросов. Параметр является необязательным. Если учетные данные не указаны, используются данные из конфигурационного файла. - -Параметры движка могут быть заданы с использованием [именованных коллекций](/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') -``` - -Использование именованных коллекций: - -```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') -``` - -### Кэш данных - -Движок таблиц `Iceberg` и табличная функция поддерживают кэширование данных так же, как хранилища `S3`, `AzureBlobStorage`, `HDFS`. См. [здесь](../../../engines/table-engines/integrations/s3.md#data-cache). - - -## См. также {#see-also} - -- [табличная функция deltaLake](../../../sql-reference/table-functions/deltalake.md) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md deleted file mode 100644 index b84f7467e40..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: 'Этот движок позволяет интегрировать ClickHouse с RocksDB' -sidebar_label: 'EmbeddedRocksDB' -sidebar_position: 50 -slug: /engines/table-engines/integrations/embedded-rocksdb -title: 'Табличный движок EmbeddedRocksDB' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Табличный движок EmbeddedRocksDB - - - -Этот движок позволяет интегрировать ClickHouse с [RocksDB](http://rocksdb.org/). - - - -## Создание таблицы - -```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 равен 0, используется обычный экземпляр RocksDB (без TTL). -* `rocksdb_dir` — путь к каталогу существующей базы RocksDB или целевой путь для создаваемой базы RocksDB. Таблица открывается с указанным `rocksdb_dir`. -* `read_only` — если `read_only` установлен в true, используется режим только для чтения. Для хранилища с TTL компакция (compaction) не будет запускаться (ни вручную, ни автоматически), поэтому просроченные записи не удаляются. -* `primary_key_name` — имя любого столбца из списка столбцов. -* `primary key` должен быть указан; в состав первичного ключа может входить только один столбец. Первичный ключ будет сериализован в бинарном виде как `rocksdb key`. -* столбцы, отличные от первичного ключа, будут сериализованы в бинарном виде как `rocksdb value` в соответствующем порядке. -* запросы с фильтрацией по ключу с использованием `equals` или `in` будут оптимизированы до поиска по нескольким ключам в `rocksdb`. - -Настройки движка: - -* `optimize_for_bulk_insert` — таблица оптимизирована для пакетных вставок (конвейер вставки будет создавать SST-файлы и импортировать их в базу данных RocksDB вместо записи в memtable); значение по умолчанию: `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`. Также этот параметр влияет на `system.tables` для движка EmbeddedRocksDB — включите его, чтобы увидеть приблизительные значения для `total_rows` и `total_bytes`. - - -## Поддерживаемые операции - -### Вставки - -При вставке новых строк в `EmbeddedRocksDB`, если ключ уже существует, его значение обновляется, иначе создаётся новый ключ. - -Пример: - -```sql -INSERT INTO test VALUES ('некоторый ключ', 1, 'значение', 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; -``` - -### Соединения - -Поддерживается специальный тип соединения `direct` с таблицами EmbeddedRocksDB. -Такое прямое соединение позволяет избежать формирования хеш-таблицы в памяти и -обращается к данным напрямую из 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); -``` - -##### Создайте и заполните таблицу для объединения с таблицей `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`](/operations/settings/settings.md#join_algorithm) -* [оператор JOIN](/sql-reference/statements/select/join.md) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md deleted file mode 100644 index c5c440f2548..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md +++ /dev/null @@ -1,267 +0,0 @@ ---- -description: 'Этот движок обеспечивает интеграцию с экосистемой Apache Hadoop, позволяя управлять данными в HDFS из ClickHouse. Этот движок аналогичен движкам File и URL, но предоставляет функции, специфичные для Hadoop.' -sidebar_label: 'HDFS' -sidebar_position: 80 -slug: /engines/table-engines/integrations/hdfs -title: 'Табличный движок HDFS' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблицы HDFS - - - -Этот движок обеспечивает интеграцию с экосистемой [Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop), позволяя управлять данными в [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) через ClickHouse. Этот движок похож на движки [File](/engines/table-engines/special/file) и [URL](/engines/table-engines/special/url), но предоставляет специфические для Hadoop возможности. - -Эта функциональность не поддерживается инженерами ClickHouse и известна своим сомнительным качеством реализации. В случае любых проблем исправляйте их самостоятельно и отправляйте pull request. - - - -## Использование - -```sql -ENGINE = HDFS(URI, format) -``` - -**Параметры движка** - -* `URI` — полный URI файла в HDFS. Часть пути в `URI` может содержать glob-шаблоны. В этом случае таблица будет доступна только для чтения. -* `format` — указывает один из доступных форматов файлов. Для выполнения - `SELECT`-запросов формат должен поддерживаться для ввода, а для выполнения - `INSERT`-запросов — для вывода. Доступные форматы перечислены в разделе - [Formats](/sql-reference/formats#formats-overview). -* [PARTITION BY expr] - -### PARTITION BY - -`PARTITION BY` — необязательный параметр. В большинстве случаев ключ партиционирования не требуется, а если и требуется, обычно нет необходимости делать его более детализированным, чем по месяцам. Партиционирование не ускоряет выполнение запросов (в отличие от выражения ORDER BY). Не следует использовать излишне детализированное партиционирование. Не выполняйте партиционирование данных по идентификаторам или именам клиентов (вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY). - -Для партиционирования по месяцам используйте выражение `toYYYYMM(date_column)`, где `date_column` — столбец с датой типа [Date](/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 │ -└──────┴───────┘ -``` - - -## Подробности реализации - -* Операции чтения и записи могут выполняться параллельно. -* Не поддерживаются: - - * Операции `ALTER` и `SELECT...SAMPLE`. - * Индексы. - * [Zero-copy](../../../operations/storing-data.md#zero-copy) репликация возможна, но не рекомендуется. - - :::note Репликация Zero-copy не готова для продакшена - Репликация Zero-copy по умолчанию отключена в 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 со следующими 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 -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') -``` - -## Конфигурация - -Как и GraphiteMergeTree, движок HDFS поддерживает расширенную настройку с помощью конфигурационного файла ClickHouse. Доступны два ключа конфигурации: глобальный (`hdfs`) и пользовательский (`hdfs_*`). Сначала применяется глобальная конфигурация, а затем — пользовательская (если она есть). - -```xml - - - /tmp/keytab/clickhouse.keytab - clickuser@TEST.CLICKHOUSE.TECH - kerberos - - - - - root@TEST.CLICKHOUSE.TECH - -``` - -### Параметры конфигурации - -#### Поддерживаемые 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](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 поддерживается только «старый» подход: -взаимодействие с узлами DataNode не защищено с помощью 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 - -libhdfs3 поддерживает HDFS Namenode HA. - -* Скопируйте `hdfs-site.xml` с узла HDFS в `/etc/clickhouse-server/`. -* Добавьте следующий фрагмент в конфигурационный файл ClickHouse: - -```xml - - /etc/clickhouse-server/hdfs-site.xml - -``` - -* Затем используйте значение тега `dfs.nameservices` из `hdfs-site.xml` в качестве адреса узла NameNode в URI HDFS. Например, замените `hdfs://appadmin@192.168.101.11:8020/abc/` на `hdfs://appadmin@my_nameservice/abc/`. - - -## Виртуальные столбцы {#virtual-columns} - -- `_path` — Путь к файлу. Тип: `LowCardinality(String)`. -- `_file` — Имя файла. Тип: `LowCardinality(String)`. -- `_size` — Размер файла в байтах. Тип: `Nullable(UInt64)`. Если размер неизвестен, значение — `NULL`. -- `_time` — Время последнего изменения файла. Тип: `Nullable(DateTime)`. Если время неизвестно, значение — `NULL`. - - - -## Настройки хранения {#storage-settings} - -- [hdfs_truncate_on_insert](/operations/settings/settings.md#hdfs_truncate_on_insert) — позволяет усечь файл перед вставкой в него данных. По умолчанию отключена. -- [hdfs_create_new_file_on_insert](/operations/settings/settings.md#hdfs_create_new_file_on_insert) — позволяет создавать новый файл при каждой вставке, если формат имеет суффикс. По умолчанию отключена. -- [hdfs_skip_empty_files](/operations/settings/settings.md#hdfs_skip_empty_files) — позволяет пропускать пустые файлы при чтении. По умолчанию отключена. - -**См. также** - -- [Виртуальные столбцы](../../../engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md deleted file mode 100644 index 6849972b2bb..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md +++ /dev/null @@ -1,439 +0,0 @@ ---- -description: 'Движок Hive позволяет выполнять запросы `SELECT` к таблице Hive в HDFS.' -sidebar_label: 'Hive' -sidebar_position: 84 -slug: /engines/table-engines/integrations/hive -title: 'Табличный движок Hive' -doc_type: 'guide' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблицы Hive - - - -Движок Hive позволяет выполнять запросы `SELECT` к таблицам Hive в HDFS. В данный момент он поддерживает следующие форматы входных данных: - -- Text: поддерживает только простые скалярные типы столбцов, за исключением `binary` - -- ORC: поддерживает простые скалярные типы столбцов, за исключением `char`; из сложных типов поддерживает только тип `array` - -- Parquet: поддерживает все простые скалярные типы столбцов; из сложных типов поддерживает только тип `array` - - - -## Создание таблицы - -```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). - -Структура таблицы может отличаться от исходной структуры таблицы Hive: - -* Имена столбцов должны совпадать с именами в исходной таблице Hive, но вы можете использовать только некоторые из этих столбцов и в любом порядке, а также использовать псевдонимы столбцов, вычисляемые из других столбцов. -* Типы столбцов должны быть такими же, как в исходной таблице Hive. -* Выражение `PARTITION BY` должно соответствовать исходной таблице Hive, и столбцы в выражении `PARTITION BY` должны присутствовать в структуре таблицы. - -**Параметры движка** - -* `thrift://host:port` — адрес Hive Metastore - -* `database` — имя удалённой базы данных. - -* `table` — имя удалённой таблицы. - - -## Пример использования - -### Как использовать локальный кэш файловой системы HDFS - -Мы настоятельно рекомендуем включать локальное кэширование для удалённых файловых систем. Тесты производительности показывают, что при использовании кэша работа почти в 2 раза быстрее. - -Перед использованием кэша добавьте его в `config.xml`. - -```xml - - true - local_cache - 559096952 - 1048576 - -``` - -* enable: ClickHouse будет поддерживать локальный кэш для удалённой файловой системы (HDFS) после запуска, если установлено значение true. -* root_dir: Обязательный параметр. Корневой каталог для хранения файлов локального кэша для удалённой файловой системы. -* limit_size: Обязательный параметр. Максимальный размер (в байтах) файлов локального кэша. -* bytes_read_before_flush: Объём данных (в байтах), который будет прочитан перед сбросом на локальную файловую систему при загрузке файла из удалённой файловой системы. Значение по умолчанию — 1 МБ. - -### Запрос к таблице Hive с форматом ввода ORC - -#### Создание таблицы в 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 - - -Таблица в ClickHouse, которая получает данные из созданной выше таблицы Hive: - -```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. -``` - -### Выполнение запроса к таблице Hive с форматом ввода Parquet - -#### Создание таблицы в 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 -Затрачено времени: 0,51 секунд -``` - - -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 -Затраченное время: 36.025 сек. - -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 -Затраченное время: 0.766 сек., получено: 1 строка - -```` - -#### Создание таблицы в ClickHouse - -Таблица в ClickHouse для получения данных из таблицы Hive, созданной выше: -```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 - -ID запроса: 4e35cf02-c7b2-430d-9b81-16f438e5fca9 - -Строка 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 строка. Прошло: 0.357 сек. -``` - -### Запрос к таблице Hive с форматом ввода Text - -#### Создание таблицы в 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 - -Таблица в ClickHouse, получающая данные из таблицы Hive, созданной выше: - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md deleted file mode 100644 index 94cb2998385..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -description: 'Этот движок обеспечивает доступ только для чтения к существующим таблицам Apache Hudi в Amazon S3.' -sidebar_label: 'Hudi' -sidebar_position: 86 -slug: /engines/table-engines/integrations/hudi -title: 'Движок таблиц Hudi' -doc_type: 'reference' ---- - - - -# Табличный движок Hudi - -Этот движок предоставляет доступ только для чтения к существующим таблицам Apache [Hudi](https://hudi.apache.org/) в Amazon S3. - - - -## Создание таблицы - -Имейте в виду, что таблица Hudi должна уже существовать в S3: эта команда не принимает DDL‑параметры для создания новой таблицы. - -```sql -CREATE TABLE hudi_table - ENGINE = Hudi(url, [aws_access_key_id, aws_secret_access_key,]) -``` - -**Параметры движка** - -* `url` — URL бакета с путём к существующей таблице Hudi. -* `aws_access_key_id`, `aws_secret_access_key` — долгосрочные учетные данные пользователя учётной записи [AWS](https://aws.amazon.com/). Их можно использовать для аутентификации запросов. Параметр является необязательным. Если учетные данные не указаны, используются значения из файла конфигурации. - -Параметры движка можно задать с помощью [Named Collections](/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') -``` - -Использование именованных коллекций: - -```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') -``` - - -## См. также {#see-also} - -- [табличная функция Hudi](/sql-reference/table-functions/hudi.md) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md deleted file mode 100644 index 19d3c619c59..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md +++ /dev/null @@ -1,325 +0,0 @@ ---- -description: 'Этот движок обеспечивает доступ только для чтения к существующим таблицам Apache Iceberg в Amazon S3, Azure, HDFS и локальном хранилище.' -sidebar_label: 'Iceberg' -sidebar_position: 90 -slug: /engines/table-engines/integrations/iceberg -title: 'Движок таблиц Iceberg' -doc_type: 'reference' ---- - - - -# Движок таблицы Iceberg {#iceberg-table-engine} - -:::warning -Мы рекомендуем использовать [табличную функцию Iceberg](/sql-reference/table-functions/iceberg.md) для работы с данными Iceberg в ClickHouse. В настоящее время табличная функция Iceberg предоставляет достаточную функциональность, реализуя частичный интерфейс только для чтения к таблицам Iceberg. - -Движок таблицы Iceberg доступен, но может иметь ограничения. Изначально ClickHouse не был спроектирован для поддержки таблиц со схемами, которые изменяются извне, что может влиять на работу движка таблицы Iceberg. В результате некоторые возможности, доступные для обычных таблиц, могут быть недоступны или работать некорректно, особенно при использовании старого анализатора запросов. - -Для оптимальной совместимости мы рекомендуем использовать табличную функцию Iceberg, пока мы продолжаем улучшать поддержку движка таблицы Iceberg. -::: - -Этот движок обеспечивает доступ только для чтения к существующим таблицам Apache [Iceberg](https://iceberg.apache.org/) в Amazon S3, Azure, HDFS, а также к локально хранимым таблицам. - - - -## Создание таблицы - -Обратите внимание, что таблица 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') -``` - -Использование именованных коллекций: - -```xml - - - - http://test.s3.amazonaws.com/clickhouse-bucket/ - test - test - - - -``` - -```sql -CREATE TABLE iceberg_table ENGINE=IcebergS3(iceberg_conf, filename = 'test_table') - -``` - - -## Псевдонимы {#aliases} - -Движок таблицы `Iceberg` теперь является псевдонимом движка `IcebergS3`. - - - -## Эволюция схемы {#schema-evolution} -В данный момент с помощью CH вы можете читать таблицы Iceberg, схема которых со временем изменялась. В настоящее время поддерживается чтение таблиц, в которых столбцы добавлялись и удалялись, а их порядок менялся. Вы также можете изменить столбец с обязательным значением на столбец, в котором допускается значение NULL. Дополнительно поддерживаются разрешённые преобразования типов для простых типов, а именно:   -* int -> long -* float -> double -* decimal(P, S) -> decimal(P', S), где P' > P. - -Сейчас невозможно изменять вложенные структуры или типы элементов внутри массивов и отображений. - -Чтобы прочитать таблицу, схема которой изменилась после её создания, с использованием динамического вывода схемы, установите allow_dynamic_metadata_for_data_lakes = true при создании таблицы. - - - -## Отсечение партиций {#partition-pruning} - -ClickHouse поддерживает отсечение партиций в запросах SELECT к таблицам Iceberg, что помогает оптимизировать производительность запросов за счёт пропуска нерелевантных файлов данных. Чтобы включить отсечение партиций, установите `use_iceberg_partition_pruning = 1`. Дополнительную информацию об отсечении партиций в Iceberg см. в спецификации: https://iceberg.apache.org/spec/#partitioning - - - -## Time travel {#time-travel} - -В ClickHouse поддерживается механизм time travel для таблиц Iceberg, который позволяет выполнять запросы к историческим данным по заданной временной метке или идентификатору снимка (snapshot). - - - -## Обработка таблиц с удалёнными строками - -В настоящее время поддерживаются только таблицы Iceberg с [позиционными удалениями (position deletes)](https://iceberg.apache.org/spec/#position-delete-files). - -Следующие методы удаления **не поддерживаются**: - -* [удаления по равенству (equality deletes)](https://iceberg.apache.org/spec/#equality-delete-files) -* [векторы удаления (deletion vectors)](https://iceberg.apache.org/spec/#deletion-vectors) (введены в версии 3) - -### Базовое использование - -```sql -SELECT * FROM example_table ORDER BY 1 -SETTINGS iceberg_timestamp_ms = 1714636800000 -``` - -```sql -SELECT * FROM example_table ORDER BY 1 -SETTINGS iceberg_snapshot_id = 3547395809148285433 -``` - -Примечание: Нельзя указывать параметры `iceberg_timestamp_ms` и `iceberg_snapshot_id` в одном запросе одновременно. - -### Важные замечания - -* **Снапшоты** обычно создаются, когда: - * В таблицу записываются новые данные - * Выполняется операция компакции данных - -* **Изменения схемы, как правило, не создают снапшоты** — это приводит к важным особенностям поведения при использовании механизма time travel для таблиц, которые претерпели эволюцию схемы. - -### Примеры сценариев - -Все сценарии приведены на Spark, потому что ClickHouse (CH) пока не поддерживает запись в таблицы Iceberg. - -#### Сценарий 1: Изменения схемы без новых снапшотов - -Рассмотрим следующую последовательность операций: - -```sql --- Создать таблицу с двумя столбцами - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2') - --- Вставить данные в таблицу - INSERT INTO spark_catalog.db.time_travel_example VALUES - (1, 'Mars') - - ts1 = now() // Фрагмент псевдокода - --- Изменить таблицу, добавив новый столбец - ALTER TABLE spark_catalog.db.time_travel_example ADD COLUMN (price double) - - ts2 = now() - --- Вставить данные в таблицу - INSERT INTO spark_catalog.db.time_travel_example VALUES (2, 'Venus', 100) - - ts3 = now() - --- Запросить таблицу для каждой временной метки - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts1; - -+------------+------------+ -|order_number|product_code| -+------------+------------+ -| 1| Mars| -+------------+------------+ - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts2; - -+------------+------------+ -|order_number|product_code| -+------------+------------+ -| 1| Mars| -+------------+------------+ - - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts3; - -+------------+------------+-----+ -|order_number|product_code|price| -+------------+------------+-----+ -| 1| Mars| NULL| -| 2| Venus|100.0| -+------------+------------+-----+ -``` - -Результаты запроса в разные моменты времени: - -* В моменты ts1 и ts2: отображаются только исходные два столбца -* В момент ts3: отображаются все три столбца, при этом для первой строки значение price равно NULL - -#### Сценарий 2: Отличия между исторической и текущей схемами - -Запрос time travel, выполненный в текущий момент времени, может показать схему, отличающуюся от текущей схемы таблицы: - -```sql --- Создание таблицы - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example_2 ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2') - --- Вставка начальных данных в таблицу - INSERT INTO spark_catalog.db.time_travel_example_2 VALUES (2, 'Venus'); - --- Изменение таблицы для добавления нового столбца - ALTER TABLE spark_catalog.db.time_travel_example_2 ADD COLUMN (price double); - - ts = now(); - --- Запрос таблицы на текущий момент с использованием синтаксиса временной метки - - SELECT * FROM spark_catalog.db.time_travel_example_2 TIMESTAMP AS OF ts; - - +------------+------------+ - |order_number|product_code| - +------------+------------+ - | 2| Venus| - +------------+------------+ - --- Запрос таблицы на текущий момент - SELECT * FROM spark_catalog.db.time_travel_example_2; - +------------+------------+-----+ - |order_number|product_code|price| - +------------+------------+-----+ - | 2| Venus| NULL| - +------------+------------+-----+ -``` - -Это происходит потому, что `ALTER TABLE` не создает новый снимок, а для текущей таблицы Spark берет значение `schema_id` из последнего файла метаданных, а не из снимка. - - -#### Сценарий 3: Отличия между исторической и текущей схемами - -Второй момент заключается в том, что при выполнении операции time travel вы не можете получить состояние таблицы до того, как в неё были записаны какие-либо данные: - -```sql --- Создание таблицы - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example_3 ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2'); - - ts = now(); - --- Запрос таблицы на определённую временную метку - SELECT * FROM spark_catalog.db.time_travel_example_3 TIMESTAMP AS OF ts; -- Завершается ошибкой: Cannot find a snapshot older than ts. -``` - -В ClickHouse поведение аналогично Spark. Вы можете мысленно заменить запросы Select в Spark на запросы Select в ClickHouse — и всё будет работать так же. - - -## Определение файла метаданных - -При использовании движка таблиц `Iceberg` в ClickHouse системе необходимо найти корректный файл metadata.json, который описывает структуру таблицы Iceberg. Ниже описано, как работает этот процесс определения: - -### Поиск кандидатов - -1. **Явное указание пути**: - -* Если вы задаёте `iceberg_metadata_file_path`, система будет использовать именно этот путь, комбинируя его с путём к директории таблицы Iceberg. -* При наличии этого параметра все остальные параметры определения игнорируются. - -2. **Сопоставление UUID таблицы**: - -* Если указан `iceberg_metadata_table_uuid`, система будет: - * Рассматривать только файлы `.metadata.json` в директории `metadata` - * Отфильтровывать файлы, содержащие поле `table-uuid`, совпадающее с указанным UUID (без учёта регистра) - -3. **Поиск по умолчанию**: - -* Если ни один из вышеперечисленных параметров не задан, все файлы `.metadata.json` в директории `metadata` рассматриваются как кандидаты - -### Выбор самого нового файла - -После определения файлов-кандидатов по указанным правилам система решает, какой из них является самым новым: - -* Если включён `iceberg_recent_metadata_file_by_last_updated_ms_field`: - * Выбирается файл с максимальным значением поля `last-updated-ms` - -* В противном случае: - * Выбирается файл с наибольшим номером версии - * (Версия представлена как `V` в именах файлов формата `V.metadata.json` или `V-uuid.metadata.json`) - -**Примечание**: Все упомянутые параметры являются настройками на уровне движка и должны указываться при создании таблицы, как показано ниже: - -```sql -CREATE TABLE example_table ENGINE = Iceberg( - 's3://bucket/path/to/iceberg_table' -) SETTINGS iceberg_metadata_table_uuid = '6f6f6407-c6a5-465f-a808-ea8900e35a38'; -``` - -**Примечание**: Хотя каталоги Iceberg обычно отвечают за разрешение метаданных, табличный движок `Iceberg` в ClickHouse напрямую интерпретирует файлы, хранящиеся в S3, как таблицы Iceberg, поэтому важно понимать правила их разрешения. - - -## Кэш данных {#data-cache} - -Табличный движок `Iceberg` и одноимённая табличная функция поддерживают кэширование данных так же, как и хранилища `S3`, `AzureBlobStorage`, `HDFS`. См. [здесь](../../../engines/table-engines/integrations/s3.md#data-cache). - - - -## Кэш метаданных {#metadata-cache} - -Движок таблиц и табличная функция `Iceberg` поддерживают кэш метаданных, в котором хранится информация о manifest-файлах, списке manifest и JSON-файле метаданных. Кэш хранится в памяти. Эта функция управляется настройкой `use_iceberg_metadata_files_cache`, которая по умолчанию включена. - - - -## См. также {#see-also} - -- [табличная функция iceberg](/sql-reference/table-functions/iceberg.md) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md deleted file mode 100644 index 36d0a797d64..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: 'Документация по табличным движкам для интеграций' -sidebar_label: 'Интеграции' -sidebar_position: 40 -slug: /engines/table-engines/integrations/ -title: 'Табличные движки для интеграций' -doc_type: 'reference' ---- - - - -# Движки таблиц для интеграций - -ClickHouse предоставляет различные способы интеграции с внешними системами, включая движки таблиц. Как и для всех остальных движков таблиц, конфигурация выполняется с помощью запросов `CREATE TABLE` или `ALTER TABLE`. Затем, с точки зрения пользователя, настроенная интеграция выглядит как обычная таблица, но запросы к ней проксируются во внешнюю систему. Такое прозрачное выполнение запросов является одним из ключевых преимуществ этого подхода по сравнению с альтернативными методами интеграции, такими как словари или табличные функции, которые требуют использования специальных способов обращения при каждом запросе. - -{/* Таблица оглавления для этой страницы автоматически генерируется скриптом - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - на основе полей фронтматтера YAML: slug, description, title. - - Если вы заметили ошибку, отредактируйте YML-фронтматтер самих страниц. - */ } - - -{/*AUTOGENERATED_START*/ } - -| Страница | Описание | -| --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Движок таблицы AzureBlobStorage](/engines/table-engines/integrations/azureBlobStorage) | Этот движок реализует интеграцию с экосистемой Azure Blob Storage. | -| [Табличный движок DeltaLake](/engines/table-engines/integrations/deltalake) | Этот движок предоставляет доступ только для чтения к существующим таблицам Delta Lake в Amazon S3. | -| [Движок таблицы EmbeddedRocksDB](/engines/table-engines/integrations/embedded-rocksdb) | Этот движок обеспечивает интеграцию ClickHouse с RocksDB | -| [Движок таблицы ExternalDistributed](/engines/table-engines/integrations/ExternalDistributed) | Движок `ExternalDistributed` позволяет выполнять запросы `SELECT` к данным, которые хранятся на удалённых серверах MySQL или PostgreSQL. Принимает движки MySQL или PostgreSQL в качестве аргумента, что позволяет использовать шардинг. | -| [Движок таблицы TimeSeries](/engines/table-engines/special/time_series) | Движок таблицы, хранящий временные ряды, то есть набор значений, связанных с временными метками и тегами (метками). | -| [Движок таблицы HDFS](/engines/table-engines/integrations/hdfs) | Этот движок обеспечивает интеграцию с экосистемой Apache Hadoop, позволяя управлять данными в HDFS из ClickHouse. Он похож на движки File и URL, но предоставляет специализированные для Hadoop возможности. | -| [Движок таблиц Hive](/engines/table-engines/integrations/hive) | Движок Hive позволяет выполнять запросы `SELECT` по таблице Hive в HDFS. | -| [Движок таблиц Hudi](/engines/table-engines/integrations/hudi) | Этот движок обеспечивает доступ только для чтения к существующим таблицам Apache Hudi в Amazon S3. | -| [Табличный движок Iceberg](/engines/table-engines/integrations/iceberg) | Этот движок обеспечивает доступную только для чтения интеграцию с существующими таблицами Apache Iceberg в Amazon S3, Azure, HDFS, а также с локально хранящимися таблицами. | -| [Табличный движок JDBC](/engines/table-engines/integrations/jdbc) | Позволяет ClickHouse подключаться к внешним базам данных посредством JDBC. | -| [Движок таблиц Kafka](/engines/table-engines/integrations/kafka) | Движок таблиц Kafka можно использовать для работы с Apache Kafka; он позволяет публиковать данные и подписываться на потоки данных, организовывать отказоустойчивое хранение данных и обрабатывать потоки по мере их поступления. | -| [Движок таблиц MaterializedPostgreSQL](/engines/table-engines/integrations/materialized-postgresql) | Создаёт таблицу ClickHouse, заполняя её начальными данными из дампа таблицы PostgreSQL, и запускает процесс репликации. | -| [Табличный движок MongoDB](/engines/table-engines/integrations/mongodb) | Движок MongoDB — это табличный движок только для чтения, который позволяет читать данные из удалённой коллекции. | -| [Движок таблиц MySQL](/engines/table-engines/integrations/mysql) | Документация по табличному движку MySQL | -| [Движок таблицы NATS](/engines/table-engines/integrations/nats) | Этот движок позволяет осуществлять интеграцию ClickHouse с NATS для публикации и подписки на сообщения по определённым темам, а также обработки новых сообщений по мере их появления. | -| [Движок таблицы ODBC](/engines/table-engines/integrations/odbc) | Позволяет ClickHouse подключаться к внешним базам данных по ODBC. | -| [Движок таблиц PostgreSQL](/engines/table-engines/integrations/postgresql) | Движок PostgreSQL позволяет выполнять запросы `SELECT` и `INSERT` к данным, хранящимся на удалённом сервере PostgreSQL. | -| [Движок таблиц RabbitMQ](/engines/table-engines/integrations/rabbitmq) | Этот движок позволяет интегрировать ClickHouse с RabbitMQ. | -| [Табличный движок Redis](/engines/table-engines/integrations/redis) | Этот движок позволяет интегрировать ClickHouse с Redis. | -| [Движок таблицы S3](/engines/table-engines/integrations/s3) | Этот движок обеспечивает интеграцию с экосистемой Amazon S3. Аналогичен движку HDFS, но поддерживает функции, специфичные для S3. | -| [Движок таблицы S3Queue](/engines/table-engines/integrations/s3queue) | Этот движок обеспечивает интеграцию с экосистемой Amazon S3 и позволяет выполнять потоковый импорт. Аналогичен движкам Kafka и RabbitMQ, но предоставляет возможности, специфичные для S3. | -| [Движок таблицы AzureQueue](/engines/table-engines/integrations/azure-queue) | Этот движок интегрируется с экосистемой Azure Blob Storage и поддерживает потоковый импорт данных. | -| [Движок таблиц YTsaurus](/engines/table-engines/integrations/ytsaurus) | Табличный движок для импорта данных из кластера YTsaurus. | -| [Движок таблиц SQLite](/engines/table-engines/integrations/sqlite) | Движок позволяет импортировать данные в SQLite и экспортировать их из него, а также поддерживает выполнение запросов к таблицам SQLite напрямую из ClickHouse. | -| [Движок таблицы ArrowFlight](/engines/table-engines/integrations/arrowflight) | Движок позволяет выполнять запросы к удалённым наборам данных по протоколу Apache Arrow Flight. | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md deleted file mode 100644 index ab2de4f7cf0..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -description: 'Позволяет ClickHouse подключаться к внешним базам данных через JDBC.' -sidebar_label: 'JDBC' -sidebar_position: 100 -slug: /engines/table-engines/integrations/jdbc -title: 'Табличный движок JDBC' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблицы JDBC - - - -:::note -clickhouse-jdbc-bridge содержит экспериментальный код и больше не поддерживается. Он может содержать проблемы с надежностью и уязвимости в области безопасности. Используйте его на свой страх и риск. -ClickHouse рекомендует использовать встроенные табличные функции ClickHouse, которые являются более удачной альтернативой для сценариев разовых запросов (Postgres, MySQL, MongoDB и т. д.). -::: - -Позволяет 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). - - - -## Создание таблицы - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]имя_таблицы -( - список_столбцов... -) -ENGINE = JDBC(источник_данных, внешняя_база_данных, внешняя_таблица) -``` - -**Параметры движка** - -* `datasource` — URI или имя внешней СУБД. - - Формат URI: `jdbc:://:/?user=&password=`. - Пример для MySQL: `jdbc:mysql://localhost:3306/?user=root&password=root`. - -* `external_database` — имя базы данных во внешней СУБД или, вместо этого, явно заданная схема таблицы (см. примеры). - -* `external_table` — имя таблицы во внешней базе данных или оператор SELECT вида `select * from table1 where column1=1`. - -* Эти параметры также можно передавать с использованием [именованных коллекций](operations/named-collections.md). - - -## Пример использования - -Создание таблицы на сервере 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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md deleted file mode 100644 index 5f5d9e4280f..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md +++ /dev/null @@ -1,315 +0,0 @@ ---- -description: 'Табличный движок Kafka может использоваться для интеграции с Apache Kafka: он позволяет публиковать данные и подписываться на потоки данных, организовывать отказоустойчивое хранение и обрабатывать потоки по мере их поступления.' -sidebar_label: 'Kafka' -sidebar_position: 110 -slug: /engines/table-engines/integrations/kafka -title: 'Табличный движок Kafka' -keywords: ['Kafka', 'табличный движок'] -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# Табличный движок Kafka - -:::tip -Если вы используете ClickHouse Cloud, мы рекомендуем вместо этого использовать [ClickPipes](/integrations/clickpipes). ClickPipes нативно поддерживает приватные сетевые соединения, независимое масштабирование ресурсов для приёма данных и ресурсов кластера, а также всесторонний мониторинг при потоковой загрузке данных из Kafka в ClickHouse. -::: - -- Публиковать или подписываться на потоки данных. -- Организовывать отказоустойчивое хранилище. -- Обрабатывать потоки по мере их поступления. - -## Создание таблицы - -```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_security_protocol = '',] - [kafka_sasl_mechanism = '',] - [kafka_sasl_username = '',] - [kafka_sasl_password = '',] - [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_compression_codec = '',] - [kafka_compression_level = -1]; -``` - -Обязательные параметры: - -* `kafka_broker_list` — список брокеров, разделённых запятыми (например, `localhost:9092`). -* `kafka_topic_list` — список топиков Kafka. -* `kafka_group_name` — группа потребителей Kafka. Смещения чтения отслеживаются для каждой группы отдельно. Если вы не хотите, чтобы сообщения дублировались в кластере, используйте одинаковое имя группы во всех местах. -* `kafka_format` — формат сообщений. Использует ту же нотацию, что и SQL-функция `FORMAT`, например `JSONEachRow`. Для получения дополнительной информации см. раздел [Formats](../../../interfaces/formats.md). - -Необязательные параметры: - - -- `kafka_security_protocol` - Протокол, используемый для связи с брокерами. Возможные значения: `plaintext`, `ssl`, `sasl_plaintext`, `sasl_ssl`. -- `kafka_sasl_mechanism` - Механизм SASL, используемый для аутентификации. Возможные значения: `GSSAPI`, `PLAIN`, `SCRAM-SHA-256`, `SCRAM-SHA-512`, `OAUTHBEARER`. -- `kafka_sasl_username` - Имя пользователя SASL для использования с механизмами `PLAIN` и `SASL-SCRAM-..`. -- `kafka_sasl_password` - Пароль SASL для использования с механизмами `PLAIN` и `SASL-SCRAM-..`. -- `kafka_schema` — Параметр, который необходимо использовать, если формат требует определения схемы. Например, [Cap'n Proto](https://capnproto.org/) требует путь к файлу схемы и имя корневого объекта `schema.capnp:Message`. -- `kafka_schema_registry_skip_bytes` — Количество байтов, которые нужно пропустить в начале каждого сообщения при использовании реестра схем с заголовками-оболочками (например, AWS Glue Schema Registry с 19-байтовой оболочкой). Диапазон: `[0, 255]`. Значение по умолчанию: `0`. -- `kafka_num_consumers` — Количество консьюмеров для таблицы. Укажите больше консьюмеров, если пропускной способности одного консьюмера недостаточно. Общее количество консьюмеров не должно превышать количество партиций в топике, так как только один консьюмер может быть назначен на партицию, и не должно быть больше числа физических ядер на сервере, где развернут ClickHouse. Значение по умолчанию: `1`. -- `kafka_max_block_size` — Максимальный размер батча (в сообщениях) для операции poll. Значение по умолчанию: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size). -- `kafka_skip_broken_messages` — Допустимое количество сообщений Kafka с несовместимой схемой на блок при разборе сообщений. Если `kafka_skip_broken_messages = N`, то движок пропускает *N* сообщений Kafka, которые не могут быть разобраны (сообщение соответствует строке данных). Значение по умолчанию: `0`. -- `kafka_commit_every_batch` — Фиксировать (commit) каждый прочитанный и обработанный батч вместо одного коммита после записи целого блока. Значение по умолчанию: `0`. -- `kafka_client_id` — Идентификатор клиента. По умолчанию пустой. -- `kafka_poll_timeout_ms` — Таймаут для одной операции poll из Kafka. Значение по умолчанию: [stream_poll_timeout_ms](../../../operations/settings/settings.md#stream_poll_timeout_ms). -- `kafka_poll_max_batch_size` — Максимальное количество сообщений, запрашиваемых за один poll Kafka. Значение по умолчанию: [max_block_size](/operations/settings/settings#max_block_size). -- `kafka_flush_interval_ms` — Таймаут для сброса данных из Kafka. Значение по умолчанию: [stream_flush_interval_ms](/operations/settings/settings#stream_flush_interval_ms). -- `kafka_thread_per_consumer` — Выделяет независимый поток для каждого консьюмера. При включении каждый консьюмер сбрасывает данные независимо и параллельно (в противном случае строки от нескольких консьюмеров будут объединяться в один блок). Значение по умолчанию: `0`. -- `kafka_handle_error_mode` — Режим обработки ошибок для движка Kafka. Возможные значения: `default` (будет выброшено исключение, если не удалось разобрать сообщение), `stream` (текст исключения и исходное сообщение будут сохранены в виртуальных колонках `_error` и `_raw_message`), `dead_letter_queue` (данные, связанные с ошибкой, будут сохранены в `system.dead_letter_queue`). -- `kafka_commit_on_select` — Фиксировать сообщения при выполнении запроса `SELECT`. Значение по умолчанию: `false`. -- `kafka_max_rows_per_message` — Максимальное количество строк, записываемых в одно сообщение Kafka для построчных форматов. Значение по умолчанию: `1`. -- `kafka_compression_codec` — Кодек сжатия, используемый при формировании сообщений. Поддерживаются: пустая строка, `none`, `gzip`, `snappy`, `lz4`, `zstd`. В случае пустой строки кодек сжатия не задаётся таблицей, поэтому будут использоваться значения из конфигурационных файлов или значение по умолчанию из `librdkafka`. Значение по умолчанию: пустая строка. -- `kafka_compression_level` — Параметр уровня сжатия для алгоритма, выбранного в `kafka_compression_codec`. Более высокие значения обеспечивают лучшее сжатие за счёт большего использования CPU. Рабочий диапазон зависит от алгоритма: `[0-9]` для `gzip`; `[0-12]` для `lz4`; только `0` для `snappy`; `[0-12]` для `zstd`; `-1` = уровень сжатия по умолчанию, зависящий от кодека. Значение по умолчанию: `-1`. - -Examples: - -```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#default_values). Если вам нужны такие столбцы, вы можете добавить их на уровне материализованного представления (см. ниже). -::: - - -## Описание - -Доставленные сообщения отслеживаются автоматически, поэтому каждое сообщение в группе учитывается только один раз. Если вам нужно получить данные дважды, создайте копию таблицы с другим именем группы. - -Группы гибкие и синхронизируются в кластере. Например, если у вас есть 10 топиков и 5 копий таблицы в кластере, то каждая копия получает по 2 топика. Если количество копий меняется, топики автоматически перераспределяются между копиями. Подробнее об этом читайте на [http://kafka.apache.org/intro](http://kafka.apache.org/intro). - -Рекомендуется, чтобы у каждого топика Kafka была своя собственная группа потребителей, что обеспечивает эксклюзивную связь между топиком и группой, особенно в средах, где топики могут динамически создаваться и удаляться (например, в тестовой или промежуточной среде). - -`SELECT` мало полезен для чтения сообщений (кроме отладки), потому что каждое сообщение может быть прочитано только один раз. На практике удобнее создавать потоки в реальном времени с помощью материализованных представлений. Для этого: - -1. Используйте движок для создания Kafka-потребителя и рассматривайте его как поток данных. -2. Создайте таблицу с нужной структурой. -3. Создайте материализованное представление, которое преобразует данные из движка и помещает их в ранее созданную таблицу. - -Когда `MATERIALIZED VIEW` привязан к движку, он начинает собирать данные в фоновом режиме. Это позволяет непрерывно получать сообщения из Kafka и преобразовывать их в требуемый формат с помощью `SELECT`. -Одна таблица 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#stream_flush_interval_ms) миллисекунд блок не был сформирован, данные будут принудительно записаны в таблицу независимо от полноты блока. - -Чтобы прекратить получение данных топика или изменить логику преобразования, отсоедините материализованное представление: - -```sql - DETACH TABLE consumer; - ATTACH TABLE consumer; -``` - -Если вы хотите изменить целевую таблицу с помощью `ALTER`, рекомендуем отключить материализованное представление, чтобы избежать расхождений между целевой таблицей и данными из представления. - - -## Конфигурация - -Как и движок GraphiteMergeTree, движок Kafka поддерживает расширенную конфигурацию с использованием файла конфигурации ClickHouse. Вы можете использовать два ключа конфигурации: глобальный (в секции ``) и на уровне топика (в секции ``). Сначала применяется глобальная конфигурация, а затем — конфигурация для конкретного топика (если она задана). - -```xml - - - cgrp - 3000 - - - logs - 4000 - - - - - smallest - - logs - 100000 - - - - stats - 50000 - - - - - - - logs - 250 - - - - stats - 400 - - - -``` - -Список доступных параметров конфигурации приведён в [справочнике по конфигурации librdkafka](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md). Используйте символ подчёркивания (`_`) вместо точки в конфигурации ClickHouse. Например, `check.crcs=true` будет записано как `true`. - - -### Поддержка Kerberos - -Для работы с Kafka с поддержкой Kerberos добавьте дочерний элемент `security_protocol` со значением `sasl_plaintext`. Этого достаточно при наличии действительного Kerberos ticket-granting ticket (TGT), уже полученного и закэшированного средствами операционной системы. -ClickHouse может самостоятельно поддерживать учетные данные Kerberos с использованием файла keytab. Для этого используйте дочерние элементы `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 поддерживает все [форматы](../../../interfaces/formats.md), поддерживаемые в ClickHouse. -Количество строк в одном сообщении Kafka зависит от того, является ли формат построчным или блочным: - -- Для построчных форматов количество строк в одном сообщении Kafka можно контролировать с помощью настройки `kafka_max_rows_per_message`. -- Для блочных форматов мы не можем разделить блок на более мелкие части, но количество строк в одном блоке можно контролировать с помощью общего параметра настройки [max_block_size](/operations/settings/settings#max_block_size). - -## Движок для хранения зафиксированных смещений в ClickHouse Keeper - - - -Если включён параметр `allow_experimental_kafka_offsets_storage_in_keeper`, для табличного движка 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}/{uuid}', - kafka_replica_name = '{replica}' -SETTINGS allow_experimental_kafka_offsets_storage_in_keeper=1; -``` - - -### Известные ограничения {#known-limitations} - -Поскольку новый движок является экспериментальным, он ещё не готов для промышленного использования. На данный момент в реализации есть несколько известных ограничений: - -- Наибольшее ограничение заключается в том, что движок не поддерживает прямое чтение. Чтение из движка с использованием материализованных представлений и запись в движок работают, но прямое чтение — нет. В результате все прямые запросы `SELECT` будут завершаться с ошибкой. -- Быстрое удаление и пересоздание таблицы или указание одного и того же пути ClickHouse Keeper для разных движков может вызывать проблемы. В качестве рекомендуемой практики можно использовать `{uuid}` в `kafka_keeper_path`, чтобы избежать конфликтов путей. -- Для обеспечения повторяемости чтения сообщения не могут потребляться из нескольких партиций в одном потоке. С другой стороны, потребители Kafka должны регулярно опрашиваться, чтобы оставаться «живыми». В результате этих двух требований мы решили разрешать создание нескольких потребителей только в том случае, если включён `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#background_message_broker_schedule_pool_size) -- [system.kafka_consumers](../../../operations/system-tables/kafka_consumers.md) \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md deleted file mode 100644 index d2005238932..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -description: 'Создаёт таблицу ClickHouse на основе начального дампа данных из таблицы PostgreSQL и запускает процесс репликации.' -sidebar_label: 'MaterializedPostgreSQL' -sidebar_position: 130 -slug: /engines/table-engines/integrations/materialized-postgresql -title: 'Движок таблицы MaterializedPostgreSQL' -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблицы MaterializedPostgreSQL - - - - - -:::note -Пользователям ClickHouse Cloud рекомендуется использовать [ClickPipes](/integrations/clickpipes) для репликации PostgreSQL в ClickHouse. Это решение нативно поддерживает высокопроизводительную фиксацию изменений данных (CDC, Change Data Capture) для PostgreSQL. -::: - -Создает таблицу ClickHouse с начальным дампом данных таблицы PostgreSQL и запускает процесс репликации, то есть выполняет фоновую задачу по применению новых изменений по мере их появления в таблице PostgreSQL удаленной базы данных. - -:::note -Этот движок таблицы является экспериментальным. Чтобы использовать его, установите `allow_experimental_materialized_postgresql_table` в значение 1 в ваших конфигурационных файлах или с помощью команды `SET`: - -```sql -SET allow_experimental_materialized_postgresql_table=1 -``` - -::: - -Если требуется более одной таблицы, настоятельно рекомендуется использовать движок базы данных [MaterializedPostgreSQL](../../../engines/database-engines/materialized-postgresql.md) вместо движка таблицы и настройку `materialized_postgresql_tables_list`, которая задаёт список реплицируемых таблиц (также можно будет указать `schema` базы данных). Такой подход значительно лучше с точки зрения нагрузки на CPU, количества подключений и числа слотов репликации в удалённой базе данных PostgreSQL. - - -## Создание таблицы - -```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. Параметр [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) должен иметь значение `logical`, а параметр `max_replication_slots` — значение не менее `2` в конфигурационном файле PostgreSQL. - -2. Таблица с движком `MaterializedPostgreSQL` должна иметь первичный ключ — тот же, что и индекс replica identity (по умолчанию — первичный ключ) соответствующей таблицы PostgreSQL (см. [подробности об индексе replica identity](../../../engines/database-engines/materialized-postgresql.md#requirements)). - -3. Допускается только тип базы данных [Atomic](https://en.wikipedia.org/wiki/Atomicity_(database_systems)). - -4. Движок таблицы `MaterializedPostgreSQL` работает только с PostgreSQL версии >= 11, поскольку реализация использует функцию PostgreSQL [pg_replication_slot_advance](https://pgpedia.info/p/pg_replication_slot_advance.html). - - - -## Виртуальные столбцы - -* `_version` — счётчик транзакций. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md). - -* `_sign` — метка удаления. Тип: [Int8](../../../sql-reference/data-types/int-uint.md). Возможные значения: - * `1` — строка не удалена, - * `-1` — строка удалена. - -Эти столбцы не нужно добавлять при создании таблицы. Они всегда доступны в запросах `SELECT`. -Столбец `_version` равен позиции `LSN` в `WAL`, поэтому его можно использовать для проверки актуальности репликации. - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md deleted file mode 100644 index 75fee13a8d4..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md +++ /dev/null @@ -1,245 +0,0 @@ ---- -description: 'Движок таблицы MongoDB — это движок только для чтения, который позволяет считывать данные из удалённой коллекции.' -sidebar_label: 'MongoDB' -sidebar_position: 135 -slug: /engines/table-engines/integrations/mongodb -title: 'Движок таблицы MongoDB' -doc_type: 'reference' ---- - - - -# Табличный движок MongoDB - -Табличный движок MongoDB — это движок только для чтения, который позволяет читать данные из удалённой коллекции [MongoDB](https://www.mongodb.com/). - -Поддерживаются только серверы MongoDB версии 3.6 и выше. -[Seed list (`mongodb+srv`)](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-seed-list) пока не поддерживается. - - - -## Создание таблицы - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name -( - name1 [type1], - name2 [type2], - ... -) ENGINE = MongoDB(host:port, database, collection, user, password[, options[, oid_columns]]); -``` - -**Параметры движка** - -| Параметр | Описание | -| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `host:port` | Адрес сервера MongoDB. | -| `database` | Имя удалённой базы данных. | -| `collection` | Имя удалённой коллекции. | -| `user` | Пользователь MongoDB. | -| `password` | Пароль пользователя. | -| `options` | Необязательный параметр. Параметры строки подключения MongoDB [options](https://www.mongodb.com/docs/manual/reference/connection-string-options/#connection-options) в формате URL-строки, например: `'authSource=admin&ssl=true'`. | -| `oid_columns` | Разделённый запятыми список столбцов, которые должны интерпретироваться как `oid` в предложении WHERE. По умолчанию `_id`. | - -:::tip -Если вы используете облачный сервис MongoDB Atlas, URL подключения можно получить в разделе «Atlas SQL». -Seed-список(`mongodb**+srv**`) пока не поддерживается, но поддержка будет добавлена в будущих релизах. -::: - -Либо вы можете передать URI: - -```sql -ENGINE = MongoDB(uri, collection[, oid_columns]); -``` - -**Параметры движка** - -| Параметр | Описание | -| ------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -| `uri` | URI подключения к серверу MongoDB. | -| `collection` | Имя коллекции на удалённом сервере. | -| `oid_columns` | Список имён столбцов, разделённых запятыми, которые в предложении WHERE должны интерпретироваться как `oid`. По умолчанию — `_id`. | - - -## Сопоставление типов - -| MongoDB | ClickHouse | -| ----------------------- | ------------------------------------------------------------------------------------ | -| bool, int32, int64 | *любой числовой тип, кроме Decimals*, Boolean, String | -| double | Float64, String | -| date | Date, Date32, DateTime, DateTime64, String | -| string | String, *любой числовой тип (кроме Decimals), если значение имеет корректный формат* | -| document | String (как JSON) | -| array | Array, String (как JSON) | -| oid | String | -| binary | String, если в столбце; строка в кодировке base64, если в массиве или документе | -| uuid (binary subtype 4) | UUID | -| *any other* | String | - -Если ключ не найден в документе MongoDB (например, имя столбца не совпадает), будет вставлено значение по умолчанию или `NULL` (если столбец допускает значения `NULL`). - -### OID - -Если вы хотите, чтобы `String` обрабатывался как `oid` в условии WHERE, просто укажите имя столбца в последнем аргументе движка таблицы. -Это может понадобиться при выборке записи по столбцу `_id`, который по умолчанию имеет тип `oid` в MongoDB. -Если поле `_id` в таблице имеет другой тип, например `uuid`, необходимо указать пустой `oid_columns`, иначе по умолчанию используется значение `_id` для этого параметра. - -```javascript -db.sample_oid.insertMany([ - {"another_oid_column": ObjectId()}, -]); - -db.sample_oid.find(); -[ - { - "_id": {"$oid": "67bf6cc44ebc466d33d42fb2"}, - "another_oid_column": {"$oid": "67bf6cc40000000000ea41b1"} - } -] -``` - -По умолчанию только `_id` считается столбцом типа `oid`. - -```sql -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('mongodb://user:pass@host/db', 'sample_oid'); - -SELECT count() FROM sample_oid WHERE _id = '67bf6cc44ebc466d33d42fb2'; --вернёт 1. -SELECT count() FROM sample_oid WHERE another_oid_column = '67bf6cc40000000000ea41b1'; --вернёт 0 -``` - -В этом случае результат будет `0`, потому что ClickHouse не знает, что `another_oid_column` имеет тип данных `oid`, поэтому давайте это исправим: - -```sql -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('mongodb://user:pass@host/db', 'sample_oid', '_id,another_oid_column'); - --- или - -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('host', 'db', 'sample_oid', 'user', 'pass', '', '_id,another_oid_column'); - -SELECT count() FROM sample_oid WHERE another_oid_column = '67bf6cc40000000000ea41b1'; -- теперь вернёт 1 -``` - - -## Поддерживаемые предложения - -Поддерживаются только запросы с простыми выражениями (например, `WHERE field = ORDER BY field2 LIMIT `). -Такие выражения переводятся в язык запросов MongoDB и выполняются на стороне сервера. -Вы можете отключить все эти ограничения, используя [mongodb_throw_on_unsupported_query](../../../operations/settings/settings.md#mongodb_throw_on_unsupported_query). -В этом случае ClickHouse пытается преобразовать запрос на основе принципа «best effort», но это может привести к полному сканированию таблицы и обработке на стороне 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`. - -::: - - -## Пример использования - -Предположим, что в MongoDB загружен набор данных [sample_mflix](https://www.mongodb.com/docs/atlas/sample-data/sample-mflix). - -Создайте таблицу в ClickHouse, которая позволит читать данные из коллекции в MongoDB: - -```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 -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: Молодой человек случайно переносится на 30 лет в прошлое на машине времени DeLorean, изобретённой его другом, доктором Эмметом Брауном, и должен сделать так, чтобы его родители-старшеклассники встретились и полюбили друг друга, иначе он сам перестанет существовать. -genres: ['Adventure','Comedy','Sci-Fi'] -directors: ['Robert Zemeckis'] -released: 1985-07-03 - -Row 2: -────── -title: Back to the Future Part II -plot: После визита в 2015 год Марти МакФлай должен снова отправиться в 1955 год, чтобы предотвратить катастрофические изменения в 1985 году... не вмешиваясь при этом в события своего первого путешествия. -genres: ['Action','Adventure','Comedy'] -directors: ['Robert Zemeckis'] -released: 1989-11-22 -``` - -```sql --- Найти топ-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 - ┌─название───────────────┬─рейтинг┐ -1. │ Старикам тут не место │ 8.1 │ -2. │ Закатный экспресс │ 7.4 │ -3. │ Дорога │ 7.3 │ - └────────────────────────┴────────┘ -``` - - -## Диагностика и устранение неполадок {#troubleshooting} -Сгенерированный запрос MongoDB можно увидеть в журналах с уровнем DEBUG. - -Подробности реализации приведены в документации [mongocxx](https://github.com/mongodb/mongo-cxx-driver) и [mongoc](https://github.com/mongodb/mongo-c-driver). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md deleted file mode 100644 index c9414d2e3e4..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -description: 'Документация по табличному движку MySQL' -sidebar_label: 'MySQL' -sidebar_position: 138 -slug: /engines/table-engines/integrations/mysql -title: 'Табличный движок MySQL' -doc_type: 'reference' ---- - - - -# Движок таблицы MySQL - -Движок MySQL позволяет выполнять запросы `SELECT` и `INSERT` к данным, которые хранятся на удалённом сервере MySQL. - - - -## Создание таблицы - -```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). - -Структура таблицы может отличаться от исходной структуры таблицы MySQL: - -* Имена столбцов должны совпадать с именами в исходной таблице MySQL, но вы можете использовать только некоторые из этих столбцов и в любом порядке. -* Типы столбцов могут отличаться от типов в исходной таблице MySQL. ClickHouse пытается [приводить](../../../engines/database-engines/mysql.md#data_types-support) значения к типам данных ClickHouse. -* Настройка [external_table_functions_use_nulls](/operations/settings/settings#external_table_functions_use_nulls) определяет, как обрабатывать столбцы типа Nullable. Значение по умолчанию: 1. Если 0, табличная функция не делает столбцы Nullable и вставляет значения по умолчанию вместо null. Это также применимо к значениям NULL внутри массивов. - -**Параметры движка** - -* `host:port` — адрес сервера MySQL. -* `database` — имя удалённой базы данных. -* `table` — имя удалённой таблицы. -* `user` — пользователь MySQL. -* `password` — пароль пользователя. -* `replace_query` — флаг, который преобразует запросы `INSERT INTO` в `REPLACE INTO`. Если `replace_query=1`, запрос подменяется. -* `on_duplicate_clause` — выражение `ON DUPLICATE KEY on_duplicate_clause`, которое добавляется к запросу `INSERT`. - Пример: `INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1`, где `on_duplicate_clause` — это `UPDATE c2 = c2 + 1`. См. [документацию MySQL](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html), чтобы узнать, какое значение `on_duplicate_clause` вы можете использовать с предложением `ON DUPLICATE KEY`. - Чтобы указать `on_duplicate_clause`, необходимо передать `0` в параметр `replace_query`. Если одновременно переданы `replace_query = 1` и `on_duplicate_clause`, ClickHouse генерирует исключение. - -Аргументы также можно передавать с помощью [именованных коллекций](/operations/named-collections.md). В этом случае `host` и `port` должны быть указаны отдельно. Такой подход рекомендуется для продакшн-среды. - -Простые выражения `WHERE`, такие как `=, !=, >, >=, <, <=`, выполняются на сервере MySQL. - -Остальные условия и ограничение выборки `LIMIT` выполняются в ClickHouse только после завершения запроса к MySQL. - -Поддерживаются несколько реплик, которые должны быть перечислены через `|`. Например: - -```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'); -``` - - -## Пример использования - -Создайте таблицу в 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') -``` - -Или используя [именованные коллекции](/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} - -Задаёт число попыток для пула с отказоустойчивостью (failover). - -Возможные значения: - -- Положительное целое число. -- 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) -- [Использование MySQL в качестве источника словаря](/sql-reference/dictionaries#mysql) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md deleted file mode 100644 index be0abe14840..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md +++ /dev/null @@ -1,317 +0,0 @@ ---- -description: 'Этот движок позволяет интегрировать ClickHouse с NATS для публикации - или подписки на темы сообщений и обработки новых сообщений по мере их поступления.' -sidebar_label: 'NATS' -sidebar_position: 140 -slug: /engines/table-engines/integrations/nats -title: 'Табличный движок NATS' -doc_type: 'guide' ---- - - - -# Табличный движок NATS {#redisstreams-engine} - -Этот движок позволяет интегрировать ClickHouse с [NATS](https://nats.io/). - -`NATS` позволяет: - -- Публиковать сообщения в сабжекты (subjects) или подписываться на них. -- Обрабатывать новые сообщения по мере их появления. - - - -## Создание таблицы - -```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` – host:port (например, `localhost:5672`). -* `nats_subjects` – Список subject, к которым таблица NATS подписывается/в которые публикует. Поддерживаются шаблоны subject с подстановочными знаками, такие как `foo.*.bar` или `baz.>`. -* `nats_format` – Формат сообщений. Использует ту же нотацию, что и SQL-функция `FORMAT`, например `JSONEachRow`. Дополнительные сведения см. в разделе [Formats](../../../interfaces/formats.md). - -Необязательные параметры: - -* `nats_schema` – Параметр, который необходимо использовать, если формат требует определения схемы. Например, [Cap'n Proto](https://capnproto.org/) требует путь к файлу схемы и имя корневого объекта `schema.capnp:Message`. -* `nats_stream` – Имя существующего потока (stream) в NATS JetStream. -* `nats_consumer` – Имя существующего постоянного (durable) pull-консьюмера в NATS JetStream. -* `nats_num_consumers` – Количество консьюмеров на таблицу. Значение по умолчанию: `1`. Укажите больше консьюмеров, если пропускной способности одного консьюмера недостаточно (только для NATS core). -* `nats_queue_group` – Имя группы очереди для подписчиков NATS. По умолчанию используется имя таблицы. -* `nats_max_reconnect` – Устаревший параметр, не оказывает никакого эффекта, переподключение выполняется постоянно с таймаутом `nats_reconnect_wait`. -* `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` – Количество строк, собираемых в результате опроса (poll) для сброса данных из NATS. Значение по умолчанию: [max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size). -* `nats_flush_interval_ms` – Таймаут для сброса данных, прочитанных из NATS. Значение по умолчанию: [stream_flush_interval_ms](/operations/settings/settings#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` — Максимальное количество строк, записываемых в одно сообщение NATS для построчных форматов (по умолчанию: `1`). -* `nats_handle_error_mode` — Режим обработки ошибок для движка NATS. Возможные значения: `default` (будет сгенерировано исключение, если не удалось разобрать сообщение), `stream` (сообщение об исключении и исходное сообщение будут сохранены во виртуальных столбцах `_error` и `_raw_message`). - -SSL-подключение: - - -Для безопасного соединения используйте `nats_secure = 1`. -Поведение используемой библиотеки по умолчанию состоит в том, что она не проверяет, достаточно ли безопасно установленное TLS‑соединение. Просрочен ли сертификат, самоподписан, отсутствует или недействителен — соединение всё равно устанавливается. Более строгая проверка сертификатов может быть реализована в будущем. - -Запись в таблицу NATS: - -Если таблица читает только из одного subject, любая операция INSERT будет публиковаться в тот же subject. -Однако, если таблица читает из нескольких subject, необходимо указать, в какой subject мы хотим публиковать. -Поэтому при вставке в таблицу с несколькими subject требуется установить `stream_like_engine_insert_queue`. -Вы можете выбрать один из subject, из которых читает таблица, и публиковать туда свои данные. Например: - -```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. -В частности, вы можете указать пароль Redis для движка NATS: - -```xml - - click - house - clickhouse - -``` - - -## Описание - -`SELECT` не особенно полезен для чтения сообщений (кроме отладки), потому что каждое сообщение может быть прочитано только один раз. Гораздо практичнее создавать потоки в реальном времени с помощью [материализованных представлений](../../../sql-reference/statements/create/view.md). Для этого: - -1. Используйте движок для создания потребителя NATS и рассматривайте его как поток данных. -2. Создайте таблицу с нужной структурой. -3. Создайте материализованное представление, которое преобразует данные из движка и помещает их в ранее созданную таблицу. - -Когда `MATERIALIZED VIEW` подключается к движку, оно начинает собирать данные в фоновом режиме. Это позволяет постоянно получать сообщения из NATS и преобразовывать их в требуемый формат с помощью оператора `SELECT`. -Одна таблица NATS может иметь любое количество материализованных представлений; они не читают данные из таблицы напрямую, а получают только новые записи (блоками). Таким образом, вы можете записывать данные в несколько таблиц с разной степенью детализации (с группировкой — агрегацией и без нее). - -Пример: - -```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; -``` - -Чтобы прекратить приём потоковых данных или изменить логику преобразования, отсоедините материализованное представление: - -```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 поддерживает все [форматы](../../../interfaces/formats.md), поддерживаемые в ClickHouse. -Количество строк в одном сообщении NATS зависит от того, является ли формат строковым или блочным: - -- Для строковых форматов количеством строк в одном сообщении NATS можно управлять с помощью настройки `nats_max_rows_per_message`. -- Для блочных форматов блок нельзя разделить на более мелкие части, но количеством строк в одном блоке можно управлять с помощью общей настройки [max_block_size](/operations/settings/settings#max_block_size). - - - -## Использование JetStream - -Прежде чем использовать движок NATS с NATS JetStream, необходимо создать поток NATS (stream) и устойчивого (durable) pull‑consumer'а. Для этого можно использовать, например, утилиту `nats` из пакета [NATS CLI](https://github.com/nats-io/natscli): - -
- создание stream'а - - ```bash - $ nats stream add - ? Stream Name stream_name - ? Subjects stream_subject - ? Storage file - ? Replication 1 - ? Retention Policy Limits - ? Discard Policy Old - ? Stream Messages Limit -1 - ? Per Subject Messages Limit -1 - ? Total Stream Size -1 - ? Message TTL -1 - ? Max Message Size -1 - ? Duplicate tracking time window 2m0s - ? Allow message Roll-ups No - ? Allow message deletion Yes - ? Allow purging subjects or the entire stream Yes - Stream stream_name was created - - Information for Stream stream_name created 2025-10-03 14:12:51 - - Subjects: stream_subject - Replicas: 1 - Storage: File - - Options: - - Retention: Limits - Acknowledgments: true - Discard Policy: Old - Duplicate Window: 2m0s - Direct Get: true - Allows Msg Delete: true - Allows Purge: true - Allows Per-Message TTL: false - Allows Rollups: false - - Limits: - - Maximum Messages: unlimited - Maximum Per Subject: unlimited - Maximum Bytes: unlimited - Maximum Age: unlimited - Maximum Message Size: unlimited - Maximum Consumers: unlimited - - State: - - Messages: 0 - Bytes: 0 B - First Sequence: 0 - Last Sequence: 0 - Active Consumers: 0 - ``` -
- -
- создание устойчивого pull‑consumer'а - - ```bash - $ nats consumer add - ? Select a Stream stream_name - ? Consumer name consumer_name - ? Delivery target (empty for Pull Consumers) - ? Start policy (all, new, last, subject, 1h, msg sequence) all - ? Acknowledgment policy explicit - ? Replay policy instant - ? Filter Stream by subjects (blank for all) - ? Maximum Allowed Deliveries -1 - ? Maximum Acknowledgments Pending 0 - ? Deliver headers only without bodies No - ? Add a Retry Backoff Policy No - Information for Consumer stream_name > consumer_name created 2025-10-03T14:13:51+03:00 - - Configuration: - - Name: consumer_name - Pull Mode: true - Deliver Policy: All - Ack Policy: Explicit - Ack Wait: 30.00s - Replay Policy: Instant - Max Ack Pending: 1,000 - Max Waiting Pulls: 512 - - State: - - Last Delivered Message: Consumer sequence: 0 Stream sequence: 0 - Acknowledgment Floor: Consumer sequence: 0 Stream sequence: 0 - Outstanding Acks: 0 out of maximum 1,000 - Redelivered Messages: 0 - Unprocessed Messages: 0 - Waiting Pulls: 0 of maximum 512 - ``` -
- -После создания stream'а и устойчивого pull‑consumer'а можно создать таблицу с движком NATS. Для этого необходимо инициализировать параметры: nats_stream, nats_consumer_name и nats_subjects: - -```SQL -CREATE TABLE nats_jet_stream ( - key UInt64, - value UInt64 - ) ENGINE NATS - SETTINGS nats_url = 'localhost:4222', - nats_stream = 'stream_name', - nats_consumer_name = 'consumer_name', - nats_subjects = 'stream_subject', - nats_format = 'JSONEachRow'; -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md deleted file mode 100644 index a2e2691350e..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -description: 'Позволяет ClickHouse подключаться к внешним базам данных через ODBC.' -sidebar_label: 'ODBC' -sidebar_position: 150 -slug: /engines/table-engines/integrations/odbc -title: 'Табличный движок ODBC' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблицы 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). - - - -## Создание таблицы - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] -( - name1 [type1], - name2 [type2], - ... -) -ENGINE = ODBC(источник_данных, внешняя_база_данных, внешняя_таблица) -``` - -См. подробное описание запроса [CREATE TABLE](/sql-reference/statements/create/table). - -Структура таблицы может отличаться от структуры исходной таблицы: - -* Имена столбцов должны совпадать с именами в исходной таблице, но вы можете использовать только часть этих столбцов и в любом порядке. -* Типы столбцов могут отличаться от типов в исходной таблице. ClickHouse пытается [привести](/sql-reference/functions/type-conversion-functions#cast) значения к типам данных ClickHouse. -* Настройка [external_table_functions_use_nulls](/operations/settings/settings#external_table_functions_use_nulls) определяет, как обрабатывать столбцы типа Nullable. Значение по умолчанию: 1. Если установлено 0, табличная функция не делает столбцы Nullable и вставляет значения по умолчанию вместо null. Это также относится к значениям NULL внутри массивов. - -**Параметры движка** - -* `datasource` — Имя раздела с настройками подключения в файле `odbc.ini`. -* `external_database` — Имя базы данных во внешней СУБД. -* `external_table` — Имя таблицы в `external_database`. - -Эти параметры также можно передавать с помощью [именованных коллекций](operations/named-collections.md). - - -## Пример использования - -**Получение данных из локального экземпляра MySQL через ODBC** - -Этот пример протестирован на Ubuntu Linux 18.04 и MySQL Server 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 -``` - -Вы можете проверить соединение с помощью утилиты `isql`, входящей в состав unixODBC. - -```bash -$ isql -v mysqlconn -+-------------------------+ -| Подключено! | -| | -... -``` - -Таблица в 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) -``` - -Таблица в ClickHouse, которая получает данные из таблицы MySQL: - -```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](/sql-reference/dictionaries#mysql) -- [Табличная функция ODBC](../../../sql-reference/table-functions/odbc.md) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md deleted file mode 100644 index 0258bcab40f..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: 'Табличный движок PostgreSQL позволяет выполнять запросы `SELECT` и `INSERT` к данным, хранящимся на удалённом сервере PostgreSQL.' -sidebar_label: 'PostgreSQL' -sidebar_position: 160 -slug: /engines/table-engines/integrations/postgresql -title: 'Табличный движок PostgreSQL' -doc_type: 'guide' ---- - - - -# Движок таблиц PostgreSQL - -Движок PostgreSQL позволяет выполнять запросы `SELECT` и `INSERT` к данным, хранящимся на удалённом сервере PostgreSQL. - -:::note -В настоящее время поддерживаются только версии PostgreSQL 12 и выше. -::: - -:::tip -Пользователям ClickHouse Cloud рекомендуется использовать [ClickPipes](/integrations/clickpipes) для потоковой передачи данных из Postgres в ClickHouse. Это обеспечивает встроенную поддержку высокопроизводительной вставки, при этом сохраняя разделение зон ответственности за счёт возможности независимо масштабировать ингестию и ресурсы кластера. -::: - - - -## Создание таблицы - -```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). - -Структура таблицы может отличаться от исходной структуры таблицы PostgreSQL: - -* Имена столбцов должны совпадать с исходной таблицей PostgreSQL, но вы можете использовать только часть этих столбцов и в любом порядке. -* Типы столбцов могут отличаться от типов в исходной таблице PostgreSQL. ClickHouse пытается [привести](../../../engines/database-engines/postgresql.md#data_types-support) значения к типам данных ClickHouse. -* Настройка [external_table_functions_use_nulls](/operations/settings/settings#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`. Необязательный параметр. Примечание: добавление этой опции сделает вставку менее эффективной. - -Для продакшен-среды рекомендуется использовать [именованные коллекции](/operations/named-collections.md) (доступно начиная с версии 21.11). Ниже приведён пример: - -```xml - - - localhost - 5432 - postgres - **** - schema1 - - -``` - -Некоторые параметры можно переопределить, передав аргументы вида «ключ–значение»: - -```sql -SELECT * FROM postgresql(postgres_creds, table='table1'); -``` - - -## Особенности реализации - -Запросы `SELECT` на стороне PostgreSQL выполняются как `COPY (SELECT ...) TO STDOUT` внутри транзакции PostgreSQL только для чтения с фиксацией (commit) после каждого запроса `SELECT`. - -Простые выражения `WHERE`, такие как `=`, `!=`, `>`, `>=`, `<`, `<=` и `IN`, выполняются на сервере PostgreSQL. - -Все соединения, агрегации, сортировка, условия `IN [ array ]`, а также ограничение выборки `LIMIT` выполняются в ClickHouse только после завершения запроса к PostgreSQL. - -Запросы `INSERT` на стороне PostgreSQL выполняются как `COPY "table_name" (field1, field2, ... fieldN) FROM STDIN` внутри транзакции PostgreSQL с автоматической фиксацией (auto-commit) после каждого оператора `INSERT`. - -Типы `Array` в PostgreSQL преобразуются в массивы 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. Чем больше число в карте, тем ниже приоритет. Наивысший приоритет — `0`. - -В примере ниже реплика `example01-1` имеет наивысший приоритет: - -```xml - - 5432 - clickhouse - qwerty - - example01-1 - 1 - - - example01-2 - 2 - - db_name - table_name
- id=10 - SQL_QUERY -
- -``` - - -## Пример использования - -### Таблица в 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](/engines/table-engines/integrations/postgresql.md) для подключения таблицы ClickHouse к таблице PostgreSQL и выполнения операторов SELECT и INSERT над базой данных PostgreSQL: - -```sql -CREATE TABLE default.postgresql_table -( - `float_nullable` Nullable(Float32), - `str` String, - `int_id` Int32 -) -ENGINE = PostgreSQL('localhost:5432', 'public', 'test', 'postgres_user', 'postgres_password'); -``` - -### Вставка начальных данных из таблицы PostgreSQL в таблицу ClickHouse с использованием запроса SELECT - -[Табличная функция postgresql](/sql-reference/table-functions/postgresql.md) копирует данные из PostgreSQL в ClickHouse. Её часто используют для повышения производительности запросов за счёт выполнения запросов и аналитики в ClickHouse, а не в PostgreSQL, а также для миграции данных из 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', 'postgres_user', 'postgres_password'); -``` - -### Вставка инкрементальных данных из таблицы PostgreSQL в таблицу ClickHouse - -Если после первоначальной вставки вы выполняете дальнейшую синхронизацию между таблицей PostgreSQL и таблицей ClickHouse, вы можете использовать предложение WHERE в ClickHouse, чтобы вставлять только данные, добавленные в PostgreSQL, на основе метки времени или уникального последовательного идентификатора. - -Для этого потребуется отслеживать максимальный идентификатор или метку времени, добавленные ранее, например, следующим образом: - -```sql -SELECT max(`int_id`) AS maxIntID FROM default.postgresql_copy; -``` - -Затем вставляем значения из таблицы PostgreSQL, которые больше текущего максимума - -```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 как источника словаря](/sql-reference/dictionaries#mysql) - - -## Связанные материалы {#related-content} - -- Блог: [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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md deleted file mode 100644 index 357253a9623..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -description: 'Этот движок позволяет интегрировать ClickHouse с RabbitMQ.' -sidebar_label: 'RabbitMQ' -sidebar_position: 170 -slug: /engines/table-engines/integrations/rabbitmq -title: 'Табличный движок RabbitMQ' -doc_type: 'guide' ---- - - - -# Табличный движок RabbitMQ - -Этот движок позволяет интегрировать ClickHouse с [RabbitMQ](https://www.rabbitmq.com). - -`RabbitMQ` позволяет: - -- Публиковать или подписываться на потоки данных. -- Обрабатывать потоки по мере их поступления. - - - -## Создание таблицы - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] -( - name1 [type1], - name2 [type2], - ... -) ENGINE = RabbitMQ SETTINGS - rabbitmq_host_port = 'host:port' [или 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` – 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` – Список ключей маршрутизации (routing keys), разделённых запятыми. -- `rabbitmq_schema` – Параметр, который необходимо использовать, если формат требует определения схемы. Например, [Cap'n Proto](https://capnproto.org/) требует указать путь к файлу схемы и имя корневого объекта `schema.capnp:Message`. -- `rabbitmq_num_consumers` – Количество consumers на таблицу. Укажите большее число consumers, если пропускной способности одного недостаточно. По умолчанию: `1`. -- `rabbitmq_num_queues` – Общее количество очередей. Увеличение этого числа может значительно повысить производительность. По умолчанию: `1`. -- `rabbitmq_queue_base` - Укажите префикс для имён очередей. Сценарии использования этого параметра описаны ниже. -- `rabbitmq_deadletter_exchange` - Укажите имя для [dead letter exchange](https://www.rabbitmq.com/dlx.html). Вы можете создать другую таблицу с этим именем exchange и собирать сообщения в случаях, когда они повторно публикуются в dead letter exchange. По умолчанию dead letter exchange не задан. -- `rabbitmq_persistent` - Если установлено в 1 (true), в запросе INSERT режим доставки будет установлен в 2 (помечает сообщения как `persistent`). По умолчанию: `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#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: объявление exchanges, очередей, связей (bindings). По умолчанию: `false`. -- `rabbitmq_username` - Имя пользователя RabbitMQ. -- `rabbitmq_password` - Пароль RabbitMQ. -- `reject_unhandled_messages` - Отклонять сообщения (отправлять в RabbitMQ отрицательное подтверждение) в случае ошибок. Этот параметр автоматически включается, если задан `x-dead-letter-exchange` в `rabbitmq_queue_settings_list`. -- `rabbitmq_commit_on_select` - Фиксировать сообщения при выполнении запроса SELECT. По умолчанию: `false`. -- `rabbitmq_max_rows_per_message` — Максимальное количество строк, записываемых в одно сообщение RabbitMQ для построчных форматов. По умолчанию: `1`. -- `rabbitmq_empty_queue_backoff_start` — Начальная точка backoff для переназначения чтения, если очередь RabbitMQ пуста. -- `rabbitmq_empty_queue_backoff_end` — Конечная точка backoff для переназначения чтения, если очередь RabbitMQ пуста. -- `rabbitmq_handle_error_mode` — Способ обработки ошибок для движка RabbitMQ. Возможные значения: default (будет выброшено исключение, если не удаётся разобрать сообщение), stream (текст исключения и исходное сообщение будут сохранены во виртуальных столбцах `_error` и `_raw_message`), dead_letter_queue (данные, связанные с ошибкой, будут сохранены в system.dead_letter_queue). - - * [ ] SSL connection: - -Используйте либо `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 - -``` - - -## Описание - -`SELECT` не особенно полезен для чтения сообщений (кроме отладки), потому что каждое сообщение можно прочитать только один раз. Гораздо практичнее создавать потоки в реальном времени с помощью [материализованных представлений](../../../sql-reference/statements/create/view.md). Для этого: - -1. Используйте движок, чтобы создать потребителя RabbitMQ и рассматривать его как поток данных. -2. Создайте таблицу с требуемой структурой. -3. Создайте материализованное представление, которое преобразует данные из движка и помещает их в ранее созданную таблицу. - -Когда `MATERIALIZED VIEW` связывается с движком, оно начинает собирать данные в фоновом режиме. Это позволяет непрерывно получать сообщения из RabbitMQ и конвертировать их в требуемый формат с помощью `SELECT`. -Одна таблица RabbitMQ может иметь любое количество материализованных представлений. - -Данные могут направляться на основе `rabbitmq_exchange_type` и указанного `rabbitmq_routing_key_list`. -В одной таблице может быть не более одного exchange. Один exchange может использоваться несколькими таблицами — это позволяет выполнять маршрутизацию в несколько таблиц одновременно. - -Варианты типа exchange: - -* `direct` — маршрутизация основана на точном совпадении ключей. Пример списка ключей таблицы: `key1,key2,key3,key4,key5`, ключ сообщения может быть равен любому из них. -* `fanout` — маршрутизация во все таблицы (в которых имя exchange совпадает) независимо от ключей. -* `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` — данные равномерно распределяются между всеми привязанными таблицами (в которых имя exchange совпадает). Обратите внимание, что этот тип exchange должен быть включён с помощью плагина RabbitMQ: `rabbitmq-plugins enable rabbitmq_consistent_hash_exchange`. - -Настройка `rabbitmq_queue_base` может использоваться в следующих случаях: - -* чтобы позволить разным таблицам разделять очереди, так что для одних и тех же очередей может быть зарегистрировано несколько потребителей, что повышает производительность. Если используются настройки `rabbitmq_num_consumers` и/или `rabbitmq_num_queues`, то точное совпадение очередей достигается в случае, когда эти параметры одинаковы. -* чтобы иметь возможность восстановить чтение из определённых устойчивых (durable) очередей, когда не все сообщения были успешно потреблены. Чтобы возобновить потребление из одной конкретной очереди — укажите её имя в настройке `rabbitmq_queue_base` и не задавайте `rabbitmq_num_consumers` и `rabbitmq_num_queues` (по умолчанию 1). Чтобы возобновить потребление из всех очередей, которые были объявлены для конкретной таблицы, просто укажите те же настройки: `rabbitmq_queue_base`, `rabbitmq_num_consumers`, `rabbitmq_num_queues`. По умолчанию имена очередей будут уникальны для таблиц. -* чтобы повторно использовать очереди, так как они объявлены как durable и не удаляются автоматически. (Могут быть удалены с помощью любых CLI‑инструментов RabbitMQ.) - -Для повышения производительности полученные сообщения группируются в блоки размером [max_insert_block_size](/operations/settings/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` публикуемых сообщений (уникальное для каждого сообщения/пакета). - -Для INSERT‑запроса доступна метаинформация сообщения, которая добавляется для каждого опубликованного сообщения: `messageID` и флаг `republished` (true, если сообщение было опубликовано более одного раза) — они доступны через заголовки сообщения. - -Не используйте одну и ту же таблицу для вставок и материализованных представлений. - -Пример: - -```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` — имя exchange в RabbitMQ. Тип данных: `String`. -- `_channel_id` — идентификатор канала (ChannelID), на котором был объявлен consumer, получивший сообщение. Тип данных: `String`. -- `_delivery_tag` — DeliveryTag полученного сообщения. Область действия — один канал. Тип данных: `UInt64`. -- `_redelivered` — флаг `redelivered` сообщения. Тип данных: `UInt8`. -- `_message_id` — идентификатор сообщения (messageID) полученного сообщения; непустой, если был установлен при публикации сообщения. Тип данных: `String`. -- `_timestamp` — временная метка (timestamp) полученного сообщения; непустая, если была установлена при публикации сообщения. Тип данных: `UInt64`. - -Дополнительные виртуальные столбцы при `rabbitmq_handle_error_mode='stream'`: - -- `_raw_message` — исходное сообщение, которое не удалось успешно разобрать. Тип данных: `Nullable(String)`. -- `_error` — текст исключения, возникшего при ошибке разбора. Тип данных: `Nullable(String)`. - -Примечание: виртуальные столбцы `_raw_message` и `_error` заполняются только в случае возникновения исключения во время разбора; при успешном разборе сообщения они всегда равны `NULL`. - - - -## Ограничения {#caveats} - -Даже если вы укажете [выражения значений по умолчанию для столбцов](/sql-reference/statements/create/table.md/#default_values) (такие как `DEFAULT`, `MATERIALIZED`, `ALIAS`) в определении таблицы, они будут игнорироваться. Вместо этого столбцы будут заполняться значениями по умолчанию для соответствующих типов. - - - -## Поддержка форматов данных {#data-formats-support} - -Движок RabbitMQ поддерживает все [форматы](../../../interfaces/formats.md), которые поддерживаются в ClickHouse. -Количество строк в одном сообщении RabbitMQ зависит от того, является ли формат построчным или блочным: - -- Для построчных форматов количество строк в одном сообщении RabbitMQ можно контролировать с помощью настройки `rabbitmq_max_rows_per_message`. -- Для блочных форматов нельзя разделить блок на более мелкие части, но количество строк в одном блоке можно контролировать глобальной настройкой [max_block_size](/operations/settings/settings#max_block_size). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md deleted file mode 100644 index 37de63a250a..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -description: 'Этот движок позволяет интегрировать ClickHouse с Redis.' -sidebar_label: 'Redis' -sidebar_position: 175 -slug: /engines/table-engines/integrations/redis -title: 'Табличный движок Redis' -doc_type: 'guide' ---- - - - -# Табличный движок Redis - -Этот движок позволяет интегрировать ClickHouse с [Redis](https://redis.io/). Поскольку Redis использует модель ключ–значение (kv), настоятельно рекомендуется выполнять только точечные запросы, например `where k=xx` или `where k in (xx, xx)`. - - - -## Создание таблицы - -```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 Serialization -`PRIMARY KEY` поддерживает только один столбец. Первичный ключ будет сериализован в двоичном виде как ключ Redis. -Столбцы, отличные от первичного ключа, будут сериализованы в двоичном виде как значение Redis в соответствующем порядке. -::: - -Аргументы также могут быть переданы с использованием [именованных коллекций](/operations/named-collections.md). В этом случае `host` и `port` должны указываться отдельно. Этот подход рекомендуется для production-среды. На данный момент все параметры, передаваемые с использованием именованных коллекций в Redis, являются обязательными. - -:::note Filtering -Запросы с `key equals` или `in filtering` будут оптимизированы до поиска по нескольким ключам в Redis. Если запросы выполняются без ключа фильтрации, будет выполнено полное сканирование таблицы, что является ресурсоёмкой операцией. -::: - - -## Пример использования - -Создайте таблицу в ClickHouse с движком `Redis`, явно указав аргументы: - -```sql -CREATE TABLE redis_table -( - `key` String, - `v1` UInt32, - `v2` String, - `v3` Float32 -) -ENGINE = Redis('redis1:6379') PRIMARY KEY(key); -``` - -Или, используя [именованные коллекции](/operations/named-collections.md): - -```xml - - - 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'; -``` - -Truncate: - -Асинхронно очищает базу данных Redis. Также `Truncate` поддерживает синхронный режим (SYNC). - -```sql -TRUNCATE TABLE redis_table SYNC; -``` - -Join: - -Объединение с другими таблицами. - -```sql -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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md deleted file mode 100644 index 7b21b4b5543..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md +++ /dev/null @@ -1,456 +0,0 @@ ---- -description: 'Этот движок обеспечивает интеграцию с экосистемой Amazon S3. Аналогичен - движку HDFS, но предоставляет специальные возможности для S3.' -sidebar_label: 'S3' -sidebar_position: 180 -slug: /engines/table-engines/integrations/s3 -title: 'Табличный движок S3' -doc_type: 'reference' ---- - - - -# Движок таблицы S3 - -Этот движок обеспечивает интеграцию с экосистемой [Amazon S3](https://aws.amazon.com/s3/). Он похож на движок [HDFS](/engines/table-engines/integrations/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 │ -└──────┴───────┘ -``` - - -## Создайте таблицу - -```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_strategy], [partition_columns_in_data_file]) - [PARTITION BY expr] - [SETTINGS ...] -``` - -### Параметры движка - -* `path` — URL бакета с путем к файлу. В режиме только для чтения поддерживаются следующие шаблоны: `*`, `**`, `?`, `{abc,def}` и `{N..M}`, где `N`, `M` — числа, `'abc'`, `'def'` — строки. Дополнительную информацию см. [ниже](#wildcards-in-path). -* `NOSIGN` — Если это ключевое слово указано вместо учетных данных, все запросы не будут подписываться. -* `format` — [Формат](/sql-reference/formats#formats-overview) файла. -* `aws_access_key_id`, `aws_secret_access_key` — Долгосрочные учетные данные пользователя аккаунта [AWS](https://aws.amazon.com/). Их можно использовать для аутентификации запросов. Параметр необязателен. Если учетные данные не указаны, они берутся из конфигурационного файла. Дополнительную информацию см. в разделе [Использование S3 для хранения данных](../mergetree-family/mergetree.md#table_engine-mergetree-s3). -* `compression` — Тип сжатия. Поддерживаемые значения: `none`, `gzip/gz`, `brotli/br`, `xz/LZMA`, `zstd/zst`. Параметр необязателен. По умолчанию тип сжатия автоматически определяется по расширению файла. -* `partition_strategy` – Варианты: `WILDCARD` или `HIVE`. `WILDCARD` требует наличия `{_partition_id}` в пути, который заменяется ключом партиционирования. `HIVE` не допускает шаблоны, предполагает, что путь — это корень таблицы, и генерирует директории партиций в стиле Hive с идентификаторами Snowflake в качестве имен файлов и форматом файла в качестве расширения. По умолчанию используется `WILDCARD`. -* `partition_columns_in_data_file` — Используется только со стратегией партиционирования `HIVE`. Указывает ClickHouse, следует ли ожидать, что столбцы партиционирования будут записаны в файл данных. По умолчанию `false`. -* `storage_class_name` — Варианты: `STANDARD` или `INTELLIGENT_TIERING`, позволяют указать [AWS S3 Intelligent Tiering](https://aws.amazon.com/s3/storage-classes/intelligent-tiering/). - -### Кэш данных - -Движок таблиц `S3` поддерживает кэширование данных на локальном диске. -Параметры конфигурации файлового кэша и примеры использования приведены в этом [разделе](/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; -``` - -Существует два способа задать кэш в конфигурационном файле. - -1. Добавьте следующий раздел в конфигурационный файл ClickHouse: - -```xml - - - - путь к каталогу кэша - 10Gi - - - -``` - -2. повторно используйте конфигурацию кеша (и, следовательно, хранилище кеша) из секции ClickHouse `storage_configuration`, [описанной здесь](/operations/storing-data.md/#using-local-cache) - -### PARTITION BY - -`PARTITION BY` — необязательный параметр. В большинстве случаев вам не нужен ключ партиционирования, а если он все же требуется, как правило, не нужен ключ с более мелкой детализацией, чем по месяцам. Партиционирование не ускоряет запросы (в отличие от выражения ORDER BY). Никогда не используйте слишком мелкое партиционирование. Не делите данные на партиции по идентификаторам или именам клиентов (вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY). - -Для партиционирования по месяцам используйте выражение `toYYYYMM(date_column)`, где `date_column` — это столбец с датой типа [Date](/sql-reference/data-types/date.md). Имена партиций здесь имеют формат `"YYYYMM"`. - -#### Стратегия партиционирования - -`WILDCARD` (по умолчанию): заменяет подстановочный шаблон `{_partition_id}` в пути к файлу фактическим ключом партиционирования. Чтение не поддерживается. - - -`HIVE` реализует партиционирование в стиле Hive для чтения и записи. Чтение реализовано с использованием рекурсивного glob-шаблона, что эквивалентно запросу `SELECT * FROM s3('table_root/**.parquet')`. -При записи файлы создаются в следующем формате: `//.`. - -Примечание: при использовании стратегии партиционирования `HIVE` настройка `use_hive_partitioning` не влияет на поведение. - -Пример стратегии партиционирования `HIVE`: - -```sql -arthur :) CREATE TABLE t_03363_parquet (year UInt16, country String, counter UInt8) -ENGINE = S3(s3_conn, filename = 't_03363_parquet', format = Parquet, partition_strategy='hive') -PARTITION BY (year, country); - -arthur :) INSERT INTO t_03363_parquet VALUES - (2022, 'USA', 1), - (2022, 'Canada', 2), - (2023, 'USA', 3), - (2023, 'Mexico', 4), - (2024, 'France', 5), - (2024, 'Germany', 6), - (2024, 'Germany', 7), - (1999, 'Brazil', 8), - (2100, 'Japan', 9), - (2024, 'CN', 10), - (2025, '', 11); - -arthur :) select _path, * from t_03363_parquet; - - ┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐ - 1. │ test/t_03363_parquet/year=2100/country=Japan/7329604473272971264.parquet │ 2100 │ Japan │ 9 │ - 2. │ test/t_03363_parquet/year=2024/country=France/7329604473323302912.parquet │ 2024 │ France │ 5 │ - 3. │ test/t_03363_parquet/year=2022/country=Canada/7329604473314914304.parquet │ 2022 │ Canada │ 2 │ - 4. │ test/t_03363_parquet/year=1999/country=Brazil/7329604473289748480.parquet │ 1999 │ Brazil │ 8 │ - 5. │ test/t_03363_parquet/year=2023/country=Mexico/7329604473293942784.parquet │ 2023 │ Mexico │ 4 │ - 6. │ test/t_03363_parquet/year=2023/country=USA/7329604473319108608.parquet │ 2023 │ USA │ 3 │ - 7. │ test/t_03363_parquet/year=2025/country=/7329604473327497216.parquet │ 2025 │ │ 11 │ - 8. │ test/t_03363_parquet/year=2024/country=CN/7329604473310720000.parquet │ 2024 │ CN │ 10 │ - 9. │ test/t_03363_parquet/year=2022/country=USA/7329604473298137088.parquet │ 2022 │ USA │ 1 │ -10. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │ 6 │ -11. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │ 7 │ - └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘ -``` - -### Запросы к секционированным данным - -В этом примере используется [рецепт для docker compose](https://github.com/ClickHouse/examples/tree/5fdc6ff72f4e5137e23ea075c88d3f44b0202490/docker-compose-recipes/recipes/ch-and-minio-S3), который интегрирует ClickHouse и MinIO. Вы сможете воспроизвести те же запросы, используя S3, заменив endpoint и значения аутентификации. - -Обратите внимание, что endpoint S3 в конфигурации `ENGINE` использует токен-параметр `{_partition_id}` как часть объекта S3 (имени файла) и что запросы SELECT выполняются по соответствующим именам объектов (например, `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 -Получено исключение от сервера (версия 23.4.1): -Код: 48. DB::Exception: Получено от localhost:9000. DB::Exception: Чтение из партиционированного хранилища S3 еще не реализовано. (NOT_IMPLEMENTED) -``` - - -## Вставка данных {#inserting-data} - -Обратите внимание, что строки можно вставлять только в новые файлы. Здесь нет циклов слияния или операций разбиения файлов. После того как файл записан, последующие вставки завершатся с ошибкой. Чтобы этого избежать, вы можете использовать настройки `s3_truncate_on_insert` и `s3_create_new_file_on_insert`. Подробнее см. [здесь](/integrations/s3#inserting-data). - - - -## Виртуальные столбцы {#virtual-columns} - -- `_path` — путь к файлу. Тип: `LowCardinality(String)`. -- `_file` — имя файла. Тип: `LowCardinality(String)`. -- `_size` — размер файла в байтах. Тип: `Nullable(UInt64)`. Если размер неизвестен, значение — `NULL`. -- `_time` — время последнего изменения файла. Тип: `Nullable(DateTime)`. Если время неизвестно, значение — `NULL`. -- `_etag` — ETag файла. Тип: `LowCardinality(String)`. Если значение ETag неизвестно, значение — `NULL`. -- `_tags` — теги файла. Тип: `Map(String, String)`. Если тегов нет, значение — пустая карта `{}`. - -Для получения дополнительной информации о виртуальных столбцах см. [здесь](../../../engines/table-engines/index.md#table_engines-virtual_columns){}`. - - - -## Детали реализации {#implementation-details} - -- Операции чтения и записи могут выполняться параллельно. -- Не поддерживаются: - - Операции `ALTER` и `SELECT...SAMPLE`. - - Индексы. - - Репликация [zero-copy](../../../operations/storing-data.md#zero-copy) возможна, но не поддерживается. - - :::note Репликация zero-copy не готова для промышленной эксплуатации - Репликация zero-copy по умолчанию отключена в ClickHouse, начиная с версии 22.8. Не рекомендуется использовать эту функцию в промышленной эксплуатации. - ::: - - - -## Подстановочные шаблоны в пути - -Аргумент `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). - -:::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** - -Предположим, у нас есть несколько файлов в формате CSV со следующими URI в S3: - -* '[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_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_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/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_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_2.csv)' -* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv)' - -Есть несколько способов создать таблицу, включающую все шесть файлов: - -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](/operations/settings/settings.md#s3_truncate_on_insert) - позволяет обрезать файл перед вставкой данных в него. По умолчанию отключено. -- [s3_create_new_file_on_insert](/operations/settings/settings.md#s3_create_new_file_on_insert) - позволяет создавать новый файл при каждой вставке, если формат имеет суффикс. По умолчанию отключено. -- [s3_skip_empty_files](/operations/settings/settings.md#s3_skip_empty_files) - позволяет пропускать пустые файлы при чтении. По умолчанию включено. - - - -## Настройки, связанные с S3 {#settings} - -Следующие настройки могут быть заданы перед выполнением запроса или помещены в файл конфигурации. - -- `s3_max_single_part_upload_size` — Максимальный размер объекта для загрузки в S3 одним запросом (single-part upload). Значение по умолчанию — `32 МБ`. -- `s3_min_upload_part_size` — Минимальный размер части, загружаемой при многокомпонентной загрузке ([S3 Multipart upload](https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html)). Значение по умолчанию — `16 МБ`. -- `s3_max_redirects` — Максимальное количество переходов при перенаправлениях S3. Значение по умолчанию — `10`. -- `s3_single_read_retries` — Максимальное количество попыток однократного чтения. Значение по умолчанию — `4`. -- `s3_max_put_rps` — Максимальная частота запросов PUT в секунду до начала ограничения (throttling). Значение по умолчанию — `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`. -- `s3_upload_part_size_multiply_factor` — Умножать `s3_min_upload_part_size` на этот коэффициент каждый раз, когда было загружено `s3_multiply_parts_count_threshold` частей из одной операции записи в S3. Значение по умолчанию — `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` — Ограничивает количество запросов PUT, которые могут выполняться параллельно для одного объекта. Рекомендуется ограничить это значение. Значение `0` означает отсутствие ограничений. Значение по умолчанию — `20`. Каждая активная (in-flight) часть имеет буфер размером `s3_min_upload_part_size` для первых `s3_upload_part_size_multiply_factor` частей и больше, когда файл достаточно большой, см. `upload_part_size_multiply_factor`. При настройках по умолчанию один загружаемый файл потребляет не более `320 МБ` памяти для файла размером менее `8 ГБ`. Для более крупных файлов потребление больше. - -Соображения безопасности: если злоумышленник может указывать произвольные URL-адреса S3, параметр `s3_max_redirects` должен быть установлен в ноль, чтобы избежать атак [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery), либо в конфигурации сервера должен быть задан `remote_host_filter`. - - - -## Параметры для отдельных endpoint - -Следующие параметры могут быть указаны в конфигурационном файле для заданного endpoint (который будет сопоставляться по точному префиксу URL): - -* `endpoint` — Задает префикс endpoint. Обязательный параметр. -* `access_key_id` и `secret_access_key` — Задают учетные данные для использования с заданным endpoint. Необязательные параметры. -* `use_environment_credentials` — Если установлено в `true`, клиент S3 попытается получить учетные данные из переменных окружения и метаданных [Amazon EC2](https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud) для заданного endpoint. Необязательный параметр, значение по умолчанию — `false`. -* `region` — Задает имя региона S3. Необязательный параметр. -* `use_insecure_imds_request` — Если установлено в `true`, клиент S3 будет использовать небезопасный IMDS-запрос при получении учетных данных из метаданных Amazon EC2. Необязательный параметр, значение по умолчанию — `false`. -* `expiration_window_seconds` — Дополнительный интервал при проверке, истекли ли учетные данные с ограниченным сроком действия. Необязательный параметр, значение по умолчанию — `120`. -* `no_sign_request` - Игнорирует все учетные данные, чтобы запросы не подписывались. Полезно для доступа к публичным бакетам. -* `header` — Добавляет указанный HTTP-заголовок к запросу к заданному endpoint. Необязательный параметр, может быть указан несколько раз. -* `access_header` - Добавляет указанный HTTP-заголовок к запросу к заданному endpoint в случаях, когда нет других учетных данных из какого-либо другого источника. -* `server_side_encryption_customer_key_base64` — Если указан, будут установлены необходимые заголовки для доступа к объектам S3 с шифрованием SSE-C. Необязательный параметр. -* `server_side_encryption_kms_key_id` - Если указан, будут установлены необходимые заголовки для доступа к объектам S3 с [шифрованием 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`, будет установлен заголовок для включения ключей бакета S3 для SSE-KMS. Необязательный параметр, может быть `true` или `false`, по умолчанию не задан (соответствует настройке на уровне бакета). -* `max_single_read_retries` — Максимальное количество попыток при одном чтении. Значение по умолчанию — `4`. Необязательный параметр. -* `max_put_rps`, `max_put_burst`, `max_get_rps` и `max_get_burst` - Настройки ограничения скорости (см. описание выше), применяемые к конкретному endpoint вместо настроек на запрос. Необязательные параметры. - -**Пример:** - -```xml - - - https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/ - - - - - - - - - - - - - - - -``` - - -## Работа с архивами - -Предположим, что у нас есть несколько файлов-архивов со следующими 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-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-11.csv.zip)' -* '[https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip](https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip)' - -Извлечение данных из этих архивов можно выполнять с помощью синтаксиса ::. Глоб-шаблоны (globs) могут использоваться как в части 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 поддерживает три формата архивов: -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'); -``` - - -## Оптимизация производительности {#optimizing-performance} - -Подробнее об оптимизации производительности функции s3 см. в [нашем подробном руководстве](/integrations/s3/performance). - - - -## См. также {#see-also} - -- [табличная функция S3](../../../sql-reference/table-functions/s3.md) -- [Интеграция S3 с ClickHouse](/integrations/s3) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md deleted file mode 100644 index 79fb3196b4f..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md +++ /dev/null @@ -1,440 +0,0 @@ ---- -description: 'Этот движок обеспечивает интеграцию с экосистемой Amazon S3 и поддерживает - потоковый импорт данных. Аналогичен движкам Kafka и RabbitMQ, но предоставляет функции, - специфичные для S3.' -sidebar_label: 'S3Queue' -sidebar_position: 181 -slug: /engines/table-engines/integrations/s3queue -title: 'Табличный движок S3Queue' -doc_type: 'reference' ---- - -import ScalePlanFeatureBadge from '@theme/badges/ScalePlanFeatureBadge' - - -# Движок таблицы S3Queue - -Этот движок обеспечивает интеграцию с экосистемой [Amazon S3](https://aws.amazon.com/s3/) и поддерживает потоковый импорт. Движок аналогичен движкам [Kafka](../../../engines/table-engines/integrations/kafka.md) и [RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md), но предоставляет возможности, специфичные для S3. - -Важно учитывать следующее замечание из [оригинального PR с реализацией S3Queue](https://github.com/ClickHouse/ClickHouse/pull/49086/files#diff-e1106769c9c8fbe48dd84f18310ef1a250f2c248800fde97586b3104e9cd6af8R183): когда к этому движку подключается `MATERIALIZED VIEW`, движок таблицы S3Queue начинает собирать данные в фоновом режиме. - - - -## Создание таблицы {#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], [headers]) - [SETTINGS] - [mode = '',] - [after_processing = 'keep',] - [keeper_path = '',] - [loading_retries = 0,] - [processing_threads_num = 16,] - [parallel_inserts = false,] - [enable_logging_to_queue_log = true,] - [last_processed_path = "",] - [tracked_files_limit = 1000,] - [tracked_file_ttl_sec = 0,] - [polling_min_timeout_ms = 1000,] - [polling_max_timeout_ms = 10000,] - [polling_backoff_ms = 0,] - [cleanup_interval_min_ms = 10000,] - [cleanup_interval_max_ms = 30000,] - [buckets = 0,] - [list_objects_batch_size = 1000,] - [enable_hash_ring_filtering = 0,] - [max_processed_files_before_commit = 100,] - [max_processed_rows_before_commit = 0,] - [max_processed_bytes_before_commit = 0,] - [max_processing_time_sec_before_commit = 0,] -``` - -:::warning -До версии `24.7` необходимо использовать префикс `s3queue_` для всех настроек, за исключением `mode`, `after_processing` и `keeper_path`. -::: - -**Параметры движка** - -Параметры `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 хранятся только максимальное имя (в лексикографическом смысле) успешно обработанного файла и имена файлов, для которых будет выполнена повторная попытка после неудачной загрузки. - -Значение по умолчанию: `ordered` в версиях до 24.6. Начиная с версии 24.6 значение по умолчанию отсутствует, настройку необходимо указывать вручную. Для таблиц, созданных в более ранних версиях, значение по умолчанию останется `Ordered` для обеспечения совместимости. - -### `after_processing` {#after_processing} - -Удалить или сохранить файл после успешной обработки. -Возможные значения: - -- keep. -- delete. - -Значение по умолчанию: `keep`. - -### `keeper_path` {#keeper_path} - -Путь в ZooKeeper может быть указан как настройка движка таблицы, или путь по умолчанию может быть сформирован из пути, предоставленного глобальной конфигурацией, и UUID таблицы. -Возможные значения: - -- String. - -Значение по умолчанию: `/`. - -### `s3queue_loading_retries` {#loading_retries} - -Повторять попытки загрузки файла до указанного количества раз. По умолчанию повторные попытки не выполняются. -Возможные значения: - -- Положительное целое число. - -Значение по умолчанию: `0`. - -### `s3queue_processing_threads_num` {#processing_threads_num} - -Количество потоков для выполнения обработки. Применяется только для режима `Unordered`. - -Значение по умолчанию: количество процессоров или 16. - -### `s3queue_parallel_inserts` {#parallel_inserts} - -По умолчанию `processing_threads_num` создаёт один `INSERT`, поэтому загрузка файлов и парсинг выполняются только в нескольких потоках. -Но это ограничивает параллелизм, поэтому для лучшей пропускной способности используйте `parallel_inserts=true`, это позволит вставлять данные параллельно (но имейте в виду, что это приведёт к большему количеству сгенерированных кусков данных для семейства MergeTree). - -:::note -`INSERT` будут создаваться с учётом настроек `max_process*_before_commit`. -::: - -Значение по умолчанию: `false`. - -### `s3queue_enable_logging_to_s3queue_log` {#enable_logging_to_s3queue_log} - -Включить логирование в `system.s3queue_log`. - -Значение по умолчанию: `0`. - -### `s3queue_polling_min_timeout_ms` {#polling_min_timeout_ms} - -Указывает минимальное время в миллисекундах, которое ClickHouse ожидает перед выполнением следующей попытки опроса. - -Возможные значения: - -- Положительное целое число. - -Значение по умолчанию: `1000`. - -### `s3queue_polling_max_timeout_ms` {#polling_max_timeout_ms} - -Определяет максимальное время в миллисекундах, которое ClickHouse ожидает перед инициацией следующей попытки опроса. - -Возможные значения: - -- Положительное целое число. - -Значение по умолчанию: `10000`. - -### `s3queue_polling_backoff_ms` {#polling_backoff_ms} - -Определяет дополнительное время ожидания, добавляемое к предыдущему интервалу опроса, когда новые файлы не найдены. Следующий опрос происходит после суммы предыдущего интервала и этого значения отсрочки, или максимального интервала, в зависимости от того, что меньше. - -Возможные значения: - -- Положительное целое число. - -Значение по умолчанию: `0`. - -### `s3queue_tracked_files_limit` {#tracked_files_limit} - -Позволяет ограничить количество узлов ZooKeeper при использовании режима 'unordered', не действует для режима 'ordered'. -При достижении лимита самые старые обработанные файлы будут удалены из узла ZooKeeper и обработаны снова. - -Возможные значения: - -- Положительное целое число. - -Значение по умолчанию: `1000`. - -### `s3queue_tracked_file_ttl_sec` {#tracked_file_ttl_sec} - -Максимальное количество секунд для хранения обработанных файлов в узле ZooKeeper (по умолчанию хранятся бессрочно) для режима 'unordered', не действует для режима '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, каждая из которых работает с одним и тем же каталогом метаданных в keeper, значение `s3queue_buckets` должно быть не меньше количества реплик. Если также используется параметр `s3queue_processing_threads`, имеет смысл дополнительно увеличить значение параметра `s3queue_buckets`, так как он определяет фактическую степень параллелизма обработки `S3Queue`. - -### `use_persistent_processing_nodes` {#use_persistent_processing_nodes} - -По умолчанию таблица S3Queue всегда использовала эфемерные узлы обработки, что могло приводить к дублированию данных в случае истечения сессии zookeeper до того, как S3Queue зафиксирует обработанные файлы в zookeeper, но после начала обработки. Этот параметр заставляет сервер исключить возможность появления дубликатов при истечении сессии keeper. - -### `persistent_processing_nodes_ttl_seconds` {#persistent_processing_nodes_ttl_seconds} - -В случае аварийного завершения работы сервера возможна ситуация, когда при включённом параметре `use_persistent_processing_nodes` узлы обработки не будут удалены. Этот параметр определяет период времени, в течение которого эти узлы обработки могут быть безопасно удалены. - -Значение по умолчанию: `3600` (1 час). - - -## Настройки, связанные с S3 {#s3-settings} - -Движок поддерживает все настройки, связанные с S3. Подробнее о настройках S3 см. [здесь](../../../engines/table-engines/integrations/s3.md). - - -## Доступ к S3 на основе ролей {#s3-role-based-access} - - - -Движок таблиц s3Queue поддерживает доступ на основе ролей. -Инструкции по настройке роли для доступа к вашему бакету см. в документации [здесь](/cloud/data-sources/secure-s3). - -После настройки роли можно передать `roleARN` через параметр `extra_credentials`, как показано ниже: - -```sql -CREATE TABLE s3_table -( - ts DateTime, - value UInt64 -) -ENGINE = S3Queue( - 'https:///*.csv', - extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/') - ,'CSV') -SETTINGS - ... -``` - - -## Режим ordered для S3Queue {#ordered-mode} - -Режим обработки `S3Queue` позволяет хранить меньше метаданных в ZooKeeper, но имеет ограничение: файлы, добавленные позже по времени, должны иметь алфавитно-цифровые имена, которые идут дальше в порядке сортировки. - -Режим `ordered` для `S3Queue`, как и режим `unordered`, поддерживает настройку `(s3queue_)processing_threads_num` (префикс `s3queue_` необязателен), которая позволяет управлять количеством потоков, обрабатывающих файлы `S3` локально на сервере. -Кроме того, режим `ordered` также вводит другую настройку `(s3queue_)buckets`, которая означает «логические потоки». В распределённом сценарии, когда имеется несколько серверов с репликами таблицы `S3Queue`, эта настройка определяет количество единиц обработки. Например, каждый поток обработки на каждой реплике `S3Queue` будет пытаться заблокировать определённый `bucket` для обработки; каждый `bucket` привязывается к определённым файлам по хешу имени файла. Поэтому в распределённом сценарии настоятельно рекомендуется, чтобы значение настройки `(s3queue_)buckets` было как минимум равно количеству реплик или больше. Допустимо иметь количество buckets больше, чем количество реплик. Наиболее оптимальным сценарием является случай, когда значение настройки `(s3queue_)buckets` равно произведению `number_of_replicas` и `(s3queue_)processing_threads_num`. -Настройка `(s3queue_)processing_threads_num` не рекомендуется к использованию в версиях до `24.6`. -Настройка `(s3queue_)buckets` доступна начиная с версии `24.6`. - - -## Description {#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` — Имя файла. -- `_size` — Размер файла. -- `_time` — Время создания файла. - -Подробнее о виртуальных столбцах см. [здесь](../../../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, и сессия keeper истекает до того, как один из серверов успевает зафиксировать обработанный файл, что может привести к тому, что другой сервер начнёт обработку файла, который мог быть частично или полностью обработан первым сервером; однако это не относится к версии 25.8 и выше при `use_persistent_processing_nodes = 1`. - -- происходит аварийное завершение работы сервера. - -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`. Постоянная таблица. Содержит ту же информацию, что и `system.s3queue`, но для обработанных (`processed`) и завершившихся с ошибкой (`failed`) файлов. - -Структура таблицы: - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md deleted file mode 100644 index 2268c7f7761..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -description: 'Движок позволяет импортировать данные в SQLite и экспортировать их из SQLite, а также поддерживает выполнение запросов к таблицам SQLite непосредственно из ClickHouse.' -sidebar_label: 'SQLite' -sidebar_position: 185 -slug: /engines/table-engines/integrations/sqlite -title: 'Табличный движок SQLite' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблиц SQLite - - - -Этот движок позволяет импортировать данные в SQLite и экспортировать их из неё, а также выполнять запросы к таблицам SQLite непосредственно из ClickHouse. - - - -## Создание таблицы - -```sql - CREATE TABLE [IF NOT EXISTS] [db.]table_name - ( - name1 [type1], - name2 [type2], ... - ) ENGINE = SQLite('db_path', 'table') -``` - -**Параметры движка** - -* `db_path` — Путь к файлу базы данных SQLite. -* `table` — Название таблицы в базе данных SQLite. - - -## Пример использования - -Пример запроса для создания таблицы 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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md deleted file mode 100644 index 4f5b9435884..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md +++ /dev/null @@ -1,342 +0,0 @@ ---- -description: 'Движок таблицы для хранения временных рядов — набора значений, привязанных к меткам времени и тегам (лейблам).' -sidebar_label: 'TimeSeries' -sidebar_position: 60 -slug: /engines/table-engines/special/time_series -title: 'Движок таблицы TimeSeries' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Табличный движок TimeSeries - - - - - -Табличный движок для хранения временных рядов, то есть наборов значений, связанных с временными метками и тегами (или метками): - -```sql -metric_name1[tag1=value1, tag2=value2, ...] = {timestamp1: value1, timestamp2: value2, ...} -metric_name2[...] = ... -``` - -:::info -Это экспериментальная функция, поведение которой в будущих релизах может измениться без сохранения обратной совместимости. -Активируйте использование табличного движка TimeSeries -с помощью настройки [allow_experimental_time_series_table](/operations/settings/settings#allow_experimental_time_series_table). -Выполните команду `set allow_experimental_time_series_table = 1`. -::: - - -## Синтаксис - -```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)] -``` - - -## Использование - -Проще всего начать, оставив все настройки по умолчанию (можно создать таблицу `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` не имеет собственных данных, всё хранится в её целевых таблицах. -Это похоже на работу [материализованного представления](../../../sql-reference/statements/create/view#materialized-view), -с той разницей, что у материализованного представления есть одна целевая таблица, -тогда как у таблицы `TimeSeries` есть три целевые таблицы с именами [data](#data-table), [tags](#tags-table) и [metrics](#metrics-table). - -Целевые таблицы могут быть либо указаны явно в запросе `CREATE TABLE`, -либо движок таблицы `TimeSeries` может автоматически сгенерировать внутренние целевые таблицы. - -Целевые таблицы следующие: - -### Таблица data {#data-table} - -Таблица _data_ содержит временные ряды, связанные с некоторым идентификатором. - -Таблица _data_ должна иметь столбцы: - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `id` | [x] | `UUID` | any | Идентифицирует комбинацию имён метрик и тегов | -| `timestamp` | [x] | `DateTime64(3)` | `DateTime64(X)` | Точка во времени | -| `value` | [x] | `Float64` | `Float32` or `Float64` | Значение, связанное с `timestamp` | - -### Таблица tags {#tags-table} - -Таблица _tags_ содержит идентификаторы, вычисленные для каждой комбинации имени метрики и тегов. - -Таблица _tags_ должна иметь столбцы: - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `id` | [x] | `UUID` | any (must match the type of `id` in the [data](#data-table) table) | `id` идентифицирует комбинацию имени метрики и тегов. Выражение DEFAULT определяет, как вычисляется такой идентификатор | -| `metric_name` | [x] | `LowCardinality(String)` | `String` or `LowCardinality(String)` | Имя метрики | -| `` | [ ] | `String` | `String` or `LowCardinality(String)` or `LowCardinality(Nullable(String))` | Значение конкретного тега, имя тега и имя соответствующего столбца задаются в настройке [tags_to_columns](#settings) | -| `tags` | [x] | `Map(LowCardinality(String), String)` | `Map(String, String)` or `Map(LowCardinality(String), String)` or `Map(LowCardinality(String), LowCardinality(String))` | Карта тегов за исключением тега `__name__`, содержащего имя метрики, и за исключением тегов с именами, перечисленными в настройке [tags_to_columns](#settings) | -| `all_tags` | [ ] | `Map(String, String)` | `Map(String, String)` or `Map(LowCardinality(String), String)` or `Map(LowCardinality(String), LowCardinality(String))` | Эфемерный столбец, каждая строка — это карта всех тегов, за исключением только тега `__name__`, содержащего имя метрики. Единственная цель этого столбца — использовать его при вычислении `id` | -| `min_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` or `Nullable(DateTime64(X))` | Минимальная метка времени временных рядов с этим `id`. Столбец создаётся, если [store_min_time_and_max_time](#settings) имеет значение `true` | -| `max_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` or `Nullable(DateTime64(X))` | Максимальная метка времени временных рядов с этим `id`. Столбец создаётся, если [store_min_time_and_max_time](#settings) имеет значение `true` | - -### Таблица metrics {#metrics-table} - -Таблица _metrics_ содержит информацию о собираемых метриках, типах этих метрик и их описаниях. - -Таблица _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`, фактически будет сохранена в этих трёх целевых таблицах. -Таблица `TimeSeries` содержит все столбцы из таблиц [data](#data-table), [tags](#tags-table), [metrics](#metrics-table). - - - -## Создание - -Существует несколько способов создать таблицу с движком `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' -``` - -Таким образом, столбцы были сгенерированы автоматически, и в этом операторе также присутствуют три внутренних 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 -``` - - -## Настройка типов столбцов - -Вы можете изменить тип почти любого столбца во внутренних целевых таблицах, явно указав его -при определении основной таблицы. Например, - -```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` содержит идентификаторы; каждый идентификатор вычисляется для комбинации имени метрики и тегов. -Выражение DEFAULT для столбца `id` — это выражение, которое будет использоваться для вычисления таких идентификаторов. -И тип столбца `id`, и это выражение могут быть изменены путём их явного указания: - -```sql -CREATE TABLE my_table -( - id UInt64 DEFAULT sipHash64(metric_name, all_tags) -) -ENGINE=TimeSeries -``` - - -## Столбцы `tags` и `all_tags` - -Есть два столбца, содержащих отображения тегов, — `tags` и `all_tags`. В этом примере они по сути эквивалентны, однако могут отличаться, -если используется настройка `tags_to_columns`. Эта настройка позволяет указать, что конкретный тег должен храниться в отдельном столбце вместо хранения -в отображении внутри столбца `tags`: - -```sql -CREATE TABLE my_table -ENGINE = TimeSeries -SETTINGS tags_to_columns = {'instance': 'instance', 'job': 'job'} -``` - -Этот оператор добавит столбцы: - -```sql -`instance` String, -`job` String -``` - -к определению и таблицы `my_table`, и ее внутренней целевой таблицы [tags](#tags-table). В этом случае столбец `tags` не будет содержать теги `instance` и `job`, -но столбец `all_tags` будет содержать их. Столбец `all_tags` является временным, и его единственное назначение — использоваться в выражении DEFAULT -для столбца `id`. - -Типы столбцов можно изменить, явно указав их: - -```sql -CREATE TABLE my_table ( - instance LowCardinality(String), - job LowCardinality(Nullable(String)) -) -ENGINE=TimeSeries -SETTINGS tags_to_columns = {'instance': 'instance', 'job': 'job'} -``` - - -## Движки внутренних целевых таблиц - -По умолчанию внутренние целевые таблицы используют следующие движки таблиц: - -* таблица [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 -``` - - -## Внешние таблицы назначения - -Можно настроить таблицу `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`: - -| Name | Type | Default | Description | -|---|---|---|---| -| `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` этот флаг включает использование `SimpleAggregateFunction(min, Nullable(DateTime64(3)))` вместо просто `Nullable(DateTime64(3))` как типа столбца `min_time`, и аналогично для столбца `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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md deleted file mode 100644 index 3403e3953f2..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -description: 'Табличный движок, позволяющий импортировать данные из кластера YTsaurus.' -sidebar_label: 'YTsaurus' -sidebar_position: 185 -slug: /engines/table-engines/integrations/ytsaurus -title: 'Табличный движок YTsaurus' -keywords: ['YTsaurus', 'табличный движок'] -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# Движок таблицы YTsaurus - - - - -Движок таблицы YTsaurus позволяет импортировать данные из кластера YTsaurus. - - - -## Создание таблицы - -```sql - CREATE TABLE [IF NOT EXISTS] [db.]table_name - ( - name1 [type1], - name2 [type2], ... - ) ENGINE = YTsaurus('http_proxy_url', 'cypress_path', 'oauth_token') -``` - -:::info -Это экспериментальная функция, которая в будущих релизах может измениться с нарушением обратной совместимости. -Включите использование табличного движка YTsaurus -с помощью настройки [`allow_experimental_ytsaurus_table_engine`](/operations/settings/settings#allow_experimental_ytsaurus_table_engine). - -Сделать это можно с помощью: - -`SET allow_experimental_ytsaurus_table_engine = 1`. -::: - -**Параметры движка** - -* `http_proxy_url` — URL HTTP-прокси YTsaurus. -* `cypress_path` — Cypress-путь к источнику данных. -* `oauth_token` — OAuth-токен. - - -## Пример использования - -Пример запроса для создания таблицы YTsaurus: - -```sql title="Query" -SHOW CREATE TABLE yt_saurus; -``` - -```sql title="Response" -CREATE TABLE yt_saurus -( - `a` UInt32, - `b` String -) -ENGINE = YTsaurus('http://localhost:8000', '//tmp/table', 'password') -``` - -Чтобы получить данные из таблицы, выполните: - -```sql title="Query" -SELECT * FROM yt_saurus; -``` - -```response title="Response" - ┌──a─┬─b──┐ - │ 10 │ 20 │ - └────┴────┘ -``` - - -## Типы данных {#data-types} - -### Примитивные типы данных {#primitive-data-types} - -| Тип данных YTsaurus | Тип данных ClickHouse | -| ------------------- | ------------------------ | -| `int8` | `Int8` | -| `int16` | `Int16` | -| `int32` | `Int32` | -| `int64` | `Int64` | -| `uint8` | `UInt8` | -| `uint16` | `UInt16` | -| `uint32` | `UInt32` | -| `uint64` | `UInt64` | -| `float` | `Float32` | -| `double` | `Float64` | -| `boolean` | `Bool` | -| `string` | `String` | -| `utf8` | `String` | -| `json` | `JSON` | -| `yson(type_v3)` | `JSON` | -| `uuid` | `UUID` | -| `date32` | `Date` (пока не поддерживается) | -| `datetime64` | `Int64` | -| `timestamp64` | `Int64` | -| `interval64` | `Int64` | -| `date` | `Date` (пока не поддерживается) | -| `datetime` | `DateTime` | -| `timestamp` | `DateTime64(6)` | -| `interval` | `UInt64` | -| `any` | `String` | -| `null` | `Nothing` | -| `void` | `Nothing` | -| `T` с `required = False` | `Nullable(T)` | - -### Составные типы данных {#composite-data-types} - -| Тип данных YTsaurus | Тип данных ClickHouse | -| ------------------- | --------------------- | -| `decimal` | `Decimal` | -| `optional` | `Nullable` | -| `list` | `Array` | -| `struct` | `NamedTuple` | -| `tuple` | `Tuple` | -| `variant` | `Variant` | -| `dict` | `Array(Tuple(...))` | -| `tagged` | `T` | - -**См. также** - -- Табличная функция [ytsaurus](../../../sql-reference/table-functions/ytsaurus.md) -- [Схема данных ytsaurus](https://ytsaurus.tech/docs/en/user-guide/storage/static-schema) -- [Типы данных ytsaurus](https://ytsaurus.tech/docs/en/user-guide/storage/data-types) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md deleted file mode 100644 index 177f681a8bf..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -description: 'Документация по семейству движков Log' -sidebar_label: 'Семейство Log' -sidebar_position: 20 -slug: /engines/table-engines/log-family/ -title: 'Семейство движков Log' -doc_type: 'guide' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Семейство движков таблиц Log - - - -Эти движки разработаны для сценариев, когда требуется быстро записывать множество небольших таблиц (до примерно 1 миллиона строк) и затем считывать их целиком. - -Движки семейства: - -| Движки семейства Log | -|---------------------------------------------------------------------| -| [StripeLog](/engines/table-engines/log-family/stripelog.md) | -| [Log](/engines/table-engines/log-family/log.md) | -| [TinyLog](/engines/table-engines/log-family/tinylog.md) | - -Движки таблиц семейства `Log` могут хранить данные в распределённых файловых системах [HDFS](/engines/table-engines/integrations/hdfs) или [S3](/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3). - -:::warning Этот движок не предназначен для логов. -Несмотря на название, *движки таблиц Log не предназначены для хранения логов. Их следует использовать только для небольших объёмов данных, которые нужно быстро записывать. -::: - - - -## Общие свойства {#common-properties} - -Движки: - -- Хранят данные на диске. - -- При записи добавляют данные в конец файла. - -- Поддерживают блокировки для конкурентного доступа к данным. - - Во время выполнения запросов `INSERT` таблица блокируется, и другие запросы на чтение и запись данных ожидают её разблокировки. Если нет запросов на запись данных, любое количество запросов на чтение может выполняться одновременно. - -- Не поддерживают [мутации](/sql-reference/statements/alter#mutations). - -- Не поддерживают индексы. - - Это означает, что запросы `SELECT` по диапазонам данных неэффективны. - -- Не выполняют запись данных атомарно. - - Вы можете получить таблицу с повреждёнными данными, если что-то прервёт операцию записи, например, аварийное выключение сервера. - - - -## Отличия {#differences} - -Движок `TinyLog` является самым простым в семействе и предоставляет минимальный набор функций и наименьшую производительность. Движок `TinyLog` не поддерживает параллельное чтение данных несколькими потоками в рамках одного запроса. Он читает данные медленнее, чем другие движки из семейства, которые поддерживают параллельное чтение в рамках одного запроса, и использует почти столько же файловых дескрипторов, сколько движок `Log`, поскольку хранит каждый столбец в отдельном файле. Используйте его только в простых сценариях. - -Движки `Log` и `StripeLog` поддерживают параллельное чтение данных. При чтении данных ClickHouse использует несколько потоков. Каждый поток обрабатывает отдельный блок данных. Движок `Log` использует отдельный файл для каждого столбца таблицы. `StripeLog` хранит все данные в одном файле. В результате движок `StripeLog` использует меньше файловых дескрипторов, но движок `Log` обеспечивает более высокую производительность при чтении данных. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md deleted file mode 100644 index 6d786230c94..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -description: 'Документация по движку Log' -slug: /engines/table-engines/log-family/log -toc_priority: 33 -toc_title: 'Log' -title: 'Движок таблиц Log' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблицы Log - - - -Этот движок относится к семейству движков `Log`. Общие свойства движков `Log` и их различия см. в статье [Семейство движков Log](../../../engines/table-engines/log-family/index.md). - -`Log` отличается от [TinyLog](../../../engines/table-engines/log-family/tinylog.md) тем, что рядом с файлами столбцов хранится небольшой файл «меток». Эти метки записываются для каждого блока данных и содержат смещения, которые указывают, откуда нужно начать чтение файла, чтобы пропустить заданное количество строк. Это позволяет читать данные таблицы в несколько потоков. -Для параллельного доступа к данным операции чтения могут выполняться одновременно, при этом операции записи блокируют чтение и друг друга. -Движок `Log` не поддерживает индексы. Аналогично, если запись в таблицу завершилась ошибкой, таблица считается повреждённой, и чтение из неё приводит к ошибке. Движок `Log` подходит для временных данных, таблиц с однократной записью, а также для тестирования или демонстрационных целей. - - - -## Создание таблицы - -```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 = Log -``` - -См. подробное описание запроса [CREATE TABLE](/sql-reference/statements/create/table). - - -## Запись данных {#table_engines-log-writing-the-data} - -Движок `Log` эффективно хранит данные, записывая каждый столбец в отдельный файл. Для каждой таблицы движок `Log` записывает следующие файлы в указанный путь хранения: - -- `.bin`: файл данных для каждого столбца, содержащий сериализованные и сжатые данные. -`__marks.mrk`: файл меток, в котором хранятся смещения и количество строк для каждого вставленного блока данных. Метки используются для эффективного выполнения запросов, позволяя движку пропускать нерелевантные блоки данных при чтении. - -### Процесс записи {#writing-process} - -Когда данные записываются в таблицу `Log`: - -1. Данные сериализуются и сжимаются в блоки. -2. Для каждого столбца сжатые данные дописываются в соответствующий файл `.bin`. -3. В файл `__marks.mrk` добавляются соответствующие записи, фиксирующие смещение и количество строк вновь вставленных данных. - - - -## Чтение данных {#table_engines-log-reading-the-data} - -Файл меток позволяет ClickHouse выполнять параллельное чтение данных. Это означает, что запрос `SELECT` может возвращать строки в непредсказуемом порядке. Используйте конструкцию `ORDER BY`, чтобы отсортировать строки. - - - -## Пример использования - -Создание таблицы: - -```sql -CREATE TABLE log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = Log -``` - -Вставка данных: - -```sql -INSERT INTO log_table VALUES (now(),'REGULAR','Первое обычное сообщение') -INSERT INTO log_table VALUES (now(),'REGULAR','Второе обычное сообщение'),(now(),'WARNING','Первое предупреждение') -``` - -Мы использовали два запроса `INSERT`, чтобы создать два блока данных внутри файлов `.bin`. - -ClickHouse использует несколько потоков при выборке данных. Каждый поток читает отдельный блок данных и по завершении независимо возвращает результирующие строки. В результате порядок блоков строк в выводе может не совпадать с порядком этих же блоков на входе. Например: - -```sql -SELECT * FROM log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:27:32 │ REGULAR │ Второе обычное сообщение │ -│ 2019-01-18 14:34:53 │ WARNING │ Первое предупреждение │ -└─────────────────────┴──────────────┴────────────────────────────┘ -┌───────────timestamp─┬─message_type─┬─message───────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ Первое обычное сообщение │ -└─────────────────────┴──────────────┴───────────────────────────┘ -``` - -Сортировка результатов (по умолчанию — по возрастанию): - -```sql -SELECT * FROM log_table ORDER BY timestamp -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ Первое обычное сообщение │ -│ 2019-01-18 14:27:32 │ REGULAR │ Второе обычное сообщение │ -│ 2019-01-18 14:34:53 │ WARNING │ Первое предупреждение │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md deleted file mode 100644 index b0cfb49f8d6..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -description: 'Документация по движку таблицы StripeLog' -slug: /engines/table-engines/log-family/stripelog -toc_priority: 32 -toc_title: 'StripeLog' -title: 'Движок таблицы StripeLog' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблицы StripeLog - - - -Этот движок относится к семейству лог-движков. Общие свойства лог-движков и их различия см. в статье [Log Engine Family](../../../engines/table-engines/log-family/index.md). - -Используйте этот движок в сценариях, когда необходимо создавать большое количество таблиц с небольшим объёмом данных (менее 1 миллиона строк). Например, такую таблицу можно использовать для хранения входящих пакетов данных для последующей трансформации, когда требуется их атомарная обработка. До 100 тыс. экземпляров таблиц этого типа являются нормальной конфигурацией для одного сервера ClickHouse. Этот табличный движок следует предпочесть движку [Log](./log.md), когда требуется большое количество таблиц, однако это происходит за счёт эффективности чтения. - - - -## Создание таблицы - -```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). - - -## Запись данных {#table_engines-stripelog-writing-the-data} - -Движок `StripeLog` хранит все столбцы в одном файле. Для каждого запроса `INSERT` ClickHouse добавляет блок данных в конец файла таблицы, записывая столбцы по отдельности. - -Для каждой таблицы ClickHouse создает следующие файлы: - -- `data.bin` — файл с данными. -- `index.mrk` — файл с метками. Метки содержат смещения для каждого столбца каждого вставленного блока данных. - -Движок `StripeLog` не поддерживает операции `ALTER UPDATE` и `ALTER DELETE`. - - - -## Чтение данных {#table_engines-stripelog-reading-the-data} - -Файл с метками позволяет ClickHouse параллелизировать чтение данных. Это означает, что запрос `SELECT` возвращает строки в непредсказуемом порядке. Используйте оператор `ORDER BY` для сортировки строк. - - - -## Пример использования - -Создание таблицы: - -```sql -CREATE TABLE stripe_log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = StripeLog -``` - -Вставка данных: - -```sql -INSERT INTO stripe_log_table VALUES (now(),'REGULAR','Первое обычное сообщение') -INSERT INTO stripe_log_table VALUES (now(),'REGULAR','Второе обычное сообщение'),(now(),'WARNING','Первое предупреждение') -``` - -Мы использовали два запроса `INSERT`, чтобы создать два блока данных в файле `data.bin`. - -ClickHouse использует несколько потоков при выборке данных. Каждый поток читает отдельный блок данных и по мере завершения возвращает соответствующие строки независимо от других. В результате порядок блоков строк в выходных данных в большинстве случаев не совпадает с порядком этих же блоков во входных данных. Например: - -```sql -SELECT * FROM stripe_log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:27:32 │ REGULAR │ Второе обычное сообщение │ -│ 2019-01-18 14:34:53 │ WARNING │ Первое предупреждение │ -└─────────────────────┴──────────────┴────────────────────────────┘ -┌───────────timestamp─┬─message_type─┬─message───────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ Первое обычное сообщение │ -└─────────────────────┴──────────────┴───────────────────────────┘ -``` - -Сортировка результатов (по умолчанию — по возрастанию): - -```sql -SELECT * FROM stripe_log_table ORDER BY timestamp -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ Первое обычное сообщение │ -│ 2019-01-18 14:27:32 │ REGULAR │ Второе обычное сообщение │ -│ 2019-01-18 14:34:53 │ WARNING │ Первое предупреждение │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md deleted file mode 100644 index 988c67ef87d..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -description: 'Документация по табличному движку TinyLog' -slug: /engines/table-engines/log-family/tinylog -toc_priority: 34 -toc_title: 'TinyLog' -title: 'Табличный движок TinyLog' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблиц TinyLog - - - -Движок относится к семейству лог-движков. Общие свойства лог-движков и их различия см. в разделе [Log Engine Family](../../../engines/table-engines/log-family/index.md). - -Этот табличный движок обычно используется по принципу «одна запись»: данные записываются один раз, после чего могут многократно читаться. Например, вы можете использовать таблицы типа `TinyLog` для промежуточных данных, обрабатываемых небольшими пакетами. Учтите, что хранение данных в большом количестве маленьких таблиц неэффективно. - -Запросы выполняются в одном потоке. Другими словами, этот движок предназначен для относительно небольших таблиц (примерно до 1 000 000 строк). Имеет смысл использовать этот табличный движок, если у вас много маленьких таблиц, поскольку он проще, чем движок [Log](../../../engines/table-engines/log-family/log.md) (нужно открыть меньше файлов). - - - -## Характеристики {#characteristics} - -- **Более простая структура**: В отличие от движка `Log`, `TinyLog` не использует mark-файлы. Это снижает сложность, но также ограничивает возможности оптимизации производительности для больших наборов данных. -- **Однопоточная обработка запросов**: Запросы к таблицам `TinyLog` выполняются в одном потоке, что делает его подходящим для относительно небольших таблиц, обычно до 1 000 000 строк. -- **Эффективен для небольших таблиц**: Простота движка `TinyLog` делает его предпочтительным при работе с большим количеством небольших таблиц, так как он требует меньше файловых операций по сравнению с движком `Log`. - -В отличие от движка `Log`, `TinyLog` не использует mark-файлы. Это снижает сложность, но также ограничивает возможности оптимизации производительности для более крупных наборов данных. - - - -## Создание таблицы - -```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 = TinyLog -``` - -Подробное описание запроса см. в разделе [CREATE TABLE](/sql-reference/statements/create/table). - - -## Запись данных {#table_engines-tinylog-writing-the-data} - -Движок `TinyLog` хранит все столбцы в одном файле. Для каждого запроса `INSERT` ClickHouse добавляет блок данных в конец файла таблицы, записывая столбцы один за другим. - -Для каждой таблицы ClickHouse записывает следующие файлы: - -- `.bin`: файл данных для каждого столбца, содержащий сериализованные и сжатые данные. - -Движок `TinyLog` не поддерживает операции `ALTER UPDATE` и `ALTER DELETE`. - - - -## Пример использования - -Создание таблицы: - -```sql -CREATE TABLE tiny_log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = TinyLog -``` - -Добавление данных: - -```sql -INSERT INTO tiny_log_table VALUES (now(),'REGULAR','Первое обычное сообщение') -INSERT INTO tiny_log_table VALUES (now(),'REGULAR','Второе обычное сообщение'),(now(),'WARNING','Первое предупреждение') -``` - -Мы использовали два запроса `INSERT`, чтобы создать два блока данных внутри файлов `.bin`. - -ClickHouse использует один поток чтения данных. В результате порядок блоков строк на выходе совпадает с порядком этих же блоков на входе. Например: - -```sql -SELECT * FROM tiny_log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2024-12-10 13:11:58 │ REGULAR │ Первое обычное сообщение │ -│ 2024-12-10 13:12:12 │ REGULAR │ Второе обычное сообщение │ -│ 2024-12-10 13:12:12 │ WARNING │ Первое предупреждение │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md deleted file mode 100644 index af0991fb0bb..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md +++ /dev/null @@ -1,200 +0,0 @@ ---- -description: 'Заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым [ключом сортировки](../../../engines/table-engines/mergetree-family/mergetree.md)) одной строкой (в пределах одной части данных), которая хранит объединённое состояние агрегатных функций.' -sidebar_label: 'AggregatingMergeTree' -sidebar_position: 60 -slug: /engines/table-engines/mergetree-family/aggregatingmergetree -title: 'Движок таблицы AggregatingMergeTree' -doc_type: 'reference' ---- - - - -# Движок таблиц AggregatingMergeTree - -Движок наследуется от [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) и изменяет логику слияния частей данных. ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым [ключом сортировки](../../../engines/table-engines/mergetree-family/mergetree.md)) одной строкой (в пределах одной части данных), которая хранит комбинацию состояний агрегатных функций. - -Вы можете использовать таблицы `AggregatingMergeTree` для инкрементальной агрегации данных, в том числе для материализованных представлений с агрегированными данными. - -Пример использования AggregatingMergeTree и агрегатных функций показан в видео ниже: -
- -
- -Движок обрабатывает все столбцы со следующими типами: - -- [`AggregateFunction`](../../../sql-reference/data-types/aggregatefunction.md) -- [`SimpleAggregateFunction`](../../../sql-reference/data-types/simpleaggregatefunction.md) - -Имеет смысл использовать `AggregatingMergeTree`, если он уменьшает число строк на несколько порядков. - - - -## Создание таблицы - -```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` требуются те же [части запроса](../../../engines/table-engines/mergetree-family/mergetree.md), что и при создании таблицы `MergeTree`. - -
- Устаревший способ создания таблицы - - :::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} - -Для вставки данных используйте запрос [INSERT SELECT](../../../sql-reference/statements/insert-into.md) с агрегирующими функциями с суффиксом `-State`. -При выборке данных из таблицы `AggregatingMergeTree` используйте предложение `GROUP BY` и те же агрегирующие функции, что и при вставке данных, но с суффиксом `-Merge`. - -В результатах запроса `SELECT` значения типа `AggregateFunction` имеют двоичное представление, зависящее от реализации, для всех форматов вывода ClickHouse. Например, если вы выгружаете данные в формате `TabSeparated` с помощью запроса `SELECT`, то этот дамп можно загрузить обратно с помощью запроса `INSERT`. - - - -## Пример агрегированного материализованного представления - -В этом примере предполагается, что у вас есть база данных под названием `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); -``` - -Далее необходимо создать таблицу `AggregatingMergeTree`, которая будет хранить агрегирующие функции `AggregationFunction`, отслеживающие общее количество посещений и количество уникальных пользователей. - -Создайте материализованное представление с движком `AggregatingMergeTree`, которое отслеживает таблицу `test.visits` и использует тип [`AggregateFunction`](/sql-reference/data-types/aggregatefunction): - -```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.agg_visits` данными из `test.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.visits_mv`: - -```sql -SELECT - StartDate, - sumMerge(Visits) AS Visits, - uniqMerge(Users) AS Users -FROM test.visits_mv -GROUP BY StartDate -ORDER BY StartDate; -``` - -```text -┌───────────────StartDate─┬─Visits─┬─Users─┐ -│ 2022-11-03 03:27:11.000 │ 9 │ 2 │ -└─────────────────────────┴────────┴───────┘ -``` - -Добавьте ещё пару записей в `test.visits`, но на этот раз попробуйте использовать другое значение временной метки для одной из записей: - -```sql -INSERT INTO test.visits (StartDate, CounterID, Sign, UserID) - VALUES (1669446031000, 2, 5, 10), (1667446031000, 3, 7, 5); -``` - -Выполните запрос `SELECT` ещё раз — будет выведен следующий результат: - -```text -┌───────────────ДатаНачала─┬─Посещения─┬─Пользователи─┐ -│ 2022-11-03 03:27:11.000 │ 16 │ 3 │ -│ 2022-11-26 07:00:31.000 │ 5 │ 1 │ -└─────────────────────────┴────────┴───────┘ -``` - -В некоторых случаях вы можете захотеть избежать предварительной агрегации строк во время вставки, чтобы перенести нагрузку агрегации с момента вставки -на момент слияния. Обычно необходимо включать столбцы, которые не участвуют в агрегации, в оператор `GROUP BY` -в определении материализованного представления, чтобы избежать ошибки. Однако вы можете воспользоваться функцией [`initializeAggregation`](/sql-reference/functions/other-functions#initializeAggregation) -с настройкой `optimize_on_insert = 0` (по умолчанию она включена), чтобы добиться этого. Использование `GROUP BY` -в этом случае больше не требуется: - -```sql -CREATE MATERIALIZED VIEW test.visits_mv TO test.agg_visits -AS SELECT - StartDate, - CounterID, - initializeAggregation('sumState', Sign) AS Visits, - initializeAggregation('uniqState', UserID) AS Users -FROM test.visits; -``` - - -:::note -При использовании `initializeAggregation` агрегатное состояние создаётся для каждой отдельной строки без группировки. -Каждая исходная строка даёт одну строку в материализованном представлении, а фактическая агрегация происходит позже, когда -`AggregatingMergeTree` объединяет части. Это верно только в том случае, если `optimize_on_insert = 0`. -::: - - - -## Связанные материалы {#related-content} - -- Блог: [Использование комбинаторов агрегатных функций в ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md deleted file mode 100644 index 5e480489647..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md +++ /dev/null @@ -1,736 +0,0 @@ ---- -description: 'Документация по точному и приближённому векторному поиску' -keywords: ['векторный поиск по сходству', 'ann', 'knn', 'hnsw', 'индексы', 'индекс', 'поиск ближайших соседей', 'векторный поиск'] -sidebar_label: 'Точный и приближённый векторный поиск' -slug: /engines/table-engines/mergetree-family/annindexes -title: 'Точный и приближённый векторный поиск' -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# Точный и приближённый векторный поиск - -Задача нахождения N ближайших точек в многомерном (векторном) пространстве для заданной точки известна как [поиск ближайших соседей](https://en.wikipedia.org/wiki/Nearest_neighbor_search) или, кратко, векторный поиск. -Существуют два общих подхода к решению задачи векторного поиска: - -* Точный векторный поиск вычисляет расстояние между заданной точкой и всеми точками в векторном пространстве. Это обеспечивает максимально возможную точность, то есть возвращаемые точки гарантированно являются фактическими ближайшими соседями. Поскольку векторное пространство просматривается полностью, точный векторный поиск может быть слишком медленным для практического использования. -* Приближённый векторный поиск относится к группе методов (например, специальные структуры данных, такие как графы и случайные леса), которые вычисляют результаты намного быстрее, чем точный векторный поиск. Точность результата, как правило, «достаточно хороша» для практического применения. Многие приближённые методы предоставляют параметры для настройки компромисса между точностью результата и временем поиска. - -Векторный поиск (точный или приближённый) может быть записан на SQL следующим образом: - -```sql -WITH [...] AS reference_vector -SELECT [...] -FROM table -WHERE [...] -- условие WHERE необязательно -ORDER BY (vectors, reference_vector) -LIMIT -``` - -Точки в векторном пространстве хранятся в столбце `vectors` типа массива, например [Array(Float64)](../../../sql-reference/data-types/array.md), [Array(Float32)](../../../sql-reference/data-types/array.md) или [Array(BFloat16)](../../../sql-reference/data-types/array.md). -Эталонный вектор — это константный массив, задаваемый в виде общего табличного выражения. -`<DistanceFunction>` вычисляет расстояние между эталонной точкой и всеми сохранёнными точками. -Для этого может быть использована любая из доступных [функций расстояния](/sql-reference/functions/distance-functions). -`<N>` задаёт, сколько соседей нужно вернуть. - - -## Точный поиск по векторам - -Точный поиск по векторам можно выполнить с использованием приведённого выше запроса SELECT без изменений. -Время выполнения таких запросов, как правило, пропорционально количеству сохранённых векторов и их размерности, то есть количеству элементов массива. -Кроме того, поскольку ClickHouse выполняет полный перебор всех векторов, время выполнения таких запросов также зависит от количества потоков, используемых запросом (см. настройку [max_threads](../../../operations/settings/settings.md#max_threads)). - -### Пример - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32)) ENGINE = MergeTree ORDER BY id; - -INSERT INTO tab VALUES (0, [1.0, 0.0]), (1, [1.1, 0.0]), (2, [1.2, 0.0]), (3, [1.3, 0.0]), (4, [1.4, 0.0]), (5, [1.5, 0.0]), (6, [0.0, 2.0]), (7, [0.0, 2.1]), (8, [0.0, 2.2]), (9, [0.0, 2.3]), (10, [0.0, 2.4]), (11, [0.0, 2.5]); - -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -возвращает - -```result - ┌─id─┬─vec─────┐ -1. │ 6 │ [0,2] │ -2. │ 7 │ [0,2.1] │ -3. │ 8 │ [0,2.2] │ - └────┴─────────┘ -``` - - -## Приблизительный векторный поиск - -### Индексы сходства векторов - -ClickHouse предоставляет специальный индекс сходства векторов («vector similarity») для выполнения приблизительного векторного поиска. - -:::note -Индексы сходства векторов доступны в ClickHouse версиях 25.8 и новее. -Если вы столкнётесь с проблемами, пожалуйста, создайте issue в [репозитории ClickHouse](https://github.com/clickhouse/clickhouse/issues). -::: - -#### Создание индекса сходства векторов - -Индекс сходства векторов можно создать на новой таблице следующим образом: - -```sql -CREATE TABLE table -( - [...], - vectors Array(Float*), - INDEX vectors TYPE vector_similarity(, , ) [GRANULARITY ] -) -ENGINE = MergeTree -ORDER BY [...] -``` - -В качестве альтернативы можно добавить индекс векторного сходства к уже существующей таблице: - -```sql -ALTER TABLE table ADD INDEX vectors TYPE vector_similarity(, , ) [GRANULARITY ]; -``` - -Индексы векторного сходства — это особый вид пропускающих индексов (см. [здесь](mergetree.md#table_engine-mergetree-data_skipping-indexes) и [здесь](../../../optimize/skipping-indexes)). -Соответственно, приведенный выше оператор `ALTER TABLE` приводит к тому, что индекс строится только для новых данных, которые будут вставляться в таблицу. -Чтобы построить индекс и для уже существующих данных, его необходимо материализовать: - -```sql -ALTER TABLE table MATERIALIZE INDEX SETTINGS mutations_sync = 2; -``` - -Функция `` должна быть - -* `L2Distance`, [евклидовым расстоянием](https://en.wikipedia.org/wiki/Euclidean_distance), представляющим длину отрезка между двумя точками в евклидовом пространстве, или -* `cosineDistance`, [косинусным расстоянием](https://en.wikipedia.org/wiki/Cosine_similarity#Cosine_distance), представляющим угол между двумя ненулевыми векторами. - -Для нормализованных данных обычно лучше всего подходит `L2Distance`, в противном случае рекомендуется `cosineDistance`, чтобы компенсировать масштаб. - -`` задаёт размер массива (количество элементов) в базовом столбце. -Если при создании индекса ClickHouse обнаружит массив с другим размером, индекс не будет создан, а будет возвращена ошибка. - -Необязательный параметр GRANULARITY `` относится к размеру гранул индекса (см. [здесь](../../../optimize/skipping-indexes)). -Значение по умолчанию — 100 миллионов — должно хорошо подходить для большинства вариантов использования, но его также можно настроить. -Мы рекомендуем выполнять настройку только продвинутым пользователям, которые понимают последствия своих действий (см. [ниже](#differences-to-regular-skipping-indexes)). - -Индексы векторного сходства являются обобщёнными в том смысле, что могут использовать различные методы приблизительного поиска. -Фактически используемый метод задаётся параметром ``. -На данный момент доступен только метод HNSW ([академическая статья](https://arxiv.org/abs/1603.09320)) — популярная и современная техника приблизительного поиска по векторам на основе иерархических графов близости. -Если в качестве типа используется HNSW, пользователи могут дополнительно указать специфичные для HNSW параметры: - -```sql -CREATE TABLE table -( - [...], - vectors Array(Float*), - INDEX index_name vectors TYPE vector_similarity('hnsw', , [, , , ]) [GRANULARITY N] -) -ENGINE = MergeTree -ORDER BY [...] -``` - -Доступны следующие параметры, специфичные для HNSW: - -* `` управляет квантизацией векторов в графе близости. Возможные значения: `f64`, `f32`, `f16`, `bf16`, `i8` или `b1`. Значение по умолчанию — `bf16`. Обратите внимание, что этот параметр не влияет на представление векторов во внутреннем столбце. -* `` управляет количеством соседей у каждой вершины графа, также известным как гиперпараметр HNSW `M`. Значение по умолчанию — `32`. Значение `0` означает использование значения по умолчанию. -* `` управляет размером динамического списка кандидатов во время построения графа HNSW, также известным как гиперпараметр HNSW `ef_construction`. Значение по умолчанию — `128`. Значение `0` означает использование значения по умолчанию. - -Значения по умолчанию всех параметров, специфичных для HNSW, достаточно хорошо подходят для большинства сценариев использования. -Поэтому мы не рекомендуем изменять эти параметры. - - -Дополнительно действуют следующие ограничения: - -* Индексы векторного сходства могут быть построены только по столбцам типов [Array(Float32)](../../../sql-reference/data-types/array.md), [Array(Float64)](../../../sql-reference/data-types/array.md) или [Array(BFloat16)](../../../sql-reference/data-types/array.md). Массивы допускающих `NULL` и чисел с плавающей запятой с низкой кардинальностью, такие как `Array(Nullable(Float32))` и `Array(LowCardinality(Float32))`, не поддерживаются. -* Индексы векторного сходства должны строиться по отдельным столбцам. -* Индексы векторного сходства могут быть построены по вычисляемым выражениям (например, `INDEX index_name arraySort(vectors) TYPE vector_similarity([...])`), но такие индексы не могут быть использованы для последующего приближённого поиска ближайших соседей. -* Для индексов векторного сходства требуется, чтобы все массивы в базовом столбце содержали `` элементов — это проверяется при создании индекса. Чтобы как можно раньше обнаружить нарушения этого требования, пользователи могут добавить [ограничение](/sql-reference/statements/create/table.md#constraints) для векторного столбца, например, `CONSTRAINT same_length CHECK length(vectors) = 256`. -* Аналогично, значения массивов в базовом столбце не должны быть пустыми (`[]`) и не должны иметь пустое значение по умолчанию (также `[]`). - -**Оценка потребления хранилища и памяти** - -Вектор, сгенерированный для использования с типичной моделью ИИ (например, большой языковой моделью, [LLMs](https://en.wikipedia.org/wiki/Large_language_model)), состоит из сотен или тысяч значений с плавающей запятой. -Таким образом, одно векторное значение может потреблять несколько килобайт памяти. -Пользователи, которые хотят оценить объём хранилища, необходимый для базового векторного столбца в таблице, а также объём оперативной памяти, необходимый для индекса векторного сходства, могут использовать две приведённые ниже формулы: - -Потребление хранилища векторным столбцом в таблице (без сжатия): - -```text -Потребление хранилища = Количество векторов × Размерность × Размер типа данных столбца -``` - -Пример для [датасета DBpedia](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M): - -```text -Потребление хранилища = 1 миллион * 1536 * 4 (для Float32) = 6,1 ГБ -``` - -Индекс сходства векторов должен быть полностью загружен с диска в основную память для выполнения поиска. -Аналогично, векторный индекс также полностью строится в памяти, а затем сохраняется на диск. - -Объём памяти, необходимый для загрузки векторного индекса: - -```text -Память для векторов в индексе (mv) = Количество векторов * Размерность * Размер квантованного типа данных -Память для графа в оперативной памяти (mg) = Количество векторов * hnsw_max_connections_per_layer * Байт_на_идентификатор_узла (= 4) * Коэффициент_повторения_узлов_по_слоям (= 2) - -Потребление памяти: mv + mg -``` - -Пример для [набора данных DBpedia](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M): - -```text -Память для векторов в индексе (mv) = 1 млн * 1536 * 2 (для BFloat16) = 3072 МБ -Память для графа в памяти (mg) = 1 млн * 64 * 2 * 4 = 512 МБ - -Потребление памяти = 3072 + 512 = 3584 МБ -``` - -Приведенная выше формула не учитывает дополнительную память, необходимую индексам векторного сходства для выделения структур данных, используемых во время выполнения, таких как заранее выделенные буферы и кэши. - -#### Использование индекса векторного сходства - -:::note -Чтобы использовать индексы векторного сходства, настройка [compatibility](../../../operations/settings/settings.md) должна быть равна `''` (значение по умолчанию) или `'25.1'` либо новее. -::: - -Индексы векторного сходства поддерживают запросы SELECT следующего вида: - -```sql -WITH [...] AS reference_vector -SELECT [...] -FROM table -WHERE [...] -- предложение WHERE необязательно -ORDER BY (vectors, reference_vector) -LIMIT -``` - -Оптимизатор запросов ClickHouse пытается сопоставить запрос с приведённым выше шаблоном и использовать доступные индексы векторного сходства. -Запрос может использовать индекс векторного сходства только в том случае, если функция расстояния в запросе SELECT совпадает с функцией расстояния в определении индекса. - -Продвинутые пользователи могут задать собственное значение настройки [hnsw_candidate_list_size_for_search](../../../operations/settings/settings.md#hnsw_candidate_list_size_for_search) (также известной как гиперпараметр HNSW «ef_search»), чтобы настраивать размер списка кандидатов при выполнении поиска (например, `SELECT [...] SETTINGS hnsw_candidate_list_size_for_search = `). -Значение настройки по умолчанию, равное 256, хорошо работает в большинстве сценариев использования. -Более высокие значения настройки обеспечивают лучшую точность ценой более низкой производительности. - - -Если запрос может использовать индекс векторного сходства, ClickHouse проверяет, что значение LIMIT ``, указанное в запросах SELECT, находится в разумных пределах. -Более точно, будет возвращена ошибка, если `` больше значения настройки [max_limit_for_vector_search_queries](../../../operations/settings/settings.md#max_limit_for_vector_search_queries), по умолчанию равного 100. -Слишком большие значения LIMIT могут замедлять поиск и обычно указывают на ошибку в использовании. - -Чтобы проверить, использует ли запрос SELECT индекс векторного сходства, вы можете добавить к запросу префикс `EXPLAIN indexes = 1`. - -В качестве примера, запрос - -```sql -EXPLAIN indexes = 1 -WITH [0.462, 0.084, ..., -0.110] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 10; -``` - -может вернуть - -```result - ┌─explain─────────────────────────────────────────────────────────────────────────────────────────┐ - 1. │ Expression (Проекция имён) │ - 2. │ Limit (предварительный LIMIT (без OFFSET)) │ - 3. │ Sorting (Сортировка для ORDER BY) │ - 4. │ Expression ((Перед ORDER BY + (Проекция + Преобразование имён столбцов в идентификаторы))) │ - 5. │ ReadFromMergeTree (default.tab) │ - 6. │ Индексы: │ - 7. │ PrimaryKey │ - 8. │ Условие: true │ - 9. │ Части: 1/1 │ -10. │ Гранулы: 575/575 │ -11. │ Skip │ -12. │ Имя: idx │ -13. │ Описание: vector_similarity GRANULARITY 100000000 │ -14. │ Части: 1/1 │ -15. │ Гранулы: 10/575 │ - └─────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -В этом примере 1 миллион векторов из [набора данных dbpedia](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M), каждый размерностью 1536, хранятся в 575 гранулах, т.е. примерно по 1,7 тыс. строк на гранулу. -В запросе запрашиваются 10 соседей, и индекс векторного сходства находит этих 10 соседей в 10 отдельных гранулах. -Эти 10 гранул будут прочитаны во время выполнения запроса. - -Индексы векторного сходства используются, если вывод содержит `Skip`, а также имя и тип векторного индекса (в примере `idx` и `vector_similarity`). -В этом случае индекс векторного сходства отбросил две из четырёх гранул, т.е. 50% данных. -Чем больше гранул может быть отброшено, тем эффективнее используется индекс. - -:::tip -Чтобы принудительно использовать индекс, вы можете выполнить запрос SELECT с параметром [force_data_skipping_indexes](../../../operations/settings/settings#force_data_skipping_indices) (укажите имя индекса в качестве значения параметра). -::: - -**Постфильтрация и префильтрация** - -Пользователи могут дополнительно указать предложение `WHERE` с дополнительными условиями фильтрации для запроса SELECT. -ClickHouse будет применять эти условия фильтрации, используя стратегию постфильтрации или префильтрации. -Кратко, обе стратегии определяют порядок, в котором применяются фильтры: - -* Постфильтрация означает, что индекс векторного сходства применяется первым, после чего ClickHouse применяет дополнительные фильтры, указанные в предложении `WHERE`. -* Префильтрация означает, что порядок применения фильтров будет обратным. - -У стратегий разные компромиссы: - -* У постфильтрации есть типичная проблема: она может вернуть меньше строк, чем запрошено в предложении `LIMIT `. Такая ситуация возникает, когда одна или несколько строк результата, возвращённых индексом векторного сходства, не удовлетворяют дополнительным фильтрам. -* Префильтрация в целом остаётся нерешённой задачей. Некоторые специализированные векторные базы данных предоставляют алгоритмы префильтрации, но большинство реляционных баз данных (включая ClickHouse) будут переходить к точному поиску соседей, т.е. к полному перебору без индекса. - -Используемая стратегия зависит от условия фильтрации. - -*Дополнительные фильтры являются частью ключа партиционирования* - -Если дополнительное условие фильтрации является частью ключа партиционирования, то ClickHouse применит отсечение партиций. -В качестве примера, таблица разбита на диапазонные партиции по столбцу `year`, и выполняется следующий запрос: - -```sql -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -WHERE year = 2025 -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -ClickHouse отбросит все партиции, кроме партиции за 2025 год. - -*Дополнительные фильтры, которые не могут быть выполнены по индексам* - -Если дополнительные условия фильтрации не могут быть выполнены по индексам (индекс по первичному ключу, пропускающий индекс), ClickHouse применит последующую фильтрацию. - - -*Дополнительные фильтры могут оцениваться с использованием индекса первичного ключа* - -Если дополнительные условия фильтрации могут быть оценены с использованием [первичного ключа](mergetree.md#primary-key) (т. е. они образуют префикс первичного ключа) и - -* условие фильтрации отбрасывает как минимум одну строку внутри части, ClickHouse будет использовать предварительную фильтрацию для «выживших» диапазонов внутри части, -* условие фильтрации не отбрасывает ни одной строки внутри части, ClickHouse будет выполнять постфильтрацию для этой части. - -На практике второй вариант встречается довольно редко. - -*Дополнительные фильтры могут оцениваться с использованием skipping index* - -Если дополнительные условия фильтрации могут быть оценены с использованием [skipping indexes](mergetree.md#table_engine-mergetree-data_skipping-indexes) (minmax index, set index и т. д.), ClickHouse выполняет постфильтрацию. -В таких случаях индекс векторного сходства вычисляется первым, так как ожидается, что он отбросит наибольшее количество строк по сравнению с другими skipping indexes. - -Для более тонкого управления постфильтрацией и предварительной фильтрацией можно использовать два параметра: - -Параметр [vector_search_filter_strategy](../../../operations/settings/settings#vector_search_filter_strategy) (по умолчанию: `auto`, который реализует приведённые выше эвристики) может быть установлен в значение `prefilter`. -Это полезно для принудительной предварительной фильтрации в случаях, когда дополнительные условия фильтрации обладают крайне высокой селективностью. -Например, следующий запрос может выиграть от предварительной фильтрации: - -```sql -SELECT bookid, author, title -FROM books -WHERE price < 2.00 -ORDER BY cosineDistance(book_vector, getEmbedding('Книги о древних азиатских империях')) -LIMIT 10 -``` - -Предположим, что только очень небольшое количество книг стоит меньше 2 долларов. В этом случае постфильтрация может вернуть ноль строк, потому что все 10 лучших совпадений, возвращённых векторным индексом, могут иметь цену выше 2 долларов. -Принудительно включив префильтрацию (добавьте `SETTINGS vector_search_filter_strategy = 'prefilter'` к запросу), ClickHouse сначала находит все книги с ценой менее 2 долларов, а затем выполняет переборный (brute-force) векторный поиск по найденным книгам. - -В качестве альтернативного подхода к решению указанной выше проблемы можно задать настройку [vector_search_index_fetch_multiplier](../../../operations/settings/settings#vector_search_index_fetch_multiplier) (по умолчанию: `1.0`, максимум: `1000.0`) значением > `1.0` (например, `2.0`). -Количество ближайших соседей, выбираемых из векторного индекса, умножается на значение этой настройки, после чего к этим строкам применяется дополнительный фильтр, чтобы вернуть количество строк, не превышающее значение LIMIT. -Например, мы можем выполнить запрос ещё раз, но уже с множителем `3.0`: - -```sql -SELECT bookid, author, title -FROM books -WHERE price < 2.00 -ORDER BY cosineDistance(book_vector, getEmbedding('Books on ancient Asian empires')) -LIMIT 10 -SETTING vector_search_index_fetch_multiplier = 3.0; -``` - -ClickHouse извлечёт 3,0 x 10 = 30 ближайших соседей из векторного индекса в каждой части и затем применит дополнительные фильтры. -Будут возвращены только десять ближайших соседей. -Отметим, что настройка `vector_search_index_fetch_multiplier` может смягчить проблему, но в крайних случаях (при очень селективном условии WHERE) всё ещё возможно, что будет возвращено меньше N запрошенных строк. - -**Пересчёт оценок (rescoring)** - -Skip-индексы в ClickHouse обычно фильтруют данные на уровне гранул, то есть запрос к skip-индексу (внутренне) возвращает список потенциально подходящих гранул, что сокращает объём читаемых данных при последующем сканировании. -Это хорошо работает для skip-индексов в целом, но в случае индексов векторного сходства создаётся «несоответствие гранулярности». -Подробнее: индекс векторного сходства определяет номера строк N наиболее похожих векторов для заданного опорного вектора, но затем ему нужно сопоставить эти номера строк с номерами гранул. -ClickHouse затем загрузит эти гранулы с диска и повторит вычисление расстояний для всех векторов в этих гранулах. -Этот шаг называется пересчётом оценок (rescoring), и хотя теоретически он может повысить точность — помните, что индекс векторного сходства возвращает только *приближённый* результат, — очевидно, что с точки зрения производительности он не оптимален. - -Поэтому ClickHouse предоставляет оптимизацию, которая отключает пересчёт оценок и возвращает наиболее похожие векторы и их расстояния напрямую из индекса. -Эта оптимизация включена по умолчанию, см. настройку [vector_search_with_rescoring](../../../operations/settings/settings#vector_search_with_rescoring). -В общих чертах она работает так: ClickHouse делает доступными наиболее похожие векторы и их расстояния в виде виртуального столбца `_distances`. -Чтобы увидеть это, выполните запрос векторного поиска с `EXPLAIN header = 1`: - - -```sql -EXPLAIN header = 1 -WITH [0., 2.] AS reference_vec -SELECT id -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3 -SETTINGS vector_search_with_rescoring = 0 -``` - -```result -Query id: a2a9d0c8-a525-45c1-96ca-c5a11fa66f47 - - ┌─explain─────────────────────────────────────────────────────────────────────────────────────────────────┐ - 1. │ Expression (Проекция имён) │ - 2. │ Header: id Int32 │ - 3. │ Limit (предварительный LIMIT (без OFFSET)) │ - 4. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ - 5. │ __table1.id Int32 │ - 6. │ Sorting (Сортировка для ORDER BY) │ - 7. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ - 8. │ __table1.id Int32 │ - 9. │ Expression ((До ORDER BY + (Проекция + Замена имён столбцов на идентификаторы столбцов))) │ -10. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ -11. │ __table1.id Int32 │ -12. │ ReadFromMergeTree (default.tab) │ -13. │ Header: id Int32 │ -14. │ _distance Float32 │ - └─────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -:::note -Запрос, выполняемый без повторной оценки (`vector_search_with_rescoring = 0`) и с включёнными параллельными репликами, может всё равно перейти к повторной оценке результатов. -::: - -#### Оптимизация производительности - -**Настройка сжатия** - -Практически во всех вариантах использования векторы в соответствующем столбце являются плотными и плохо сжимаются. -В результате [сжатие](/sql-reference/statements/create/table.md#column_compression_codec) замедляет операции вставки данных во векторный столбец и чтения из него. -Поэтому мы рекомендуем отключить сжатие. -Для этого укажите `CODEC(NONE)` для векторного столбца следующим образом: - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32) CODEC(NONE), INDEX idx vec TYPE vector_similarity('hnsw', 'L2Distance', 2)) ENGINE = MergeTree ORDER BY id; -``` - -**Настройка создания индексов** - -Жизненный цикл индексов векторного сходства привязан к жизненному циклу частей. -Другими словами, всякий раз, когда создаётся новая часть с определённым индексом векторного сходства, создаётся и сам индекс. -Обычно это происходит при [вставке данных](https://clickhouse.com/docs/guides/inserting-data) или во время [слияний](https://clickhouse.com/docs/merges). -К сожалению, HNSW известен длительным временем создания индексов, что может значительно замедлять вставки и слияния. -Индексы векторного сходства оптимальны, когда данные неизменяемы или изменяются редко. - -Для ускорения создания индексов можно использовать следующие приёмы: - -Во-первых, создание индексов можно распараллелить. -Максимальное количество потоков создания индексов настраивается с помощью серверного параметра [max_build_vector_similarity_index_thread_pool_size](/operations/server-configuration-parameters/settings#max_build_vector_similarity_index_thread_pool_size). -Для оптимальной производительности значение этого параметра следует устанавливать равным числу ядер CPU. - -Во-вторых, для ускорения операторов INSERT пользователи могут отключить создание пропускающих индексов для вновь вставляемых частей при помощи параметра сессии [materialize_skip_indexes_on_insert](../../../operations/settings/settings.md#materialize_skip_indexes_on_insert). -SELECT-запросы к таким частям будут выполнять точный поиск. -Поскольку вставляемые части, как правило, малы по сравнению с общим размером таблицы, ожидается, что влияние этого на производительность будет незначительным. - -В-третьих, для ускорения слияний пользователи могут отключить создание пропускающих индексов на слитых частях с помощью параметра сессии [materialize_skip_indexes_on_merge](../../../operations/settings/merge-tree-settings.md#materialize_skip_indexes_on_merge). -В сочетании с оператором [ALTER TABLE [...] MATERIALIZE INDEX [...]](../../../sql-reference/statements/alter/skipping-index.md#materialize-index) это обеспечивает явный контроль над жизненным циклом индексов векторного сходства. -Например, создание индексов можно отложить до момента, когда весь объём данных уже принят, или до периода низкой нагрузки на систему, например на выходные. - -**Настройка использования индексов** - - -Запросы SELECT должны загружать индексы векторного сходства в оперативную память, чтобы использовать их. -Чтобы один и тот же индекс векторного сходства не загружался в оперативную память многократно, ClickHouse предоставляет специализированный кэш в оперативной памяти для таких индексов. -Чем больше этот кэш, тем меньше будет лишних загрузок. -Максимальный размер кэша можно настроить с помощью серверной настройки [vector_similarity_index_cache_size](../../../operations/server-configuration-parameters/settings.md#vector_similarity_index_cache_size). -По умолчанию кэш может увеличиваться до 5 ГБ. - -:::note -Кэш индекса векторного сходства хранит гранулы векторного индекса. -Если отдельные гранулы векторного индекса больше размера кэша, они не будут кэшироваться. -Поэтому необходимо вычислить размер векторного индекса (на основе формулы из раздела «Оценка потребления хранилища и памяти» или [system.data_skipping_indices](../../../operations/system-tables/data_skipping_indices)) и задать размер кэша соответствующим образом. -::: - -Текущий размер кэша индекса векторного сходства отображается в [system.metrics](../../../operations/system-tables/metrics.md): - -```sql -SELECT metric, value -FROM system.metrics -WHERE metric = 'VectorSimilarityIndexCacheBytes' -``` - -Информацию о попаданиях и промахах кэша для запроса с заданным идентификатором можно получить из [system.query_log](../../../operations/system-tables/query_log.md): - -```sql -SYSTEM FLUSH LOGS query_log; - -SELECT ProfileEvents['VectorSimilarityIndexCacheHits'], ProfileEvents['VectorSimilarityIndexCacheMisses'] -FROM system.query_log -WHERE type = 'QueryFinish' AND query_id = '<...>' -ORDER BY event_time_microseconds; -``` - -Для production-сценариев мы рекомендуем выбирать размер кэша таким образом, чтобы все векторные индексы постоянно помещались в память. - -**Настройка квантования** - -[Квантование](https://huggingface.co/blog/embedding-quantization) — это метод уменьшения объёма памяти, занимаемой векторами, и вычислительных затрат на построение и обход векторных индексов. -Векторные индексы ClickHouse поддерживают следующие варианты квантования: - -| Quantization | Name | Storage per dimension | -| -------------- | ---------------------------- | --------------------- | -| f32 | Single precision | 4 bytes | -| f16 | Half precision | 2 bytes | -| bf16 (default) | Half precision (brain float) | 2 bytes | -| i8 | Quarter precision | 1 byte | -| b1 | Binary | 1 bit | - -Квантование снижает точность векторного поиска по сравнению с поиском по исходным значениям с полной точностью с плавающей запятой (`f32`). -Однако на большинстве наборов данных квантование в формате half-precision brain float (`bf16`) приводит к пренебрежимо малой потере точности, поэтому векторные индексы похожести по умолчанию используют именно этот метод квантования. -Квантование до четверной точности (`i8`) и бинарное квантование (`b1`) приводят к заметной потере точности в векторном поиске. -Мы рекомендуем эти варианты квантования только в том случае, если размер векторного индекса похожести значительно превышает доступный объём DRAM. -В этом случае мы также рекомендуем включить пересчёт скоринга ([vector_search_index_fetch_multiplier](../../../operations/settings/settings#vector_search_index_fetch_multiplier), [vector_search_with_rescoring](../../../operations/settings/settings#vector_search_with_rescoring)) для повышения точности. -Бинарное квантование рекомендуется только для 1) нормализованных эмбеддингов (т.е. длина вектора = 1, модели OpenAI обычно нормализованы) и 2) если в качестве функции расстояния используется косинусное расстояние. -Бинарное квантование на внутреннем уровне использует расстояние Хэмминга для построения и обхода графа близости. -На этапе пересчёта скоринга используются исходные векторы с полной точностью, хранящиеся в таблице, для определения ближайших соседей по косинусному расстоянию. - -**Настройка передачи данных** - -Опорный вектор в запросе векторного поиска предоставляется пользователем и, как правило, получается путём вызова большой языковой модели (LLM). -Типичный Python-код, выполняющий векторный поиск в ClickHouse, может выглядеть так: - -```python -search_v = openai_client.embeddings.create(input = "[Good Books]", model='text-embedding-3-large', dimensions=1536).data[0].embedding - -params = {'search_v': search_v} -result = chclient.query( - "SELECT id FROM items - ORDER BY cosineDistance(vector, %(search_v)s) - LIMIT 10", - parameters = params) -``` - - -Векторы встраивания (`search_v` в приведённом выше фрагменте) могут иметь очень большую размерность. -Например, OpenAI предоставляет модели, которые генерируют векторы встраивания с размерностью 1536 или даже 3072. -В приведённом выше коде драйвер ClickHouse для Python подставляет вектор встраивания, преобразуя его в человекочитаемую строку, и затем целиком отправляет запрос SELECT в виде строки. -Предположим, что вектор встраивания состоит из 1536 значений с плавающей запятой одинарной точности, тогда длина отправляемой строки достигает 20 кБ. -Это приводит к высокому использованию CPU на токенизацию, разбор и выполнение тысяч преобразований строки в число с плавающей запятой. -Кроме того, требуется значительный объём места в файле журнала сервера ClickHouse, что также вызывает разрастание `system.query_log`. - -Обратите внимание, что большинство LLM‑моделей возвращают вектор встраивания в виде списка или массива NumPy из нативных чисел с плавающей запятой. -Поэтому мы рекомендуем Python‑приложениям привязывать параметр опорного вектора в бинарной форме, используя следующий стиль: - -```python -search_v = openai_client.embeddings.create(input = "[Хорошие книги]", model='text-embedding-3-large', dimensions=1536).data[0].embedding - -params = {'$search_v_binary$': np.array(search_v, dtype=np.float32).tobytes()} -result = chclient.query( - "SELECT id FROM items - ORDER BY cosineDistance(vector, (SELECT reinterpret($search_v_binary$, 'Array(Float32)'))) - LIMIT 10", - parameters = params) -``` - -В этом примере опорный вектор отправляется как есть в бинарном виде и на сервере интерпретируется как массив чисел с плавающей запятой. -Это экономит процессорное время на стороне сервера и предотвращает избыточный рост серверных логов и `system.query_log`. - -#### Администрирование и мониторинг - -Объём на диске индексов векторного сходства можно получить из [system.data_skipping_indices](../../../operations/system-tables/data_skipping_indices): - -```sql -SELECT database, table, name, formatReadableSize(data_compressed_bytes) -FROM system.data_skipping_indices -WHERE type = 'vector_similarity'; -``` - -Пример результата: - -```result -┌─database─┬─table─┬─name─┬─formatReadab⋯ssed_bytes)─┐ -│ default │ tab │ idx │ 348.00 MB │ -└──────────┴───────┴──────┴──────────────────────────┘ -``` - -#### Отличия от обычных пропускающих индексов - -Как и все обычные [пропускающие индексы](/optimize/skipping-indexes), индексы векторного сходства строятся поверх гранул, и каждый индексируемый блок состоит из `GRANULARITY = [N]` гранул (`[N]` = 1 по умолчанию для обычных пропускающих индексов). -Например, если гранулярность первичного индекса таблицы равна 8192 (параметр `index_granularity = 8192`) и `GRANULARITY = 2`, то каждый индексируемый блок будет содержать 16384 строки. -Однако структуры данных и алгоритмы для поиска приблизительных соседей по своей природе ориентированы на строки. -Они хранят компактное представление набора строк, а также возвращают строки в ответ на запросы векторного поиска. -Это приводит к довольно неочевидным отличиям в поведении индексов векторного сходства по сравнению с обычными пропускающими индексами. - -Когда пользователь определяет индекс векторного сходства по столбцу, ClickHouse внутренне создает для каждого индексного блока отдельный «подиндекс» векторного сходства. -Подиндекс является «локальным» в том смысле, что он знает только о строках своего индексного блока. -В предыдущем примере, при условии, что столбец содержит 65536 строк, мы получаем четыре индексных блока (охватывающих восемь гранул) и подиндекс векторного сходства для каждого индексного блока. -Теоретически подиндекс может напрямую возвращать строки с N ближайшими точками в пределах своего индексного блока. -Однако, поскольку ClickHouse загружает данные с диска в память на уровне гранул, подиндексы расширяют найденные строки до границ гранул. -Это отличается от обычных пропускающих индексов, которые пропускают данные на уровне индексных блоков. - - -Параметр `GRANULARITY` определяет, сколько подиндексов векторного сходства создаётся. -Большие значения `GRANULARITY` означают меньшее количество, но более крупные подиндексы векторного сходства, вплоть до ситуации, когда столбец (или часть данных столбца) имеет только один подиндекс. -В этом случае подиндекс имеет «глобальное» представление обо всех строках столбца и может напрямую вернуть все гранулы столбца (части) с релевантными строками (таких гранул не более `LIMIT [N]`). -На втором шаге ClickHouse загрузит эти гранулы и определит действительно лучшие строки, выполнив расчёт расстояний полным перебором (brute-force) по всем строкам гранул. -При небольшом значении `GRANULARITY` каждый из подиндексов возвращает до `LIMIT N` гранул. -В результате требуется загрузить и дополнительно отфильтровать больше гранул. -Обратите внимание, что точность поиска в обоих случаях одинаково высока, различается только производительность обработки. -Обычно рекомендуется использовать большое значение `GRANULARITY` для индексов векторного сходства и переходить к меньшим значениям `GRANULARITY` только в случае проблем, например чрезмерного потребления памяти структурами векторного сходства. -Если `GRANULARITY` для индексов векторного сходства не задан, значение по умолчанию — 100 миллионов. - -#### Пример - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32), INDEX idx vec TYPE vector_similarity('hnsw', 'L2Distance', 2)) ENGINE = MergeTree ORDER BY id; - -INSERT INTO tab VALUES (0, [1.0, 0.0]), (1, [1.1, 0.0]), (2, [1.2, 0.0]), (3, [1.3, 0.0]), (4, [1.4, 0.0]), (5, [1.5, 0.0]), (6, [0.0, 2.0]), (7, [0.0, 2.1]), (8, [0.0, 2.2]), (9, [0.0, 2.3]), (10, [0.0, 2.4]), (11, [0.0, 2.5]); - -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -возвращает - -```result - ┌─id─┬─vec─────┐ -1. │ 6 │ [0,2] │ -2. │ 7 │ [0,2.1] │ -3. │ 8 │ [0,2.2] │ - └────┴─────────┘ -``` - -Дополнительные наборы данных, использующие приблизительный векторный поиск: - -* [LAION-400M](../../../getting-started/example-datasets/laion-400m-dataset) -* [LAION-5B](../../../getting-started/example-datasets/laion-5b-dataset) -* [dbpedia](../../../getting-started/example-datasets/dbpedia-dataset) -* [hackernews](../../../getting-started/example-datasets/hackernews-vector-search-dataset) - -### Квантованный бит (QBit) - - - -Один из распространённых подходов к ускорению точного векторного поиска — использовать менее точный [тип данных float](../../../sql-reference/data-types/float.md). -Например, если векторы хранятся как `Array(BFloat16)` вместо `Array(Float32)`, размер данных уменьшается вдвое, и ожидается, что время выполнения запросов сократится пропорционально. -Этот метод называется квантизацией. Хотя он ускоряет вычисления, точность результатов может снижаться, даже при полном переборе всех векторов. - -При традиционной квантизации точность теряется как во время поиска, так и при хранении данных. В приведённом выше примере мы бы хранили `BFloat16` вместо `Float32`, что означает невозможность выполнения более точного поиска в будущем, даже если это потребуется. Один из альтернативных подходов — хранить две копии данных: квантованную и с полной точностью. Хотя это работает, такой подход требует избыточного объёма хранилища. Рассмотрим сценарий, когда исходные данные имеют тип `Float64`, и нам нужно выполнять поиск с различной точностью (16-битной, 32-битной или полной 64-битной). В этом случае нам пришлось бы хранить три отдельные копии данных. - -ClickHouse предлагает тип данных Quantized Bit (`QBit`), который устраняет эти ограничения за счёт: - -1. Хранения исходных данных с полной точностью. -2. Возможности указания точности квантизации на этапе выполнения запроса. - - -Это достигается за счёт хранения данных в формате с побитовой группировкой (то есть все i-е биты всех векторов хранятся вместе), что позволяет выполнять чтение только с запрошенным уровнем точности. Вы получаете выигрыш в скорости за счёт сокращения объёма операций ввода-вывода и вычислений благодаря квантизации, при этом все исходные данные остаются доступными при необходимости. При выборе максимальной точности поиск становится точным. - -:::note -Тип данных `QBit` и связанные с ним функции вычисления расстояния в настоящее время являются экспериментальными. Чтобы их включить, выполните `SET allow_experimental_qbit_type = 1`. -Если вы столкнулись с проблемами, пожалуйста, создайте issue в [репозитории ClickHouse](https://github.com/clickhouse/clickhouse/issues). -::: - -Чтобы объявить столбец типа `QBit`, используйте следующий синтаксис: - -```sql -column_name QBit(element_type, dimension) -``` - -Где: - -* `element_type` – тип каждого элемента вектора. Поддерживаемые типы: `BFloat16`, `Float32` и `Float64` -* `dimension` – количество элементов в каждом векторе - -#### Создание таблицы `QBit` и добавление данных - -```sql -CREATE TABLE fruit_animal ( - word String, - vec QBit(Float64, 5) -) ENGINE = MergeTree -ORDER BY word; - -INSERT INTO fruit_animal VALUES - ('apple', [-0.99105519, 1.28887844, -0.43526649, -0.98520696, 0.66154391]), - ('banana', [-0.69372815, 0.25587061, -0.88226235, -2.54593015, 0.05300475]), - ('orange', [0.93338752, 2.06571317, -0.54612565, -1.51625717, 0.69775337]), - ('dog', [0.72138876, 1.55757105, 2.10953259, -0.33961248, -0.62217325]), - ('cat', [-0.56611276, 0.52267331, 1.27839863, -0.59809804, -1.26721048]), - ('horse', [-0.61435682, 0.48542571, 1.21091247, -0.62530446, -1.33082533]); -``` - -#### Векторный поиск с `QBit` - -Найдём ближайших соседей к вектору, соответствующему слову «lemon», используя L2-расстояние. Третий параметр в функции расстояния задаёт точность в битах: более высокие значения обеспечивают большую точность, но требуют больше вычислительных ресурсов. - -Все доступные функции расстояния для `QBit` можно найти [здесь](../../../sql-reference/data-types/qbit.md#vector-search-functions). - -**Поиск с полной точностью (64-битной):** - -```sql -SELECT - word, - L2DistanceTransposed(vec, [-0.88693672, 1.31532824, -0.51182908, -0.99652702, 0.59907770], 64) AS distance -FROM fruit_animal -ORDER BY distance; -``` - -```text - ┌─word───┬────────────distance─┐ -1. │ apple │ 0.14639757188169716 │ -2. │ banana │ 1.998961369007679 │ -3. │ orange │ 2.039041552613732 │ -4. │ cat │ 2.752802631487914 │ -5. │ horse │ 2.7555776805484813 │ -6. │ dog │ 3.382295083120104 │ - └────────┴─────────────────────┘ -``` - -**Поиск с уменьшенной точностью:** - -```sql -SELECT - word, - L2DistanceTransposed(vec, [-0.88693672, 1.31532824, -0.51182908, -0.99652702, 0.59907770], 12) AS distance -FROM fruit_animal -ORDER BY distance; -``` - -```text - ┌─word───┬───────────distance─┐ -1. │ apple │ 0.757668703053566 │ -2. │ orange │ 1.5499475034938677 │ -3. │ banana │ 1.6168396735102937 │ -4. │ cat │ 2.429752230904804 │ -5. │ horse │ 2.524650475528617 │ -6. │ dog │ 3.17766975527459 │ - └────────┴────────────────────┘ -``` - - -Обратите внимание, что с 12-битной квантизацией мы получаем хорошее приближение расстояний при более быстром выполнении запросов. Относительный порядок в целом сохраняется: 'apple' по‑прежнему является ближайшим совпадением. - -:::note -В текущей реализации ускорение достигается за счёт уменьшения I/O, так как мы читаем меньше данных. Если исходные данные были «широкими», например `Float64`, выбор меньшей точности всё равно приведёт к вычислению расстояния по данным той же ширины — только с меньшей точностью. -::: - -#### Соображения по производительности {#qbit-performance} - -Производительность `QBit` повышается за счёт сокращения операций I/O, поскольку при использовании меньшей точности из хранилища нужно читать меньше данных. Кроме того, когда `QBit` содержит данные типа `Float32` и параметр точности равен 16 или меньше, появляется дополнительное преимущество за счёт уменьшения объёма вычислений. Параметр точности напрямую управляет компромиссом между точностью и скоростью: - -- **Более высокая точность** (ближе к исходной разрядности данных): более точные результаты, более медленные запросы -- **Низкая точность**: более быстрые запросы с приближёнными результатами, уменьшенное использование памяти - -### Ссылки {#references} - -Блоги: -- [Vector Search with ClickHouse - Part 1](https://clickhouse.com/blog/vector-search-clickhouse-p1) -- [Vector Search with ClickHouse - Part 2](https://clickhouse.com/blog/vector-search-clickhouse-p2) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md deleted file mode 100644 index ab0708f5c5c..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -description: 'CoalescingMergeTree наследует от движка MergeTree. Его ключевая особенность — возможность автоматически сохранять последнее ненулевое значение каждого столбца при слиянии частей.' -sidebar_label: 'CoalescingMergeTree' -sidebar_position: 50 -slug: /engines/table-engines/mergetree-family/coalescingmergetree -title: 'Движок таблицы CoalescingMergeTree' -keywords: ['CoalescingMergeTree'] -show_related_blogs: true -doc_type: 'reference' ---- - - - -# Движок таблицы CoalescingMergeTree - -:::note Доступно начиная с версии 25.6 -Этот движок таблицы доступен начиная с версии 25.6 как в OSS, так и в Cloud. -::: - -Этот движок наследуется от [MergeTree](/engines/table-engines/mergetree-family/mergetree). Ключевое отличие заключается в том, как сливаются части данных: для таблиц `CoalescingMergeTree` ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым [ключом сортировки](../../../engines/table-engines/mergetree-family/mergetree.md)) одной строкой, содержащей последние значения, отличные от NULL, для каждого столбца. - -Это позволяет выполнять upsert-операции на уровне отдельных столбцов, то есть вы можете обновлять только отдельные столбцы, а не целые строки. - -`CoalescingMergeTree` предназначен для использования с типами Nullable в неклю́чевых столбцах. Если столбцы не являются Nullable, поведение такое же, как у [ReplacingMergeTree](/engines/table-engines/mergetree-family/replacingmergetree). - - - -## Создание таблицы - -```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 = CoalescingMergeTree([columns]) -[PARTITION BY expr] -[ORDER BY expr] -[SAMPLE BY expr] -[SETTINGS name=value, ...] -``` - -Описание параметров запроса см. в разделе [описание запроса](../../../sql-reference/statements/create/table.md). - -### Параметры движка CoalescingMergeTree - -#### Столбцы - -`columns` — кортеж имен столбцов, значения в которых будут объединены. Необязательный параметр. -Столбцы должны иметь числовой тип и не должны входить в ключ партиционирования или сортировки. - -Если `columns` не указан, ClickHouse объединяет значения во всех столбцах, которые не входят в ключ сортировки. - -### Части запроса - -При создании таблицы `CoalescingMergeTree` требуются те же [части запроса](../../../engines/table-engines/mergetree-family/mergetree.md), что и при создании таблицы `MergeTree`. - -
- Устаревший метод создания таблицы - - :::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 [=] CoalescingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns]) - ``` - - Все параметры, за исключением `columns`, имеют то же значение, что и в `MergeTree`. - - * `columns` — кортеж имен столбцов, значения которых будут суммироваться. Необязательный параметр. Описание см. в тексте выше. -
- - -## Пример использования - -Рассмотрим следующую таблицу: - -```sql -CREATE TABLE test_table -( - key UInt64, - value_int Nullable(UInt32), - value_string Nullable(String), - value_date Nullable(Date) -) -ENGINE = CoalescingMergeTree() -ORDER BY key -``` - -Добавьте в неё данные: - -```sql -INSERT INTO test_table VALUES(1, NULL, NULL, '2025-01-01'), (2, 10, 'test', NULL); -INSERT INTO test_table VALUES(1, 42, 'win', '2025-02-01'); -INSERT INTO test_table(key, value_date) VALUES(2, '2025-02-01'); -``` - -Результат будет выглядеть так: - -```sql -SELECT * FROM test_table ORDER BY key; -``` - -```text -┌─key─┬─value_int─┬─value_string─┬─value_date─┐ -│ 1 │ 42 │ win │ 2025-02-01 │ -│ 1 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-01-01 │ -│ 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-02-01 │ -│ 2 │ 10 │ test │ ᴺᵁᴸᴸ │ -└─────┴───────────┴──────────────┴────────────┘ -``` - -Рекомендуемый запрос для получения корректного итогового результата: - -```sql -SELECT * FROM test_table FINAL ORDER BY key; -``` - -```text -┌─key─┬─value_int─┬─value_string─┬─value_date─┐ -│ 1 │ 42 │ win │ 2025-02-01 │ -│ 2 │ 10 │ test │ 2025-02-01 │ -└─────┴───────────┴──────────────┴────────────┘ -``` - -Использование модификатора `FINAL` указывает ClickHouse применять логику слияния на этапе выполнения запроса, гарантируя получение корректного, объединённого «последнего» значения для каждого столбца. Это самый безопасный и точный метод при выполнении запросов к таблице CoalescingMergeTree. - -:::note - -Подход с использованием `GROUP BY` может возвращать некорректные результаты, если части данных в таблице ещё не были полностью слиты. - -```sql -SELECT key, last_value(value_int), last_value(value_string), last_value(value_date) FROM test_table GROUP BY key; -- Не рекомендуется. -``` - -::: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md deleted file mode 100644 index e45cf8d2fd0..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md +++ /dev/null @@ -1,380 +0,0 @@ ---- -description: 'Наследуется от MergeTree, но добавляет логику свёртки строк в процессе слияния.' -keywords: ['обновления', 'свёртка'] -sidebar_label: 'CollapsingMergeTree' -sidebar_position: 70 -slug: /engines/table-engines/mergetree-family/collapsingmergetree -title: 'Движок таблицы CollapsingMergeTree' -doc_type: 'guide' ---- - - - -# Движок таблицы CollapsingMergeTree - - - -## Описание {#description} - -Движок `CollapsingMergeTree` наследуется от [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) -и добавляет логику схлопывания строк в процессе слияния. -Движок таблицы `CollapsingMergeTree` асинхронно удаляет (схлопывает) -пары строк, если все поля в ключе сортировки (`ORDER BY`) совпадают, за исключением специального поля `Sign`, -которое может иметь значения `1` или `-1`. -Строки без пары с противоположным значением `Sign` сохраняются. - -Более подробную информацию см. в разделе [Collapsing](#table_engine-collapsingmergetree-collapsing) этого документа. - -:::note -Этот движок может значительно сократить объём хранимых данных, -что, как следствие, повышает эффективность запросов `SELECT`. -::: - - - -## Параметры {#parameters} - -Все параметры этого табличного движка, за исключением параметра `Sign`, -имеют то же значение, что и в [`MergeTree`](/engines/table-engines/mergetree-family/mergetree). - -- `Sign` — Имя столбца, указывающего тип строки: `1` — строка «состояния», `-1` — строка «отмены». Тип: [Int8](/sql-reference/data-types/int-uint). - - - -## Создание таблицы - -```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, ...] -``` - -
- Устаревший способ создания таблицы - - :::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` — имя столбца типа [Int8](/sql-reference/data-types/int-uint), в котором значение `1` обозначает строку состояния, а `-1` — строку отмены. -
- -* Описание параметров запроса см. в разделе [описание запроса](../../../sql-reference/statements/create/table.md). -* При создании таблицы `CollapsingMergeTree` используются те же [части запроса](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table), что и при создании таблицы `MergeTree`. - - -## Схлопывание - -### Данные - -Рассмотрим ситуацию, когда необходимо сохранять постоянно меняющиеся данные для некоторого объекта. -Может показаться логичным иметь по одной строке на объект и обновлять её каждый раз при изменении данных, -однако операции обновления являются дорогостоящими и медленными для СУБД, потому что требуют перезаписи данных в хранилище. -Если нам нужно быстро записывать данные, выполнение большого количества обновлений — неприемлемый подход, -но мы всегда можем записывать изменения объекта последовательно. -Для этого мы используем специальный столбец `Sign`. - -* Если `Sign` = `1`, это означает, что строка является строкой "состояния": *строка, содержащая поля, представляющие текущее актуальное состояние*. -* Если `Sign` = `-1`, это означает, что строка является строкой "отмены": *строка, используемая для отмены состояния объекта с теми же атрибутами*. - -Например, мы хотим посчитать, сколько страниц пользователи просмотрели на каком‑то сайте и как долго они их посещали. -В некоторый момент времени мы записываем следующую строку с состоянием активности пользователя: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -Позже мы фиксируем изменение активности пользователя и записываем его с помощью следующих двух строк: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -Первая строка отменяет предыдущее состояние объекта (в данном случае представляющего пользователя). -Она должна копировать все поля сортировочного ключа для строки «canceled», за исключением `Sign`. -Вторая строка выше содержит текущее состояние. - -Поскольку нам нужно только последнее состояние активности пользователя, исходную строку «state» и строку -«cancel», которую мы вставили, можно удалить, как показано ниже, таким образом сворачивая недействительное (старое) состояние объекта: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -- старая строка состояния может быть удалена -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -- строка отмены может быть удалена -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -- новая строка состояния остаётся -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -`CollapsingMergeTree` выполняет именно такое *свёртывание* во время слияния частей данных. - -:::note -Причина, по которой для каждого изменения нужны две строки, -подробнее рассматривается в разделе [Algorithm](#table_engine-collapsingmergetree-collapsing-algorithm). -::: - -**Особенности такого подхода** - -1. Программа, которая записывает данные, должна запоминать состояние объекта, чтобы впоследствии иметь возможность его отменить. Строка "cancel" должна содержать копии полей ключа сортировки строки "state" и противоположный `Sign`. Это увеличивает первоначальный объём хранилища, но позволяет быстро записывать данные. -2. Длинные растущие массивы в столбцах снижают эффективность движка из-за увеличенной нагрузки на запись. Чем проще данные, тем выше эффективность. -3. Результаты `SELECT` в значительной степени зависят от согласованности истории изменений объекта. Будьте аккуратны при подготовке данных для вставки. При несогласованных данных можно получить непредсказуемые результаты. Например, отрицательные значения для неотрицательных метрик, таких как глубина сессии. - -### Algorithm - -Когда ClickHouse сливает [части](/concepts/glossary#parts) данных, -каждая группа последовательных строк с одинаковым ключом сортировки (`ORDER BY`) сокращается до не более чем двух строк: -строки "state" с `Sign` = `1` и строки "cancel" с `Sign` = `-1`. -Другими словами, в ClickHouse записи сворачиваются. - - -Для каждой результирующей части данных ClickHouse сохраняет: - -| | | -|--|-------------------------------------------------------------------------------------------------------------------------------------| -|1.| Первую строку с `cancel` и последнюю строку с `state`, если количество строк с `state` и `cancel` совпадает и последняя строка является строкой с `state`. | -|2.| Последнюю строку с `state`, если строк с `state` больше, чем строк с `cancel`. | -|3.| Первую строку с `cancel`, если строк с `cancel` больше, чем строк с `state`. | -|4.| Ни одной строки во всех остальных случаях. | - -Кроме того, когда строк с `state` как минимум на две больше, чем строк с `cancel`, -или строк с `cancel` как минимум на две больше, чем строк с `state`, слияние продолжается. -Однако ClickHouse рассматривает эту ситуацию как логическую ошибку и записывает её в журнал сервера. -Эта ошибка может возникнуть, если одни и те же данные вставляются более одного раза. -Таким образом, схлопывание не должно изменять результаты вычисления статистики. -Изменения постепенно схлопываются так, что в итоге остаётся только последнее состояние почти каждого объекта. - -Столбец `Sign` обязателен, потому что алгоритм слияния не гарантирует, -что все строки с одинаковым ключом сортировки окажутся в одной и той же результирующей части данных и даже на одном и том же физическом сервере. -ClickHouse обрабатывает запросы `SELECT` в несколько потоков и не может предсказать порядок строк в результате. - -Агрегация необходима, если нужно получить полностью схлопнутые данные из таблицы `CollapsingMergeTree`. -Чтобы завершить схлопывание, напишите запрос с предложением `GROUP BY` и агрегатными функциями, учитывающими знак. -Например, для вычисления количества используйте `sum(Sign)` вместо `count()`. -Для вычисления суммы используйте `sum(Sign * x)` вместе с `HAVING sum(Sign) > 0` вместо `sum(x)`, -как в [примере](#example-of-use) ниже. - -Агрегаты `count`, `sum` и `avg` можно вычислять таким образом. -Агрегат `uniq` можно вычислить, если объект имеет хотя бы одно несхлопнутое состояние. -Агрегаты `min` и `max` вычислить нельзя, -потому что `CollapsingMergeTree` не сохраняет историю схлопнутых состояний. - -:::note -Если вам нужно извлечь данные без агрегации -(например, чтобы проверить, присутствуют ли строки, чьи самые новые значения удовлетворяют определённым условиям), -вы можете использовать модификатор [`FINAL`](../../../sql-reference/statements/select/from.md#final-modifier) для предложения `FROM`. Он выполнит слияние данных перед возвратом результата. -Для `CollapsingMergeTree` возвращается только последняя строка состояния для каждого ключа. -::: - - - -## Примеры - -### Пример использования - -Даны следующие исходные данные: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -Давайте создадим таблицу `UAct` с движком `CollapsingMergeTree`: - -```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) -``` - -Мы используем два запроса `INSERT`, чтобы создать две отдельные части данных. - -:::note -Если мы вставляем данные одним запросом, ClickHouse создаёт только одну часть данных и никогда не будет выполнять слияние. -::: - -Мы можем получить данные с помощью: - -```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 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -Давайте взглянем на возвращённые выше данные и посмотрим, произошло ли схлопывание... -С помощью двух запросов `INSERT` мы создали две части данных. -Запрос `SELECT` был выполнен в двух потоках, и мы получили строки в случайном порядке. -Однако схлопывание **не произошло**, потому что слияния частей данных ещё не было, -а ClickHouse объединяет части данных в фоновом режиме в непредсказуемый момент времени, который мы не можем предсказать. - -Поэтому нам нужна агрегация, -которую мы выполняем с помощью агрегатной функции [`sum`](/sql-reference/aggregate-functions/reference/sum) -и предложения [`HAVING`](/sql-reference/statements/select/having): - -```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 │ -└─────────────────────┴───────────┴──────────┘ -``` - -Если нам не нужна агрегация и мы хотим принудительно выполнить схлопывание, мы также можем использовать модификатор `FINAL` для секции `FROM`. - -```sql -SELECT * FROM UAct FINAL -``` - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -:::note -Этот способ выборки данных менее эффективен и не рекомендуется при работе с большими объемами сканируемых данных (миллионы строк). -::: - -### Пример другого подхода - -Идея этого подхода состоит в том, что при слияниях учитываются только ключевые поля. -В строке "cancel" мы, соответственно, можем указать отрицательные значения, -которые при суммировании без использования столбца `Sign` компенсируют предыдущую версию строки. - -В этом примере мы воспользуемся приведенными ниже демонстрационными данными: - - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -│ 4324182021466249494 │ -5 │ -146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -Для этого подхода необходимо изменить типы данных столбцов `PageViews` и `Duration`, чтобы можно было хранить отрицательные значения. -Поэтому при создании таблицы `UAct` с использованием `collapsingMergeTree` мы изменяем типы этих столбцов с `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; -``` - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md deleted file mode 100644 index 9829780e278..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -description: 'Узнайте, как добавить пользовательский ключ партиционирования для таблиц MergeTree.' -sidebar_label: 'Пользовательский ключ партиционирования' -sidebar_position: 30 -slug: /engines/table-engines/mergetree-family/custom-partitioning-key -title: 'Пользовательский ключ партиционирования' -doc_type: 'guide' ---- - - - -# Пользовательский ключ партиционирования - -:::note -В большинстве случаев ключ партиционирования не нужен, а в большинстве остальных случаев нет необходимости в ключе партиционирования с более мелкой детализацией, чем по месяцам, за исключением сценариев наблюдаемости (observability), где часто используется партиционирование по дням. - -Не следует использовать чрезмерно детализированное партиционирование. Не партиционируйте данные по идентификаторам или именам клиентов. Вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY. -::: - -Партиционирование доступно для [таблиц семейства MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md), включая [реплицируемые таблицы](../../../engines/table-engines/mergetree-family/replication.md) и [материализованные представления](/sql-reference/statements/create/view#materialized-view). - -Партиция — это логическое объединение записей в таблице по заданному критерию. Вы можете задать партицию по произвольному критерию, например по месяцу, по дню или по типу события. Каждая партиция хранится отдельно, что упрощает операции с этими данными. При доступе к данным ClickHouse использует минимально возможное подмножество партиций. Партиции повышают производительность запросов, содержащих ключ партиционирования, потому что ClickHouse будет фильтровать по этой партиции до выбора партиций (parts) и гранул внутри партиции. - -Партиция задаётся в предложении `PARTITION BY expr` при [создании таблицы](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table). Ключ партиционирования может быть любым выражением над столбцами таблицы. Например, чтобы указать партиционирование по месяцам, используйте выражение `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). - -При вставке новых данных в таблицу эти данные сохраняются как отдельная часть (chunk), отсортированная по первичному ключу. Через 10–15 минут после вставки части одной и той же секции объединяются в единую часть. - -:::info -Слияние работает только для частей данных, у которых одинаковое значение выражения секционирования. Это означает, что **не следует делать секционирование слишком детализированным** (более чем примерно тысяча секций). В противном случае запрос `SELECT` будет выполняться неэффективно из‑за неоправданно большого количества файлов в файловой системе и открытых файловых дескрипторов. -::: - -Используйте таблицу [system.parts](../../../operations/system-tables/parts.md) для просмотра частей таблицы и её секций. Например, предположим, что у нас есть таблица `visits` с секционированием по месяцам. Выполним запрос `SELECT` к таблице `system.parts`: - -```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`. Вы можете использовать значение этого столбца, чтобы указать имя партиции в запросах [ALTER ... PARTITION](../../../sql-reference/statements/alter/partition.md). - - -Столбец `name` содержит имена частей данных партиции. Вы можете использовать этот столбец, чтобы указать имя части в запросе [ALTER ATTACH PART](/sql-reference/statements/alter/partition#attach-partitionpart). - -Разберём имя части: `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' и так далее являются каталогами частей. Каждая часть относится к соответствующему разделу (partition) и содержит данные только за определённый месяц (в этом примере таблица разбита на разделы по месяцам). - - -Каталог `detached` содержит части, которые были отсоединены от таблицы с помощью запроса [DETACH](/sql-reference/statements/detach). Повреждённые части также перемещаются в этот каталог вместо удаления. Сервер не использует части из каталога `detached`. Вы можете добавлять, удалять или изменять данные в этом каталоге в любое время — сервер не узнает об этом, пока вы не выполните запрос [ATTACH](/sql-reference/statements/alter/partition#attach-partitionpart). - -Обратите внимание, что на рабочем сервере вы не можете вручную изменять набор частей или их данные в файловой системе, так как сервер не узнает об этом. Для нереплицируемых таблиц вы можете делать это, когда сервер остановлен, но это не рекомендуется. Для реплицируемых таблиц набор частей не может быть изменён ни при каких обстоятельствах. - -ClickHouse позволяет выполнять операции с партициями: удалять их, копировать из одной таблицы в другую или создавать резервную копию. См. полный список операций в разделе [Manipulations With Partitions and Parts](/sql-reference/statements/alter/partition). - - - -## Оптимизация 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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md deleted file mode 100644 index 305019b1c39..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md +++ /dev/null @@ -1,278 +0,0 @@ ---- -description: 'Предназначен для прореживания и агрегации/усреднения (rollup) данных Graphite.' -sidebar_label: 'GraphiteMergeTree' -sidebar_position: 90 -slug: /engines/table-engines/mergetree-family/graphitemergetree -title: 'Движок таблицы GraphiteMergeTree' -doc_type: 'guide' ---- - - - -# Движок таблицы GraphiteMergeTree - -Этот движок предназначен для прореживания и агрегирования/усреднения (rollup) данных [Graphite](http://graphite.readthedocs.io/en/latest/index.html). Он может быть полезен разработчикам, которые хотят использовать ClickHouse в качестве хранилища данных для Graphite. - -Вы можете использовать любой движок таблицы ClickHouse для хранения данных Graphite, если вам не нужен rollup, но если rollup необходим, используйте `GraphiteMergeTree`. Движок уменьшает объем хранимых данных и повышает эффективность выполнения запросов Graphite. - -Движок наследует свойства от [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md). - - - -## Создание таблицы - -```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). - -Таблица для данных Graphite должна иметь следующие столбцы: - -* Имя метрики (датчика Graphite). Тип данных: `String`. - -* Время измерения метрики. Тип данных: `DateTime`. - -* Значение метрики. Тип данных: `Float64`. - -* Версия метрики. Тип данных: любой числовой тип (ClickHouse сохраняет строки с наибольшей версией или последнюю записанную, если версии совпадают. Остальные строки удаляются при слиянии частей данных). - -Имена этих столбцов должны быть указаны в конфигурации rollup. - -**Параметры GraphiteMergeTree** - -* `config_section` — Имя раздела в файле конфигурации, где заданы правила rollup. - -**Части запроса** - -При создании таблицы `GraphiteMergeTree` требуются те же [части запроса](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table), что и при создании таблицы `MergeTree`. - -
- Устаревший способ создания таблицы - - :::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. -
- - -## Конфигурация rollup - -Настройки rollup задаются параметром [graphite_rollup](../../../operations/server-configuration-parameters/settings.md#graphite) в конфигурации сервера. Имя параметра может быть любым. Вы можете создать несколько конфигураций и использовать их для разных таблиц. - -Структура конфигурации rollup: - -required-columns -patterns - -### Обязательные столбцы - -#### `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`: - -```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` - тип правила. Применяется только к конкретным метрикам. Движок использует его для разделения обычных и помеченных (tagged) метрик. Необязательный параметр. Значение по умолчанию: `all`. - Он не нужен, когда производительность не критична или используется только один тип метрик, например обычные метрики. По умолчанию создаётся только один набор правил. В противном случае, если определён любой из специальных типов, создаются два разных набора. Один для обычных метрик (root.branch.leaf) и один для помеченных метрик (root.branch.leaf;tag1=value1). - Правила по умолчанию попадают в оба набора. - Допустимые значения: - * `all` (по умолчанию) - универсальное правило, используется, когда `rule_type` опущен. - * `plain` - правило для обычных метрик. Поле `regexp` обрабатывается как регулярное выражение. - * `tagged` - правило для помеченных метрик (метрики хранятся в БД в формате `someName?tag1=value1&tag2=value2&tag3=value3`). Регулярное выражение должно быть отсортировано по именам тегов, первый тег должен быть `__name__`, если он существует. Поле `regexp` обрабатывается как регулярное выражение. - * `tag_list` - правило для помеченных метрик, простой DSL для более удобного описания метрики в формате graphite `someName;tag1=value1;tag2=value2`, `someName` или `tag1=value1;tag2=value2`. Поле `regexp` преобразуется в правило `tagged`. Сортировка по именам тегов не нужна, она будет выполнена автоматически. Значение тега (но не имя) может задаваться как регулярное выражение, например `env=(dev|staging)`. -* `regexp` – шаблон для имени метрики (регулярное выражение или DSL). -* `age` – минимальный возраст данных в секундах. -* `precision` – точность определения возраста данных в секундах. Должно быть делителем 86400 (количество секунд в сутках). -* `function` – имя агрегирующей функции, применяемой к данным, возраст которых попадает в диапазон `[age, age + precision]`. Допустимые функции: min / max / any / avg. Среднее значение рассчитывается неточно, как среднее от средних значений. - -### Пример конфигурации без типов правил - - -```xml - - Version - - click_cost - any - - 0 - 5 - - - 86400 - 60 - - - - max - - 0 - 60 - - - 3600 - 300 - - - 86400 - 3600 - - - -``` - -### Пример конфигурации с типами правил - -```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 -Агрегация (rollup) данных выполняется во время слияний. Обычно для старых партиций слияния не запускаются, поэтому для выполнения rollup необходимо инициировать внеплановое слияние с помощью команды [OPTIMIZE](../../../sql-reference/statements/optimize.md). Также можно использовать дополнительные инструменты, например [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer). -::: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md deleted file mode 100644 index 357aa5f16db..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -description: 'Документация по семейству движков MergeTree' -sidebar_label: 'Семейство MergeTree' -sidebar_position: 10 -slug: /engines/table-engines/mergetree-family/ -title: 'Семейство движков MergeTree' -doc_type: 'reference' ---- - - - -# Семейство движков 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). - -{/* Таблица оглавления для этой страницы автоматически генерируется скриптом - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - из полей YAML front matter: slug, description, title. - - Если вы обнаружили ошибку, отредактируйте YAML front matter на соответствующих страницах. - */ } - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [MergeTree table engine](/engines/table-engines/mergetree-family/mergetree) | Движки таблиц семейства `MergeTree` спроектированы для высокой скорости приёма и обработки очень больших объёмов данных. | -| [Replicated* table engines](/engines/table-engines/mergetree-family/replication) | Обзор репликации данных с использованием семейства движков таблиц Replicated* в ClickHouse. | -| [Custom Partitioning Key](/engines/table-engines/mergetree-family/custom-partitioning-key) | Как добавить пользовательский ключ партиционирования в таблицы MergeTree. | -| [ReplacingMergeTree table engine](/engines/table-engines/mergetree-family/replacingmergetree) | Отличается от MergeTree тем, что удаляет дублирующиеся записи с одинаковым значением ключа сортировки (секция таблицы `ORDER BY`, а не `PRIMARY KEY`). | -| [CoalescingMergeTree table engine](/engines/table-engines/mergetree-family/coalescingmergetree) | CoalescingMergeTree наследует возможности движка MergeTree. Его ключевая особенность — автоматическое сохранение последнего ненулевого значения каждого столбца при слиянии частей данных. | -| [SummingMergeTree table engine](/engines/table-engines/mergetree-family/summingmergetree) | SummingMergeTree наследует возможности движка MergeTree. Его ключевая особенность — автоматическое суммирование числовых данных при слиянии частей данных. | -| [AggregatingMergeTree table engine](/engines/table-engines/mergetree-family/aggregatingmergetree) | Заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым [ключом сортировки](../../../engines/table-engines/mergetree-family/mergetree.md)) одной строкой (в пределах одной части данных), которая хранит комбинацию состояний агрегатных функций. | -| [CollapsingMergeTree table engine](/engines/table-engines/mergetree-family/collapsingmergetree) | Наследует возможности MergeTree, но добавляет логику схлопывания строк в процессе слияния. | -| [VersionedCollapsingMergeTree table engine](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) | Обеспечивает быструю запись постоянно изменяющихся состояний объектов и фоновое удаление устаревших состояний объектов. | -| [GraphiteMergeTree table engine](/engines/table-engines/mergetree-family/graphitemergetree) | Предназначен для прореживания и агрегирования/усреднения (rollup) данных Graphite. | -| [Exact and Approximate Vector Search](/engines/table-engines/mergetree-family/annindexes) | Документация по точному и приближенному векторному поиску. | -| [Full-text Search using Text Indexes](/engines/table-engines/mergetree-family/invertedindexes) | Позволяет быстро находить искомые слова и фразы в тексте. | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md deleted file mode 100644 index b27704e82ac..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md +++ /dev/null @@ -1,816 +0,0 @@ ---- -description: 'Быстро находите нужные термины в тексте.' -keywords: ['полнотекстовый поиск', 'текстовый индекс', 'индекс', 'индексы'] -sidebar_label: 'Полнотекстовый поиск с использованием текстовых индексов' -slug: /engines/table-engines/mergetree-family/invertedindexes -title: 'Полнотекстовый поиск с использованием текстовых индексов' -doc_type: 'reference' ---- - -import PrivatePreviewBadge from '@theme/badges/PrivatePreviewBadge'; - - -# Полнотекстовый поиск с использованием текстовых индексов - - - -Текстовые индексы в ClickHouse (также известные как ["обратные индексы"](https://en.wikipedia.org/wiki/Inverted_index)) обеспечивают быстрый полнотекстовый поиск по строковым данным. -Индекс сопоставляет каждый токен в столбце со строками, которые содержат этот токен. -Токены генерируются процессом, называемым токенизацией. -Например, ClickHouse по умолчанию токенизирует английское предложение "All cat like mice." как ["All", "cat", "like", "mice"] (обратите внимание, что завершающая точка игнорируется). -Доступны более продвинутые токенизаторы, например для данных журналов (логов). - - - -## Создание текстового индекса - -Чтобы создать текстовый индекс, сначала включите соответствующий экспериментальный параметр: - -```sql -SET allow_experimental_full_text_index = true; -``` - -Текстовый индекс может быть определён для столбцов типов [String](/sql-reference/data-types/string.md), [FixedString](/sql-reference/data-types/fixedstring.md), [Array(String)](/sql-reference/data-types/array.md), [Array(FixedString)](/sql-reference/data-types/array.md) и [Map](/sql-reference/data-types/map.md) (через функции работы с map [mapKeys](/sql-reference/functions/tuple-map-functions.md/#mapkeys) и [mapValues](/sql-reference/functions/tuple-map-functions.md/#mapvalues)) с использованием следующего синтаксиса: - -```sql -CREATE TABLE tab -( - `key` UInt64, - `str` String, - INDEX text_idx(str) TYPE text( - -- Обязательные параметры: - tokenizer = splitByNonAlpha - | splitByString[(S)] - | ngrams[(N)] - | sparseGrams[(min_length[, max_length[, min_cutoff_length]])] - | array - -- Необязательные параметры: - [, preprocessor = expression(str)] - -- Дополнительные необязательные параметры: - [, dictionary_block_size = D] - [, dictionary_block_frontcoding_compression = B] - [, max_cardinality_for_embedded_postings = M] - [, bloom_filter_false_positive_rate = R] - ) [GRANULARITY 64] -) -ENGINE = MergeTree -ORDER BY key -``` - -**Аргумент tokenizer (обязательный)**. Аргумент `tokenizer` задаёт токенизатор: - -* `splitByNonAlpha` разбивает строки по небуквенно-цифровым ASCII-символам (см. также функцию [splitByNonAlpha](/sql-reference/functions/splitting-merging-functions.md/#splitByNonAlpha)). -* `splitByString(S)` разбивает строки по определённым пользовательским строкам-разделителям `S` (см. также функцию [splitByString](/sql-reference/functions/splitting-merging-functions.md/#splitByString)). - Разделители можно задать с помощью необязательного параметра, например, `tokenizer = splitByString([', ', '; ', '\n', '\\'])`. - Обратите внимание, что каждая строка может состоять из нескольких символов (в примере — `', '`). - Список разделителей по умолчанию, если он не указан явно (например, `tokenizer = splitByString`), содержит один пробел `[' ']`. -* `ngrams(N)` разбивает строки на `N`-граммы одинакового размера (см. также функцию [ngrams](/sql-reference/functions/splitting-merging-functions.md/#ngrams)). - Длину n-граммы можно задать с помощью необязательного целочисленного параметра от 2 до 8, например, `tokenizer = ngrams(3)`. - Размер n-граммы по умолчанию, если он не указан явно (например, `tokenizer = ngrams`), равен 3. -* `sparseGrams(min_length, max_length, min_cutoff_length)` разбивает строки на n-граммы переменной длины как минимум из `min_length` и не более чем из `max_length` (включительно) символов (см. также функцию [sparseGrams](/sql-reference/functions/string-functions#sparseGrams)). - Если не указано явно, значения `min_length` и `max_length` по умолчанию равны 3 и 100. - Если задан параметр `min_cutoff_length`, в индекс сохраняются только n-граммы с длиной не меньше `min_cutoff_length`. - По сравнению с `ngrams(N)` токенизатор `sparseGrams` генерирует n-граммы переменной длины, что позволяет более гибко представлять исходный текст. - Например, `tokenizer = sparseGrams(3, 5, 4)` генерирует из входной строки 3-, 4- и 5-граммы, но в индекс сохраняются только 4- и 5-граммы. -* `array` не выполняет токенизацию, т. е. каждое значение в строке является токеном (см. также функцию [array](/sql-reference/functions/array-functions.md/#array)). - -:::note -Токенизатор `splitByString` применяет строки-разделители слева направо. -Это может приводить к неоднозначной токенизации. -Например, строки-разделители `['%21', '%']` приведут к тому, что `%21abc` будет токенизировано как `['abc']`, тогда как при перестановке строк-разделителей `['%', '%21']` результатом будет `['21abc']`. -В большинстве случаев нужно, чтобы при сопоставлении более длинные разделители имели приоритет. -Обычно это можно обеспечить, передавая строки-разделители в порядке убывания длины. -Если строки-разделители образуют [префиксный код](https://en.wikipedia.org/wiki/Prefix_code), их можно передавать в произвольном порядке. -::: - - -:::warning -В настоящее время не рекомендуется создавать текстовые индексы для текста на незападных языках, например китайском. -Поддерживаемые в данный момент токенизаторы могут привести к чрезмерно большим размерам индексов и длительному времени выполнения запросов. -В будущем планируется добавить специализированные языково-специфичные токенизаторы, которые будут лучше обрабатывать такие случаи. -::: - -Чтобы проверить, как токенизаторы разбивают входную строку, можно использовать функцию ClickHouse [tokens](/sql-reference/functions/splitting-merging-functions.md/#tokens): - -Пример: - -```sql -SELECT tokens('abc def', 'ngrams', 3); -``` - -Результат: - -```result -['abc','bc ','c d',' de','def'] -``` - -**Аргумент препроцессора (необязательный)**. Аргумент `preprocessor` представляет собой выражение, которое применяется к входной строке перед токенизацией. - -Типичные варианты использования аргумента препроцессора включают: - -1. Приведение к нижнему или верхнему регистру для обеспечения регистронезависимого сопоставления, например [lower](/sql-reference/functions/string-functions.md/#lower), [lowerUTF8](/sql-reference/functions/string-functions.md/#lowerUTF8) — см. первый пример ниже. -2. Нормализация UTF-8, например [normalizeUTF8NFC](/sql-reference/functions/string-functions.md/#normalizeUTF8NFC), [normalizeUTF8NFD](/sql-reference/functions/string-functions.md/#normalizeUTF8NFD), [normalizeUTF8NFKC](/sql-reference/functions/string-functions.md/#normalizeUTF8NFKC), [normalizeUTF8NFKD](/sql-reference/functions/string-functions.md/#normalizeUTF8NFKD), [toValidUTF8](/sql-reference/functions/string-functions.md/#toValidUTF8). -3. Удаление или преобразование нежелательных символов или подстрок, например [extractTextFromHTML](/sql-reference/functions/string-functions.md/#extractTextFromHTML), [substring](/sql-reference/functions/string-functions.md/#substring), [idnaEncode](/sql-reference/functions/string-functions.md/#idnaEncode). - -Выражение препроцессора должно преобразовывать входное значение типа [String](/sql-reference/data-types/string.md) или [FixedString](/sql-reference/data-types/fixedstring.md) в значение того же типа. - -Примеры: - -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(col))` -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = substringIndex(col, '\n', 1))` -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(extractTextFromHTML(col))` - -Кроме того, выражение препроцессора должно ссылаться только на столбец, для которого определён текстовый индекс. -Использование недетерминированных функций не допускается. - -Функции [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken), [hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) и [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) используют препроцессор для предварительного преобразования поискового термина перед его токенизацией. - -Например: - -```sql -CREATE TABLE tab -( - key UInt64, - str String, - INDEX idx(str) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(str)) -) -ENGINE = MergeTree -ORDER BY tuple(); - -SELECT count() FROM tab WHERE hasToken(str, 'Foo'); -``` - -эквивалентно: - -```sql -CREATE TABLE tab -( - key UInt64, - str String, - INDEX idx(lower(str)) TYPE text(tokenizer = 'splitByNonAlpha') -) -ENGINE = MergeTree -ORDER BY tuple(); - -SELECT count() FROM tab WHERE hasToken(str, lower('Foo')); -``` - -**Другие аргументы (необязательные)**. Текстовые индексы в ClickHouse реализованы как [вторичные индексы](/engines/table-engines/mergetree-family/mergetree.md/#skip-index-types). -Однако, в отличие от других индексов с пропуском, текстовые индексы имеют значение GRANULARITY по умолчанию, равное 64. -Это значение выбрано эмпирически и обеспечивает хороший баланс между скоростью и размером индекса для большинства случаев использования. -Опытные пользователи могут указать другую гранулярность индекса (мы не рекомендуем этого делать). - -
- -Необязательные расширенные параметры - -Значения по умолчанию следующих расширенных параметров будут хорошо работать практически во всех ситуациях. -Мы не рекомендуем их изменять. - -Необязательный параметр `dictionary_block_size` (по умолчанию: 128) задаёт размер блоков словаря в строках. - -Необязательный параметр `dictionary_block_frontcoding_compression` (по умолчанию: 1) указывает, используют ли блоки словаря фронтальное кодирование в качестве сжатия. - -Необязательный параметр `max_cardinality_for_embedded_postings` (по умолчанию: 16) задаёт порог кардинальности, ниже которого списки постингов должны быть встроены в блоки словаря. - - -Необязательный параметр `bloom_filter_false_positive_rate` (по умолчанию: 0.1) задаёт вероятность ложноположительных срабатываний фильтра Блума словаря. - -
- -Текстовые индексы можно добавлять в столбец или удалять из него после создания таблицы: - -```sql -ALTER TABLE tab DROP INDEX text_idx; -ALTER TABLE tab ADD INDEX text_idx(s) TYPE text(tokenizer = splitByNonAlpha); -``` - - -## Использование текстового индекса - -Использовать текстовый индекс в запросах SELECT просто, так как стандартные функции строкового поиска автоматически используют индекс. -Если индекс отсутствует, приведённые ниже функции строкового поиска будут выполнять медленный полный перебор по всем данным. - -### Поддерживаемые функции - -Текстовый индекс может быть использован, если текстовые функции применяются в условии `WHERE` запроса SELECT: - -```sql -SELECT [...] -FROM [...] -WHERE функция_поиска_по_строке(столбец_с_текстовым_индексом) -``` - -#### `=` и `!=` - -`=` ([equals](/sql-reference/functions/comparison-functions.md/#equals)) и `!=` ([notEquals](/sql-reference/functions/comparison-functions.md/#notEquals)) совпадают с заданным поисковым выражением целиком. - -Пример: - -```sql -SELECT * from tab WHERE str = 'Привет'; -``` - -Индекс по тексту поддерживает операторы `=` и `!=`, однако поиск по равенству и неравенству имеет смысл только с токенизатором `array` (он приводит к тому, что индекс хранит значения целых строк). - -#### `IN` и `NOT IN` - -`IN` ([in](/sql-reference/functions/in-functions)) и `NOT IN` ([notIn](/sql-reference/functions/in-functions)) похожи на функции `equals` и `notEquals`, но они выбирают все (`IN`) или ни одного (`NOT IN`) из искомых значений. - -Пример: - -```sql -SELECT * from tab WHERE str IN ('Привет', 'Мир'); -``` - -Те же ограничения, что и для `=` и `!=`, действуют и здесь: `IN` и `NOT IN` имеют смысл только в сочетании с токенизатором `array`. - -#### `LIKE`, `NOT LIKE` и `match` - -:::note -В настоящее время эти функции используют текстовый индекс для фильтрации только в том случае, если токенизатор индекса — `splitByNonAlpha` или `ngrams`. -::: - -Чтобы использовать `LIKE` ([like](/sql-reference/functions/string-search-functions.md/#like)), `NOT LIKE` ([notLike](/sql-reference/functions/string-search-functions.md/#notLike)) и функцию [match](/sql-reference/functions/string-search-functions.md/#match) с текстовыми индексами, ClickHouse должен иметь возможность извлечь полные токены из поискового термина. - -Пример: - -```sql -SELECT count() FROM tab WHERE comment LIKE 'support%'; -``` - -`support` в примере может соответствовать `support`, `supports`, `supporting` и т. д. -Такой запрос является запросом по подстроке, и его нельзя ускорить с помощью текстового индекса. - -Чтобы использовать текстовый индекс для запросов с LIKE, шаблон LIKE нужно изменить следующим образом: - -```sql -SELECT count() FROM tab WHERE comment LIKE ' support %'; -- или `% support %` -``` - -Пробелы слева и справа от `support` гарантируют, что термин может быть извлечён как токен. - -#### `startsWith` и `endsWith` - -Аналогично оператору `LIKE`, функции [startsWith](/sql-reference/functions/string-functions.md/#startsWith) и [endsWith](/sql-reference/functions/string-functions.md/#endsWith) могут использовать текстовый индекс только в том случае, если из поискового выражения могут быть извлечены полные токены. - -Пример: - -```sql -SELECT count() FROM tab WHERE startsWith(comment, 'поддержка clickhouse'); -``` - -В этом примере только `clickhouse` считается токеном. -`support` не является токеном, так как он может соответствовать `support`, `supports`, `supporting` и т.д. - -Чтобы найти все строки, которые начинаются с `clickhouse supports`, завершите шаблон поиска пробелом в конце: - -```sql -startsWith(comment, 'clickhouse supports ')` -``` - -Аналогично, `endsWith` следует использовать с пробелом в начале строки: - -```sql -SELECT count() FROM tab WHERE endsWith(comment, ' olap engine'); -``` - -#### `hasToken` и `hasTokenOrNull` - -Функции [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken) и [hasTokenOrNull](/sql-reference/functions/string-search-functions.md/#hasTokenOrNull) сопоставляют значение с одним заданным токеном. - -В отличие от упомянутых выше функций, они не токенизируют искомое значение (предполагается, что на вход подаётся один токен). - -Пример: - -```sql -SELECT count() FROM tab WHERE hasToken(comment, 'clickhouse'); -``` - -Функции `hasToken` и `hasTokenOrNull` являются наиболее эффективными при использовании с индексом `text`. - -#### `hasAnyTokens` и `hasAllTokens` - - -Функции [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) и [hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) сопоставляют строку соответственно с одним или со всеми указанными токенами. - -Обе функции принимают поисковые токены либо в виде строки, которая будет разбита на токены с использованием того же токенизатора, что и для столбца, по которому построен индекс, либо в виде массива уже подготовленных токенов, к которым перед поиском токенизация применяться не будет. -См. документацию по функциям для получения дополнительной информации. - -Пример: - -```sql --- Поисковые токены передаются как строковый аргумент -SELECT count() FROM tab WHERE hasAnyTokens(comment, 'clickhouse olap'); -SELECT count() FROM tab WHERE hasAllTokens(comment, 'clickhouse olap'); - --- Поисковые токены передаются как Array(String) -SELECT count() FROM tab WHERE hasAnyTokens(comment, ['clickhouse', 'olap']); -SELECT count() FROM tab WHERE hasAllTokens(comment, ['clickhouse', 'olap']); -``` - -#### `has` - -Функция для работы с массивами [`has`](/sql-reference/functions/array-functions#has) проверяет наличие отдельного токена в массиве строк. - -Пример: - -```sql -SELECT count() FROM tab WHERE has(array, 'clickhouse'); -``` - -#### `mapContains` - -Функция [mapContains](/sql-reference/functions/tuple-map-functions#mapcontains) (псевдоним `mapContainsKey`) проверяет, содержится ли заданный токен среди ключей отображения. - -Пример: - -```sql -SELECT count() FROM tab WHERE mapContainsKey(map, 'clickhouse'); --- OR -SELECT count() FROM tab WHERE mapContains(map, 'clickhouse'); -``` - -#### `operator[]` - -Оператор доступа [`operator[]`](/sql-reference/operators#access-operators) можно использовать с текстовым индексом для фильтрации по ключам и значениям. - -Пример: - -```sql -SELECT count() FROM tab WHERE map['engine'] = 'clickhouse'; -``` - -Рассмотрим следующие примеры использования столбцов типов `Array(T)` и `Map(K, V)` с текстовым индексом. - -### Примеры для столбцов `Array` и `Map` с текстовыми индексами - -#### Индексирование столбцов `Array(String)` - -Представьте платформу для ведения блогов, где авторы классифицируют свои записи с помощью ключевых слов. -Мы хотим, чтобы пользователи могли находить похожие материалы, выполняя поиск или переходя по темам. - -Рассмотрим следующее определение таблицы: - -```sql -CREATE TABLE posts ( - post_id UInt64, - title String, - content String, - keywords Array(String) -) -ENGINE = MergeTree -ORDER BY (post_id); -``` - -Без текстового индекса поиск постов с определённым ключевым словом (например, `clickhouse`) требует сканирования всех постов: - -```sql -SELECT count() FROM posts WHERE has(keywords, 'clickhouse'); -- медленное полное сканирование таблицы - проверяет каждое ключевое слово в каждой записи -``` - -По мере роста платформы выполнение запроса становится всё более медленным, поскольку ему приходится просматривать каждый массив `keywords` в каждой строке. -Чтобы решить эту проблему с производительностью, мы создаём текстовый индекс для столбца `keywords`: - -```sql -ALTER TABLE posts ADD INDEX keywords_idx(keywords) TYPE text(tokenizer = splitByNonAlpha); -ALTER TABLE posts MATERIALIZE INDEX keywords_idx; -- Не забудьте материализовать индекс для существующих данных -``` - -#### Индексация столбцов типа Map - -Во многих сценариях систем наблюдаемости сообщения логов разбиваются на отдельные «компоненты» и сохраняются в виде соответствующих типов данных, например тип `DateTime` для временной метки, `Enum` для уровня логирования и т. д. -Поля метрик оптимально хранить в виде пар «ключ–значение». -Операционным командам нужно эффективно искать по логам для отладки, расследования инцидентов информационной безопасности и мониторинга. - -Рассмотрим следующую таблицу логов: - -```sql -CREATE TABLE logs ( - id UInt64, - timestamp DateTime, - message String, - attributes Map(String, String) -) -ENGINE = MergeTree -ORDER BY (timestamp); -``` - -Без текстового индекса поиск по данным типа [Map](/sql-reference/data-types/map.md) требует полного сканирования таблицы: - -```sql --- Находит все логи с данными об ограничении скорости: -SELECT count() FROM logs WHERE has(mapKeys(attributes), 'rate_limit'); -- медленное полное сканирование таблицы - --- Находит все логи с конкретного IP-адреса: -SELECT count() FROM logs WHERE has(mapValues(attributes), '192.168.1.1'); -- медленное полное сканирование таблицы -``` - -По мере роста объёма логов эти запросы начинают работать медленнее. - -Решение — создать текстовый индекс для ключей и значений типа [Map](/sql-reference/data-types/map.md). -Используйте [mapKeys](/sql-reference/functions/tuple-map-functions.md/#mapkeys) для создания текстового индекса, когда нужно находить логи по именам полей или типам атрибутов: - - -```sql -ALTER TABLE logs ADD INDEX attributes_keys_idx mapKeys(attributes) TYPE text(tokenizer = array); -ALTER TABLE posts MATERIALIZE INDEX attributes_keys_idx; -``` - -Используйте [mapValues](/sql-reference/functions/tuple-map-functions.md/#mapvalues), чтобы создать текстовый индекс, когда вам нужно выполнять поиск по самому содержимому атрибутов: - -```sql -ALTER TABLE logs ADD INDEX attributes_vals_idx mapValues(attributes) TYPE text(tokenizer = array); -ALTER TABLE posts MATERIALIZE INDEX attributes_vals_idx; -``` - -Примеры запросов: - -```sql --- Найти все запросы с ограничением скорости: -SELECT * FROM logs WHERE mapContainsKey(attributes, 'rate_limit'); -- быстро - --- Найти все логи с конкретного IP-адреса: -SELECT * FROM logs WHERE has(mapValues(attributes), '192.168.1.1'); -- быстро -``` - - -## Оптимизация производительности - -### Прямое чтение - -Некоторые типы текстовых запросов можно значительно ускорить с помощью оптимизации, называемой «прямое чтение». -Более точно, эту оптимизацию можно применить, если в запросе SELECT текстовый столбец *не* выбирается. - -Пример: - -```sql -SELECT column_a, column_b, ... -- не: column_with_text_index -FROM [...] -WHERE string_search_function(column_with_text_index) -``` - -Оптимизация прямого чтения в ClickHouse обрабатывает запрос, используя исключительно текстовый индекс (т. е. обращения к текстовому индексу) без доступа к исходному текстовому столбцу. -Обращения к текстовому индексу читают относительно небольшой объём данных и поэтому значительно быстрее, чем обычные skip-индексы в ClickHouse (которые выполняют поиск по skip-индексу, а затем загружают и фильтруют отобранные гранулы). - -Прямое чтение управляется двумя настройками: - -* Настройка [query_plan_direct_read_from_text_index](../../../operations/settings/settings#query_plan_direct_read_from_text_index), которая определяет, включено ли прямое чтение в целом. -* Настройка [use_skip_indexes_on_data_read](../../../operations/settings/settings#use_skip_indexes_on_data_read), которая является ещё одним обязательным условием для прямого чтения. Обратите внимание, что в базах данных ClickHouse с [compatibility](../../../operations/settings/settings#compatibility) < 25.10 `use_skip_indexes_on_data_read` отключена, поэтому вам нужно либо повысить значение настройки compatibility, либо явно выполнить `SET use_skip_indexes_on_data_read = 1`. - -Кроме того, текстовый индекс должен быть полностью материализован, чтобы использовать прямое чтение (для этого используйте `ALTER TABLE ... MATERIALIZE INDEX`). - -**Поддерживаемые функции** -Оптимизация прямого чтения поддерживает функции `hasToken`, `hasAllTokens` и `hasAnyTokens`. -Эти функции также могут комбинироваться операторами AND, OR и NOT. -Условие WHERE также может содержать дополнительные фильтры, не являющиеся функциями полнотекстового поиска (как для текстовых, так и для других столбцов) — в этом случае оптимизация прямого чтения всё равно будет использоваться, но менее эффективно (она применяется только к поддерживаемым функциям текстового поиска). - -Чтобы убедиться, что запрос использует прямое чтение, выполните его с `EXPLAIN PLAN actions = 1`. -В качестве примера — запрос с отключённым прямым чтением - -```sql -EXPLAIN PLAN actions = 1 -SELECT count() -FROM tab -WHERE hasToken(col, 'some_token') -SETTINGS query_plan_direct_read_from_text_index = 0, -- отключить прямое чтение - use_skip_indexes_on_data_read = 1; -``` - -возвращает - -```text -[...] -Filter ((WHERE + Change column names to column identifiers)) -Filter column: hasToken(__table1.col, 'some_token'_String) (removed) -Actions: INPUT : 0 -> col String : 0 - COLUMN Const(String) -> 'some_token'_String String : 1 - FUNCTION hasToken(col :: 0, 'some_token'_String :: 1) -> hasToken(__table1.col, 'some_token'_String) UInt8 : 2 -[...] -``` - -тогда как тот же запрос, выполненный при `query_plan_direct_read_from_text_index = 1` - -```sql -EXPLAIN PLAN actions = 1 -SELECT count() -FROM tab -WHERE hasToken(col, 'some_token') -SETTINGS query_plan_direct_read_from_text_index = 1, -- включить прямое чтение - use_skip_indexes_on_data_read = 1; -``` - -возвращает - -```text -[...] -Expression (перед GROUP BY) -Позиции: - Фильтр - Столбец фильтра: __text_index_idx_hasToken_94cc2a813036b453d84b6fb344a63ad3 (удалён) - Actions: INPUT :: 0 -> __text_index_idx_hasToken_94cc2a813036b453d84b6fb344a63ad3 UInt8 : 0 -[...] -``` - -Вывод второго EXPLAIN PLAN содержит виртуальный столбец `__text_index___`. -Если этот столбец присутствует, используется прямое чтение. - -### Кэширование - -Доступны различные кэши для буферизации частей текстового индекса в памяти (см. раздел [Сведения о реализации](#implementation)): -В настоящее время доступны кэши для десериализованных блоков словаря, заголовков и списков постингов текстового индекса для снижения объема операций ввода-вывода (I/O). -Их можно включить с помощью настроек [use_text_index_dictionary_cache](/operations/settings/settings#use_text_index_dictionary_cache), [use_text_index_header_cache](/operations/settings/settings#use_text_index_header_cache) и [use_text_index_postings_cache](/operations/settings/settings#use_text_index_postings_cache). -По умолчанию все кэши отключены. - -Для настройки кэшей используйте следующие параметры сервера. - -#### Настройки кэша блоков словаря - - -| Параметр | Описание | -|----------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------| -| [text_index_dictionary_block_cache_policy](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_policy) | Название политики кэша блоков словаря текстового индекса. | -| [text_index_dictionary_block_cache_size](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_size) | Максимальный размер кэша в байтах. | -| [text_index_dictionary_block_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_max_entries) | Максимальное количество десериализованных блоков словаря в кэше. | -| [text_index_dictionary_block_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_size_ratio) | Размер защищённой очереди в кэше блоков словаря текстового индекса относительно общего размера кэша. | - -#### Настройки кэша заголовков {#caching-header} - -| Параметр | Описание | -|--------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------| -| [text_index_header_cache_policy](/operations/server-configuration-parameters/settings#text_index_header_cache_policy) | Название политики кэша заголовков текстового индекса. | -| [text_index_header_cache_size](/operations/server-configuration-parameters/settings#text_index_header_cache_size) | Максимальный размер кэша в байтах. | -| [text_index_header_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_header_cache_max_entries) | Максимальное количество десериализованных заголовков в кэше. | -| [text_index_header_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_header_cache_size_ratio) | Размер защищённой очереди в кэше заголовков текстового индекса относительно общего размера кэша. | - -#### Настройки кэша списков вхождений {#caching-posting-lists} - -| Параметр | Описание | -|---------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------| -| [text_index_postings_cache_policy](/operations/server-configuration-parameters/settings#text_index_postings_cache_policy) | Название политики кэша списков вхождений текстового индекса. | -| [text_index_postings_cache_size](/operations/server-configuration-parameters/settings#text_index_postings_cache_size) | Максимальный размер кэша в байтах. | -| [text_index_postings_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_postings_cache_max_entries) | Максимальное количество десериализованных списков вхождений в кэше. | -| [text_index_postings_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_postings_cache_size_ratio) | Размер защищённой очереди в кэше списков вхождений текстового индекса относительно общего размера кэша. | - - - -## Детали реализации {#implementation} - -Каждый текстовый индекс состоит из двух (абстрактных) структур данных: -- словаря, который отображает каждый токен на список вхождений, и -- набора списков вхождений, каждый из которых представляет собой набор номеров строк. - -Поскольку текстовый индекс является skip-индексом, эти структуры данных логически существуют для каждой гранулы индекса. - -Во время создания индекса создаются три файла (на каждую part): - -**Файл блоков словаря (.dct)** - -Токены в грануле индекса сортируются и сохраняются в блоках словаря по 128 токенов в каждом (размер блока настраивается параметром `dictionary_block_size`). -Файл блоков словаря (.dct) содержит все блоки словаря всех гранул индекса в одной part. - -**Файл гранул индекса (.idx)** - -Файл гранул индекса содержит для каждого блока словаря первый токен блока, его относительное смещение в файле блоков словаря и фильтр Блума для всех токенов в блоке. -Эта разреженная структура индекса аналогична [разреженному индексу первичного ключа](https://clickhouse.com/docs/guides/best-practices/sparse-primary-indexes) в ClickHouse. -Фильтр Блума позволяет заранее отбрасывать блоки словаря, если разыскиваемый токен не содержится в блоке словаря. - -**Файл списков вхождений (.pst)** - -Списки вхождений для всех токенов располагаются последовательно в файле списков вхождений. -Чтобы экономить место и при этом обеспечивать быстрые операции пересечения и объединения, списки вхождений хранятся в виде [roaring bitmaps](https://roaringbitmap.org/). -Если кардинальность списка вхождений меньше 16 (настраивается параметром `max_cardinality_for_embedded_postings`), он встраивается в словарь. - - - -## Пример: датасет Hacker News - -Рассмотрим, как текстовые индексы улучшают производительность на большом текстовом наборе данных. -Мы будем использовать 28,7 млн строк комментариев с популярного сайта Hacker News. -Вот таблица без текстового индекса: - -```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,7 млн строк хранятся в Parquet-файле в S3 — давайте загрузим их в таблицу `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'); -``` - -Используем `ALTER TABLE`, создадим текстовый индекс по столбцу comment, затем материализуем его: - -```sql --- Добавить индекс -ALTER TABLE hackernews ADD INDEX comment_idx(comment) TYPE text(tokenizer = splitByNonAlpha); - --- Материализовать индекс для существующих данных -ALTER TABLE hackernews MATERIALIZE INDEX comment_idx SETTINGS mutations_sync = 2; -``` - -Теперь давайте выполним запросы с использованием функций `hasToken`, `hasAnyTokens` и `hasAllTokens`. -Следующие примеры покажут существенную разницу в производительности между стандартным сканированием индекса и оптимизацией прямого чтения. - -### 1. Использование `hasToken` - -`hasToken` проверяет, содержит ли текст указанный одиночный токен. -Мы будем искать регистрозависимый токен `ClickHouse`. - -**Прямое чтение отключено (стандартное сканирование)** -По умолчанию ClickHouse использует skip-индекс для фильтрации гранул, а затем читает данные столбца для этих гранул. -Мы можем смоделировать это поведение, отключив прямое чтение. - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 516 │ -└─────────┘ - -1 строка в наборе. Прошло: 0,362 сек. Обработано 24,90 млн строк, 9,51 ГБ -``` - -**Включено прямое чтение (Fast index read)** -Теперь запустим тот же запрос с включённым режимом прямого чтения (это значение по умолчанию). - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 516 │ -└─────────┘ - -Обработана 1 строка. Затрачено: 0.008 сек. Обработано 3.15 млн строк, 3.15 МБ -``` - -Запрос прямого чтения более чем в 45 раз быстрее (0,362 с против 0,008 с) и обрабатывает значительно меньше данных (9,51 ГБ против 3,15 МБ), поскольку читает только из индекса. - -### 2. Использование `hasAnyTokens` - -`hasAnyTokens` проверяет, содержит ли текст хотя бы один из заданных токенов. -Мы будем искать комментарии, содержащие либо «love», либо «ClickHouse». - -**Прямое чтение отключено (стандартное сканирование)** - -```sql -SELECT count() -FROM hackernews -WHERE hasAnyTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 408426 │ -└─────────┘ - -1 row in set. Elapsed: 1.329 sec. Processed 28.74 million rows, 9.72 GB -``` - -**Включено прямое чтение (быстрое чтение индекса)** - -```sql -SELECT count() -FROM hackernews -WHERE hasAnyTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 408426 │ -└─────────┘ -``` - - -1 строка в наборе. Прошло: 0.015 сек. Обработано 27.99 млн строк, 27.99 МБ - -```` -Ускорение ещё более впечатляющее для этого распространённого поиска с условием "ИЛИ". -Запрос выполняется почти в 89 раз быстрее (1.329 с против 0.015 с) благодаря отсутствию полного сканирования столбца. - -### 3. Использование `hasAllTokens` - -`hasAllTokens` проверяет, содержит ли текст все указанные токены. -Выполним поиск комментариев, содержащих одновременно 'love' и 'ClickHouse'. - -**Прямое чтение отключено (стандартное сканирование)** -Даже при отключённом прямом чтении стандартный skip-индекс остаётся эффективным. -Он сокращает 28,7 млн строк до 147,46 тыс. строк, но всё равно должен прочитать 57,03 МБ из столбца. - -```sql -SELECT count() -FROM hackernews -WHERE hasAllTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 11 │ -└─────────┘ - -1 row in set. Elapsed: 0.184 sec. Processed 147.46 thousand rows, 57.03 MB -```` - -**Прямое чтение (Fast index read) включено** -Прямое чтение обрабатывает запрос, работая только с данными индекса и считывая всего 147,46 КБ. - -```sql -SELECT count() -FROM hackernews -WHERE hasAllTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 11 │ -└─────────┘ - -1 строка в наборе. Затрачено: 0.007 сек. Обработано 147.46 тыс. строк, 147.46 КБ -``` - -Для этого поиска с оператором "AND" оптимизация прямого чтения более чем в 26 раз быстрее (0.184 s против 0.007 s), чем стандартное сканирование с использованием skip-индекса. - -### 4. Составной поиск: OR, AND, NOT, ... - -Оптимизация прямого чтения также применима к составным булевым выражениям. -Здесь мы выполним поиск без учета регистра для 'ClickHouse' OR 'clickhouse'. - -**Прямое чтение отключено (стандартное сканирование)** - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') OR hasToken(comment, 'clickhouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 769 │ -└─────────┘ - -1 строка в результате. Время выполнения: 0.450 сек. Обработано 25.87 млн строк, 9.58 ГБ -``` - -**Прямое чтение включено (быстрый доступ к индексу)** - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') OR hasToken(comment, 'clickhouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 769 │ -└─────────┘ - -Обработана 1 строка. Затрачено: 0.013 сек. Обработано 25.87 млн строк, 51.73 МБ -``` - -Благодаря объединению результатов из индекса прямой запрос на чтение выполняется в 34 раза быстрее (0,450 s против 0,013 s) и позволяет избежать чтения 9,58 GB данных столбцов. -В этом конкретном случае предпочтительнее использовать более эффективный синтаксис `hasAnyTokens(comment, ['ClickHouse', 'clickhouse'])`. - - -## Связанные материалы {#related-content} - -- Статья в блоге: [Introducing Inverted Indices in ClickHouse](https://clickhouse.com/blog/clickhouse-search-with-inverted-indices) -- Статья в блоге: [Inside ClickHouse full-text search: fast, native, and columnar](https://clickhouse.com/blog/clickhouse-full-text-search) -- Видео: [Full-Text Indices: Design and Experiments](https://www.youtube.com/watch?v=O_MnyUkrIq8) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md deleted file mode 100644 index c7a12b9bbc4..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md +++ /dev/null @@ -1,1191 +0,0 @@ ---- -description: 'Движки таблиц семейства `MergeTree` разработаны для высокой скорости загрузки и обработки огромных объемов данных.' -sidebar_label: 'MergeTree' -sidebar_position: 11 -slug: /engines/table-engines/mergetree-family/mergetree -title: 'Движок таблицы MergeTree' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Движок таблиц MergeTree - -Движок `MergeTree` и другие движки семейства `MergeTree` (например, `ReplacingMergeTree`, `AggregatingMergeTree`) являются наиболее часто используемыми и наиболее надежными движками таблиц в ClickHouse. - -Движки таблиц семейства `MergeTree` разработаны для высокой скорости загрузки данных и работы с очень большими объемами данных. -Операции вставки создают части таблицы (table parts), которые фоновым процессом сливаются с другими частями таблицы. - -Основные особенности движков таблиц семейства `MergeTree`: - -- Первичный ключ таблицы определяет порядок сортировки внутри каждой части таблицы (кластерный индекс). При этом первичный ключ ссылается не на отдельные строки, а на блоки по 8192 строки, называемые гранулами. Это делает первичные ключи огромных наборов данных достаточно компактными, чтобы оставаться загруженными в оперативной памяти, при этом обеспечивая быстрый доступ к данным на диске. - -- Таблицы могут быть секционированы (разделены на партиции) с использованием произвольного выражения партиционирования. Отсечение партиций (partition pruning) обеспечивает пропуск чтения партиций, если запрос позволяет это сделать. - -- Данные могут реплицироваться между несколькими узлами кластера для обеспечения высокой доступности, отказоустойчивости и обновлений без простоя. См. раздел [Data replication](/engines/table-engines/mergetree-family/replication.md). - -- Движки таблиц `MergeTree` поддерживают различные типы статистики и методы семплирования, которые помогают в оптимизации запросов. - -:::note -Несмотря на схожее название, движок [Merge](/engines/table-engines/special/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](/sql-reference/statements/create/table.md). - -### Секции запроса {#mergetree-query-clauses} - -#### ENGINE {#engine} - -`ENGINE` — имя и параметры движка. `ENGINE = MergeTree()`. Движок `MergeTree` не имеет параметров. - -#### ORDER BY {#order_by} - -`ORDER BY` — ключ сортировки. - -Кортеж из имен столбцов или произвольных выражений. Пример: `ORDER BY (CounterID + 1, EventDate)`. - -Если первичный ключ не определен (т.е. секция `PRIMARY KEY` не указана), ClickHouse использует ключ сортировки в качестве первичного ключа. - -Если сортировка не требуется, можно использовать синтаксис `ORDER BY tuple()`. -Альтернативно, если включена настройка `create_table_empty_primary_key_by_default`, секция `ORDER BY ()` неявно добавляется к операторам `CREATE TABLE`. См. [Выбор первичного ключа](#selecting-a-primary-key). - -#### PARTITION BY {#partition-by} - -`PARTITION BY` — [ключ партиционирования](/engines/table-engines/mergetree-family/custom-partitioning-key.md). Необязательный параметр. В большинстве случаев ключ партиционирования не требуется, а если партиционирование необходимо, обычно не нужен ключ более детальный, чем по месяцам. Партиционирование не ускоряет запросы (в отличие от выражения ORDER BY). Не следует использовать слишком детальное партиционирование. Не партиционируйте данные по идентификаторам или именам клиентов (вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY). - -Для партиционирования по месяцам используйте выражение `toYYYYMM(date_column)`, где `date_column` — столбец с датой типа [Date](/sql-reference/data-types/date.md). Имена партиций в этом случае имеют формат `"YYYYMM"`. - -#### PRIMARY KEY {#primary-key} - -`PRIMARY KEY` — первичный ключ, если он [отличается от ключа сортировки](#choosing-a-primary-key-that-differs-from-the-sorting-key). Необязательный параметр. - -Указание ключа сортировки (с помощью секции `ORDER BY`) неявно задает первичный ключ. -Обычно нет необходимости указывать первичный ключ дополнительно к ключу сортировки. - -#### SAMPLE BY {#sample-by} - -`SAMPLE BY` — выражение для сэмплирования. Необязательный параметр. - -Если указано, оно должно содержаться в первичном ключе. -Выражение для сэмплирования должно возвращать беззнаковое целое число. - -Пример: `SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`. - -#### TTL {#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`. - -Подробнее см. [TTL для столбцов и таблиц](#table_engine-mergetree-ttl) - -#### SETTINGS {#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 -``` - -В примере задано партиционирование по месяцам. - -Также задано выражение для сэмплирования в виде хеша по идентификатору пользователя. Это позволяет псевдослучайным образом перемешать данные в таблице для каждого `CounterID` и `EventDate`. Если при выборке данных указать секцию [SAMPLE](/sql-reference/statements/select/sample), 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](/sql-reference/data-types/date.md). ClickHouse автоматически создаёт партиции по месяцам на основе этого столбца. Имена партиций имеют формат `"YYYYMM"`. -- `sampling_expression` — Выражение для сэмплирования. -- `(primary, key)` — Первичный ключ. Тип: [Tuple()](/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` все столбцы хранятся в одном файле. Формат `Compact` может использоваться для повышения производительности при небольших и частых вставках. - -Формат хранения данных управляется настройками движка таблицы `min_bytes_for_wide_part` и `min_rows_for_wide_part`. Если количество байтов или строк в куске данных меньше значения соответствующей настройки, кусок хранится в формате `Compact`. В противном случае он хранится в формате `Wide`. Если ни одна из этих настроек не задана, куски данных хранятся в формате `Wide`. - -Каждый кусок данных логически разделён на гранулы. Гранула — это наименьший неделимый набор данных, который ClickHouse читает при выборке данных. ClickHouse не разделяет строки или значения, поэтому каждая гранула всегда содержит целое число строк. Первая строка гранулы отмечается значением первичного ключа для этой строки. Для каждого куска данных ClickHouse создаёт индексный файл, в котором хранятся метки. Для каждого столбца, независимо от того, входит ли он в первичный ключ или нет, ClickHouse также сохраняет те же метки. Эти метки позволяют находить данные непосредственно в файлах столбцов. - -Размер гранулы ограничивается настройками движка таблицы `index_granularity` и `index_granularity_bytes`. Количество строк в грануле находится в диапазоне `[1, index_granularity]` в зависимости от размера строк. Размер гранулы может превышать `index_granularity_bytes`, если размер одной строки больше значения настройки. В этом случае размер гранулы равен размеру строки. - - -## Первичные ключи и индексы в запросах {#primary-keys-and-indexes-in-queries} - -Рассмотрим первичный ключ `(CounterID, Date)` в качестве примера. В этом случае сортировка и индекс могут быть проиллюстрированы следующим образом: - -```text -Все данные: [---------------------------------------------] -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` дополнительных строк в каждом блоке данных. - -Разреженные индексы позволяют работать с очень большим количеством строк таблицы, поскольку в большинстве случаев такие индексы помещаются в оперативной памяти компьютера. - -ClickHouse не требует уникальности первичного ключа. Вы можете вставлять несколько строк с одинаковым первичным ключом. - -Вы можете использовать выражения типа `Nullable` в секциях `PRIMARY KEY` и `ORDER BY`, но это крайне не рекомендуется. Чтобы разрешить эту возможность, включите настройку [allow_nullable_key](/operations/settings/merge-tree-settings/#allow_nullable_key). Для значений `NULL` в секции `ORDER BY` применяется принцип [NULLS_LAST](/sql-reference/statements/select/order-by.md/#sorting-of-special-values). - -### Выбор первичного ключа {#selecting-a-primary-key} - -Количество столбцов в первичном ключе явно не ограничено. В зависимости от структуры данных вы можете включить в первичный ключ больше или меньше столбцов. Это может: - -- Улучшить производительность индекса. - - Если первичный ключ — это `(a, b)`, то добавление еще одного столбца `c` улучшит производительность, если выполняются следующие условия: - - Существуют запросы с условием на столбец `c`. - - Длинные диапазоны данных (в несколько раз длиннее, чем `index_granularity`) с идентичными значениями для `(a, b)` встречаются часто. Другими словами, когда добавление еще одного столбца позволяет пропускать довольно длинные диапазоны данных. - -- Улучшить сжатие данных. - - ClickHouse сортирует данные по первичному ключу, поэтому чем выше согласованность данных, тем лучше сжатие. - -- Обеспечить дополнительную логику при слиянии частей данных в движках [CollapsingMergeTree](/engines/table-engines/mergetree-family/collapsingmergetree) и [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree.md). - - В этом случае имеет смысл указать _ключ сортировки_, отличающийся от первичного ключа. - -Длинный первичный ключ негативно повлияет на производительность вставки и потребление памяти, но дополнительные столбцы в первичном ключе не влияют на производительность ClickHouse при выполнении запросов `SELECT`. - -Вы можете создать таблицу без первичного ключа, используя синтаксис `ORDER BY tuple()`. В этом случае ClickHouse хранит данные в порядке вставки. Если вы хотите сохранить порядок данных при вставке данных запросами `INSERT ... SELECT`, установите [max_insert_threads = 1](/operations/settings/settings#max_insert_threads). - -Для выборки данных в исходном порядке используйте [однопоточные](/operations/settings/settings.md/#max_threads) запросы `SELECT`. - -### Выбор первичного ключа, отличающегося от ключа сортировки {#choosing-a-primary-key-that-differs-from-the-sorting-key} - - -Возможно указать первичный ключ (выражение, значения которого записываются в индексный файл для каждой отметки), отличающийся от ключа сортировки (выражения для сортировки строк в частях данных). В этом случае кортеж выражения первичного ключа должен быть префиксом кортежа выражения ключа сортировки. - -Эта возможность полезна при использовании движков таблиц [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree.md) и -[AggregatingMergeTree](/engines/table-engines/mergetree-family/aggregatingmergetree.md). В типичном случае при использовании этих движков таблица имеет два типа столбцов: _измерения_ и _метрики_. Типичные запросы агрегируют значения столбцов метрик с произвольным `GROUP BY` и фильтрацией по измерениям. Поскольку SummingMergeTree и AggregatingMergeTree агрегируют строки с одинаковым значением ключа сортировки, естественно добавить в него все измерения. В результате выражение ключа состоит из длинного списка столбцов, и этот список необходимо часто обновлять при добавлении новых измерений. - -В этом случае имеет смысл оставить в первичном ключе только несколько столбцов, которые обеспечат эффективное сканирование диапазонов, и добавить остальные столбцы измерений в кортеж ключа сортировки. - -[ALTER](/sql-reference/statements/alter/index.md) ключа сортировки является лёгкой операцией, поскольку при одновременном добавлении нового столбца в таблицу и в ключ сортировки существующие части данных не требуют изменения. Так как старый ключ сортировки является префиксом нового ключа сортировки, а во вновь добавленном столбце нет данных, данные отсортированы как по старому, так и по новому ключу сортировки в момент модификации таблицы. - -### Использование индексов и партиций в запросах {#use-of-indexes-and-partitions-in-queries} - -Для запросов `SELECT` ClickHouse анализирует, может ли быть использован индекс. Индекс может быть использован, если в секции `WHERE/PREWHERE` присутствует выражение (как один из элементов конъюнкции или полностью), представляющее операцию сравнения на равенство или неравенство, или если оно содержит `IN` или `LIKE` с фиксированным префиксом для столбцов или выражений, которые входят в первичный ключ или ключ партиционирования, или для определённых частично повторяющихся функций этих столбцов, или логических отношений этих выражений. - -Таким образом, возможно быстро выполнять запросы по одному или нескольким диапазонам первичного ключа. В этом примере запросы будут выполняться быстро для конкретного тега отслеживания, для конкретного тега и диапазона дат, для конкретного тега и даты, для нескольких тегов с диапазоном дат и так далее. - -Рассмотрим движок, настроенный следующим образом: - -```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](/operations/settings/settings.md/#force_index_by_date) и [force_primary_key](/operations/settings/settings#force_primary_key). - -Ключ партиционирования по месяцам позволяет читать только те блоки данных, которые содержат даты из соответствующего диапазона. В этом случае блок данных может содержать данные для многих дат (до целого месяца). Внутри блока данные отсортированы по первичному ключу, который может не содержать дату в качестве первого столбца. Из-за этого использование запроса только с условием по дате, не указывающим префикс первичного ключа, приведёт к чтению большего объёма данных, чем для одной даты. - -### Использование индекса для частично монотонных первичных ключей {#use-of-index-for-partially-monotonic-primary-keys} - - -Рассмотрим, например, дни месяца. Они образуют [монотонную последовательность](https://en.wikipedia.org/wiki/Monotonic_function) в пределах одного месяца, но не являются монотонными для более длительных периодов. Это частично монотонная последовательность. Если пользователь создает таблицу с частично монотонным первичным ключом, ClickHouse создает разреженный индекс как обычно. Когда пользователь выбирает данные из такой таблицы, ClickHouse анализирует условия запроса. Если пользователь хочет получить данные между двумя отметками индекса и обе эти отметки попадают в пределы одного месяца, ClickHouse может использовать индекс в этом конкретном случае, поскольку он может вычислить расстояние между параметрами запроса и отметками индекса. - -ClickHouse не может использовать индекс, если значения первичного ключа в диапазоне параметров запроса не представляют собой монотонную последовательность. В этом случае ClickHouse использует метод полного сканирования. - -ClickHouse использует эту логику не только для последовательностей дней месяца, но и для любого первичного ключа, который представляет собой частично монотонную последовательность. - -### Индексы пропуска данных {#table_engine-mergetree-data_skipping-indexes} - -Объявление индекса находится в секции столбцов запроса `CREATE`. - -```sql -INDEX index_name expr TYPE type(...) [GRANULARITY granularity_value] -``` - -Для таблиц семейства `*MergeTree` можно указывать индексы пропуска данных. - -Эти индексы агрегируют некоторую информацию о заданном выражении на блоках, которые состоят из `granularity_value` гранул (размер гранулы задается с помощью настройки `index_granularity` в движке таблицы). Затем эти агрегаты используются в запросах `SELECT` для уменьшения объема данных, считываемых с диска, путем пропуска больших блоков данных, где условие `where` не может быть выполнено. - -Предложение `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 -``` - -### Типы индексов пропуска {#skip-index-types} - -Движок таблиц `MergeTree` поддерживает следующие типы индексов пропуска. -Для получения дополнительной информации о том, как индексы пропуска могут использоваться для оптимизации производительности, -см. [«Понимание индексов пропуска данных ClickHouse»](/optimize/skipping-indexes). - -- Индекс [`MinMax`](#minmax) -- Индекс [`Set`](#set) -- Индекс [`bloom_filter`](#bloom-filter) -- Индекс [`ngrambf_v1`](#n-gram-bloom-filter) -- Индекс [`tokenbf_v1`](#token-bloom-filter) - -#### Индекс пропуска MinMax {#minmax} - -Для каждой гранулы индекса сохраняются минимальное и максимальное значения выражения. -(Если выражение имеет тип `tuple`, сохраняются минимум и максимум для каждого элемента кортежа.) - -```text title="Синтаксис" -minmax -``` - -#### Set {#set} - -Для каждой гранулы индекса сохраняется не более `max_rows` уникальных значений указанного выражения. -`max_rows = 0` означает «сохранять все уникальные значения». - -```text title="Синтаксис" -set(max_rows) -``` - -#### Bloom filter {#bloom-filter} - -Для каждой гранулы индекса сохраняется [фильтр Блума](https://en.wikipedia.org/wiki/Bloom_filter) для указанных столбцов. - -```text title="Синтаксис" -bloom_filter([false_positive_rate]) -``` - -Параметр `false_positive_rate` может принимать значение от 0 до 1 (по умолчанию: `0.025`) и задает вероятность ложноположительного срабатывания (что увеличивает объем считываемых данных). - - -Поддерживаются следующие типы данных: - -- `(U)Int*` -- `Float*` -- `Enum` -- `Date` -- `DateTime` -- `String` -- `FixedString` -- `Array` -- `LowCardinality` -- `Nullable` -- `UUID` -- `Map` - -:::note Тип данных Map: указание создания индекса по ключам или значениям -Для типа данных `Map` можно указать, должен ли индекс создаваться по ключам или по значениям, используя функции [`mapKeys`](/sql-reference/functions/tuple-map-functions.md/#mapkeys) или [`mapValues`](/sql-reference/functions/tuple-map-functions.md/#mapvalues). -::: - -#### N-граммный фильтр Блума {#n-gram-bloom-filter} - -Для каждой гранулы индекса сохраняется [фильтр Блума](https://en.wikipedia.org/wiki/Bloom_filter) для [n-грамм](https://en.wikipedia.org/wiki/N-gram) указанных столбцов. - -```text title="Синтаксис" -ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed) -``` - -| Параметр | Описание | -| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| `n` | Размер n-граммы | -| `size_of_bloom_filter_in_bytes` | Размер фильтра Блума в байтах. Здесь можно использовать большое значение, например `256` или `512`, так как оно хорошо сжимается. | -| `number_of_hash_functions` | Количество хеш-функций, используемых в фильтре Блума. | -| `random_seed` | Начальное значение для хеш-функций фильтра Блума. | - -Этот индекс работает только со следующими типами данных: - -- [`String`](/sql-reference/data-types/string.md) -- [`FixedString`](/sql-reference/data-types/fixedstring.md) -- [`Map`](/sql-reference/data-types/map.md) - -Для оценки параметров `ngrambf_v1` можно использовать следующие [пользовательские функции (UDF)](/sql-reference/statements/create/function.md). - -```sql title="UDF для ngrambf_v1" -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)))) -``` - -Для использования этих функций необходимо указать как минимум два параметра: - -- `total_number_of_all_grams` -- `probability_of_false_positives` - -Например, в грануле содержится `4300` n-грамм, и вы ожидаете, что вероятность ложных срабатываний будет меньше `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). - -#### Токенный фильтр Блума {#token-bloom-filter} - -Токенный фильтр Блума аналогичен `ngrambf_v1`, но сохраняет токены (последовательности, разделенные неалфавитно-цифровыми символами) вместо n-грамм. - -```text title="Синтаксис" -tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed) -``` - - -#### Фильтр Блума на основе разреженных грамм {#sparse-grams-bloom-filter} - -Фильтр Блума на основе разреженных грамм аналогичен `ngrambf_v1`, но использует [токены разреженных грамм](/sql-reference/functions/string-functions.md/#sparseGrams) вместо n-грамм. - -```text title="Синтаксис" -sparse_grams(min_ngram_length, max_ngram_length, min_cutoff_length, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed) -``` - -### Текстовый индекс {#text} - -Поддерживает полнотекстовый поиск, подробности см. [здесь](invertedindexes.md). - -#### Векторное сходство {#vector-similarity} - -Поддерживает приближённый поиск ближайших соседей, подробности см. [здесь](annindexes.md). - -### Поддержка функций {#functions-support} - -Условия в секции `WHERE` содержат вызовы функций, работающих со столбцами. Если столбец является частью индекса, ClickHouse пытается использовать этот индекс при выполнении функций. ClickHouse поддерживает различные подмножества функций для использования индексов. - -Индексы типа `set` могут использоваться всеми функциями. Другие типы индексов поддерживаются следующим образом: - - -| Функция (оператор) / индекс | первичный ключ | minmax | ngrambf_v1 | tokenbf_v1 | bloom_filter | text | sparse_grams | -| ------------------------------------------------------------------------------------------------------------------------- | -------------- | ------ | -------------- | -------------- | ---------------- | ---- | ---------------- | -| [equals (=, ==)](/sql-reference/functions/comparison-functions.md/#equals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [notEquals(!=, <>)](/sql-reference/functions/comparison-functions.md/#notEquals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [like](/sql-reference/functions/string-search-functions.md/#like) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [notLike](/sql-reference/functions/string-search-functions.md/#notLike) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [match](/sql-reference/functions/string-search-functions.md/#match) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [startsWith](/sql-reference/functions/string-functions.md/#startsWith) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [endsWith](/sql-reference/functions/string-functions.md/#endsWith) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [multiSearchAny](/sql-reference/functions/string-search-functions.md/#multiSearchAny) | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | ✗ | -| [in](/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [notIn](/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [меньше (`<`)](/sql-reference/functions/comparison-functions.md/#less) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [больше (`>`)](/sql-reference/functions/comparison-functions.md/#greater) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [lessOrEquals (`<=`)](/sql-reference/functions/comparison-functions.md/#lessOrEquals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [greaterOrEquals (`>=`)](/sql-reference/functions/comparison-functions.md/#greaterOrEquals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [empty](/sql-reference/functions/array-functions/#empty) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [notEmpty](/sql-reference/functions/array-functions/#notEmpty) | ✗ | ✔ | ✗ | ✗ | ✗ | ✗ | ✔ | -| [has](/sql-reference/functions/array-functions#has) | ✗ | ✗ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [hasAny](/sql-reference/functions/array-functions#hasAny) | ✗ | ✗ | ✔ | ✔ | ✔ | ✗ | ✔ | -| [hasAll](/sql-reference/functions/array-functions#hasAll) | ✗ | ✗ | ✔ | ✔ | ✔ | ✗ | ✔ | -| [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken) | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | ✗ | -| [hasTokenOrNull](/sql-reference/functions/string-search-functions.md/#hasTokenOrNull) | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | ✗ | -| [hasTokenCaseInsensitive (`*`)](/sql-reference/functions/string-search-functions.md/#hasTokenCaseInsensitive) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | -| [hasTokenCaseInsensitiveOrNull (`*`)](/sql-reference/functions/string-search-functions.md/#hasTokenCaseInsensitiveOrNull) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | -| [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | -| [hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | -| [mapContains](/sql-reference/functions/tuple-map-functions#mapcontains) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | - - - -Функции с константным аргументом, который меньше размера n-граммы, не могут использоваться индексом `ngrambf_v1` для оптимизации запросов. - -(*) Чтобы `hasTokenCaseInsensitive` и `hasTokenCaseInsensitiveOrNull` были эффективны, индекс `tokenbf_v1` должен быть создан по данным в нижнем регистре, например `INDEX idx (lower(str_col)) TYPE tokenbf_v1(512, 3, 0)`. - -:::note -Фильтры Блума могут давать ложноположительные совпадения, поэтому индексы `ngrambf_v1`, `tokenbf_v1`, `sparse_grams` и `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} - -Проекции похожи на [материализованные представления](/sql-reference/statements/create/view), но определяются на уровне части таблицы. Они обеспечивают гарантии согласованности и автоматически используются в запросах. - -:::note -При использовании проекций следует также учитывать настройку [force_optimize_projection](/operations/settings/settings#force_optimize_projection). -::: - -Проекции не поддерживаются в операторах `SELECT` с модификатором [FINAL](/sql-reference/statements/select/from#final-modifier). - -### Запрос проекции {#projection-query} - -Запрос проекции определяет проекцию. Он неявно выбирает данные из родительской таблицы. -**Синтаксис** - -```sql -SELECT [GROUP BY] [ORDER BY] -``` - -Проекции можно изменять или удалять с помощью оператора [ALTER](/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](/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). - -**Синтаксис** - -Установка времени жизни для столбца: - -```sql -TTL time_column -TTL time_column + interval -``` - -Для определения `interval` используйте операторы [временных интервалов](/sql-reference/operators#operators-for-working-with-dates-and-times), например: - -```sql -TTL date_time + INTERVAL 1 MONTH -TTL date_time + INTERVAL 15 HOUR -``` - -### TTL столбца {#mergetree-column-ttl} - -Когда значения в столбце устаревают, ClickHouse заменяет их значениями по умолчанию для типа данных столбца. Если все значения столбца в куске данных устаревают, ClickHouse удаляет этот столбец из куска данных в файловой системе. - -Секция `TTL` не может использоваться для ключевых столбцов. - -**Примеры** - -#### Создание таблицы с `TTL`: {#creating-a-table-with-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 к столбцу существующей таблицы {#adding-ttl-to-a-column-of-an-existing-table} - -```sql -ALTER TABLE tab - MODIFY COLUMN - c String TTL d + INTERVAL 1 DAY; -``` - -#### Изменение TTL столбца {#altering-ttl-of-the-column} - -```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`, в результирующей строке он содержит произвольное значение из сгруппированных строк (как если бы к нему была применена агрегатная функция `any`). - -**Примеры** - -#### Создание таблицы с `TTL`: {#creating-a-table-with-ttl-1} - -```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` таблицы: {#altering-ttl-of-the-table} - -```sql -ALTER TABLE tab - MODIFY TTL d + INTERVAL 1 DAY; -``` - - -Создание таблицы, в которой строки истекают через месяц. Истекшие строки, даты которых приходятся на понедельники, удаляются: - -```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; -``` - -#### Создание таблицы, в которой истекшие строки перекомпрессируются: {#creating-a-table-where-expired-rows-are-recompressed} - -```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} - -Данные с истекшим `TTL` удаляются при слиянии частей данных в ClickHouse. - -Когда ClickHouse обнаруживает истекшие данные, он выполняет внеплановое слияние. Для управления частотой таких слияний можно задать параметр `merge_with_ttl_timeout`. Если значение слишком низкое, будет выполняться много внеплановых слияний, что может потреблять значительные ресурсы. - -Если вы выполняете запрос `SELECT` между слияниями, вы можете получить истекшие данные. Чтобы этого избежать, используйте запрос [OPTIMIZE](/sql-reference/statements/optimize.md) перед `SELECT`. - -**См. также** - -- настройка [ttl_only_drop_parts](/operations/settings/merge-tree-settings#ttl_only_drop_parts) - - -## Типы дисков {#disk-types} - -Помимо локальных блочных устройств, ClickHouse поддерживает следующие типы хранилищ: - -- [`s3` для S3 и MinIO](#table_engine-mergetree-s3) -- [`gcs` для GCS](/integrations/data-ingestion/gcs/index.md/#creating-a-disk) -- [`blob_storage_disk` для Azure Blob Storage](/operations/storing-data#azure-blob-storage) -- [`hdfs` для HDFS](/engines/table-engines/integrations/hdfs) -- [`web` для чтения данных из веб-источников в режиме только для чтения](/operations/storing-data#web-storage) -- [`cache` для локального кэширования](/operations/storing-data#using-local-cache) -- [`s3_plain` для резервного копирования в S3](/operations/backup#backuprestore-using-an-s3-disk) -- [`s3_plain_rewritable` для неизменяемых нереплицируемых таблиц в S3](/operations/storing-data.md#s3-plain-rewritable-storage) - - -## Использование нескольких блочных устройств для хранения данных {#table_engine-mergetree-multiple-volumes} - -### Введение {#introduction} - -Семейство движков таблиц `MergeTree` может хранить данные на нескольких блочных устройствах. Например, это полезно, когда данные определённой таблицы неявно делятся на «горячие» и «холодные». К наиболее свежим данным регулярно обращаются, но они занимают небольшой объём. Напротив, исторические данные с «длинным хвостом» запрашиваются редко. Если доступно несколько дисков, «горячие» данные можно размещать на быстрых дисках (например, NVMe SSD или в памяти), а «холодные» данные — на относительно медленных (например, HDD). - -Часть данных является минимальной перемещаемой единицей для таблиц на движке `MergeTree`. Данные, относящиеся к одной части, хранятся на одном диске. Части данных могут перемещаться между дисками в фоновом режиме (в соответствии с пользовательскими настройками), а также с помощью запросов [ALTER](/sql-reference/statements/alter/partition). - -### Термины {#terms} - -- Диск — блочное устройство, подключённое к файловой системе. -- Диск по умолчанию — диск, на котором расположен путь, указанный в настройке сервера [path](/operations/server-configuration-parameters/settings.md/#path). -- Том — упорядоченный набор однотипных дисков (аналогично [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures)). -- Политика хранения — набор томов и правила перемещения данных между ними. - -Названия указанных сущностей можно найти в системных таблицах [system.storage_policies](/operations/system-tables/storage_policies) и [system.disks](/operations/system-tables/disks). Чтобы применить одну из настроенных политик хранения к таблице, используйте настройку `storage_policy` для таблиц семейства движков `MergeTree`. - -### Конфигурация {#table_engine-mergetree-multiple-volumes_configure} - -Диски, тома и политики хранения должны быть объявлены внутри тега `` в файле в каталоге `config.d`. - -:::tip -Диски также могут быть объявлены в секции `SETTINGS` запроса. Это полезно -для разового анализа, когда необходимо временно подключить диск, который, например, доступен по URL. -Подробнее см. в разделе [динамическое хранилище](/operations/storing-data#dynamic-configuration). -::: - -Структура конфигурации: - -```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), когда они становятся достаточно крупными. Не используйте этот параметр, если ваша политика содержит только один том. -* `move_factor` — когда количество доступного места становится меньше этого коэффициента, данные автоматически начинают перемещаться на следующий том, если он есть (по умолчанию 0.1). ClickHouse сортирует существующие части данных по размеру от наибольшей к наименьшей (в порядке убывания) и выбирает части с суммарным размером, достаточным для выполнения условия `move_factor`. Если суммарного размера всех частей недостаточно, будут перемещены все части. -* `perform_ttl_move_on_insert` — отключает перемещение по TTL при INSERT части данных. По умолчанию (если параметр включен), если вставляется часть данных, которая уже просрочена по правилу перемещения TTL, она сразу записывается на том/диск, указанный в правиле перемещения. Это может значительно замедлить вставку, если целевой том/диск медленный (например, S3). Если параметр отключен, уже просроченная часть данных сначала записывается на том по умолчанию, а затем сразу же переносится на том, указанный правилом TTL. -* `load_balancing` — политика балансировки по дискам: `round_robin` или `least_used`. -* `least_used_ttl_ms` — настройка тайм-аута (в миллисекундах) для обновления информации о доступном пространстве на всех дисках (`0` — обновлять всегда, `-1` — никогда не обновлять, значение по умолчанию — `60000`). Обратите внимание: если диск может использоваться только ClickHouse и не подвержен онлайн-изменению размера/сжатию файловой системы, можно использовать `-1`; во всех остальных случаях это не рекомендуется, так как в итоге это приведёт к некорректному распределению пространства. -* `prefer_not_to_merge` — не следует использовать этот параметр. Отключает слияние частей данных на этом томе (это вредно и приводит к деградации производительности). Когда этот параметр включён (не делайте этого), слияние данных на этом томе не допускается (что плохо). Это позволяет (но вам это не нужно) управлять (если вы хотите чем-то управлять, вы совершаете ошибку) тем, как ClickHouse работает с медленными дисками (но ClickHouse знает лучше, поэтому, пожалуйста, не используйте этот параметр). -* `volume_priority` — определяет приоритет (порядок), в котором заполняются тома. Чем меньше значение, тем выше приоритет. Значения параметра должны быть натуральными числами и совместно покрывать диапазон от 1 до N (где N — наименьший приоритет) без пропуска каких-либо чисел. - * Если *у всех* томов задан приоритет, они используются в указанном порядке. - * Если только *у некоторых* томов задан приоритет, тома без приоритета имеют наименьший приоритет и используются в том порядке, в котором они определены в конфигурации. - * Если *ни у одного* тома приоритет не задан, их приоритет устанавливается в соответствии с порядком их объявления в конфигурации. - * Два тома не могут иметь одинаковое значение приоритета. - -Примеры конфигурации: - -```xml - - ... - - - - - disk1 - disk2 - - - - - - - - fast_ssd - 1073741824 - - - disk1 - - - 0.2 - - - - -
- jbod1 -
- - external - -
-
-
- ... -
-``` - - -В данном примере политика `hdd_in_order` реализует подход [циклического перебора](https://en.wikipedia.org/wiki/Round-robin_scheduling). Эта политика определяет только один том (`single`), куски данных хранятся на всех его дисках в циклическом порядке. Такая политика может быть весьма полезна, если к системе подключено несколько однотипных дисков, но RAID не настроен. Имейте в виду, что каждый отдельный дисковый накопитель не является надёжным, и вы можете компенсировать это коэффициентом репликации 3 или более. - -Если в системе доступны различные типы дисков, можно использовать политику `moving_from_ssd_to_hdd`. Том `hot` состоит из SSD-диска (`fast_ssd`), максимальный размер куска, который может храниться на этом томе, составляет 1 ГБ. Все куски размером более 1 ГБ будут храниться непосредственно на томе `cold`, который содержит HDD-диск `disk1`. -Кроме того, как только диск `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](/operations/server-configuration-parameters/settings.md/#background_move_pool_size). - -### Подробности {#details} - -В случае таблиц `MergeTree` данные попадают на диск различными способами: - -- В результате вставки (запрос `INSERT`). -- Во время фоновых слияний и [мутаций](/sql-reference/statements/alter#mutations). -- При загрузке с другой реплики. -- В результате заморозки партиции [ALTER TABLE ... FREEZE PARTITION](/sql-reference/statements/alter/partition#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](/operations/system-tables/part_log) (поле `type = MOVE_PART`) и [system.parts](/operations/system-tables/parts.md) (поля `path` и `disk`). Также подробная информация доступна в логах сервера. - -Пользователь может принудительно переместить кусок или партицию с одного тома на другой с помощью запроса [ALTER TABLE ... MOVE PART\|PARTITION ... TO VOLUME\|DISK ...](/sql-reference/statements/alter/partition), при этом учитываются все ограничения для фоновых операций. Запрос инициирует перемещение самостоятельно и не ожидает завершения фоновых операций. Пользователь получит сообщение об ошибке, если недостаточно свободного пространства или если какое-либо из требуемых условий не выполнено. - -Перемещение данных не влияет на репликацию данных. Поэтому для одной и той же таблицы на разных репликах могут быть указаны различные политики хранения. - - -После завершения фоновых слияний и мутаций старые части удаляются только по истечении заданного времени (`old_parts_lifetime`). -В течение этого времени они не перемещаются на другие тома или диски. Поэтому, пока части окончательно не удалены, они продолжают учитываться при расчёте занятого дискового пространства. - -Пользователь может равномерно распределять новые крупные части по разным дискам тома [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures) с помощью настройки [min_bytes_to_rebalance_partition_over_jbod](/operations/settings/merge-tree-settings.md/#min_bytes_to_rebalance_partition_over_jbod). - - - -## Использование внешнего хранилища для хранения данных {#table_engine-mergetree-s3} - -Движки таблиц семейства [MergeTree](/engines/table-engines/mergetree-family/mergetree.md) могут хранить данные в `S3`, `AzureBlobStorage`, `HDFS`, используя диски с типами `s3`, `azure_blob_storage`, `hdfs` соответственно. Подробнее см. в разделе [настройка параметров внешнего хранилища](/operations/storing-data.md/#configuring-external-storage). - -Пример использования [S3](https://aws.amazon.com/s3/) в качестве внешнего хранилища с диском типа `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 - -
- ... -
-``` - -См. также [настройка параметров внешнего хранилища](/operations/storing-data.md/#configuring-external-storage). - -:::note конфигурация кеша -В версиях ClickHouse с 22.3 по 22.7 используется другая конфигурация кеша. См. раздел [использование локального кеша](/operations/storing-data.md/#using-local-cache), если вы используете одну из этих версий. -::: - - -## Виртуальные столбцы {#virtual-columns} - -- `_part` — Имя части. -- `_part_index` — Порядковый индекс части в результате запроса. -- `_part_starting_offset` — Накопительное смещение начальной строки части в результате запроса. -- `_part_offset` — Номер строки в части. -- `_part_granule_offset` — Номер гранулы в части. -- `_partition_id` — Имя партиции. -- `_part_uuid` — Уникальный идентификатор части (если включена настройка MergeTree `assign_part_uuids`). -- `_part_data_version` — Версия данных части (минимальный номер блока или версия мутации). -- `_partition_value` — Значения (кортеж) выражения `partition by`. -- `_sample_factor` — Коэффициент выборки (из запроса). -- `_block_number` — Исходный номер блока для строки, назначенный при вставке; сохраняется при слияниях, если включена настройка `enable_block_number_column`. -- `_block_offset` — Исходный номер строки в блоке, назначенный при вставке; сохраняется при слияниях, если включена настройка `enable_block_offset_column`. -- `_disk_name` — Имя диска, используемого для хранения данных. - - -## Статистика столбцов {#column-statistics} - - - - -Объявление статистики находится в секции столбцов запроса `CREATE` для таблиц семейства `*MergeTree*` при включении `set allow_experimental_statistics = 1`. - -```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; -``` - -Эта легковесная статистика агрегирует информацию о распределении значений в столбцах. Статистика хранится в каждом куске и обновляется при каждой вставке данных. -Она может использоваться для оптимизации prewhere только при включении `set allow_statistics_optimize = 1`. - -### Доступные типы статистики столбцов {#available-types-of-column-statistics} - -- `MinMax` - - Минимальное и максимальное значения столбца, что позволяет оценить селективность диапазонных фильтров для числовых столбцов. - - Синтаксис: `minmax` - -- `TDigest` - - Скетчи [TDigest](https://github.com/tdunning/t-digest), которые позволяют вычислять приблизительные процентили (например, 90-й процентиль) для числовых столбцов. - - Синтаксис: `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 или FixedString | -| -------- | --------------------------------------------------- | --------------------- | -| CountMin | ✔ | ✔ | -| MinMax | ✔ | ✗ | -| TDigest | ✔ | ✗ | -| Uniq | ✔ | ✔ | - -### Поддерживаемые операции {#supported-operations} - -| | Фильтры равенства (==) | Диапазонные фильтры (`>, >=, <, <=`) | -| -------- | --------------------- | ------------------------------ | -| 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](/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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md deleted file mode 100644 index b02445758f3..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -description: 'отличается от MergeTree тем, что удаляет дублирующиеся записи с - одинаковым значением сортировочного ключа (секция `ORDER BY` таблицы, а не `PRIMARY KEY`).' -sidebar_label: 'ReplacingMergeTree' -sidebar_position: 40 -slug: /engines/table-engines/mergetree-family/replacingmergetree -title: 'Движок таблицы ReplacingMergeTree' -doc_type: 'reference' ---- - - - -# Движок таблиц ReplacingMergeTree - -Этот движок отличается от [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) тем, что удаляет дублирующиеся записи с одинаковым значением [ключа сортировки](../../../engines/table-engines/mergetree-family/mergetree.md) (раздел `ORDER BY` в определении таблицы, а не `PRIMARY KEY`). - -Дедупликация данных происходит только во время слияния. Слияния выполняются в фоновом режиме в неизвестный момент времени, поэтому вы не можете планировать их выполнение. Часть данных может остаться необработанной. Хотя вы можете запустить внеплановое слияние с помощью запроса `OPTIMIZE`, не рассчитывайте на это, потому что запрос `OPTIMIZE` будет считывать и записывать большой объем данных. - -Таким образом, `ReplacingMergeTree` подходит для фоновой очистки дублирующихся данных с целью экономии места, но не гарантирует отсутствие дубликатов. - -:::note -Подробное руководство по ReplacingMergeTree, включая лучшие практики и способы оптимизации производительности, доступно [здесь](/guides/replacing-merge-tree). -::: - - - -## Создание таблицы - -```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 -Уникальность строк определяется разделом таблицы `ORDER BY`, а не `PRIMARY KEY`. -::: - - -## Параметры ReplacingMergeTree - -### `ver` - -`ver` — столбец с номером версии. Тип `UInt*`, `Date`, `DateTime` или `DateTime64`. Необязательный параметр. - -При слиянии `ReplacingMergeTree` из всех строк с одинаковым сортировочным ключом оставляет только одну: - -* Последнюю в выборке, если `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, 'первая', '2020-01-01 01:01:01'); -INSERT INTO myFirstReplacingMT Values (1, 'вторая', '2020-01-01 00:00:00'); - -SELECT * FROM myFirstReplacingMT FINAL; - -┌─key─┬─someCol─┬───────────eventTime─┐ -│ 1 │ вторая │ 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, 'первая', '2020-01-01 01:01:01'); -INSERT INTO mySecondReplacingMT Values (1, 'вторая', '2020-01-01 00:00:00'); - -SELECT * FROM mySecondReplacingMT FINAL; - -┌─key─┬─someCol─┬───────────eventTime─┐ -│ 1 │ первая │ 2020-01-01 01:01:01 │ -└─────┴─────────┴─────────────────────┘ -``` - -### `is_deleted` - -`is_deleted` — имя столбца, используемого во время слияния для определения, представляет ли строка состояние или подлежит удалению; `1` — строка-удаление, `0` — строка-состояние. - -Тип данных столбца — `UInt8`. - -:::note -`is_deleted` может быть включён только при использовании `ver`. - -Независимо от выполняемой над данными операции, версия должна увеличиваться. Если две вставленные строки имеют одинаковый номер версии, сохраняется последняя вставленная строка. - -По умолчанию ClickHouse сохраняет последнюю строку для ключа, даже если эта строка является строкой удаления. Это нужно для того, чтобы любые будущие строки с более низкими версиями могли быть безопасно вставлены, и строка удаления всё равно применялась. - -Чтобы навсегда удалить такие строки удаления, включите настройку таблицы `allow_experimental_replacing_merge_with_cleanup` и выполните одно из следующих действий: - -1. Задайте настройки таблицы `enable_replacing_merge_with_cleanup_for_min_age_to_force_merge`, `min_age_to_force_merge_on_partition_only` и `min_age_to_force_merge_seconds`. Если все части в партиции старше, чем `min_age_to_force_merge_seconds`, ClickHouse выполнит их слияние - в одну часть и удалит все строки удаления. - -2. Вручную выполните `OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP`. - ::: - -Пример: - -```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 строк в наборе. Прошло: 0.003 сек. - --- удалить строки с 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 │ -└─────┴─────────┴─────────────────────┴────────────┘ - -``` -``` - - -## Части запроса {#query-clauses} - -При создании таблицы `ReplacingMergeTree` необходимо указывать те же [части запроса](../../../engines/table-engines/mergetree-family/mergetree.md), что и при создании таблицы `MergeTree`. - -
- -Устаревший способ создания таблицы - -:::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 строк в наборе. Затрачено: 19.958 сек. Обработано 1.00 миллиард строк, 8.00 ГБ (50.11 миллионов строк/с., 400.84 МБ/с.) -``` - -Запрос без `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 строка в наборе. Затрачено: 0.002 сек. -``` - -Для получения дополнительных сведений о `FINAL`, включая рекомендации по оптимизации его производительности, мы рекомендуем ознакомиться с [подробным руководством по ReplacingMergeTree](/guides/replacing-merge-tree). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md deleted file mode 100644 index 6ac7b1d8bbd..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md +++ /dev/null @@ -1,355 +0,0 @@ ---- -description: 'Обзор репликации данных с помощью семейства движков таблиц Replicated* в ClickHouse' -sidebar_label: 'Replicated*' -sidebar_position: 20 -slug: /engines/table-engines/mergetree-family/replication -title: 'Движки таблиц Replicated*' -doc_type: 'reference' ---- - - - -# Движки таблиц Replicated* - -:::note -В ClickHouse Cloud репликация выполняется автоматически. Пожалуйста, создавайте таблицы без указания аргументов. Например, в тексте ниже вы бы заменили: - -```sql -ENGINE = ReplicatedMergeTree( - '/clickhouse/tables/{shard}/table_name', - '{replica}' -) -``` - -с: - -```sql -ENGINE = ReplicatedMergeTree -``` - -::: - -Репликация поддерживается только для таблиц семейства MergeTree: - -* ReplicatedMergeTree -* ReplicatedSummingMergeTree -* ReplicatedReplacingMergeTree -* ReplicatedAggregatingMergeTree -* ReplicatedCollapsingMergeTree -* ReplicatedVersionedCollapsingMergeTree -* ReplicatedGraphiteMergeTree - -Репликация осуществляется на уровне отдельной таблицы, а не всего сервера. Сервер может одновременно хранить как реплицируемые, так и нереплицируемые таблицы. - -Сжатые данные для запросов `INSERT` и `ALTER` реплицируются (дополнительную информацию см. в документации по [ALTER](/sql-reference/statements/alter)). - -Запросы `CREATE`, `DROP`, `ATTACH`, `DETACH` и `RENAME` выполняются на одном сервере и не реплицируются: - -* Запрос `CREATE TABLE` создаёт новую реплицируемую таблицу на сервере, где выполняется запрос. Если эта таблица уже существует на других серверах, добавляется новая реплика. -* Запрос `DROP TABLE` удаляет реплику, расположенную на сервере, где выполняется запрос. -* Запрос `RENAME` переименовывает таблицу на одной из реплик. Другими словами, реплицируемые таблицы могут иметь разные имена на разных репликах. - -ClickHouse использует [ClickHouse Keeper](/guides/sre/keeper/index.md) для хранения метаданных о репликах. Возможно использование ZooKeeper версии 3.4.5 или более новой, но рекомендуется ClickHouse Keeper. - -Чтобы использовать репликацию, задайте параметры в разделе конфигурации сервера [zookeeper](/operations/server-configuration-parameters/settings#zookeeper). - -:::note -Не пренебрегайте настройками безопасности. ClickHouse поддерживает схему `digest` [ACL](https://zookeeper.apache.org/doc/current/zookeeperProgrammers.html#sc_ZooKeeperAccessControl) подсистемы безопасности ZooKeeper. -::: - -Пример настройки адресов кластера 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 не задан в конфигурационном файле, вы не сможете создавать реплицируемые таблицы, а любые существующие реплицируемые таблицы будут доступны только для чтения. - - -ZooKeeper не используется в запросах `SELECT`, поскольку репликация не влияет на производительность `SELECT`, и запросы выполняются так же быстро, как и для нереплицируемых таблиц. При запросе распределённых реплицируемых таблиц поведение ClickHouse контролируется настройками [max_replica_delay_for_distributed_queries](/operations/settings/settings.md/#max_replica_delay_for_distributed_queries) и [fallback_to_stale_replicas_for_distributed_queries](/operations/settings/settings.md/#fallback_to_stale_replicas_for_distributed_queries). - -Для каждого запроса `INSERT` в ZooKeeper добавляется примерно десять записей через несколько транзакций. (Более точно — для каждого вставленного блока данных; один запрос `INSERT` содержит один блок или один блок на `max_insert_block_size = 1048576` строк.) Это приводит к немного большей задержке для `INSERT` по сравнению с нереплицируемыми таблицами. Но если вы следуете рекомендациям вставлять данные пачками не более одного `INSERT` в секунду, это не создаёт никаких проблем. Весь кластер ClickHouse, который использует один кластер ZooKeeper для координации, в сумме выполняет несколько сотен `INSERT` в секунду. Пропускная способность по вставке данных (количество строк в секунду) столь же высока, как и для нереплицируемых данных. - -Для очень больших кластеров вы можете использовать разные кластеры ZooKeeper для разных шардов. Однако, исходя из нашего опыта, в этом не было необходимости даже для промышленных кластеров примерно из 300 серверов. - -Репликация асинхронная и многомастерная (multi-master). Запросы `INSERT` (а также `ALTER`) могут быть отправлены на любой доступный сервер. Данные вставляются на тот сервер, на котором выполняется запрос, а затем копируются на остальные серверы. Поскольку это асинхронно, недавно вставленные данные появляются на других репликах с некоторой задержкой. Если часть реплик недоступна, данные будут записаны, когда они станут доступны. Если реплика доступна, задержка равна времени, необходимому для передачи блока сжатых данных по сети. Количество потоков, выполняющих фоновые задачи для реплицируемых таблиц, можно задать настройкой [background_schedule_pool_size](/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size). - -Движок `ReplicatedMergeTree` использует отдельный пул потоков для реплицируемых выборок данных (fetch). Размер пула ограничивается настройкой [background_fetches_pool_size](/operations/server-configuration-parameters/settings#background_fetches_pool_size), которую можно изменить с перезапуском сервера. - -По умолчанию запрос `INSERT` ждёт подтверждения записи данных только от одной реплики. Если данные были успешно записаны только на одну реплику и сервер с этой репликой перестаёт существовать, сохранённые данные будут потеряны. Чтобы получать подтверждение записи данных от нескольких реплик, используйте опцию `insert_quorum`. - -Каждый блок данных записывается атомарно. Запрос `INSERT` разбивается на блоки до `max_insert_block_size = 1048576` строк. Другими словами, если запрос `INSERT` содержит меньше 1048576 строк, он выполняется атомарно. - -Блоки данных дедуплицируются. При многократной записи одного и того же блока данных (блоков одинакового размера, содержащих одинаковые строки в одном и том же порядке) блок записывается только один раз. Причина в том, что при сетевых сбоях клиентское приложение может не знать, были ли данные записаны в БД, поэтому запрос `INSERT` можно просто повторить. Не имеет значения, на какие реплики отправлялись `INSERT` с идентичными данными. Запросы `INSERT` являются идемпотентными. Параметры дедупликации управляются серверными настройками [merge_tree](/operations/server-configuration-parameters/settings.md/#merge_tree). - -Во время репликации по сети передаются только исходные данные для вставки. Дальнейшая обработка данных (слияние) координируется и выполняется на всех репликах одинаковым образом. Это минимизирует использование сети, что означает, что репликация хорошо работает, когда реплики расположены в разных дата-центрах. (Обратите внимание, что дублирование данных в разных дата-центрах является основной целью репликации.) - -Вы можете иметь любое количество реплик одних и тех же данных. По нашему опыту, относительно надёжным и удобным решением в продакшене может быть двойная репликация, при этом каждый сервер использует RAID-5 или RAID-6 (а в некоторых случаях RAID-10). - -Система отслеживает синхронность данных на репликах и способна восстанавливаться после сбоя. Переключение осуществляется автоматически (при небольших расхождениях в данных) или полуавтоматически (когда данные отличаются слишком сильно, что может указывать на ошибку конфигурации). - - - -## Создание реплицируемых таблиц - -:::note -В ClickHouse Cloud репликация выполняется автоматически. - -Создавайте таблицы с использованием [`MergeTree`](/engines/table-engines/mergetree-family/mergetree) без аргументов репликации. Система автоматически преобразует [`MergeTree`](/engines/table-engines/mergetree-family/mergetree) в [`SharedMergeTree`](/cloud/reference/shared-merge-tree) для репликации и распределения данных. - -Не используйте `ReplicatedMergeTree` и не задавайте параметры репликации, так как репликацией управляет платформа. - -::: - -### Параметры Replicated*MergeTree - -| Parameter | Description | -| ------------------ | ------------------------------------------------------------------------------------------------------------------- | -| `zoo_path` | Путь к таблице в ClickHouse Keeper. | -| `replica_name` | Имя реплики в ClickHouse Keeper. | -| `other_parameters` | Параметры движка, используемого для создания реплицируемой версии, например параметр версии в `ReplacingMergeTree`. | - -Пример: - -```sql -CREATE TABLE table_name -( - EventDate DateTime, - CounterID UInt32, - UserID UInt32, - ver UInt16 -ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{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](/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`). Таким образом, путь в ClickHouse Keeper можно указать как `'/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`. Однако удаляется только одна реплика — та, которая находится на сервере, где вы выполняете запрос. - - -## Восстановление после сбоев - -Если ClickHouse Keeper недоступен при запуске сервера, реплицируемые таблицы переключаются в режим только для чтения. Система периодически пытается подключиться к ClickHouse Keeper. - -Если ClickHouse Keeper недоступен во время выполнения `INSERT` или при взаимодействии с ClickHouse Keeper возникает ошибка, будет выброшено исключение. - -После подключения к ClickHouse Keeper система проверяет, соответствует ли набор данных в локальной файловой системе ожидаемому набору данных (ClickHouse Keeper хранит эту информацию). При небольших несоответствиях система устраняет их, синхронизируя данные с репликами. - -Если система обнаруживает повреждённые части данных (с некорректным размером файлов) или неизвестные части (записанные в файловую систему, но не зафиксированные в ClickHouse Keeper), они перемещаются в подкаталог `detached` (они не удаляются). Все отсутствующие части копируются с реплик. - -Обратите внимание, что ClickHouse не выполняет никаких разрушающих действий, таких как автоматическое удаление большого объёма данных. - -При запуске сервера (или установлении нового сеанса с ClickHouse Keeper) он проверяет только количество и размеры всех файлов. Если размеры файлов совпадают, но байты где-то посередине были изменены, это сразу не обнаруживается, а только при попытке чтения данных для запроса `SELECT`. Запрос в этом случае завершится исключением о несовпадающей контрольной сумме или размере сжатого блока. В таком случае части данных добавляются в очередь проверки и при необходимости копируются с реплик. - -Если локальный набор данных слишком сильно отличается от ожидаемого, срабатывает защитный механизм. Сервер записывает это в лог и отказывается запускаться. Причина в том, что такая ситуация может указывать на ошибку конфигурации, например, если реплика на одном шарде была по ошибке сконфигурирована как реплика на другом шарде. Однако пороговые значения для этого механизма установлены достаточно низкими, и такая ситуация может возникнуть при нормальном восстановлении после сбоя. В этом случае данные восстанавливаются полуавтоматически — «по нажатию кнопки». - -Чтобы запустить восстановление, создайте узел `/path_to_table/replica_name/flags/force_restore_data` в 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/`, с реплики. Если идентификатор шарда или реплики явно задан в определениях таблиц, скорректируйте его так, чтобы он соответствовал этой реплике. (Либо запустите сервер и выполните все запросы `ATTACH TABLE`, которые должны были находиться в .sql-файлах в `/var/lib/clickhouse/metadata/`.) -4. Для запуска процедуры восстановления создайте узел в ClickHouse Keeper `/path_to_table/replica_name/flags/force_restore_data` с любым содержимым или выполните команду для восстановления всех реплицируемых таблиц: `sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data` - -Затем запустите сервер (или перезапустите, если он уже работает). Данные будут загружены с реплик. - -Альтернативный вариант восстановления — удалить информацию о потерянной реплике из ClickHouse Keeper (`/path_to_table/replica_name`), затем создать реплику заново, как описано в разделе "[Создание реплицируемых таблиц](#creating-replicated-tables)". - -Во время восстановления пропускная способность сети никак не ограничивается. Учитывайте это, если вы восстанавливаете сразу много реплик. - - - -## Преобразование из MergeTree в ReplicatedMergeTree - -Мы используем термин `MergeTree` для обозначения всех движков таблиц из `семейства MergeTree`, аналогично для `ReplicatedMergeTree`. - -Если у вас была таблица `MergeTree`, реплицированная вручную, вы можете преобразовать её в реплицируемую таблицу. Это может понадобиться, если вы уже накопили большой объём данных в таблице `MergeTree` и теперь хотите включить репликацию. - -Оператор [ATTACH TABLE ... AS REPLICATED](/sql-reference/statements/attach.md#attach-mergetree-table-as-replicatedmergetree) позволяет присоединить отсоединённую таблицу `MergeTree` как `ReplicatedMergeTree`. - -Таблица `MergeTree` может быть автоматически преобразована при перезапуске сервера, если флаг `convert_to_replicated` установлен в каталоге данных таблицы (`/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/` для базы данных `Atomic`). -Создайте пустой файл `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/`). -Затем выполните `ALTER TABLE ATTACH PARTITION` на одной из реплик, чтобы добавить эти части данных в рабочий набор данных. - - -## Преобразование ReplicatedMergeTree в MergeTree {#converting-from-replicatedmergetree-to-mergetree} - -Используйте оператор [ATTACH TABLE ... AS NOT REPLICATED](/sql-reference/statements/attach.md#attach-mergetree-table-as-replicatedmergetree), чтобы подключить отсоединённую таблицу `ReplicatedMergeTree` как таблицу `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](/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) -- [background_fetches_pool_size](/operations/server-configuration-parameters/settings.md/#background_fetches_pool_size) -- [execute_merges_on_single_replica_time_threshold](/operations/settings/merge-tree-settings#execute_merges_on_single_replica_time_threshold) -- [max_replicated_fetches_network_bandwidth](/operations/settings/merge-tree-settings.md/#max_replicated_fetches_network_bandwidth) -- [max_replicated_sends_network_bandwidth](/operations/settings/merge-tree-settings.md/#max_replicated_sends_network_bandwidth) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md deleted file mode 100644 index 65742cd803d..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -description: 'SummingMergeTree наследуется от движка MergeTree. Его ключевая особенность — возможность автоматически суммировать числовые данные при слиянии частей.' -sidebar_label: 'SummingMergeTree' -sidebar_position: 50 -slug: /engines/table-engines/mergetree-family/summingmergetree -title: 'Табличный движок SummingMergeTree' -doc_type: 'reference' ---- - - - -# Движок таблиц SummingMergeTree - -Этот движок наследуется от [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree). Разница в том, что при слиянии частей данных для таблиц `SummingMergeTree` ClickHouse заменяет все строки с одинаковым первичным ключом (или, точнее, с одинаковым [ключом сортировки](../../../engines/table-engines/mergetree-family/mergetree.md)) одной строкой, которая содержит суммы значений для столбцов с числовым типом данных. Если ключ сортировки построен таким образом, что одному значению ключа соответствует большое количество строк, это существенно уменьшает объем хранимых данных и ускоряет выборку. - -Мы рекомендуем использовать этот движок совместно с `MergeTree`. Храните полные данные в таблице `MergeTree`, а `SummingMergeTree` используйте для хранения агрегированных данных, например при подготовке отчетов. Такой подход поможет избежать потери ценных данных из-за некорректно составленного первичного ключа. - - - -## Создание таблицы - -```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` не указан, ClickHouse суммирует значения во всех столбцах с числовым типом данных, которые не входят в ключ сортировки. - -### Части запроса - -При создании таблицы `SummingMergeTree` требуются те же [части запроса](../../../engines/table-engines/mergetree-family/mergetree.md), что и при создании таблицы `MergeTree`. - -
- Устаревший метод создания таблицы - - :::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` — кортеж с именами столбцов, значения которых будут суммироваться. Необязательный параметр. Описание см. в тексте выше. -
- - -## Пример использования - -Рассмотрим следующую таблицу: - -```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 │ -└─────┴────────────┘ -``` - - -## Обработка данных - -Когда данные вставляются в таблицу, они сохраняются как есть. ClickHouse периодически сливает вставленные части данных, и именно в этот момент строки с одинаковым первичным ключом суммируются и заменяются одной строкой для каждой получившейся части данных. - -ClickHouse может сливать части данных таким образом, что разные получившиеся части данных могут содержать строки с одинаковым первичным ключом, т. е. суммирование будет неполным. Поэтому при выполнении запроса (`SELECT`) следует использовать агрегатную функцию [sum()](/sql-reference/aggregate-functions/reference/sum) и предложение `GROUP BY`, как описано в примере выше. - -### Общие правила суммирования - -Значения в столбцах с числовым типом данных суммируются. Набор столбцов определяется параметром `columns`. - -Если значения были равны 0 во всех столбцах для суммирования, строка удаляется. - -Если столбец не входит в первичный ключ и не суммируется, из существующих значений выбирается произвольное. - -Значения не суммируются для столбцов, входящих в первичный ключ. - -### Суммирование в столбцах AggregateFunction - -Для столбцов типа [AggregateFunction](../../../sql-reference/data-types/aggregatefunction.md) ClickHouse ведёт себя как движок [AggregatingMergeTree](../../../engines/table-engines/mergetree-family/aggregatingmergetree.md), агрегируя в соответствии с функцией. - -### Вложенные структуры - -Таблица может содержать вложенные структуры данных, которые обрабатываются особым образом. - -Если имя вложенной таблицы оканчивается на `Map` и она содержит как минимум два столбца, удовлетворяющих следующим критериям: - -* первый столбец — числовой `(*Int*, Date, DateTime)` или строковый `(String, FixedString)`, назовём его `key`, -* остальные столбцы — арифметические `(*Int*, Float32/64)`, назовём их `(values...)`, - -то такая вложенная таблица интерпретируется как отображение `key => (values...)`, и при слиянии её строк элементы двух наборов данных объединяются по `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 │ -└──────┴─────────┴─────────────┴────────┘ -``` - - -При запросе данных используйте функцию [sumMap(key, value)](../../../sql-reference/aggregate-functions/reference/summap.md) для агрегации значений типа `Map`. - -Для вложенных структур данных не нужно указывать их столбцы в кортеже столбцов для суммирования. - - - -## Связанные материалы {#related-content} - -- Блог: [Использование агрегатных комбинаторов в ClickHouse](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md deleted file mode 100644 index 3be3f2fe0aa..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -description: 'Обеспечивает быструю запись состояний объектов, которые постоянно изменяются, - и фоновое удаление старых состояний объектов.' -sidebar_label: 'VersionedCollapsingMergeTree' -sidebar_position: 80 -slug: /engines/table-engines/mergetree-family/versionedcollapsingmergetree -title: 'Движок таблицы VersionedCollapsingMergeTree' -doc_type: 'reference' ---- - - - -# Движок таблицы VersionedCollapsingMergeTree - -Этот движок: - -- Обеспечивает быструю запись состояний объектов, которые постоянно изменяются. -- Удаляет старые состояния объектов в фоновом режиме, что значительно сокращает объём занимаемого места. - -См. раздел [Collapsing](#table_engines_versionedcollapsingmergetree) для получения дополнительной информации. - -Движок наследуется от [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) и добавляет к алгоритму слияния кусков данных логику схлопывания строк. `VersionedCollapsingMergeTree` служит той же цели, что и [CollapsingMergeTree](../../../engines/table-engines/mergetree-family/collapsingmergetree.md), но использует другой алгоритм схлопывания, который позволяет вставлять данные в произвольном порядке несколькими потоками. В частности, столбец `Version` помогает корректно схлопывать строки, даже если они вставляются в неверном порядке. В отличие от этого, `CollapsingMergeTree` допускает только строго последовательную вставку. - - - -## Создание таблицы - -```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` | Имя столбца с типом записи: `1` — запись «state», `-1` — запись «cancel». | [`Int8`](/sql-reference/data-types/int-uint) | -| `version` | Имя столбца с версией состояния объекта. | [`Int*`](/sql-reference/data-types/int-uint), [`UInt*`](/sql-reference/data-types/int-uint), [`Date`](/sql-reference/data-types/date), [`Date32`](/sql-reference/data-types/date32), [`DateTime`](/sql-reference/data-types/datetime) или [`DateTime64`](/sql-reference/data-types/datetime64) | - -### Клаузы запроса - -При создании таблицы `VersionedCollapsingMergeTree` требуются те же [клаузы](../../../engines/table-engines/mergetree-family/mergetree.md), что и при создании таблицы `MergeTree`. - -
- Устаревший метод создания таблицы - - :::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` — запись «state», `-1` — запись «cancel». - - Тип данных столбца — `Int8`. - - * `version` — имя столбца с версией состояния объекта. - - Тип данных столбца должен быть `UInt*`. -
- - -## Коллапсирование - -### Данные - -Рассмотрим ситуацию, когда нужно сохранять постоянно изменяющиеся данные для некоторого объекта. Разумно иметь одну строку на объект и обновлять эту строку при каждом изменении. Однако операция UPDATE для СУБД дорогая и медленная, поскольку требует перезаписи данных в хранилище. Обновление неприемлемо, если нужно быстро записывать данные, но вы можете последовательно записывать изменения объекта следующим образом. - -При записи строки используйте столбец `Sign`. Если `Sign = 1`, это означает, что строка представляет состояние объекта (назовём её строкой «state»). Если `Sign = -1`, это указывает на отмену состояния объекта с теми же атрибутами (назовём её строкой «cancel»). Также используйте столбец `Version`, который должен идентифицировать каждое состояние объекта отдельным номером. - -Например, мы хотим посчитать, сколько страниц посетили пользователи на некотором сайте и как долго они там находились. В некоторый момент времени мы записываем следующую строку с состоянием активности пользователя: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -Позже, на одном из этапов, мы фиксируем изменение активности пользователя и записываем это с помощью следующих двух строк. - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | -│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -Первая строка аннулирует предыдущее состояние объекта (пользователя). В ней должны быть скопированы все поля аннулируемого состояния, кроме `Sign`. - -Вторая строка содержит текущее состояние. - -Поскольку нам нужно только последнее состояние активности пользователя, строки - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | -│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -может быть удалён, схлопывая некорректное (старое) состояние объекта. `VersionedCollapsingMergeTree` делает это при слиянии частей данных. - -Чтобы понять, зачем нужны две строки для каждого изменения, см. раздел [Algorithm](#table_engines-versionedcollapsingmergetree-algorithm). - -**Примечания по использованию** - -1. Программа, которая записывает данные, должна запоминать состояние объекта, чтобы иметь возможность его отменить. Строка "Cancel" должна содержать копии полей первичного ключа, версию строки "state" и противоположный `Sign`. Это увеличивает начальный размер хранилища, но позволяет быстро записывать данные. -2. Длинные постоянно растущие массивы в столбцах снижают эффективность движка из‑за нагрузки на запись. Чем проще данные, тем выше эффективность. -3. Результаты `SELECT` сильно зависят от согласованности истории изменений объекта. Будьте внимательны при подготовке данных для вставки. При несогласованных данных вы можете получить непредсказуемые результаты, например отрицательные значения для неотрицательных метрик, таких как глубина сессии. - -### Algorithm - -Когда ClickHouse сливает части данных, он удаляет каждую пару строк с одинаковым первичным ключом и версией и разным `Sign`. Порядок строк не имеет значения. - -Когда ClickHouse вставляет данные, он упорядочивает строки по первичному ключу. Если столбец `Version` не входит в первичный ключ, ClickHouse неявно добавляет его в первичный ключ как последнее поле и использует для сортировки. - - -## Выборка данных {#selecting-data} - -ClickHouse не гарантирует, что все строки с одинаковым первичным ключом окажутся в одной и той же результирующей части данных или даже на одном и том же физическом сервере. Это верно как при записи данных, так и при последующем объединении частей данных. Кроме того, ClickHouse обрабатывает запросы `SELECT` в несколько потоков и не может предсказать порядок строк в результате. Это означает, что агрегирование обязательно, если необходимо получить полностью «схлопнутые» данные из таблицы `VersionedCollapsingMergeTree`. - -Чтобы завершить схлопывание, сформируйте запрос с оператором `GROUP BY` и агрегатными функциями, которые учитывают знак. Например, для вычисления количества используйте `sum(Sign)` вместо `count()`. Для вычисления суммы некоторой величины используйте `sum(Sign * x)` вместо `sum(x)` и добавьте `HAVING sum(Sign) > 0`. - -Такие агрегаты, как `count`, `sum` и `avg`, можно вычислять таким образом. Агрегат `uniq` можно вычислить, если объект имеет хотя бы одно несхлопнутое состояние. Агрегаты `min` и `max` вычислить нельзя, потому что `VersionedCollapsingMergeTree` не сохраняет историю значений схлопнутых состояний. - -Если нужно извлечь данные со «схлопыванием», но без агрегирования (например, чтобы проверить, существуют ли строки, последние значения которых удовлетворяют определённым условиям), можно использовать модификатор `FINAL` в секции `FROM`. Такой подход неэффективен и не должен применяться для больших таблиц. - - - -## Пример использования - -Пример данных: - -```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) -``` - -Выполним два запроса `INSERT`, чтобы создать две разные части данных. Если вставить данные одним запросом, ClickHouse создаст одну часть данных, и слияние никогда не будет выполнено. - -Получение данных: - -```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 │ -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -Что мы здесь видим и куда делись схлопнувшиеся части? -Мы создали две части данных с помощью двух запросов `INSERT`. Запрос `SELECT` был выполнен в двух потоках, и результат — строки в случайном порядке. -Схлопывание не произошло, потому что части данных ещё не были объединены. 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 │ -└─────────────────────┴───────────┴──────────┴─────────┘ -``` - -Если нам не нужна агрегация и мы хотим принудительно выполнить схлопывание, мы можем использовать модификатор `FINAL` в предложении `FROM`. - -```sql -SELECT * FROM UAct FINAL -``` - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │ -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -Это крайне неэффективный способ выборки данных. Не используйте его для больших таблиц. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md deleted file mode 100644 index f90e756406a..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -description: 'Движок таблицы Alias создает прозрачный прокси к другой таблице. Все операции перенаправляются в целевую таблицу, при этом сам алиас не хранит никаких данных.' -sidebar_label: 'Alias' -sidebar_position: 5 -slug: /engines/table-engines/special/alias -title: 'Движок таблицы Alias' -doc_type: 'reference' ---- - - - -# Движок таблицы Alias - -Движок `Alias` создает прокси к другой таблице. Все операции чтения и записи перенаправляются в целевую таблицу, при этом сама таблица-алиас не хранит данные и лишь содержит ссылку на целевую таблицу. - - - -## Создание таблицы - -```sql -CREATE TABLE [db_name.]alias_name -ENGINE = Alias(target_table) -``` - -Либо с явным указанием имени базы данных: - -```sql -CREATE TABLE [db_name.]alias_name -ENGINE = Alias(target_db, target_table) -``` - -:::note -Таблица `Alias` не поддерживает явное задание столбцов. Столбцы автоматически наследуются от целевой таблицы. Это гарантирует, что псевдоним всегда соответствует схеме целевой таблицы. -::: - - -## Параметры движка {#engine-parameters} - -- **`target_db (optional)`** — Имя базы данных, содержащей целевую таблицу. -- **`target_table`** — Имя целевой таблицы. - - - -## Поддерживаемые операции {#supported-operations} - -Движок таблицы `Alias` поддерживает все основные операции. -### Операции с целевой таблицей {#operations-on-target} - -Эти операции пробрасываются в целевую таблицу: - -| Operation | Support | Description | -|-----------|---------|-------------| -| `SELECT` | ✅ | Чтение данных из целевой таблицы | -| `INSERT` | ✅ | Запись данных в целевую таблицу | -| `INSERT SELECT` | ✅ | Пакетная вставка в целевую таблицу | -| `ALTER TABLE ADD COLUMN` | ✅ | Добавление столбцов в целевую таблицу | -| `ALTER TABLE MODIFY SETTING` | ✅ | Изменение настроек целевой таблицы | -| `ALTER TABLE PARTITION` | ✅ | Операции с партициями (DETACH/ATTACH/DROP) для целевой таблицы | -| `ALTER TABLE UPDATE` | ✅ | Обновление строк в целевой таблице (мутация) | -| `ALTER TABLE DELETE` | ✅ | Удаление строк из целевой таблицы (мутация) | -| `OPTIMIZE TABLE` | ✅ | Оптимизация целевой таблицы (слияние частей) | -| `TRUNCATE TABLE` | ✅ | Очистка целевой таблицы | - -### Операции с самим алиасом {#operations-on-alias} - -Эти операции затрагивают только алиас, а **не** целевую таблицу: - -| Operation | Support | Description | -|-----------|---------|-------------| -| `DROP TABLE` | ✅ | Удаляет только алиас, целевая таблица остаётся без изменений | -| `RENAME TABLE` | ✅ | Переименовывает только алиас, целевая таблица остаётся без изменений | - - - -## Примеры использования - -### Создание простого псевдонима - -Создайте простой псевдоним в той же базе данных: - -```sql --- Создать исходную таблицу -CREATE TABLE source_data ( - id UInt32, - name String, - value Float64 -) ENGINE = MergeTree -ORDER BY id; - --- Вставить данные -INSERT INTO source_data VALUES (1, 'one', 10.1), (2, 'two', 20.2); - --- Создать псевдоним -CREATE TABLE data_alias ENGINE = Alias('source_data'); - --- Выполнить запрос через псевдоним -SELECT * FROM data_alias; -``` - -```text -┌─id─┬─name─┬─value─┐ -│ 1 │ one │ 10.1 │ -│ 2 │ two │ 20.2 │ -└────┴──────┴───────┘ -``` - -### Псевдоним для другой базы данных - -Создайте псевдоним, который ссылается на таблицу в другой базе данных: - -```sql --- Создание баз данных -CREATE DATABASE db1; -CREATE DATABASE db2; - --- Создание исходной таблицы в db1 -CREATE TABLE db1.events ( - timestamp DateTime, - event_type String, - user_id UInt32 -) ENGINE = MergeTree -ORDER BY timestamp; - --- Создание псевдонима в db2, ссылающегося на db1.events -CREATE TABLE db2.events_alias ENGINE = Alias('db1', 'events'); - --- Или с использованием формата database.table -CREATE TABLE db2.events_alias2 ENGINE = Alias('db1.events'); - --- Оба псевдонима работают одинаково -INSERT INTO db2.events_alias VALUES (now(), 'click', 100); -SELECT * FROM db2.events_alias2; -``` - -### Операции записи через алиас - -Все операции записи перенаправляются в целевую таблицу: - -```sql -CREATE TABLE metrics ( - ts DateTime, - metric_name String, - value Float64 -) ENGINE = MergeTree -ORDER BY ts; - -CREATE TABLE metrics_alias ENGINE = Alias('metrics'); - --- Вставка через псевдоним -INSERT INTO metrics_alias VALUES - (now(), 'cpu_usage', 45.2), - (now(), 'memory_usage', 78.5); - --- Вставка с помощью SELECT -INSERT INTO metrics_alias -SELECT now(), 'disk_usage', number * 10 -FROM system.numbers -LIMIT 5; - --- Проверка наличия данных в целевой таблице -SELECT count() FROM metrics; -- Возвращает 7 -SELECT count() FROM metrics_alias; -- Возвращает 7 -``` - -### Изменение схемы - -Операции `ALTER` изменяют схему целевой таблицы: - -```sql -CREATE TABLE users ( - id UInt32, - name String -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE users_alias ENGINE = Alias('users'); - --- Добавить столбец через псевдоним -ALTER TABLE users_alias ADD COLUMN email String DEFAULT ''; - --- Столбец добавляется в целевую таблицу -DESCRIBE users; -``` - -```text -┌─name──┬─type───┬─default_type─┬─default_expression─┐ -│ id │ UInt32 │ │ │ -│ name │ String │ │ │ -│ email │ String │ DEFAULT │ '' │ -└───────┴────────┴──────────────┴────────────────────┘ -``` - -### Модификации данных - -Поддерживаются операции UPDATE и DELETE: - -```sql -CREATE TABLE products ( - id UInt32, - name String, - price Float64, - status String DEFAULT 'active' -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE products_alias ENGINE = Alias('products'); - -INSERT INTO products_alias VALUES - (1, 'item_one', 100.0, 'active'), - (2, 'item_two', 200.0, 'active'), - (3, 'item_three', 300.0, 'inactive'); - --- Обновление через алиас -ALTER TABLE products_alias UPDATE price = price * 1.1 WHERE status = 'active'; - --- Удаление через алиас -ALTER TABLE products_alias DELETE WHERE status = 'inactive'; - --- Изменения применяются к целевой таблице -SELECT * FROM products ORDER BY id; -``` - -```text -┌─id─┬─name─────┬─price─┬─status─┐ -│ 1 │ item_one │ 110.0 │ активный │ -│ 2 │ item_two │ 220.0 │ активный │ -└────┴──────────┴───────┴────────┘ -``` - -### Операции с партициями - -Для партиционированных таблиц операции с партициями перенаправляются: - - -```sql -CREATE TABLE logs ( - date Date, - level String, - message String -) ENGINE = MergeTree -PARTITION BY toYYYYMM(date) -ORDER BY date; - -CREATE TABLE logs_alias ENGINE = Alias('logs'); - -INSERT INTO logs_alias VALUES - ('2024-01-15', 'INFO', 'message1'), - ('2024-02-15', 'ERROR', 'message2'), - ('2024-03-15', 'INFO', 'message3'); - --- Отключение партиции через псевдоним -ALTER TABLE logs_alias DETACH PARTITION '202402'; - -SELECT count() FROM logs_alias; -- Возвращает 2 (партиция 202402 отключена) - --- Подключение партиции обратно -ALTER TABLE logs_alias ATTACH PARTITION '202402'; - -SELECT count() FROM logs_alias; -- Возвращает 3 -``` - -### Оптимизация таблицы - -Выполните операцию `OPTIMIZE` для слияния частей в целевой таблице: - -```sql -CREATE TABLE events ( - id UInt32, - data String -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE events_alias ENGINE = Alias('events'); - --- Множественные вставки создают несколько частей -INSERT INTO events_alias VALUES (1, 'data1'); -INSERT INTO events_alias VALUES (2, 'data2'); -INSERT INTO events_alias VALUES (3, 'data3'); - --- Проверка количества частей -SELECT count() FROM system.parts -WHERE database = currentDatabase() - AND table = 'events' - AND active; - --- Оптимизация через псевдоним -OPTIMIZE TABLE events_alias FINAL; - --- Части объединены в целевой таблице -SELECT count() FROM system.parts -WHERE database = currentDatabase() - AND table = 'events' - AND active; -- Возвращает 1 -``` - -### Управление псевдонимами - -Псевдонимы можно переименовывать или удалять по отдельности: - -```sql -CREATE TABLE important_data ( - id UInt32, - value String -) ENGINE = MergeTree -ORDER BY id; - -INSERT INTO important_data VALUES (1, 'critical'), (2, 'important'); - -CREATE TABLE old_alias ENGINE = Alias('important_data'); - --- Переименование псевдонима (целевая таблица остаётся без изменений) -RENAME TABLE old_alias TO new_alias; - --- Создание ещё одного псевдонима для той же таблицы -CREATE TABLE another_alias ENGINE = Alias('important_data'); - --- Удаление одного псевдонима (целевая таблица и остальные псевдонимы остаются без изменений) -DROP TABLE new_alias; - -SELECT * FROM another_alias; -- Всё ещё работает -SELECT count() FROM important_data; -- Данные целы, возвращает 2 -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md deleted file mode 100644 index 4220516d3e6..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -description: 'Буферизует данные для записи в оперативной памяти (RAM), периодически сбрасывая их в другую таблицу. При чтении данные считываются одновременно из буфера и из другой таблицы.' -sidebar_label: 'Buffer' -sidebar_position: 120 -slug: /engines/table-engines/special/buffer -title: 'Движок таблицы Buffer' -doc_type: 'reference' ---- - - - -# Движок таблицы Buffer - -Буферизует данные, подлежащие записи, в оперативной памяти и периодически сбрасывает их в другую таблицу. При чтении данные одновременно считываются из буфера и из другой таблицы. - -:::note -Рекомендуемая альтернатива движку таблицы Buffer — включение [асинхронных вставок](/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` и `max_bytes` - -Условия для сброса данных из буфера. - -### Необязательные параметры движка - -#### `flush_time`, `flush_rows` и `flush_bytes` - -Условия для фонового сброса данных из буфера (отсутствие параметра или значение 0 означает отсутствие параметров `flush*`). - -Данные сбрасываются из буфера и записываются в целевую таблицу, если выполнены все условия `min*` или хотя бы одно условие `max*`. - -Также, если выполнено хотя бы одно условие `flush*`, в фоновом режиме инициируется сброс. В отличие от параметров `max*`, параметры `flush*` позволяют настраивать фоновые сбросы отдельно, чтобы избежать добавления задержки для запросов `INSERT` в таблицы Buffer. - -#### `min_time`, `max_time` и `flush_time` - -Условие по времени в секундах с момента первой записи в буфер. - -#### `min_rows`, `max_rows` и `flush_rows` - -Условие по количеству строк в буфере. - -#### `min_bytes`, `max_bytes` и `flush_bytes` - -Условие по количеству байт в буфере. - -Во время операции записи данные вставляются в один или несколько случайных буферов (настраивается с помощью `num_layers`). Или, если объём вставляемых данных достаточно велик (больше `max_rows` или `max_bytes`), они записываются непосредственно в целевую таблицу, минуя буфер. - -Условия для сброса данных вычисляются отдельно для каждого из буферов `num_layers`. Например, если `num_layers = 16` и `max_bytes = 100000000`, максимальное потребление оперативной памяти составляет 1,6 ГБ. - -Пример: - -```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. При записи в эту таблицу данные буферизуются в оперативной памяти и позже записываются в таблицу `merge.hits`. Создаётся единый буфер, и данные сбрасываются, если выполняется одно из условий: - -* прошло 100 секунд с момента последнего сброса (`max_time`) или -* было записано 1 миллион строк (`max_rows`) или -* было записано 100 МБ данных (`max_bytes`) или -* прошло 10 секунд (`min_time`) и были записаны 10 000 строк (`min_rows`) и 10 МБ (`min_bytes`) данных - -Например, если была записана всего одна строка, то через 100 секунд она будет сброшена в любом случае. Но если было записано много строк, данные будут сброшены раньше. - -Когда сервер останавливается или выполняется `DROP TABLE` либо `DETACH TABLE`, буферизованные данные также сбрасываются в целевую таблицу. - -Вы можете задать пустые строковые литералы в одинарных кавычках для имени базы данных и имени таблицы. Это указывает на отсутствие целевой таблицы. В этом случае, когда условия сброса данных выполняются, буфер просто очищается. Это может быть полезно для хранения окна данных в памяти. - - -При чтении из таблицы Buffer данные обрабатываются как из буфера, так и из целевой таблицы (если она существует). -Обратите внимание, что таблица Buffer не поддерживает индекс. Иными словами, данные в буфере полностью сканируются, что может быть медленно для больших буферов. (Для данных в подчинённой таблице будет использоваться индекс, который она поддерживает.) - -Если набор столбцов в таблице Buffer не совпадает с набором столбцов в подчинённой таблице, вставляется подмножество столбцов, существующих в обеих таблицах. - -Если типы не совпадают для одного из столбцов в таблице Buffer и подчинённой таблице, в журнал сервера записывается сообщение об ошибке и буфер очищается. -То же самое происходит, если подчинённая таблица не существует в момент сброса буфера. - -:::note -Выполнение ALTER для таблицы Buffer в релизах, выпущенных до 26 октября 2021 года, приведёт к ошибке `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. Это даст скорость всего в несколько тысяч строк в секунду, тогда как вставка больших блоков данных может обеспечить более миллиона строк в секунду. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md deleted file mode 100644 index f04780ecca4..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -description: 'Движок `Dictionary` отображает данные словаря как таблицу в ClickHouse.' -sidebar_label: 'Dictionary' -sidebar_position: 20 -slug: /engines/table-engines/special/dictionary -title: 'Движок таблицы Dictionary' -doc_type: 'reference' ---- - - - -# Движок таблицы Dictionary - -Движок `Dictionary` представляет данные [словаря](../../../sql-reference/dictionaries/index.md) в виде таблицы ClickHouse. - - - -## Пример - -В качестве примера рассмотрим словарь `products` со следующей конфигурацией: - -```xml - - - products - - -
products
- DSN=some-db-server - - - - 300 - 360 - - - - - - - product_id - - - title - String - - - - - -``` - -Запросите данные словаря: - -```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 │ -└──────────┴──────┴────────┴─────────────────┴─────────────────┴─────────────────┴───────────────┴─────────────────┘ -``` - -Вы можете использовать функцию [dictGet*](/sql-reference/functions/ext-dict-functions#dictget-dictgetordefault-dictgetornull), чтобы получить данные словаря в этом формате. - -Это представление неудобно, когда нужно получить сырые (raw) данные или выполнить операцию `JOIN`. В таких случаях можно использовать движок `Dictionary`, который отображает данные словаря в виде таблицы. - -Синтаксис: - -```sql -CREATE TABLE %table_name% (%fields%) engine = Dictionary(%dictionary_name%)` -``` - -Пример использования: - -```sql -CREATE TABLE products (product_id UInt64, title String) ENGINE = Dictionary(products); -``` - -Хорошо - -Посмотрите, что содержится в таблице. - -```sql -SELECT * FROM products LIMIT 1; -``` - -```text -┌────product_id─┬─title───────────┐ -│ 152689 │ Некий товар │ -└───────────────┴─────────────────┘ -``` - -**См. также** - -* [Функция dictionary](/sql-reference/table-functions/dictionary) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md deleted file mode 100644 index 38629ecd720..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md +++ /dev/null @@ -1,251 +0,0 @@ ---- -description: 'Таблицы с движком Distributed не хранят собственные данные, а позволяют выполнять распределённую обработку запросов на нескольких серверах. Чтение автоматически распараллеливается. При чтении используются индексы таблиц на удалённых серверах, если они есть.' -sidebar_label: 'Distributed' -sidebar_position: 10 -slug: /engines/table-engines/special/distributed -title: 'Движок таблицы Distributed' -doc_type: 'reference' ---- - - - -# Движок распределённой таблицы - -:::warning Распределённый движок в Cloud -Чтобы создать движок распределённой таблицы в ClickHouse Cloud, можно использовать табличные функции [`remote` и `remoteSecure`](../../../sql-reference/table-functions/remote). -Синтаксис `Distributed(...)` в ClickHouse Cloud использовать нельзя. -::: - -Таблицы с движком Distributed не хранят собственные данные, но позволяют выполнять распределённую обработку запросов на нескольких серверах. -Чтение автоматически распараллеливается. Во время чтения используются индексы таблиц на удалённых серверах, если они есть. - - - -## Создание таблицы - -```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` указывает на таблицу на текущем сервере, вы можете заимствовать её схему: - -```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` | Имя кластера в конфигурационном файле сервера | -| `database` | Имя удалённой базы данных | -| `table` | Имя удалённой таблицы | -| `sharding_key` (необязательно) | Ключ шардинга.
Указание `sharding_key` необходимо в следующих случаях:
  • Для операций `INSERT` в распределённую таблицу (так как движку таблицы нужен `sharding_key`, чтобы определить, как распределить данные по шардам). Однако, если включена настройка `insert_distributed_one_random_shard`, то для `INSERT` ключ шардинга не требуется.
  • Для использования с `optimize_skip_unused_shards`, так как `sharding_key` необходим для определения, какие шарды должны запрашиваться
| -| `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` для данных файла после фоновой вставки в Distributed. Гарантирует, что ОС сбросила все вставленные данные в файл **на диске инициирующего узла**. | `false` | -| `fsync_directories` | Выполнять `fsync` для каталогов. Гарантирует, что ОС обновила метаданные каталога после операций, связанных с фоновыми вставками в таблицу Distributed (после вставки, после отправки данных на шард и т. д.). | `false` | -| `skip_unavailable_shards` | Если `true`, ClickHouse молча пропускает недоступные шарды. Шард помечается как недоступный, когда: 1) к нему нет доступа из‑за ошибки соединения; 2) шард не может быть разрешён через DNS; 3) таблица не существует на шарде. | `false` | -| `bytes_to_throw_insert` | Если количество сжатых байт, ожидающих фоновой операции `INSERT`, превысит это значение, будет выброшено исключение. `0` — не выбрасывать. | `0` | -| `bytes_to_delay_insert` | Если количество сжатых байт, ожидающих фоновой операции `INSERT`, превысит это значение, выполнение запроса будет задержано. `0` — не задерживать. | `0` | -| `max_delay_to_insert` | Максимальная задержка вставки данных в таблицу Distributed в секундах, если имеется много данных (байт), ожидающих фоновой отправки. | `60` | -| `background_insert_batch` | То же, что и [`distributed_background_insert_batch`](../../../operations/settings/settings.md#distributed_background_insert_batch). | `0` | -| `background_insert_split_batch_on_failure` | То же, что и [`distributed_background_insert_split_batch_on_failure`](../../../operations/settings/settings.md#distributed_background_insert_split_batch_on_failure). | `0` | -| `background_insert_sleep_time_ms` | То же, что и [`distributed_background_insert_sleep_time_ms`](../../../operations/settings/settings.md#distributed_background_insert_sleep_time_ms). | `0` | -| `background_insert_max_sleep_time_ms` | То же, что и [`distributed_background_insert_max_sleep_time_ms`](../../../operations/settings/settings.md#distributed_background_insert_max_sleep_time_ms). | `0` | -| `flush_on_detach` | Сбрасывать данные на удалённые узлы при `DETACH`/`DROP`/остановке сервера. | `true` | - -:::note -**Параметры надёжности** (`fsync_...`): - -* Влияют только на фоновые `INSERT` (то есть при `distributed_foreground_insert=false`), когда данные сначала сохраняются на диск инициирующего узла, а затем в фоне отправляются на шарды. -* Могут существенно снизить производительность `INSERT`. -* Влияют на запись данных, хранящихся внутри каталога распределённой таблицы, на **узел, который принял вашу вставку**. Если вам нужны гарантии записи данных в базовые таблицы MergeTree, см. параметры надёжности (`...fsync...`) в `system.merge_tree_settings`. - -Для **параметров ограничений вставки** (`..._insert`) см. также: - -* параметр [`distributed_foreground_insert`](../../../operations/settings/settings.md#distributed_foreground_insert) -* параметр [`prefer_localhost_replica`](/operations/settings/settings#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()`. - - -## Кластеры - -Кластеры настраиваются в [конфигурационном файле сервера](../../../operations/configuration-files.md): - -```xml - - - - - - - - - - - 1 - - shard_01 - - false - - - 1 - example01-01-1 - 9000 - - - example01-01-2 - 9000 - - - - 2 - shard_02 - false - - example01-02-1 - 9000 - - - example01-02-2 - 1 - 9440 - - - - -``` - -Здесь определяется кластер с именем `logs`, который состоит из двух шардов, каждый из которых содержит по две реплики. Шарды — это серверы, в которых хранятся разные части данных (чтобы прочитать все данные, необходимо обратиться ко всем шардам). Реплики — это серверы-дубликаты (чтобы прочитать все данные, можно обратиться к данным на любой из реплик). - -Имена кластеров не должны содержать точек. - -Для каждого сервера указываются параметры `host`, `port`, а также, при необходимости, `user`, `password`, `secure`, `compression`, `bind_host`: - - -| Parameter | Description | Default Value | -|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------| -| `host` | Адрес удалённого сервера. Можно использовать либо домен, либо IPv4- или IPv6-адрес. Если вы указываете домен, сервер выполняет DNS-запрос при запуске и сохраняет результат на всё время своей работы. Если DNS-запрос завершился с ошибкой, сервер не запускается. Если вы изменили DNS-запись, перезапустите сервер. | - | -| `port` | TCP-порт для работы сервера (`tcp_port` в конфигурации, обычно имеет значение 9000). Не путать с `http_port`. | - | -| `user` | Имя пользователя для подключения к удалённому серверу. У этого пользователя должны быть права на подключение к указанному серверу. Доступ настраивается в файле `users.xml`. Дополнительные сведения см. в разделе [Access rights](../../../guides/sre/user-management/index.md). | `default` | -| `password` | Пароль для подключения к удалённому серверу (не маскируется). | '' | -| `secure` | Использовать ли защищённое SSL/TLS-подключение. Обычно также требуется указать порт (порт по умолчанию для защищённого подключения — `9440`). Сервер должен слушать на `9440` и быть настроен с корректными сертификатами. | `false` | -| `compression` | Использовать сжатие данных. | `true` | -| `bind_host` | Исходный адрес, используемый при подключении к удалённому серверу с этого узла. Поддерживается только IPv4-адрес. Предназначен для продвинутых сценариев развертывания, когда требуется задать исходный IP-адрес, используемый распределёнными запросами ClickHouse. | - | - -При указании реплик одна из доступных реплик будет выбрана для каждого шарда при чтении. Можно настроить алгоритм балансировки нагрузки (предпочтения при выборе реплики для доступа) — см. настройку [load_balancing](../../../operations/settings/settings.md#load_balancing). Если не удалось установить подключение с сервером, выполняется попытка подключения с коротким таймаутом. Если подключиться не удалось, выбирается следующая реплика и так далее для всех реплик. Если попытка подключения не удалась для всех реплик, попытка будет повторена тем же образом несколько раз. Это повышает устойчивость, но не обеспечивает полной отказоустойчивости: удалённый сервер может принять подключение, но не работать или работать некорректно. - -Можно указать только один шард (в этом случае обработку запроса корректнее называть удалённой, а не распределённой) или любое количество шардов. В каждом шарде можно указать от одной до любого количества реплик. Можно задать разное количество реплик для каждого шарда. - -В конфигурации можно указать произвольное количество кластеров. - -Для просмотра ваших кластеров используйте таблицу `system.clusters`. - -Движок `Distributed` позволяет работать с кластером как с локальным сервером. Однако конфигурацию кластера нельзя задавать динамически — её необходимо настроить в конфигурационном файле сервера. Обычно все серверы в кластере имеют одинаковую конфигурацию кластера (хотя это и не обязательно). Кластеры из конфигурационного файла обновляются на лету, без перезапуска сервера. - -Если при каждом выполнении запроса нужно отправлять его в неизвестный заранее набор шардов и реплик, нет необходимости создавать таблицу `Distributed` — вместо этого используйте табличную функцию `remote`. См. раздел [Table functions](../../../sql-reference/table-functions/index.md). - - - -## Запись данных {#distributed-writing-data} - -Существует два способа записи данных в кластер: - -Во-первых, вы можете определить, на какие серверы записывать какие данные, и выполнять запись непосредственно на каждый шард. Другими словами, выполнять прямые запросы `INSERT` в удалённые таблицы в кластере, на которые указывает таблица `Distributed`. Это наиболее гибкое решение, поскольку вы можете использовать любую схему шардинга, даже нетривиальную, в силу требований предметной области. Это также наиболее оптимальное решение, так как данные могут записываться в разные шарды полностью независимо. - -Во-вторых, вы можете выполнять запросы `INSERT` в таблицу `Distributed`. В этом случае таблица будет самостоятельно распределять вставленные данные по серверам. Чтобы выполнять запись в таблицу `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()` для случайного распределения данных или `UserID` для распределения по остатку от деления идентификатора пользователя (тогда данные одного пользователя будут находиться на одном шарде, что упрощает выполнение `IN` и `JOIN` по пользователям). Если один из столбцов распределяется недостаточно равномерно, вы можете обернуть его в хеш-функцию, например `intHash64(UserID)`. - -Простой остаток от деления — ограниченное решение для шардинга и подходит не всегда. Он работает для средних и больших объёмов данных (десятки серверов), но не для очень больших объёмов данных (сотни серверов и более). В последнем случае используйте схему шардинга, требуемую предметной областью, вместо использования таблиц `Distributed`. - -О схеме шардинга следует задуматься в следующих случаях: - - - -- Используются запросы, которые выполняют объединение данных (`IN` или `JOIN`) по определённому ключу. Если данные разбиты на шарды по этому ключу, можно использовать локальные `IN` или `JOIN` вместо `GLOBAL IN` или `GLOBAL JOIN`, что значительно эффективнее. -- Используется большое количество серверов (сотни и более) с большим количеством небольших запросов, например запросов по данным отдельных клиентов (например, веб‑сайтов, рекламодателей или партнёров). Чтобы небольшие запросы не влияли на весь кластер, имеет смысл размещать данные одного клиента на одном шарде. В качестве альтернативы можно настроить двухуровневый шардинг: разделить весь кластер на «слои», где слой может состоять из нескольких шардов. Данные одного клиента располагаются в одном слое, но шарды можно добавлять в слой по мере необходимости, а данные распределяются между ними случайным образом. Для каждого слоя создаются таблицы `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/server-configuration-parameters/settings#background_distributed_schedule_pool_size). - -Если сервер был аварийно остановлен или пережил жёсткую перезагрузку (например, из‑за сбоя оборудования) после выполнения `INSERT` в таблицу `Distributed`, вставленные данные могут быть потеряны. Если в каталоге таблицы обнаруживается повреждённая часть данных, она переносится в подкаталог `broken` и больше не используется. - - - -## Чтение данных {#distributed-reading-data} - -При выполнении запроса к таблице `Distributed` запросы `SELECT` отправляются на все шарды и выполняются независимо от того, как распределены данные по шардам (они могут быть распределены полностью случайным образом). При добавлении нового шарда нет необходимости переносить в него старые данные. Вместо этого можно записывать в него новые данные, используя более высокий вес — данные будут распределены немного неравномерно, но запросы по-прежнему будут выполняться корректно и эффективно. - -Когда включён параметр `max_parallel_replicas`, обработка запросов параллелизуется по всем репликам внутри одного шарда. Дополнительную информацию см. в разделе [max_parallel_replicas](../../../operations/settings/settings.md#max_parallel_replicas). - -Чтобы узнать больше о том, как обрабатываются распределённые запросы `in` и `global in`, см. [документацию](/sql-reference/operators/in#distributed-subqueries). - - - -## Виртуальные столбцы {#virtual-columns} - -#### _shard_num {#_shard_num} - -`_shard_num` — содержит значение `shard_num` из таблицы `system.clusters`. Тип: [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/server-configuration-parameters/settings#background_distributed_schedule_pool_size) -- Функции [`shardNum()`](../../../sql-reference/functions/other-functions.md#shardNum) и [`shardCount()`](../../../sql-reference/functions/other-functions.md#shardCount) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md deleted file mode 100644 index 05a23ce4e17..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md +++ /dev/null @@ -1,236 +0,0 @@ ---- -description: 'Движки таблиц `Executable` и `ExecutablePool` позволяют создать - таблицу, строки которой генерируются скриптом, который вы задаёте (записывая строки - в **stdout**).' -sidebar_label: 'Executable/ExecutablePool' -sidebar_position: 40 -slug: /engines/table-engines/special/executable -title: 'Движки таблиц Executable и ExecutablePool' -doc_type: 'reference' ---- - - - -# Движки таблиц Executable и ExecutablePool - -Движки таблиц `Executable` и `ExecutablePool` позволяют задать таблицу, строки которой генерируются скриптом, который вы пишете (путём вывода строк в **stdout**). Исполняемый скрипт хранится в каталоге `users_scripts` и может читать данные из любого источника. - -- Таблицы `Executable`: скрипт выполняется при каждом запросе -- Таблицы `ExecutablePool`: поддерживается пул долгоживущих процессов, и для чтения процессы берутся из этого пула - -Дополнительно вы можете указать один или несколько входных запросов, результаты которых будут передаваться в **stdin** для чтения скриптом. - - - -## Создание таблицы `Executable` - -Движку таблицы `Executable` требуются два параметра: имя скрипта и формат входящих данных. При необходимости можно передать один или несколько входных запросов: - -```sql -Executable(имя_скрипта, формат, [входной_запрос...]) -``` - -Ниже приведены соответствующие параметры для таблицы `Executable`: - -* `send_chunk_header` - * Description: Отправлять количество строк в каждом чанке перед отправкой чанка на обработку. Этот параметр позволяет писать скрипты более эффективно, заранее выделяя необходимые ресурсы - * Default value: false -* `command_termination_timeout` - * Description: Таймаут завершения команды в секундах - * Default value: 10 -* `command_read_timeout` - * Description: Таймаут чтения данных из stdout команды в миллисекундах - * Default value: 10000 -* `command_write_timeout` - * Description: Таймаут записи данных в stdin команды в миллисекундах - * Default value: 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`, который будет генерировать 10 случайных строк каждый раз, когда вы выполняете `SELECT` из `my_executable_table`: - -```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` для определения, являются ли комментарии положительными, отрицательными или нейтральными, — в том числе для присвоения значения от -1 (очень негативный комментарий) до 1 (очень позитивный комментарий). Давайте создадим таблицу `Executable`, которая вычисляет тональность комментариев Hacker News с помощью `nltk`. - -В этом примере используется таблица `hackernews`, описанная [здесь](/engines/table-engines/mergetree-family/invertedindexes/#hacker-news-dataset). Таблица `hackernews` включает столбец `id` типа `UInt64` и столбец типа `String` с именем `comment`. Начнём с определения таблицы `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`. 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` -* Входящая строка имеет табличный формат (значения разделены табуляцией), поэтому мы извлекаем `id` и `comment`, используя Python-функцию `split` -* Результат `polarity_scores` — это JSON-объект с несколькими значениями. Мы решили просто взять значение `compound` из этого JSON-объекта -* Напомним, что таблица `sentiment` в ClickHouse использует формат `TabSeparated` и содержит два столбца, поэтому наша функция `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`, показанную выше, для использования `ExecutablePool` вместо `Executable`: - -```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; -``` - -ClickHouse будет по требованию поддерживать в работе 4 процесса, когда клиент выполняет запрос к таблице `sentiment_pooled`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md deleted file mode 100644 index 491770e1a5f..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -description: 'ClickHouse позволяет отправлять на сервер вместе с запросом `SELECT` данные, необходимые для обработки запроса. Эти данные помещаются во временную таблицу и могут использоваться в запросе (например, в операторах `IN`).' -sidebar_label: 'Внешние данные для обработки запросов' -sidebar_position: 130 -slug: /engines/table-engines/special/external-data -title: 'Внешние данные для обработки запросов' -doc_type: 'reference' ---- - -# Внешние данные для обработки запросов - -ClickHouse позволяет отправлять на сервер данные, которые необходимы для обработки запроса, вместе с запросом `SELECT`. Эти данные помещаются во временную таблицу (см. раздел «Временные таблицы») и могут использоваться в запросе (например, в операторах `IN`). - -Например, если у вас есть текстовый файл с важными идентификаторами пользователей, вы можете загрузить его на сервер вместе с запросом, который использует фильтрацию по этому списку. - -Если вам нужно выполнить более одного запроса с большим объёмом внешних данных, не используйте эту возможность. Лучше заранее загрузить данные в БД. - -Внешние данные могут быть загружены с помощью клиента командной строки (в неинтерактивном режиме) или с использованием HTTP-интерфейса. - -В клиенте командной строки вы можете указать секцию параметров в формате - -```bash ---external --file=... [--name=...] [--format=...] [--types=...|--structure=...] -``` - -У вас может быть несколько таких секций — по числу передаваемых таблиц. - -**–external** – Обозначает начало секции. -**–file** – Путь к файлу с дампом таблицы или `-`, что означает stdin. -Из stdin может быть получена только одна таблица. - -Следующие параметры являются необязательными: **–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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md deleted file mode 100644 index 7295bed385e..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -description: 'Табличный движок File хранит данные в файле в одном из поддерживаемых - форматов (`TabSeparated`, `Native` и т. д.).' -sidebar_label: 'File' -sidebar_position: 40 -slug: /engines/table-engines/special/file -title: 'Табличный движок File' -doc_type: 'reference' ---- - - - -# Движок таблицы File - -Движок таблицы File хранит данные в файле в одном из поддерживаемых [форматов файлов](/interfaces/formats#formats-overview) (`TabSeparated`, `Native` и т. д.). - -Сценарии использования: - -- Экспорт данных из ClickHouse в файл. -- Преобразование данных из одного формата в другой. -- Обновление данных в ClickHouse путём редактирования файла на диске. - -:::note -Этот движок в настоящее время недоступен в ClickHouse Cloud, пожалуйста, [используйте вместо него табличную функцию S3](/sql-reference/table-functions/s3.md). -::: - - - -## Использование на сервере ClickHouse - -```sql -File(Format) -``` - -Параметр `Format` задаёт один из доступных форматов файлов. Для выполнения -запросов `SELECT` формат должен поддерживать чтение (input), а для выполнения -запросов `INSERT` — запись (output). Доступные форматы перечислены в разделе -[Formats](/interfaces/formats#formats-overview). - -ClickHouse не позволяет указывать путь в файловой системе для `File`. Будет использована папка, определённая настройкой [path](../../../operations/server-configuration-parameters/settings.md) в конфигурации сервера. - -При создании таблицы с использованием `File(Format)` в этой папке создаётся пустая поддиректория. Когда данные записываются в эту таблицу, они помещаются в файл `data.Format` в этой поддиректории. - -Вы можете вручную создать эту поддиректорию и файл в файловой системе сервера, а затем [ATTACH](../../../sql-reference/statements/attach.md) их к информации о таблице с совпадающим именем, чтобы иметь возможность выполнять запросы к данным в этом файле. - -:::note -Будьте осторожны с этой функциональностью, так как ClickHouse не отслеживает внешние изменения таких файлов. Результат одновременной записи через ClickHouse и вне ClickHouse неопределён. -::: - - -## Пример - -**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 - -В [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` — необязательное выражение. Можно создавать отдельные файлы, разбивая данные на партиции по ключу партиционирования (partition key). В большинстве случаев ключ партиционирования не нужен, а если он и требуется, как правило, нет необходимости делать его более детализированным, чем до уровня месяца. Партиционирование не ускоряет выполнение запросов (в отличие от выражения ORDER BY). Никогда не используйте слишком мелкое партиционирование. Не разделяйте данные на партиции по идентификаторам или именам клиентов (вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY). - -Для партиционирования по месяцам используйте выражение `toYYYYMM(date_column)`, где `date_column` — это столбец с датой типа данных [Date](/sql-reference/data-types/date.md). Имена партиций в этом случае имеют формат `"YYYYMM"`. - - - -## Виртуальные столбцы {#virtual-columns} - -- `_path` — Путь к файлу. Тип: `LowCardinality(String)`. -- `_file` — Имя файла. Тип: `LowCardinality(String)`. -- `_size` — Размер файла в байтах. Тип: `Nullable(UInt64)`. Если размер неизвестен, значение — `NULL`. -- `_time` — Время последнего изменения файла. Тип: `Nullable(DateTime)`. Если время неизвестно, значение — `NULL`. - - - -## Настройки {#settings} - -- [engine_file_empty_if_not_exists](/operations/settings/settings#engine_file_empty_if_not_exists) — позволяет выполнять выборку из несуществующего файла, возвращая пустой набор данных. По умолчанию отключена. -- [engine_file_truncate_on_insert](/operations/settings/settings#engine_file_truncate_on_insert) — позволяет усекать файл перед вставкой в него данных. По умолчанию отключена. -- [engine_file_allow_create_multiple_files](/operations/settings/settings.md#engine_file_allow_create_multiple_files) — позволяет создавать новый файл при каждой вставке, если формат имеет суффикс. По умолчанию отключена. -- [engine_file_skip_empty_files](/operations/settings/settings.md#engine_file_skip_empty_files) — позволяет пропускать пустые файлы при чтении. По умолчанию отключена. -- [storage_file_read_method](/operations/settings/settings#engine_file_empty_if_not_exists) — метод чтения данных из файла хранилища, один из: `read`, `pread`, `mmap`. Метод `mmap` не применяется к clickhouse-server (предназначен для clickhouse-local). Значение по умолчанию: `pread` для clickhouse-server, `mmap` для clickhouse-local. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md deleted file mode 100644 index ee7c142bd24..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -description: 'Этот движок позволяет обрабатывать файлы журналов приложений как поток - записей.' -sidebar_label: 'FileLog' -sidebar_position: 160 -slug: /engines/table-engines/special/filelog -title: 'Движок таблиц FileLog' -doc_type: 'reference' ---- - - - -# Движок таблицы FileLog {#filelog-engine} - -Этот движок позволяет обрабатывать файлы журналов приложений как поток записей. - -`FileLog` позволяет: - -- Подписываться на файлы журналов. -- Обрабатывать новые записи по мере их добавления в подписанные файлы журналов. - - - -## Создание таблицы - -```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#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` - Коэффициент увеличения паузы (backoff), по умолчанию экспоненциальный. Значение по умолчанию: `2`. -* `handle_error_mode` — Как обрабатывать ошибки в движке FileLog. Возможные значения: default (будет сгенерировано исключение, если не удалось разобрать сообщение), stream (сообщение об исключении и исходное сообщение будут сохранены во виртуальных столбцах `_error` и `_raw_message`). - - -## Описание - -Поступившие записи отслеживаются автоматически, поэтому каждая запись в файле журнала учитывается только один раз. - -`SELECT` не особенно полезен для чтения записей (кроме отладки), потому что каждую запись можно прочитать только один раз. Гораздо практичнее создавать потоки в реальном времени, используя [материализованные представления](../../../sql-reference/statements/create/view.md). Для этого: - -1. Используйте движок для создания таблицы FileLog и рассматривайте её как поток данных. -2. Создайте таблицу с требуемой структурой. -3. Создайте материализованное представление, которое преобразует данные из движка и помещает их в ранее созданную таблицу. - -Когда `MATERIALIZED VIEW` подключается к движку, оно начинает собирать данные в фоновом режиме. Это позволяет постоянно получать записи из файлов журналов и преобразовывать их в нужный формат с помощью `SELECT`. -Одна таблица FileLog может иметь сколько угодно материализованных представлений; они не читают данные из таблицы напрямую, а получают новые записи (блоками), таким образом можно записывать данные в несколько таблиц с разным уровнем детализации (с группировкой — агрегацией и без неё). - -Пример: - -```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; -``` - -Чтобы прекратить приём потоковых данных или изменить логику преобразования, отсоедините материализованное представление: - -```sql - DETACH TABLE consumer; - ATTACH TABLE consumer; -``` - -Если вы хотите изменить целевую таблицу с помощью команды `ALTER`, мы рекомендуем предварительно отключить материализованное представление, чтобы избежать расхождений между целевой таблицей и данными из представления. - - -## Виртуальные столбцы {#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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md deleted file mode 100644 index 5987da1a3b8..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: 'Движок таблицы GenerateRandom генерирует случайные данные для заданной - схемы таблицы.' -sidebar_label: 'GenerateRandom' -sidebar_position: 140 -slug: /engines/table-engines/special/generate -title: 'Движок таблицы GenerateRandom' -doc_type: 'reference' ---- - - - -# Движок таблицы GenerateRandom - -Движок таблицы GenerateRandom генерирует случайные данные в соответствии с заданной схемой таблицы. - -Примеры использования: - -- Используйте в тестах для заполнения больших таблиц воспроизводимыми данными. -- Генерируйте случайные входные данные для фаззинговых тестов. - - - -## Использование в ClickHouse Server - -```sql -ENGINE = GenerateRandom([random_seed [,max_string_length [,max_array_length]]]) -``` - -Параметры `max_array_length` и `max_string_length` задают соответственно максимальную длину всех столбцов типов Array или Map и строк в генерируемых данных. - -Движок таблицы `Generate` поддерживает только запросы `SELECT`. - -Он поддерживает все [типы данных](../../../sql-reference/data-types/index.md), которые могут храниться в таблице, за исключением `AggregateFunction`. - - -## Пример - -**1.** Создайте таблицу `generate_engine_table`: - -```sql -CREATE TABLE generate_engine_table (name String, value UInt32) ENGINE = GenerateRandom(1, 5, 3) -``` - -**2.** Выполните запрос: - -```sql -SELECT * FROM generate_engine_table LIMIT 3 -``` - -```text -┌─name─┬──────value─┐ -│ c4xJ │ 1412771199 │ -│ r │ 1791099446 │ -│ 7#$ │ 124312908 │ -└──────┴────────────┘ -``` - - -## Подробности реализации {#details-of-implementation} - -- Не поддерживаются: - - `ALTER` - - `SELECT ... SAMPLE` - - `INSERT` - - Индексы - - Репликация diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md deleted file mode 100644 index f4058e0abc2..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -description: 'Документация по специальным движкам таблиц' -sidebar_label: 'Специальные' -sidebar_position: 50 -slug: /engines/table-engines/special/ -title: 'Специальные движки таблиц' -doc_type: 'reference' ---- - - - -# Специальные движки таблиц - -Существует три основные категории движков таблиц: - -* [Семейство движков MergeTree](../../../engines/table-engines/mergetree-family/index.md) для основного использования в продакшене. -* [Семейство движков Log](../../../engines/table-engines/log-family/index.md) для небольших временных данных. -* [Движки таблиц для интеграций](../../../engines/table-engines/integrations/index.md). - -Оставшиеся движки уникальны по своему назначению и пока не объединены в семейства, поэтому они отнесены к этой «специальной» категории. - -{/* Оглавление для этой страницы генерируется автоматически с помощью - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - на основе полей YAML front matter: slug, description, title. - - Если вы заметили ошибку, отредактируйте YAML front matter соответствующих страниц. - */ } - - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Alias table engine](/engines/table-engines/special/alias) | Движок таблиц Alias создает прозрачный прокси для другой таблицы. Все операции перенаправляются в целевую таблицу, при этом алиас сам по себе не хранит данные. | -| [Distributed table engine](/engines/table-engines/special/distributed) | Таблицы с движком Distributed не хранят собственные данные, но позволяют выполнять распределенную обработку запросов на нескольких серверах. Чтение автоматически параллелизуется. При чтении используются индексы таблиц на удаленных серверах, если они есть. | -| [Dictionary table engine](/engines/table-engines/special/dictionary) | Движок `Dictionary` отображает данные словаря в виде таблицы ClickHouse. | -| [Merge table engine](/engines/table-engines/special/merge) | Движок `Merge` (не путать с `MergeTree`) сам по себе не хранит данные, но позволяет одновременно читать из любого количества других таблиц. | -| [Executable and ExecutablePool table engines](/engines/table-engines/special/executable) | Движки таблиц `Executable` и `ExecutablePool` позволяют определить таблицу, строки которой генерируются заданным вами скриптом (путем записи строк в **stdout**). | -| [File table engine](/engines/table-engines/special/file) | Движок таблиц File хранит данные в файле в одном из поддерживаемых форматов (`TabSeparated`, `Native` и т. д.). | -| [Null table engine](/engines/table-engines/special/null) | При записи в таблицу `Null` данные игнорируются. При чтении из таблицы `Null` результат пуст. | -| [Set table engine](/engines/table-engines/special/set) | Набор данных, который всегда находится в оперативной памяти (RAM). Предназначен для использования в правой части оператора `IN`. | -| [Join table engine](/engines/table-engines/special/join) | Опциональная предварительно подготовленная структура данных для использования в операциях JOIN. | -| [URL table engine](/engines/table-engines/special/url) | Выполняет запросы данных к удаленному HTTP/HTTPS-серверу и с него. Этот движок похож на движок File. | -| [View table engine](/engines/table-engines/special/view) | Используется для реализации представлений (подробнее см. запрос `CREATE VIEW`). Он не хранит данные, а только сохраняет указанный запрос `SELECT`. При чтении из таблицы выполняется этот запрос (и из него удаляются все ненужные столбцы). | -| [Memory table engine](/engines/table-engines/special/memory) | Движок Memory хранит данные в оперативной памяти (RAM) в несжатом виде. Данные хранятся в точности в том виде, в каком они получены при чтении. Другими словами, чтение из этой таблицы практически бесплатное. | -| [Buffer table engine](/engines/table-engines/special/buffer) | Буферизует данные для записи в оперативной памяти, периодически сбрасывая их в другую таблицу. При чтении данные считываются одновременно из буфера и из другой таблицы. | -| [External data for query processing](/engines/table-engines/special/external-data) | ClickHouse позволяет отправлять на сервер данные, необходимые для обработки запроса, вместе с запросом `SELECT`. Эти данные помещаются во временную таблицу и могут использоваться в запросе (например, в операторах `IN`). | -| [GenerateRandom table engine](/engines/table-engines/special/generate) | Движок таблиц GenerateRandom генерирует случайные данные для заданной схемы таблицы. | -| [KeeperMap table engine](/engines/table-engines/special/keeper-map) | Этот движок позволяет использовать кластер Keeper/ZooKeeper как согласованное key-value-хранилище с линеаризуемыми записями и последовательно согласованными чтениями. | -| [FileLog table engine](/engines/table-engines/special/filelog) | Этот движок позволяет обрабатывать файлы журналов приложений как поток записей. | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md deleted file mode 100644 index 5d41830f0d9..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -description: 'Необязательная подготовленная структура данных для использования в операциях JOIN.' -sidebar_label: 'Join' -sidebar_position: 70 -slug: /engines/table-engines/special/join -title: 'Движок таблицы Join' -doc_type: 'reference' ---- - - - -# Табличный движок Join - -Дополнительная подготовленная структура данных для использования в операциях [JOIN](/sql-reference/statements/select/join). - -:::note -В ClickHouse Cloud, если ваш сервис был создан на версии раньше 25.4, необходимо установить параметр `compatibility` не ниже 25.4, выполнив команду `SET compatibility=25.4`. -::: - - - -## Создание таблицы - -```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](/sql-reference/statements/create/table). - - -## Параметры движка {#engine-parameters} - -### `join_strictness` {#join_strictness} - -`join_strictness` – [строгость JOIN](/sql-reference/statements/select/join#supported-types-of-join). - -### `join_type` {#join_type} - -`join_type` – [тип JOIN](/sql-reference/statements/select/join#supported-types-of-join). - -### Ключевые столбцы {#key-columns} - -`k1[, k2, ...]` – ключевые столбцы из предложения `USING`, по которым выполняется операция `JOIN`. - -Задавайте параметры `join_strictness` и `join_type` без кавычек, например `Join(ANY, LEFT, col1)`. Они должны соответствовать операции `JOIN`, для которой будет использоваться таблица. Если параметры не соответствуют, ClickHouse не выбрасывает исключение и может вернуть некорректные данные. - - - -## Особенности и рекомендации {#specifics-and-recommendations} - -### Хранение данных {#data-storage} - -Данные таблицы `Join` всегда находятся в оперативной памяти. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера. - -Если сервер перезапускается некорректно, блок данных на диске может быть потерян или повреждён. В этом случае может потребоваться вручную удалить файл с повреждёнными данными. - -### Выборка и вставка данных {#selecting-and-inserting-data} - -Вы можете использовать запросы `INSERT` для добавления данных в таблицы с движком `Join`. Если таблица была создана с режимом строгости `ANY`, данные для дублирующихся ключей игнорируются. При режиме строгости `ALL` добавляются все строки. - -Основные варианты использования таблиц с движком `Join`: - -- Использовать таблицу справа в выражении `JOIN`. -- Вызывать функцию [joinGet](/sql-reference/functions/other-functions.md/#joinGet), которая позволяет извлекать данные из таблицы так же, как из словаря. - -### Удаление данных {#deleting-data} - -Запросы `ALTER DELETE` для таблиц с движком `Join` реализованы как [мутации](/sql-reference/statements/alter/index.md#mutations). Мутация `DELETE` считывает отфильтрованные данные и перезаписывает данные в памяти и на диске. - -### Ограничения и настройки {#join-limitations-and-settings} - -При создании таблицы применяются следующие настройки: - -#### `join_use_nulls` {#join_use_nulls} - -[join_use_nulls](/operations/settings/settings.md/#join_use_nulls) - -#### `max_rows_in_join` {#max_rows_in_join} - -[max_rows_in_join](/operations/settings/settings#max_rows_in_join) - -#### `max_bytes_in_join` {#max_bytes_in_join} - -[max_bytes_in_join](/operations/settings/settings#max_bytes_in_join) - -#### `join_overflow_mode` {#join_overflow_mode} - -[join_overflow_mode](/operations/settings/settings#join_overflow_mode) - -#### `join_any_take_last_row` {#join_any_take_last_row} - -[join_any_take_last_row](/operations/settings/settings.md/#join_any_take_last_row) -#### `join_use_nulls` {#join_use_nulls-1} - -#### Persistent {#persistent} - -Отключает персистентность для движков таблиц Join и [Set](/engines/table-engines/special/set.md). - -Снижает нагрузку на подсистему ввода-вывода. Подходит для сценариев, ориентированных на производительность и не требующих персистентности. - -Возможные значения: - -- 1 — включено. -- 0 — выключено. - -Значение по умолчанию: `1`. - -Таблицы с движком `Join` не могут использоваться в операциях `GLOBAL JOIN`. - -Движок `Join` позволяет указать настройку [join_use_nulls](/operations/settings/settings.md/#join_use_nulls) в операторе `CREATE TABLE`. Запрос [SELECT](/sql-reference/statements/select/index.md) должен иметь то же значение `join_use_nulls`. - - - -## Примеры использования - -Создание левой таблицы: - -```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/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md deleted file mode 100644 index 0dedd9c57b3..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -description: 'Этот движок позволяет использовать кластер Keeper/ZooKeeper как согласованное - хранилище пар ключ–значение с линеаризуемыми записями и последовательной согласованностью при чтении.' -sidebar_label: 'KeeperMap' -sidebar_position: 150 -slug: /engines/table-engines/special/keeper-map -title: 'Табличный движок KeeperMap' -doc_type: 'reference' ---- - - - -# Табличный движок KeeperMap - -Этот движок позволяет использовать кластер Keeper/ZooKeeper как согласованное хранилище ключ–значение с линеаризуемыми записями и последовательно согласованными чтениями. - -Чтобы включить табличный движок KeeperMap, необходимо задать в конфигурации параметр ``, определяющий путь в ZooKeeper, по которому будут храниться таблицы. - -Например: - -```xml - - /keeper_map_tables - -``` - -где path может быть любым другим допустимым путем в ZooKeeper. - - -## Создание таблицы - -```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` — путь в ZooKeeper, по которому будет храниться `table_name`.\ - Этот путь не должен содержать префикс, определённый в конфигурации ``, поскольку префикс будет автоматически добавлен к `root_path`.\ - Также поддерживается формат `auxiliary_zookeeper_cluster_name:/some/path`, где `auxiliary_zookeeper_cluster` — это кластер ZooKeeper, определённый в конфигурации ``.\ - По умолчанию используется кластер ZooKeeper, определённый в конфигурации ``. -* `keys_limit` — максимальное количество ключей, разрешённых в таблице.\ - Это мягкое ограничение, и в некоторых крайних случаях в таблице может оказаться большее количество ключей. -* `primary_key_name` — любое имя столбца из списка столбцов. -* `primary key` должен быть указан; он может содержать только один столбец. Первичный ключ будет сериализован в бинарном виде как `node name` в 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_map_tables/keeper_map_table/data/serialized_key` в `Keeper`. -Кроме того, на количество ключей будет действовать мягкий лимит в 4 ключа. - -Если несколько таблиц создаются на одном и том же пути в ZooKeeper, значения сохраняются до тех пор, пока существует как минимум одна таблица, использующая их.\ -В результате можно использовать предложение `ON CLUSTER` при создании таблицы и разделять данные между несколькими экземплярами ClickHouse.\ -Разумеется, можно вручную выполнить `CREATE TABLE` с тем же путём на несвязанных экземплярах ClickHouse, чтобы получить тот же эффект совместного использования данных. - - -## Поддерживаемые операции - -### Вставки - -Когда в `KeeperMap` вставляются новые строки, если ключ не существует, создаётся новая запись с этим ключом. -Если ключ существует и настройка `keeper_map_strict_mode` имеет значение `true`, выбрасывается исключение, в противном случае значение для ключа перезаписывается. - -Пример: - -```sql -INSERT INTO keeper_map_table VALUES ('какой-то ключ', 1, 'значение', 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; -``` - - -## Связанные материалы {#related-content} - -- Блог: [Создание аналитических приложений реального времени с ClickHouse и Hex](https://clickhouse.com/blog/building-real-time-applications-with-clickhouse-and-hex-notebook-keeper-engine) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md deleted file mode 100644 index dd8dc33029c..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -description: 'Движок Memory хранит данные в оперативной памяти в несжатом виде. Данные - сохраняются в точно том же виде, в котором они были получены при чтении. Другими словами, чтение - из этой таблицы не требует затрат.' -sidebar_label: 'Memory' -sidebar_position: 110 -slug: /engines/table-engines/special/memory -title: 'Табличный движок Memory' -doc_type: 'reference' ---- - - - -# Движок таблиц Memory - -:::note -При использовании движка таблиц Memory в ClickHouse Cloud данные по проекту не реплицируются на все узлы (так задумано). Чтобы гарантировать, что все запросы направляются на один и тот же узел и движок Memory работает предсказуемо, вы можете: -- Выполнять все операции в одном и том же сеансе -- Использовать клиент, работающий по TCP или через нативный интерфейс (что позволяет использовать «липкие» соединения), например [clickhouse-client](/interfaces/cli) -::: - -Движок Memory хранит данные в оперативной памяти (RAM) в несжатом виде. Данные хранятся в точности в том виде, в котором они были получены при чтении. Другими словами, чтение из этой таблицы полностью бесплатно с точки зрения затрат на обработку. -Одновременный доступ к данным синхронизирован. Блокировки кратковременные: операции чтения и записи не блокируют друг друга. -Индексы не поддерживаются. Чтение выполняется параллельно. - -Максимальная производительность (более 10 ГБ/сек) достигается на простых запросах, поскольку отсутствуют чтение с диска, декомпрессия и десериализация данных. (Следует отметить, что во многих случаях производительность движка MergeTree почти столь же высока.) -При перезапуске сервера данные из таблицы исчезают, и таблица становится пустой. -Как правило, использование этого движка таблиц не оправдано. Однако его можно применять для тестов и для задач, где требуется максимальная скорость на относительно небольшом количестве строк (до примерно 100 000 000). - -Движок 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` -- `compress` — Определяет, нужно ли сжимать данные в памяти. - - Значение по умолчанию: `false` - - - -## Использование - -**Инициализация настроек** - -```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`. - - -## Примеры - -```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 байт — 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 строк - -/* 2. добавляем блок, который не удаляется */ -INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 строк - -/* 3. проверяем, что самый старый блок удаляется — 9216 байт — 1100 строк */ -INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 строк - -/* 4. проверяем, что очень большой блок вытесняет все остальные */ -INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 строк - -SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase(); -``` - -```text -┌─total_bytes─┬─total_rows─┐ -│ 65536 │ 10000 │ -└─────────────┴────────────┘ -``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md deleted file mode 100644 index ce5334d76ed..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -description: 'Табличный движок `Merge` (не путать с `MergeTree`) сам не хранит данные, а позволяет одновременно читать из любого количества других таблиц.' -sidebar_label: 'Merge' -sidebar_position: 30 -slug: /engines/table-engines/special/merge -title: 'Табличный движок Merge' -doc_type: 'reference' ---- - - - -# Движок таблицы Merge - -Движок `Merge` (не путать с `MergeTree`) сам не хранит данные, но позволяет одновременно читать из любого количества других таблиц. - -Чтение автоматически распараллеливается. Запись в таблицу не поддерживается. При чтении используются индексы таблиц, из которых фактически производится чтение, если они есть. - - - -## Создание таблицы - -```sql -CREATE TABLE ... Engine=Merge(db_name, tables_regexp) -``` - - -## Параметры движка {#engine-parameters} - -### `db_name` {#db_name} - -`db_name` — возможные значения: - - имя базы данных, - - константное выражение, которое возвращает строку с именем базы данных, например `currentDatabase()`, - - `REGEXP(expression)`, где `expression` — регулярное выражение для сопоставления имен баз данных. - -### `tables_regexp` {#tables_regexp} - -`tables_regexp` — регулярное выражение для сопоставления имен таблиц в указанной БД или нескольких БД. - -Регулярные выражения обрабатываются библиотекой [re2](https://github.com/google/re2) (поддерживает подмножество PCRE) и чувствительны к регистру. -См. примечания об экранировании символов в регулярных выражениях в разделе «match». - - - -## Использование {#usage} - -При выборе таблиц для чтения сама таблица `Merge` не выбирается, даже если она подходит под регулярное выражение. Это сделано, чтобы избежать циклов. -Можно создать две таблицы `Merge`, которые будут бесконечно пытаться читать данные друг друга, но это не лучшая идея. - -Типичный сценарий использования движка `Merge` — работа с большим количеством таблиц `TinyLog` так, как будто это одна таблица. - - - -## Примеры - -**Пример 1** - -Рассмотрим две базы данных `ABC_corporate_site` и `ABC_store`. Таблица `all_visitors` будет содержать идентификаторы из таблиц `visitors` обеих баз данных. - -```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 -ORDER BY (date, UserId, EventType); - -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). - - Если отфильтровать по `_table` (например, `WHERE _table='xyz'`), будут прочитаны только те таблицы, которые удовлетворяют условию фильтрации. - -- `_database` — имя базы данных, из которой были прочитаны данные. Тип: [String](../../../sql-reference/data-types/string.md). - -**См. также** - -- [Виртуальные столбцы](../../../engines/table-engines/index.md#table_engines-virtual_columns) -- Табличная функция [merge](../../../sql-reference/table-functions/merge.md) diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md deleted file mode 100644 index b4ecdb6cd07..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -description: 'При записи в таблицу `Null` данные игнорируются. При чтении из таблицы - `Null` ответ пустой.' -sidebar_label: 'Null' -sidebar_position: 50 -slug: /engines/table-engines/special/null -title: 'Движок таблицы Null' -doc_type: 'reference' ---- - -# Движок таблицы Null - -При записи данных в таблицу `Null` они игнорируются. -При чтении из таблицы `Null` результат будет пустым. - -Движок таблицы `Null` полезен для преобразования данных, когда исходные данные больше не нужны после преобразования. -Для этого вы можете создать материализованное представление поверх таблицы `Null`. -Данные, записываемые в таблицу, будут считываться представлением, но исходные сырые данные будут отбрасываться. \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md deleted file mode 100644 index 384300df37f..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -description: 'Набор данных, который всегда находится в оперативной памяти. Предназначен для использования в правой части оператора `IN`.' -sidebar_label: 'Set' -sidebar_position: 60 -slug: /engines/table-engines/special/set -title: 'Табличный движок Set' -doc_type: 'reference' ---- - - - -# Движок таблицы Set - -:::note -В ClickHouse Cloud, если ваш сервис был создан с версией ранее 25.4, вам необходимо установить совместимость как минимум с 25.4 с помощью `SET compatibility=25.4`. -::: - -Это набор данных, который всегда находится в оперативной памяти. Предназначен для использования в правой части оператора `IN` (см. раздел «Операторы IN»). - -Вы можете использовать `INSERT` для вставки данных в таблицу. Новые элементы будут добавлены в набор данных, а дубликаты будут игнорироваться. -Но вы не можете выполнять `SELECT` из этой таблицы. Единственный способ получить данные — использовать её в правой части оператора `IN`. - -Данные всегда расположены в оперативной памяти. При выполнении `INSERT` блоки вставленных данных также записываются в каталог таблиц на диске. При запуске сервера эти данные загружаются в оперативную память. Другими словами, после перезапуска данные сохраняются. - -При некорректном (жёстком) перезапуске сервера блок данных на диске может быть потерян или повреждён. В последнем случае вам может понадобиться вручную удалить файл с повреждёнными данными. - -### Ограничения и настройки {#join-limitations-and-settings} - -При создании таблицы применяются следующие настройки: - -#### persistent {#persistent} - -Отключает персистентность для движков таблиц Set и [Join](/engines/table-engines/special/join). - -Уменьшает нагрузку на подсистему ввода-вывода. Подходит для сценариев, где приоритетом является производительность и не требуется сохранность данных. - -Возможные значения: - -- 1 — включено. -- 0 — отключено. - -Значение по умолчанию: `1`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md deleted file mode 100644 index 9e632a8c144..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -description: 'Позволяет запрашивать и отправлять данные на удалённый HTTP/HTTPS-сервер. Этот движок аналогичен движку File.' -sidebar_label: 'URL' -sidebar_position: 80 -slug: /engines/table-engines/special/url -title: 'Табличный движок URL' -doc_type: 'reference' ---- - - - -# Движок таблицы 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#formats-overview). - - Если этот аргумент не указан, ClickHouse автоматически определяет формат по суффиксу параметра `URL`. Если суффикс параметра `URL` не соответствует ни одному из поддерживаемых форматов, создание таблицы завершится с ошибкой. Например, для выражения движка `URL('http://localhost/test.json')` будет применён формат `JSON`. - -- `CompressionMethod` указывает, нужно ли сжимать тело HTTP-запроса. Если сжатие включено, HTTP-пакеты, отправляемые движком URL, содержат заголовок `Content-Encoding`, который указывает, какой метод сжатия используется. - -Чтобы включить сжатие, сначала убедитесь, что удалённая HTTP‑конечная точка, указанная параметром `URL`, поддерживает соответствующий алгоритм сжатия. - -Поддерживаемое значение `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` преобразуются соответственно в HTTP-запросы `POST` и `GET`. Для обработки `POST`-запросов удалённый сервер должен поддерживать [передачу с кодированием фрагментами (Chunked transfer encoding)](https://en.wikipedia.org/wiki/Chunked_transfer_encoding). - -Вы можете ограничить максимальное количество переходов по перенаправлениям для HTTP-запросов GET с помощью настройки [max_http_get_redirects](/operations/settings/settings#max_http_get_redirects). - - - -## Пример - -**1.** Создайте таблицу `url_engine_table` на сервере: - -```sql -CREATE TABLE url_engine_table (word String, value UInt64) -ENGINE=URL('http://127.0.0.1:12345/', CSV) -``` - -**2.** Создайте базовый HTTP-сервер, используя стандартные средства Python 3 -и запустите его: - -```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─┐ -│ Привет │ 1 │ -│ Мир │ 2 │ -└───────┴───────┘ -``` - - -## Подробности реализации {#details-of-implementation} - -- Возможны параллельные операции чтения и записи -- Не поддерживаются: - - Операции `ALTER` и `SELECT...SAMPLE`. - - Индексы. - - Репликация. - - - -## Виртуальные столбцы {#virtual-columns} - -- `_path` — Путь к URL-ресурсу. Тип: `LowCardinality(String)`. -- `_file` — Имя URL-ресурса. Тип: `LowCardinality(String)`. -- `_size` — Размер ресурса в байтах. Тип: `Nullable(UInt64)`. Если размер неизвестен, значение — `NULL`. -- `_time` — Время последнего изменения файла. Тип: `Nullable(DateTime)`. Если время неизвестно, значение — `NULL`. -- `_headers` — Заголовки HTTP-ответа. Тип: `Map(LowCardinality(String), LowCardinality(String))`. - - - -## Настройки хранения {#storage-settings} - -- [engine_url_skip_empty_files](/operations/settings/settings.md#engine_url_skip_empty_files) — позволяет пропускать пустые файлы при чтении. По умолчанию отключена. -- [enable_url_encoding](/operations/settings/settings.md#enable_url_encoding) — позволяет включать и отключать кодирование и декодирование пути в URI. По умолчанию включена. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md b/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md deleted file mode 100644 index 3f350814d00..00000000000 --- a/i18n/ru/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -description: 'Используется для создания представлений (подробнее см. запрос `CREATE VIEW`). Движок не хранит данные, а только сохраняет указанный запрос `SELECT`. При чтении из таблицы этот запрос выполняется (из него удаляются все ненужные столбцы).' -sidebar_label: 'View' -sidebar_position: 90 -slug: /engines/table-engines/special/view -title: 'Движок таблицы View' -doc_type: 'reference' ---- - -# Движок таблицы View - -Используется для реализации представлений (подробнее см. запрос `CREATE VIEW`). Он не хранит данные, а только сохраняет указанный запрос `SELECT`. При чтении из таблицы выполняется этот запрос (при этом из него удаляются все ненужные столбцы). \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/concurrency.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/concurrency.md index c03fbce81ec..0e43f40950e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/concurrency.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/concurrency.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['concurrency', 'QPS'] --- -# Поддерживает ли ClickHouse частые одновременные запросы? +# Поддерживает ли ClickHouse частые одновременные запросы? {#does-clickhouse-support-frequent-concurrent-queries} ClickHouse разработан для систем оперативной аналитики, которые могут напрямую обслуживать внешних пользователей. Он способен обрабатывать аналитические запросы с низкой задержкой (менее 10 миллисекунд) и высокой степенью параллелизма (более 10 000 запросов в секунду) на базах данных петабайтного масштаба, объединяя исторические данные и вставки в реальном времени. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/cost-based.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/cost-based.md index 1d175685621..9c423be122b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/cost-based.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/cost-based.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['CBE', 'optimizer'] --- -# Есть ли у ClickHouse стоимостной оптимизатор? +# Есть ли у ClickHouse стоимостной оптимизатор? {#does-clickhouse-have-a-cost-based-optimizer} В ClickHouse есть отдельные механизмы стоимостной оптимизации, например, порядок чтения столбцов определяется оценочной стоимостью чтения сжатых диапазонов данных с диска. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/datalake.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/datalake.md index f6d59ecb2b7..e1baba198e2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/datalake.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/datalake.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['озеро данных', 'lakehouse'] --- -# Поддерживает ли ClickHouse озёра данных? +# Поддерживает ли ClickHouse озёра данных? {#does-clickhouse-support-data-lakes} ClickHouse поддерживает озёра данных (Data Lakes), включая Iceberg, Delta Lake, Apache Hudi, Apache Paimon, Hive. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/dependencies.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/dependencies.md index da880aed909..1b42e44c47c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/dependencies.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/dependencies.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['зависимости', 'сторонние'] --- -# Какие сторонние зависимости нужны для запуска ClickHouse? +# Какие сторонние зависимости нужны для запуска ClickHouse? {#what-are-the-3rd-party-dependencies-for-running-clickhouse} ClickHouse не имеет никаких runtime-зависимостей. Он распространяется как один исполняемый бинарный файл, который является полностью самодостаточным. Это приложение предоставляет всю функциональность кластера, обрабатывает запросы, работает как рабочий узел кластера, как система координации, реализующая алгоритм консенсуса RAFT, а также как клиент или локальный движок запросов. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md index b6eea1eebba..ee93d03b28a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['distributed', 'join'] --- -# Поддерживает ли ClickHouse распределённый JOIN? +# Поддерживает ли ClickHouse распределённый JOIN? {#does-clickhouse-support-distributed-join} ClickHouse поддерживает распределённый JOIN на кластере. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/federated.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/federated.md index e64fa273549..42170743872 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/federated.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/federated.md @@ -8,22 +8,22 @@ doc_type: 'reference' keywords: ['federated', 'hybrid', 'postgres', 'mysql', 'sqlite', 'odbc', 'jdbc'] --- -# Поддерживает ли ClickHouse федеративные запросы? +# Поддерживает ли ClickHouse федеративные запросы? {#does-clickhouse-support-federated-queries} ClickHouse имеет наиболее широкую поддержку федеративных запросов и гибридного выполнения запросов среди аналитических баз данных. Он поддерживает выполнение запросов к внешним базам данных: -- PostgreSQL -- MySQL -- MongoDB -- Redis -- любые источники данных через ODBC -- любые источники данных через JDBC -- любые источники данных Arrow Flight -- потоковые источники данных, такие как Kafka и RabbitMQ -- Data Lake‑хранилища, такие как Iceberg, Delta Lake, Apache Hudi, Apache Paimon -- внешние файлы, расположенные в общих системах хранения, таких как AWS S3, GCS, Minio, Cloudflare R2, Azure Blob Storage, Alicloud OSS, Tencent COS, а также в локальном хранилище, с широким набором форматов данных +* PostgreSQL +* MySQL +* MongoDB +* Redis +* любые источники данных через ODBC +* любые источники данных через JDBC +* любые источники данных Arrow Flight +* потоковые источники данных, такие как Kafka и RabbitMQ +* Data Lake‑хранилища, такие как Iceberg, Delta Lake, Apache Hudi, Apache Paimon +* внешние файлы, расположенные в общих системах хранения, таких как AWS S3, GCS, Minio, Cloudflare R2, Azure Blob Storage, Alicloud OSS, Tencent COS, а также в локальном хранилище, с широким набором форматов данных ClickHouse может объединять несколько разнородных источников данных в одном запросе. Также он предоставляет возможность гибридного выполнения запросов, комбинируя локальные ресурсы и передавая часть запроса на удалённые машины. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/index.md index de43f0aa585..146b0fea535 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/index.md @@ -8,18 +8,18 @@ description: 'Страница-индекс со списком общих во doc_type: 'landing-page' --- -# Общие вопросы о ClickHouse +# Общие вопросы о ClickHouse {#general-questions-about-clickhouse} -- [Что такое ClickHouse?](../../intro.md) -- [Почему ClickHouse такой быстрый?](../../concepts/why-clickhouse-is-so-fast.mdx) -- [Кто использует 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) +* [Что такое ClickHouse?](../../intro.md) +* [Почему ClickHouse такой быстрый?](../../concepts/why-clickhouse-is-so-fast.mdx) +* [Кто использует 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 Не нашли то, что искали? Ознакомьтесь с нашей [Базой знаний](/knowledgebase/), а также просмотрите множество полезных статей в этой документации. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/sql.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/sql.md index 3eaec0c1439..aa08ff2637a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/sql.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/sql.md @@ -8,46 +8,46 @@ doc_type: 'reference' keywords: ['синтаксис SQL', 'ANSI SQL'] --- -# Какой синтаксис SQL поддерживает ClickHouse? +# Какой синтаксис SQL поддерживает ClickHouse? {#what-sql-syntax-does-clickhouse-support} ClickHouse полностью поддерживает синтаксис SQL, включая такие возможности, как: -- SQL/JSON и тип данных JSON (SQL-2023) -- оконные функции (SQL-2003) -- общие табличные выражения (CTE) и рекурсивные запросы (SQL-1999) -- ROLLUP, CUBE и GROUPING SETS (SQL-1999) -- полная поддержка RBAC (SQL-1999) -- коррелированные подзапросы (SQL-1992); +* SQL/JSON и тип данных JSON (SQL-2023) +* оконные функции (SQL-2003) +* общие табличные выражения (CTE) и рекурсивные запросы (SQL-1999) +* ROLLUP, CUBE и GROUPING SETS (SQL-1999) +* полная поддержка RBAC (SQL-1999) +* коррелированные подзапросы (SQL-1992); Поддержка подтверждена бенчмарками TPC-H и TPC-DS, а также SQLTest. ClickHouse внедрил многие функции до того, как они были стандартизованы ISO/IEC, в том числе: -- условные агрегатные функции -- агрегатные функции `any` -- `least` и `greatest` -- `GROUP BY ALL` -- расширенное использование псевдонимов -- символ подчёркивания в числовых литералах +* условные агрегатные функции +* агрегатные функции `any` +* `least` и `greatest` +* `GROUP BY ALL` +* расширенное использование псевдонимов +* символ подчёркивания в числовых литералах ClickHouse расширяет SQL, добавляя важные улучшения, повышающие удобство работы: -- неограниченное использование псевдонимов -- псевдонимы внутри предложения WITH -- комбинаторы агрегатных функций -- параметризованные агрегатные функции -- приближённые агрегатные функции -- встроенные и большие целочисленные типы данных, десятичные числа повышенной точности -- функции высшего порядка для обработки массивов -- предложение ARRAY JOIN и функция arrayJoin -- агрегирование массивов -- предложение LIMIT BY -- GROUP BY WITH TOTALS -- AS OF JOIN -- ANY/ALL JOIN -- естественный синтаксис для JSON -- завершающая запятая в списке столбцов -- порядок предложений FROM ... SELECT -- типобезопасные параметры запросов и параметризованные представления +* неограниченное использование псевдонимов +* псевдонимы внутри предложения WITH +* комбинаторы агрегатных функций +* параметризованные агрегатные функции +* приближённые агрегатные функции +* встроенные и большие целочисленные типы данных, десятичные числа повышенной точности +* функции высшего порядка для обработки массивов +* предложение ARRAY JOIN и функция arrayJoin +* агрегирование массивов +* предложение LIMIT BY +* GROUP BY WITH TOTALS +* AS OF JOIN +* ANY/ALL JOIN +* естественный синтаксис для JSON +* завершающая запятая в списке столбцов +* порядок предложений FROM ... SELECT +* типобезопасные параметры запросов и параметризованные представления Некоторые из них потенциально могут быть включены в будущие стандарты SQL, при этом уже доступны пользователям ClickHouse. \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/updates.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/updates.md index 0bc89452d86..f15ed8ece48 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/updates.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/general/updates.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['обновления', 'реальное время'] --- -# Поддерживает ли ClickHouse обновления в режиме реального времени? +# Поддерживает ли ClickHouse обновления в режиме реального времени? {#does-clickhouse-support-real-time-updates} ClickHouse поддерживает оператор UPDATE и способен выполнять обновления в реальном времени с той же скоростью, с какой выполняет операции INSERT. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/index.md index ec26f9bd2c5..f9fc554fb47 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/index.md @@ -8,15 +8,15 @@ description: 'Главная страница со списком вопросо doc_type: 'landing-page' --- -# Вопросы об интеграции ClickHouse с другими системами +# Вопросы об интеграции ClickHouse с другими системами {#questions-about-integrating-clickhouse-and-other-systems} -- [Как экспортировать данные из ClickHouse в файл?](https://clickhouse.com/docs/knowledgebase/file-export) -- [Как импортировать JSON в ClickHouse?](/integrations/data-ingestion/data-formats/json/intro.md) -- [Как подключить Kafka к ClickHouse?](/integrations/data-ingestion/kafka/index.md) -- [Могу ли я подключить своё Java‑приложение к ClickHouse?](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) -- [Может ли ClickHouse читать таблицы из MySQL?](/integrations/mysql) -- [Может ли ClickHouse читать таблицы из PostgreSQL](/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md) -- [Что делать, если возникают проблемы с кодировками при подключении к Oracle через ODBC?](/faq/integration/oracle-odbc.md) +* [Как экспортировать данные из ClickHouse в файл?](https://clickhouse.com/docs/knowledgebase/file-export) +* [Как импортировать JSON в ClickHouse?](/integrations/data-ingestion/data-formats/json/intro.md) +* [Как подключить Kafka к ClickHouse?](/integrations/data-ingestion/kafka/index.md) +* [Могу ли я подключить своё Java‑приложение к ClickHouse?](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) +* [Может ли ClickHouse читать таблицы из MySQL?](/integrations/mysql) +* [Может ли ClickHouse читать таблицы из PostgreSQL](/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md) +* [Что делать, если возникают проблемы с кодировками при подключении к Oracle через ODBC?](/faq/integration/oracle-odbc.md) :::info Не нашли то, что искали? Ознакомьтесь с нашей [Базой знаний](/knowledgebase/) и также просмотрите множество полезных статей в документации. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/json-import.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/json-import.md index ed9f79a092e..81eeae88c47 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/json-import.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/json-import.md @@ -16,7 +16,7 @@ ClickHouse поддерживает широкий спектр [формато -## Примеры +## Примеры {#examples} С помощью [HTTP-интерфейса](../../interfaces/http.md): diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md index 7ec753572ed..2ddcfdbf4e6 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md @@ -8,9 +8,7 @@ doc_type: 'guide' keywords: ['oracle', 'odbc', 'encoding', 'integration', 'external dictionary'] --- - - -# Что делать, если у меня возникают проблемы с кодировками при работе с Oracle через ODBC? +# Что делать, если у меня возникают проблемы с кодировками при работе с Oracle через ODBC? {#oracle-odbc-encodings} Если вы используете Oracle как источник внешних словарей ClickHouse через драйвер Oracle ODBC, необходимо установить корректное значение переменной окружения `NLS_LANG` в файле `/etc/default/clickhouse`. Дополнительную информацию см. в [Oracle NLS_LANG FAQ](https://www.oracle.com/technetwork/products/globalization/nls-lang-099431.html). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md index 23d95d0b2b4..8067e2b45d9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md @@ -30,7 +30,7 @@ TTL также может использоваться не только для -## DELETE FROM +## DELETE FROM {#delete-from} [DELETE FROM](/sql-reference/statements/delete.md) позволяет выполнять стандартные запросы DELETE в ClickHouse. Строки, отобранные условием фильтрации, помечаются как удалённые и не возвращаются в будущих результатах запросов. Очистка строк происходит асинхронно. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/index.md index c87e91e99be..88853edcfc4 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/operations/index.md @@ -8,16 +8,16 @@ doc_type: 'landing-page' keywords: ['эксплуатация', 'администрирование', 'развертывание', 'управление кластерами', 'частые вопросы'] --- -# Вопросы по эксплуатации серверов и кластеров ClickHouse +# Вопросы по эксплуатации серверов и кластеров ClickHouse {#question-about-operating-clickhouse-servers-and-clusters} -- [Какую версию ClickHouse использовать в продакшене?](/faq/operations/production.md) -- [Можно ли развернуть ClickHouse с раздельными хранилищем и вычислительными ресурсами?](/faq/operations/separate_storage.md) -- [Можно ли удалять старые данные из таблицы ClickHouse?](/faq/operations/delete-old-data.md) -- [Как настроить ClickHouse Keeper?](/guides/sre/keeper/index.md) -- [Может ли ClickHouse интегрироваться с LDAP?](/guides/sre/user-management/configuring-ldap.md) -- [Как настроить пользователей, роли и права доступа в ClickHouse?](/guides/sre/user-management/index.md) -- [Можно ли обновлять или удалять строки в ClickHouse?](/guides/starter_guides/mutations.md) -- [Поддерживает ли ClickHouse мульти-региональную (multi-region) репликацию?](/faq/operations/multi-region-replication.md) +* [Какую версию ClickHouse использовать в продакшене?](/faq/operations/production.md) +* [Можно ли развернуть ClickHouse с раздельными хранилищем и вычислительными ресурсами?](/faq/operations/separate_storage.md) +* [Можно ли удалять старые данные из таблицы ClickHouse?](/faq/operations/delete-old-data.md) +* [Как настроить ClickHouse Keeper?](/guides/sre/keeper/index.md) +* [Может ли ClickHouse интегрироваться с LDAP?](/guides/sre/user-management/configuring-ldap.md) +* [Как настроить пользователей, роли и права доступа в ClickHouse?](/guides/sre/user-management/index.md) +* [Можно ли обновлять или удалять строки в ClickHouse?](/guides/starter_guides/mutations.md) +* [Поддерживает ли ClickHouse мульти-региональную (multi-region) репликацию?](/faq/operations/multi-region-replication.md) :::info Не нашли то, что искали? Ознакомьтесь с нашей [Базой знаний](/knowledgebase/) и просмотрите множество полезных статей в документации. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/faq/use-cases/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/faq/use-cases/index.md index bed752b2c7b..2f0d96db811 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/faq/use-cases/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/faq/use-cases/index.md @@ -8,10 +8,10 @@ keywords: ['варианты использования ClickHouse', 'база doc_type: 'landing-page' --- -# Вопросы по использованию ClickHouse +# Вопросы по использованию ClickHouse {#questions-about-clickhouse-use-cases} -- [Могу ли я использовать ClickHouse в качестве базы данных временных рядов?](/knowledgebase/time-series) -- [Могу ли я использовать ClickHouse в качестве хранилища ключ-значение?](/knowledgebase/key-value) +* [Могу ли я использовать ClickHouse в качестве базы данных временных рядов?](/knowledgebase/time-series) +* [Могу ли я использовать ClickHouse в качестве хранилища ключ-значение?](/knowledgebase/key-value) :::info Не нашли то, что искали? Ознакомьтесь с нашей [Базой знаний](/knowledgebase/), а также с многочисленными полезными статьями в этой документации. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md index 60073ad20dd..e55fb10b357 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md @@ -11,10 +11,10 @@ keywords: ['отзывы Amazon', 'датасет с отзывами покуп :::note Приведённые ниже запросы выполнялись на **Production**-инстансе ClickHouse Cloud. Для получения дополнительной информации см. раздел -["Playground specifications"](/getting-started/playground#specifications). +["Playground specifications"](/getting-started/playground#specifications). ::: -## Загрузка набора данных +## Загрузка набора данных {#loading-the-dataset} 1. Не загружая данные в ClickHouse, мы можем обращаться к ним напрямую. Давайте выберем несколько строк, чтобы посмотреть, как они выглядят: @@ -122,7 +122,6 @@ FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_*.snappy.parquet') ``` - :::tip В ClickHouse Cloud имя кластера — `default`. Замените `default` на имя вашего кластера... или используйте табличную функцию `s3` (вместо `s3Cluster`), если кластера у вас нет. ::: @@ -152,8 +151,7 @@ ORDER BY size DESC Объём исходных данных составлял около 70 ГБ, но после сжатия в ClickHouse они занимают около 30 ГБ. - -## Примеры запросов +## Примеры запросов {#example-queries} 7. Давайте выполним несколько запросов. Ниже приведены 10 наиболее полезных отзывов в этом наборе данных: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md index 6be9205b8b6..e890b6540d1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md @@ -7,7 +7,7 @@ title: 'Анонимизированная веб-аналитика' doc_type: 'guide' --- -# Обезличенные данные веб-аналитики +# Обезличенные данные веб-аналитики {#anonymized-web-analytics-data} Этот набор данных состоит из двух таблиц, содержащих обезличенные данные веб-аналитики с запросами (`hits_v1`) и визитами (`visits_v1`). @@ -15,17 +15,17 @@ doc_type: 'guide' ## Скачать данные и выполнить их приём {#download-and-ingest-the-data} -### Скачайте сжатый TSV‑файл hits +### Скачайте сжатый TSV‑файл hits {#download-the-hits-compressed-tsv-file} ```bash curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv -# Проверьте контрольную сумму +# Проверьте контрольную сумму {#validate-the-checksum} md5sum hits_v1.tsv -# Контрольная сумма должна быть: f3631b6295bf06989c1437491f7592cb +# Контрольная сумма должна быть: f3631b6295bf06989c1437491f7592cb {#checksum-should-be-equal-to-f3631b6295bf06989c1437491f7592cb} ``` -### Создание базы данных и таблицы +### Создание базы данных и таблицы {#create-the-database-and-table} ```bash clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets" @@ -45,7 +45,7 @@ clickhouse-client --query="CREATE TABLE default.hits_100m_obfuscated (WatchID UI ``` -### Импортируйте данные таблицы hits +### Импортируйте данные таблицы hits {#import-the-hits-data} ```bash cat hits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.hits_v1 FORMAT TSV" --max_insert_block_size=100000 @@ -62,13 +62,13 @@ clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1" ``` -### Скачайте сжатый TSV‑файл visits +### Скачайте сжатый TSV‑файл visits {#download-the-visits-compressed-tsv-file} ```bash curl https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv -# Проверьте контрольную сумму +# Проверьте контрольную сумму {#validate-the-checksum} md5sum visits_v1.tsv -# Контрольная сумма должна быть: 6dafe1a0f24e59e3fc2d0fed85601de6 +# Контрольная сумма должна быть: 6dafe1a0f24e59e3fc2d0fed85601de6 {#checksum-should-be-equal-to-6dafe1a0f24e59e3fc2d0fed85601de6} ``` @@ -78,7 +78,7 @@ md5sum visits_v1.tsv 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" ``` -### Импортируйте данные о посещениях +### Импортируйте данные о посещениях {#import-the-visits-data} ```bash cat visits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.visits_v1 FORMAT TSV" --max_insert_block_size=100000 @@ -95,7 +95,7 @@ clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1" ``` -## Пример JOIN +## Пример JOIN {#an-example-join} Наборы данных hits и visits используются в тестовых процедурах ClickHouse; это один из запросов из набора тестов. Остальные diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md index ccf41157c95..8801c597b7d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md @@ -94,8 +94,7 @@ clickhouse-client --query "INSERT INTO mgbench.logs2 FORMAT CSVWithNames" < mgbe clickhouse-client --query "INSERT INTO mgbench.logs3 FORMAT CSVWithNames" < mgbench3.csv ``` - -## Выполните тестовые запросы +## Выполните тестовые запросы {#run-benchmark-queries} ```sql USE mgbench; @@ -209,7 +208,6 @@ ORDER BY machine_name, dt; ``` - ```sql -- Q1.6: Каков общий почасовой объём сетевого трафика по всем файловым серверам? diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md index 4fa7a616374..b1625e0f6fb 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md @@ -8,15 +8,15 @@ keywords: ['данные о сотовых вышках', 'геоданные', doc_type: 'guide' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; -import ActionsMenu from '@site/docs/_snippets/_service_actions_menu.md'; -import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; -import SupersetDocker from '@site/docs/_snippets/_add_superset_detail.md'; +import ActionsMenu from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_service_actions_menu.md'; +import SQLConsoleDetail from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_launch_sql_console.md'; +import SupersetDocker from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_add_superset_detail.md'; import cloud_load_data_sample from '@site/static/images/_snippets/cloud-load-data-sample.png'; import cell_towers_1 from '@site/static/images/getting-started/example-datasets/superset-cell-tower-dashboard.png' import add_a_database from '@site/static/images/getting-started/example-datasets/superset-add.png' @@ -30,7 +30,6 @@ import superset_radio_umts from '@site/static/images/getting-started/example-dat import superset_umts_netherlands from '@site/static/images/getting-started/example-datasets/superset-umts-netherlands.png' import superset_cell_tower_dashboard from '@site/static/images/getting-started/example-datasets/superset-cell-tower-dashboard.png' - ## Цель {#goal} В этом руководстве вы узнаете, как: @@ -125,7 +124,7 @@ INSERT INTO cell_towers SELECT * FROM s3('https://datasets-documentation.s3.amaz -## Выполните несколько примеров запросов +## Выполните несколько примеров запросов {#examples} 1. Количество сотовых вышек по типу: @@ -172,7 +171,6 @@ SELECT mcc, count() FROM cell_towers GROUP BY mcc ORDER BY count() DESC LIMIT 10 Вы можете создать в ClickHouse [словарь (Dictionary)](../../sql-reference/dictionaries/index.md) для расшифровки этих значений. - ## Сценарий использования: использование геоданных {#use-case} Использование функции [`pointInPolygon`](/sql-reference/functions/geo/coordinates.md/#pointinpolygon). @@ -267,7 +265,6 @@ WHERE pointInPolygon((lon, lat), (SELECT * FROM moscow)) Получено 1 строк. Затрачено: 0.067 сек. Обработано 43.28 млн строк, 692.42 МБ (645.83 млн строк/сек., 10.33 ГБ/сек.) ``` - ## Обзор схемы {#review-of-the-schema} Прежде чем создавать визуализации в Superset, ознакомьтесь со столбцами, которые вы будете использовать. Этот набор данных в первую очередь содержит сведения о местоположении (долгота и широта) и типах радиотехнологий на базовых станциях мобильной связи по всему миру. Описание столбцов можно найти на [форуме сообщества](https://community.opencellid.org/t/documenting-the-columns-in-the-downloadable-cells-database-csv/186). Столбцы, используемые в визуализациях, которые вы будете строить, описаны ниже. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md index d9ac9090303..3a53af2496d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md @@ -15,7 +15,7 @@ doc_type: 'guide' Набор данных содержит 26 файлов в формате `Parquet`, размещённых на [huggingface.co](https://huggingface.co/api/datasets/Qdrant/dbpedia-entities-openai3-text-embedding-3-large-1536-1M/parquet/default/train/). Файлы называются `0.parquet`, `1.parquet`, ..., `25.parquet`. Чтобы просмотреть несколько строк этого набора данных в качестве примера, перейдите на эту [страницу Hugging Face](https://huggingface.co/datasets/Qdrant/dbpedia-entities-openai3-text-embedding-3-large-1536-1M). -## Создание таблицы +## Создание таблицы {#create-table} Создайте таблицу `dbpedia` для хранения идентификатора статьи, заголовка, текста и векторного представления (эмбеддинга): @@ -31,7 +31,7 @@ CREATE TABLE dbpedia ``` -## Загрузка таблицы +## Загрузка таблицы {#load-table} Чтобы загрузить набор данных из всех файлов Parquet, выполните следующую команду в оболочке: @@ -74,7 +74,7 @@ FROM dbpedia _Ближайшими соседями_ являются документы, изображения или другой контент, релевантный запросу пользователя. Извлечённые результаты являются ключевыми входными данными для Retrieval Augmented Generation (RAG) в приложениях генеративного ИИ. -## Выполнить векторный поиск ближайших соседей методом полного перебора +## Выполнить векторный поиск ближайших соседей методом полного перебора {#run-a-brute-force-vector-similarity-search} Поиск KNN (k ближайших соседей) или поиск методом полного перебора предполагает вычисление расстояния от каждого вектора в наборе данных до вектора-запроса (эмбеддинга), а затем упорядочивание этих расстояний для получения ближайших соседей. Для набора данных `dbpedia` @@ -119,7 +119,7 @@ LIMIT 20 Также зафиксируйте задержку выполнения запроса при холодном файловом кэше ОС и с `max_threads=1`, чтобы оценить реальное использование вычислительных ресурсов и пропускную способность подсистемы хранения (экстраполируйте это на производственный набор данных с миллионами векторов!). -## Создание индекса векторного сходства +## Создание индекса векторного сходства {#build-vector-similarity-index} Выполните следующий SQL-запрос, чтобы определить и построить индекс векторного сходства для столбца `vector`: @@ -134,7 +134,7 @@ ALTER TABLE dbpedia MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2; Построение и сохранение индекса может занять несколько минут в зависимости от количества доступных ядер CPU и пропускной способности подсистемы хранения. -## Выполнение ANN-поиска +## Выполнение ANN-поиска {#perform-ann-search} *Approximate Nearest Neighbours* (ANN, приближённые ближайшие соседи) — это группа техник (например, специальные структуры данных, такие как графы и случайные леса), которые позволяют выполнять поиск значительно быстрее, чем точный векторный поиск. Точность результатов, как правило, «достаточно хороша» для практического применения. Во многих приближённых техниках предусмотрены параметры для настройки компромисса между точностью результатов и временем поиска. @@ -181,7 +181,7 @@ LIMIT 20 ``` -## Генерация эмбеддингов для поискового запроса +## Генерация эмбеддингов для поискового запроса {#generating-embeddings-for-search-query} Запросы поиска по сходству, рассмотренные до этого момента, используют один из существующих векторов в таблице `dbpedia` в качестве поискового вектора. В реальных приложениях поисковый вектор необходимо @@ -230,7 +230,7 @@ while True: ``` -## Демонстрационное приложение «Вопрос-ответ» +## Демонстрационное приложение «Вопрос-ответ» {#q-and-a-demo-application} Приведённые выше примеры демонстрировали семантический поиск и извлечение документов с использованием ClickHouse. Далее представлено очень простое, но обладающее высоким потенциалом демонстрационное приложение генеративного ИИ. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md index 9f0aad188f2..6dadef5c183 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md @@ -24,7 +24,7 @@ import visualization_4 from '@site/static/images/getting-started/example-dataset таких как магазины, рестораны, парки, игровые площадки и памятники. Он также включает дополнительные метаданные об этих местах, такие как категории и данные из социальных сетей. -## Исследование данных +## Исследование данных {#data-exploration} Для исследования данных мы будем использовать [`clickhouse-local`](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) — небольшую утилиту командной строки, которая предоставляет полноценный движок ClickHouse. Также вы можете использовать @@ -148,7 +148,7 @@ DESCRIBE s3('s3://fsq-os-places-us-east-1/release/dt=2025-04-08/places/parquet/* ``` -## Загрузка данных в ClickHouse +## Загрузка данных в ClickHouse {#loading-the-data} Если вы хотите сохранять данные на диске, вы можете использовать `clickhouse-server` или ClickHouse Cloud. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md index 78fb0c5d90e..4371f6f28d3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md @@ -29,7 +29,7 @@ import superset_authors_matrix_v2 from '@site/static/images/getting-started/exam * `line_changes` — 2.7G — 7,535,157 строк -## Генерация данных +## Генерация данных {#generating-the-data} Этот шаг необязателен. Мы свободно распространяем эти данные — см. раздел [Downloading and inserting the data](#downloading-and-inserting-the-data). @@ -73,7 +73,7 @@ CREATE TABLE git.commits * Linux — `~/clickhouse git-import` — 160 минут -## Загрузка и вставка данных +## Загрузка и вставка данных {#downloading-and-inserting-the-data} Следующие данные можно использовать для воспроизведения рабочего окружения. Также этот набор данных доступен на play.clickhouse.com — подробности см. в разделе [Queries](#queries). @@ -220,7 +220,7 @@ FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/clickhou Этот набор данных доступен на [play.clickhouse.com](https://sql.clickhouse.com?query_id=DCQPNPAIMAQXRLHYURLKVJ) в базе данных `git_clickhouse`. Для всех запросов мы предоставляем ссылку на эту среду, при необходимости подставляя соответствующее имя базы данных. Обратите внимание, что результаты в play могут отличаться от представленных здесь из‑за различий во времени сбора данных. -### История одного файла +### История одного файла {#history-of-a-single-file} Самый простой из запросов. Здесь мы просматриваем все сообщения коммитов для `StorageReplicatedMergeTree.cpp`. Поскольку они, вероятно, более интересны, мы сортируем их по дате, начиная с самых свежих сообщений. @@ -296,7 +296,7 @@ LIMIT 10 Обратите внимание, что существует более сложный вариант этого запроса, позволяющий получить [построчную историю коммитов файла](#line-by-line-commit-history-of-a-file) с учётом переименований. -### Найти текущие активные файлы +### Найти текущие активные файлы {#find-the-current-active-files} Это важно для последующего анализа, когда нам нужно учитывать только текущие файлы в репозитории. Мы определяем этот набор как файлы, которые не были переименованы или удалены (а затем заново добавлены/переименованы). @@ -428,7 +428,7 @@ git ls-files | grep -v -E 'generated\.cpp|^(contrib|docs?|website|libs/(libcityh Эти различия не должны существенно повлиять на наш анализ. **Будем признательны за улучшенные версии этого запроса**. -### Список файлов с наибольшим числом изменений +### Список файлов с наибольшим числом изменений {#list-files-with-most-modifications} Если ограничиться текущими файлами, считаем числом изменений сумму удалений и добавлений. @@ -484,7 +484,7 @@ LIMIT 10 ``` -### В какой день недели обычно совершаются коммиты? +### В какой день недели обычно совершаются коммиты? {#what-day-of-the-week-do-commits-usually-occur} [play](https://sql.clickhouse.com?query_id=GED2STFSYJDRAA59H8RLIV) @@ -510,7 +510,7 @@ GROUP BY dayOfWeek(time) AS day_of_week Это вполне логично: по пятницам наблюдается небольшое снижение продуктивности. Здорово видеть, что люди коммитят код по выходным! Огромное спасибо нашим контрибьюторам! -### История подкаталога/файла — количество строк, коммитов и контрибьюторов в динамике +### История подкаталога/файла — количество строк, коммитов и контрибьюторов в динамике {#history-of-subdirectoryfile---number-of-lines-commits-and-contributors-over-time} Это приведёт к очень большому результату запроса, который невозможно разумно отобразить или визуализировать без фильтрации. Поэтому в следующем примере мы позволяем отфильтровать данные по файлу или подкаталогу. Здесь мы группируем по неделям с помощью функции `toStartOfWeek` — при необходимости адаптируйте под свои задачи. @@ -555,7 +555,7 @@ LIMIT 10 For commits and authors -### Вывести список файлов с максимальным числом авторов +### Вывести список файлов с максимальным числом авторов {#list-files-with-maximum-number-of-authors} Ограничить выборку только текущими файлами. @@ -611,7 +611,7 @@ LIMIT 10 ``` -### Самые старые строки кода в репозитории +### Самые старые строки кода в репозитории {#oldest-lines-of-code-in-the-repository} Только по текущим файлам. @@ -669,7 +669,7 @@ LIMIT 10 ``` -### Файлы с самой длинной историей +### Файлы с самой длинной историей {#files-with-longest-history} Только текущие файлы. @@ -728,7 +728,7 @@ LIMIT 10 Наша основная структура данных MergeTree, разумеется, постоянно развивается и имеет долгую историю доработок! -### Распределение вклада контрибьюторов между документацией и кодом в течение месяца +### Распределение вклада контрибьюторов между документацией и кодом в течение месяца {#distribution-of-contributors-with-respect-to-docs-and-code-over-the-month} **Во время сбора данных изменения в папке `docs/` были исключены из анализа из‑за очень запутанной истории коммитов. Поэтому результаты этого запроса не являются точными.** @@ -792,7 +792,7 @@ FROM Возможно, чуть больше ближе к концу месяца, но в целом распределение остаётся достаточно равномерным. Однако на эти данные нельзя полностью полагаться из‑за фильтрации фильтром docs при вставке. -### Авторы с наиболее разнообразным вкладом +### Авторы с наиболее разнообразным вкладом {#authors-with-the-most-diverse-impact} Под разнообразием вклада здесь мы понимаем количество уникальных файлов, в которые автор вносил изменения. @@ -870,7 +870,7 @@ LIMIT 10 ``` -### Избранные файлы автора +### Избранные файлы автора {#favorite-files-for-an-author} Здесь мы выбираем нашего основателя, [Алексея Миловидова](https://github.com/alexey-milovidov), и ограничиваем анализ только текущими файлами. @@ -957,7 +957,7 @@ LIMIT 10 Это, возможно, лучше отражает его сферы интересов. -### Самые большие файлы с наименьшим числом авторов +### Самые большие файлы с наименьшим числом авторов {#largest-files-with-lowest-number-of-authors} Для этого сначала нужно определить самые большие файлы. Оценивать их с помощью полного восстановления каждого файла по всей истории коммитов — слишком затратно! @@ -1130,7 +1130,7 @@ LIMIT 10 ``` -### Распределение коммитов и строк кода по времени: по дням недели, по авторам, для отдельных поддиректорий +### Распределение коммитов и строк кода по времени: по дням недели, по авторам, для отдельных поддиректорий {#commits-and-lines-of-code-distribution-by-time-by-weekday-by-author-for-specific-subdirectories} Мы рассматриваем это как количество добавленных и удалённых строк по дням недели. В данном случае мы сосредотачиваемся на [директории Functions](https://github.com/ClickHouse/ClickHouse/tree/master/src/Functions) @@ -1258,7 +1258,7 @@ FROM ``` -### Матрица авторов, показывающая, какие из них склонны переписывать код других авторов +### Матрица авторов, показывающая, какие из них склонны переписывать код других авторов {#matrix-of-authors-that-shows-what-authors-tends-to-rewrite-another-authors-code} `sign = -1` указывает на удаление кода. Мы не учитываем знаки препинания и вставку пустых строк. @@ -1313,7 +1313,7 @@ LIMIT 100 Superset матрица авторов v2 -### Кто делает наибольшую долю коммитов в каждый день недели? +### Кто делает наибольшую долю коммитов в каждый день недели? {#who-is-the-highest-percentage-contributor-per-day-of-week} Если смотреть только на количество коммитов: @@ -1514,7 +1514,7 @@ LIMIT 5 BY root ``` -### Какой процент кода автора был удалён другими авторами? +### Какой процент кода автора был удалён другими авторами? {#what-percentage-of-code-for-an-author-has-been-removed-by-other-authors} Для ответа на этот вопрос нам нужно количество строк, написанных автором, разделить на общее количество его строк, которые были удалены другим участником. @@ -1565,7 +1565,7 @@ LIMIT 10 ``` -### Список файлов, которые переписывались чаще всего? +### Список файлов, которые переписывались чаще всего? {#list-files-that-were-rewritten-most-number-of-times} Самый простой способ ответить на этот вопрос — просто посчитать максимальное количество изменений строк для каждого пути (ограничившись текущими файлами), например: @@ -1708,7 +1708,7 @@ LIMIT 10 ``` -### В какой день недели у кода наибольший шанс остаться в репозитории? +### В какой день недели у кода наибольший шанс остаться в репозитории? {#what-weekday-does-the-code-have-the-highest-chance-to-stay-in-the-repository} Для этого нам нужно однозначно идентифицировать строку кода. Мы делаем это (так как одна и та же строка может встречаться в файле несколько раз) с помощью пути и содержимого строки. @@ -1771,7 +1771,7 @@ GROUP BY dayOfWeek(added_day) AS day_of_week_added ``` -### Файлы, отсортированные по среднему возрасту кода +### Файлы, отсортированные по среднему возрасту кода {#files-sorted-by-average-code-age} Этот запрос использует тот же принцип, что и [В какой день недели у кода наибольший шанс остаться в репозитории](#what-weekday-does-the-code-have-the-highest-chance-to-stay-in-the-repository): мы стремимся однозначно идентифицировать строку кода по пути и её содержимому. Это позволяет определить интервал между моментом, когда строка была добавлена, и моментом, когда она была удалена. При этом мы ограничиваемся текущими файлами и актуальным кодом и усредняем время для каждого файла по всем строкам. @@ -1862,7 +1862,7 @@ LIMIT 10 ``` -### Кто, как правило, пишет больше тестов / C++‑кода / комментариев? +### Кто, как правило, пишет больше тестов / C++‑кода / комментариев? {#who-tends-to-write-more-tests--cpp-code--comments} Есть несколько способов подойти к этому вопросу. Если сосредоточиться на соотношении кода и тестов, то этот запрос относительно прост — нужно посчитать количество изменений в каталогах, содержащих `tests`, и вычислить их долю от общего числа изменений. @@ -1996,7 +1996,7 @@ LIMIT 10 Обратите внимание, что сортировка ведётся по количеству вкладов в код. У всех наших крупнейших контрибьюторов удивительно высокий процент — это одна из причин, почему наш код такой читаемый. -### Как со временем меняется доля кода и комментариев в коммитах автора? +### Как со временем меняется доля кода и комментариев в коммитах автора? {#how-does-an-authors-commits-change-over-time-with-respect-to-codecomments-percentage} Вычислить это по каждому автору тривиально, @@ -2114,7 +2114,7 @@ LIMIT 20 Обнадеживает, что наша доля комментариев остается примерно постоянной и не снижается по мере роста стажа авторов. -### Каково среднее время до переписывания кода и медиана (период «полураспада» кода)? +### Каково среднее время до переписывания кода и медиана (период «полураспада» кода)? {#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](#list-files-that-were-rewritten-most-number-of-times) для определения переписываний, но применить его ко всем файлам. Оконная функция позволяет вычислить время между переписываниями для каждого файла. На этой основе мы можем посчитать среднее и медиану по всем файлам. @@ -2175,7 +2175,7 @@ FROM rewrites ``` -### В какое время писать код хуже всего с точки зрения наибольшей вероятности его последующего переписывания? +### В какое время писать код хуже всего с точки зрения наибольшей вероятности его последующего переписывания? {#what-is-the-worst-time-to-write-code-in-sense-that-the-code-has-highest-chance-to-be-re-written} Аналогично разделам [Каково среднее время до переписывания кода и медиана (период полураспада кода)?](#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-times), за исключением того, что здесь мы агрегируем по дням недели. При необходимости скорректируйте, например, по месяцам года. @@ -2240,7 +2240,7 @@ GROUP BY dayOfWeek ``` -### Чей код «держится» дольше всего? +### Чей код «держится» дольше всего? {#which-authors-code-is-the-most-sticky} Мы определяем «липкость» как то, как долго код автора остается в репозитории, прежде чем его перепишут. Аналогично предыдущему вопросу [Какое среднее время до переписывания кода и медианное значение (период полураспада деградации кода)?](#what-is-the-average-time-before-code-will-be-rewritten-and-the-median-half-life-of-code-decay) — используем тот же критерий переписывания, то есть 50% добавлений и 50% удалений в файле. Мы вычисляем среднее время до переписывания для каждого автора и учитываем только контрибьюторов с более чем двумя файлами. @@ -2318,7 +2318,7 @@ LIMIT 10 ``` -### Наибольшее количество последовательных дней с коммитами у автора +### Наибольшее количество последовательных дней с коммитами у автора {#most-consecutive-days-of-commits-by-an-author} Сначала в этом запросе необходимо определить дни, в которые автор делал коммиты. Используя оконную функцию с разбиением по автору, мы можем вычислить количество дней между его коммитами. Для каждого коммита, если с момента предыдущего прошёл 1 день, мы помечаем его как последовательный (1), в противном случае — 0, сохраняя результат в поле `consecutive_day`. @@ -2374,7 +2374,7 @@ LIMIT 10 ``` -### Построчная история коммитов файла +### Построчная история коммитов файла {#line-by-line-commit-history-of-a-file} Файлы могут быть переименованы. Когда это происходит, мы получаем событие переименования, в котором столбец `path` содержит новый путь к файлу, а `old_path` — его прежнее расположение, например: @@ -2455,7 +2455,7 @@ FORMAT PrettyCompactMonoBlock ## Открытые вопросы {#unsolved-questions} -### Git blame +### Git blame {#git-blame} Получить точный результат особенно сложно из‑за того, что в настоящий момент в функциях для работы с массивами нельзя хранить состояние. Это станет возможным с помощью `arrayFold` или `arrayReduce`, которые позволяют сохранять состояние на каждой итерации. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md index ec10b335995..d60d555c526 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md @@ -7,7 +7,7 @@ doc_type: 'guide' keywords: ['пример набора данных', 'hacker news', 'пример данных', 'анализ текста', 'векторный поиск'] --- -# Набор данных Hacker News +# Набор данных Hacker News {#hacker-news-dataset} > В этом руководстве вы загрузите в таблицу ClickHouse 28 миллионов строк данных Hacker News из форматов CSV и Parquet и выполните несколько простых запросов, чтобы изучить данные. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md index 187c9d3b129..954067b6288 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md @@ -11,7 +11,7 @@ keywords: ['пример набора данных', 'laion', 'векторны Набор данных содержит URL-адрес изображения, векторные представления (эмбеддинги) как для изображения, так и для подписи, оценку сходства между изображением и подписью, а также метаданные, например ширину и высоту изображения, лицензию и флаг NSFW. Мы можем использовать этот набор данных для демонстрации [поиска приблизительных ближайших соседей](../../engines/table-engines/mergetree-family/annindexes.md) в ClickHouse. -## Подготовка данных +## Подготовка данных {#data-preparation} Эмбеддинги и метаданные хранятся в отдельных файлах в исходных данных. На этапе подготовки данные загружаются, файлы объединяются, преобразуются в CSV и импортируются в ClickHouse. Для этого вы можете использовать следующий скрипт `download.sh`: @@ -40,28 +40,28 @@ npy_file = "img_emb_" + str_i + '.npy' metadata_file = "metadata_" + str_i + '.parquet' text_npy = "text_emb_" + str_i + '.npy' -# загрузка всех файлов +# загрузка всех файлов {#load-all-files} im_emb = np.load(npy_file) text_emb = np.load(text_npy) data = pd.read_parquet(metadata_file) -# объединение файлов +# объединение файлов {#combine-files} data = pd.concat([data, pd.DataFrame({"image_embedding" : [*im_emb]}), pd.DataFrame({"text_embedding" : [*text_emb]})], axis=1, copy=False) -# столбцы для импорта в ClickHouse +# столбцы для импорта в ClickHouse {#columns-to-be-imported-into-clickhouse} data = data[['url', 'caption', 'NSFW', 'similarity', "image_embedding", "text_embedding"]] -# преобразование np.arrays в списки +# преобразование np.arrays в списки {#transform-nparrays-to-lists} data['image_embedding'] = data['image_embedding'].apply(lambda x: x.tolist()) data['text_embedding'] = data['text_embedding'].apply(lambda x: x.tolist()) -# этот небольшой хак необходим, поскольку caption иногда содержит различные типы кавычек +# этот небольшой хак необходим, поскольку caption иногда содержит различные типы кавычек {#this-small-hack-is-needed-because-caption-sometimes-contains-all-kind-of-quotes} data['caption'] = data['caption'].apply(lambda x: x.replace("'", " ").replace('"', " ")) -# экспорт данных в CSV-файл +# экспорт данных в CSV-файл {#export-data-as-csv-file} data.to_csv(str_i + '.csv', header=False) -# удаление исходных файлов данных +# удаление исходных файлов данных {#removed-raw-data-files} os.system(f"rm {npy_file} {metadata_file} {text_npy}") ``` @@ -76,7 +76,7 @@ seq 0 409 | xargs -P1 -I{} bash -c './download.sh {}' (Приведённый выше скрипт на Python очень медленный (~2–10 минут на файл), потребляет много памяти (41 ГБ на файл), а получающиеся CSV‑файлы большие (10 ГБ каждый), поэтому будьте осторожны. Если у вас достаточно RAM, увеличьте значение `-P1` для большего параллелизма. Если этого всё ещё недостаточно и обработка остаётся слишком медленной, рассмотрите более эффективную процедуру ингестии — например, сначала конвертировать файлы .npy в parquet, а затем выполнять всю остальную обработку с помощью ClickHouse.) -## Создание таблицы +## Создание таблицы {#create-table} Чтобы сначала создать таблицу без индексов, выполните: @@ -105,7 +105,7 @@ INSERT INTO laion FROM INFILE '{path_to_csv_files}/*.csv' Обратите внимание, что столбец `id` служит лишь для иллюстрации и заполняется скриптом неуникальными значениями. -## Запуск векторного поиска методом перебора +## Запуск векторного поиска методом перебора {#run-a-brute-force-vector-similarity-search} Чтобы выполнить векторный поиск методом перебора, выполните: @@ -137,7 +137,7 @@ SELECT url, caption FROM laion ORDER BY cosineDistance(image_embedding, {target: ``` -## Выполните приближённый поиск по сходству векторов с использованием индекса сходства векторов +## Выполните приближённый поиск по сходству векторов с использованием индекса сходства векторов {#run-an-approximate-vector-similarity-search-with-a-vector-similarity-index} Теперь определим два индекса сходства векторов для таблицы. @@ -194,7 +194,7 @@ SELECT url, caption FROM laion ORDER BY cosineDistance(image_embedding, {target: Обычно требуется создавать эмбеддинги для новых изображений или новых подписей к изображениям и искать в данных похожие пары «изображение — подпись к изображению». Мы можем использовать [UDF](/sql-reference/functions/udf), чтобы создать вектор `target`, не выходя за пределы клиентского приложения. Важно использовать одну и ту же модель и для исходных данных, и для новых эмбеддингов при выполнении поисковых запросов. В следующих скриптах используется модель `ViT-B/32`, которая также лежит в основе набора данных. -### Текстовые эмбеддинги +### Текстовые эмбеддинги {#text-embeddings} Сначала поместите следующий скрипт Python в каталог `user_scripts/` в каталоге данных ClickHouse и сделайте его исполняемым (`chmod +x encode_text.py`). @@ -256,7 +256,7 @@ LIMIT 10 Обратите внимание, что сам UDF `encode_text()` может занимать несколько секунд на вычисление и выдачу векторного представления (эмбеддинга). -### Векторные представления изображений +### Векторные представления изображений {#image-embeddings} Векторные представления изображений можно создать аналогичным образом; для этого мы предоставляем сценарий на Python, который генерирует векторное представление изображения, сохранённого локально в файле. @@ -304,7 +304,7 @@ if __name__ == '__main__': Загрузите пример изображения для поиска: ```shell -# получить случайное изображение набора LEGO +# получить случайное изображение набора LEGO {#get-a-random-image-of-a-lego-set} $ wget http://cdn.firstcry.com/brainbees/images/products/thumb/191325a.jpg ``` diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md index 4ce6d538c66..2a720e37590 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md @@ -16,22 +16,22 @@ keywords: ['пример набора данных', 'меню', 'историч Данные взяты из архива библиотеки, поэтому они могут быть неполными и неудобными для статистического анализа. Тем не менее, они ещё и очень «аппетитные». Объём составляет всего 1,3 миллиона записей о блюдах в меню — это очень небольшой объём данных для ClickHouse, но всё же это хороший пример. -## Загрузите набор данных +## Загрузите набор данных {#download-dataset} Выполните команду: ```bash wget https://s3.amazonaws.com/menusdata.nypl.org/gzips/2021_08_01_07_01_17_data.tgz -# Опционально: Проверка контрольной суммы +# Опционально: Проверка контрольной суммы {#option-validate-the-checksum} md5sum 2021_08_01_07_01_17_data.tgz -# Контрольная сумма должна быть равна: db6126724de939a5481e3160a2d67d15 +# Контрольная сумма должна быть равна: db6126724de939a5481e3160a2d67d15 {#checksum-should-be-equal-to-db6126724de939a5481e3160a2d67d15} ``` При необходимости замените ссылку на актуальную с [http://menus.nypl.org/data](http://menus.nypl.org/data). Размер загрузки составляет около 35 МБ. -## Распакуйте датасет +## Распакуйте датасет {#unpack-dataset} ```bash tar xvf 2021_08_01_07_01_17_data.tgz @@ -47,7 +47,7 @@ tar xvf 2021_08_01_07_01_17_data.tgz * `MenuItem` — Позиция меню. Блюдо вместе с его ценой на определённой странице меню: ссылки на блюдо и страницу меню. -## Создайте таблицы +## Создайте таблицы {#create-tables} Для хранения цен мы используем тип данных [Decimal](../../sql-reference/data-types/decimal.md). @@ -115,7 +115,7 @@ CREATE TABLE menu_item ``` -## Импортируйте данные +## Импортируйте данные {#import-data} Чтобы загрузить данные в ClickHouse, выполните следующую команду: @@ -135,7 +135,7 @@ clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_defa Настройка [date_time_input_format best_effort](/operations/settings/formats#date_time_input_format) позволяет разбирать поля [DateTime](../../sql-reference/data-types/datetime.md) в широком диапазоне форматов. Например, будет распознан формат ISO-8601 без секунд, такой как '2000-01-01 01:02'. Без этой настройки разрешён только фиксированный формат DateTime. -## Денормализация данных +## Денормализация данных {#denormalize-data} Данные представлены в нескольких таблицах в [нормализованной форме](https://en.wikipedia.org/wiki/Database_normalization#Normal_forms). Это означает, что вам нужно выполнять [JOIN](/sql-reference/statements/select/join), если вы хотите, например, получить названия блюд из пунктов меню. Для типичных аналитических задач гораздо эффективнее работать с данными, заранее объединёнными с помощью `JOIN`, чтобы не выполнять `JOIN` каждый раз. Такие данные называются «денормализованными». @@ -188,7 +188,7 @@ FROM menu_item ``` -## Проверьте данные +## Проверьте данные {#validate-data} Запрос: @@ -207,7 +207,7 @@ SELECT count() FROM menu_item_denorm; ## Выполните несколько запросов {#run-queries} -### Средние исторические цены на блюда +### Средние исторические цены на блюда {#query-averaged-historical-prices} Запрос: @@ -250,7 +250,7 @@ ORDER BY d ASC; Не воспринимайте это слишком всерьёз. -### Цены на бургеры +### Цены на бургеры {#query-burger-prices} Запрос: @@ -288,7 +288,7 @@ ORDER BY d ASC; ``` -### Водка +### Водка {#query-vodka} Запрос: @@ -323,7 +323,7 @@ ORDER BY d ASC; Чтобы получить «водку», нам нужно написать `ILIKE '%vodka%'`, и это, мягко говоря, звучит многозначительно. -### Икра +### Икра {#query-caviar} Выведем цены на икру, а также название любого блюда с икрой. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md index 51a12af366d..816e4a6af05 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md @@ -28,7 +28,7 @@ keywords: ['пример набора данных', 'noaa', 'погодные - [Предварительно подготовленная версия](#pre-prepared-data) данных для ClickHouse, очищенная, переработанная и обогащённая. Эти данные охватывают период с 1900 по 2022 годы. - [Скачать исходные данные](#original-data) и преобразовать их в формат, требуемый ClickHouse. Пользователи, желающие добавить собственные столбцы, могут использовать этот подход. -### Предварительно подготовленные данные +### Предварительно подготовленные данные {#pre-prepared-data} Более конкретно, были удалены строки, не провалившие ни одной проверки качества со стороны NOAA. Данные также были реструктурированы из формата «одно измерение на строку» в формат «одна строка на идентификатор станции и дату», т. е. @@ -55,7 +55,7 @@ wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enriche Ниже приведены шаги по скачиванию и преобразованию исходных данных перед их загрузкой в ClickHouse. -#### Загрузка +#### Загрузка {#download} Чтобы скачать исходные данные: @@ -64,7 +64,7 @@ for i in {1900..2023}; do wget https://noaa-ghcn-pds.s3.amazonaws.com/csv.gz/${i ``` -#### Сэмплирование данных +#### Сэмплирование данных {#sampling-the-data} ```bash $ clickhouse-local --query "SELECT * FROM '2021.csv.gz' LIMIT 10" --format PrettyCompact @@ -108,7 +108,7 @@ $ clickhouse-local --query "SELECT * FROM '2021.csv.gz' LIMIT 10" --format Prett Формат «одно измерение на строку» приведёт к разрежённой структуре таблицы в ClickHouse. Мы должны преобразовать данные к формату «одна строка на момент времени и станцию», с измерениями в виде столбцов. Сначала мы ограничим набор данных строками без проблем, т.е. где `qFlag` равен пустой строке. -#### Очистите данные +#### Очистите данные {#clean-the-data} Используя [ClickHouse local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local), мы можем отфильтровать строки, которые представляют интересующие нас измерения и соответствуют нашим требованиям к качеству: @@ -122,7 +122,7 @@ FROM file('*.csv.gz', CSV, 'station_id String, date String, measurement String, При объёме более 2,6 миллиарда строк этот запрос получается не очень быстрым, так как нужно разобрать все файлы. На нашей машине с 8 ядрами это занимает около 160 секунд. -### Преобразование данных (pivot) +### Преобразование данных (pivot) {#pivot-data} Хотя структуру «одно измерение на строку» можно использовать с ClickHouse, она будет излишне усложнять будущие запросы. В идеале нам нужна одна строка по идентификатору станции и дате, где каждый тип измерения и соответствующее ему значение представлены отдельным столбцом, т. е. @@ -161,7 +161,7 @@ done Этот запрос создаёт один файл `noaa.csv` размером 50 ГБ. -### Обогащение данных +### Обогащение данных {#enriching-the-data} В данных нет информации о местоположении, кроме идентификатора станции, который включает префикс с кодом страны. В идеале у каждой станции должны быть указаны широта и долгота. Для этого NOAA предоставляет сведения о каждой станции в отдельном файле [ghcnd-stations.txt](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn#format-of-ghcnd-stationstxt-file). Этот файл содержит [несколько столбцов](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn#format-of-ghcnd-stationstxt-file), из которых пять пригодятся для нашего дальнейшего анализа: id, latitude, longitude, elevation и name. @@ -194,7 +194,7 @@ FROM file('noaa.csv', CSV, Этот запрос выполняется в течение нескольких минут и создаёт файл размером 6,4 ГБ, `noaa_enriched.parquet`. -## Создание таблицы +## Создание таблицы {#create-table} Создайте таблицу MergeTree в ClickHouse (в клиенте ClickHouse). @@ -223,7 +223,7 @@ CREATE TABLE noaa ## Добавление данных в ClickHouse {#inserting-into-clickhouse} -### Вставка из локального файла +### Вставка из локального файла {#inserting-from-local-file} Данные можно вставить из локального файла следующим образом (в клиенте ClickHouse): @@ -236,7 +236,7 @@ INSERT INTO noaa FROM INFILE '<путь>/noaa_enriched.parquet' См. [здесь](https://clickhouse.com/blog/real-world-data-noaa-climate-data#load-the-data), чтобы узнать, как ускорить загрузку данных. -### Вставка из S3 +### Вставка из S3 {#inserting-from-s3} ```sql INSERT INTO noaa SELECT * @@ -249,7 +249,7 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enr ## Примеры запросов {#sample-queries} -### Максимальная температура за всё время +### Максимальная температура за всё время {#highest-temperature-ever} ```sql SELECT @@ -278,7 +278,7 @@ LIMIT 5 Обнадеживающе соответствует [задокументированному рекорду](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 год. -### Лучшие горнолыжные курорты +### Лучшие горнолыжные курорты {#best-ski-resorts} Используя [список горнолыжных курортов](https://gist.githubusercontent.com/gingerwizard/dd022f754fd128fdaf270e58fa052e35/raw/622e03c37460f17ef72907afe554cb1c07f91f23/ski_resort_stats.csv) в США и их координаты, мы объединяем его с топ-1000 метеостанций с наибольшими снегопадами в любой месяц за последние 5 лет. Отсортировав результат этого объединения по [geoDistance](/sql-reference/functions/geo/coordinates/#geodistance) и ограничив выборку расстоянием менее 20 км, мы выбираем лучший результат для каждого курорта и затем сортируем полученный список по суммарному количеству снега. Обратите внимание, что мы также ограничиваем выборку курортами, расположенными выше 1800 м, как общим индикатором хороших условий для катания. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md index 7e7bcad570d..0dafaa6a050 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md @@ -24,7 +24,7 @@ import TabItem from '@theme/TabItem'; ::: -## Создайте таблицу trips +## Создайте таблицу trips {#create-the-table-trips} Сначала создайте таблицу для поездок на такси: @@ -126,7 +126,7 @@ FROM gcs( -## Примеры запросов +## Примеры запросов {#sample-queries} Следующие запросы выполняются для описанного выше примера. Пользователи могут запускать эти примерные запросы на полном наборе данных в [sql.clickhouse.com](https://sql.clickhouse.com/?query=U0VMRUNUIGNvdW50KCkgRlJPTSBueWNfdGF4aS50cmlwcw\&chart=eyJ0eXBlIjoibGluZSIsImNvbmZpZyI6eyJ0aXRsZSI6IlRlbXBlcmF0dXJlIGJ5IGNvdW50cnkgYW5kIHllYXIiLCJ4YXhpcyI6InllYXIiLCJ5YXhpcyI6ImNvdW50KCkiLCJzZXJpZXMiOiJDQVNUKHBhc3Nlbmdlcl9jb3VudCwgJ1N0cmluZycpIn19), изменив приведённые ниже запросы для использования таблицы `nyc_taxi.trips`. @@ -183,7 +183,7 @@ ORDER BY passenger_count ASC ``` -## Скачивание подготовленных партиций +## Скачивание подготовленных партиций {#download-of-prepared-partitions} :::note Следующие шаги содержат информацию об исходном наборе данных и метод загрузки подготовленных партиций в самостоятельно управляемую среду сервера ClickHouse. @@ -196,9 +196,9 @@ ORDER BY passenger_count ASC ```bash $ curl -O https://datasets.clickhouse.com/trips_mergetree/partitions/trips_mergetree.tar -# Проверьте контрольную сумму +# Проверьте контрольную сумму {#validate-the-checksum} $ md5sum trips_mergetree.tar -# Контрольная сумма должна быть: f3b8d469b41d9a82da064ded7245d12c +# Контрольная сумма должна быть: f3b8d469b41d9a82da064ded7245d12c {#checksum-should-be-equal-to-f3b8d469b41d9a82da064ded7245d12c} $ tar xvf trips_mergetree.tar -C /var/lib/clickhouse # путь к каталогу данных ClickHouse $ # проверьте права доступа к распакованным данным и исправьте при необходимости $ sudo service clickhouse-server restart @@ -210,7 +210,7 @@ $ clickhouse-client --query "select count(*) from datasets.trips_mergetree" ::: -## Результаты на одном сервере +## Результаты на одном сервере {#results-on-single-server} Q1: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md index a51d21eb170..89f81878b6e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md @@ -42,7 +42,7 @@ keywords: ['пример набора данных', 'nypd', 'данные о п Перед началом работы с базой данных ClickHouse ознакомьтесь с данными. -### Посмотрите на поля из исходного TSV-файла +### Посмотрите на поля из исходного TSV-файла {#look-at-the-fields-in-the-source-tsv-file} Это пример команды для выполнения запроса к TSV-файлу, но пока не запускайте её. @@ -120,7 +120,7 @@ New Georeferenced Column Nullable(String) На этом этапе вам следует проверить, что столбцы в TSV‑файле совпадают по названиям и типам с указанными в разделе **Columns in this Dataset** на [веб‑странице набора данных](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243). Типы данных заданы не очень строго: все числовые поля имеют тип `Nullable(Float64)`, а все остальные поля — `Nullable(String)`. При создании таблицы ClickHouse для хранения этих данных вы можете задать более подходящие и эффективные типы. -### Определите подходящую схему +### Определите подходящую схему {#determine-the-proper-schema} Чтобы определить, какие типы следует использовать для полей, необходимо понимать, как выглядят данные. Например, поле `JURISDICTION_CODE` представляет собой числовое значение: должно ли оно иметь тип `UInt8`, `Enum` или подойдет `Float64`? @@ -211,7 +211,7 @@ clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ В используемом на момент написания наборе данных всего несколько сотен уникальных парков и игровых площадок в столбце `PARK_NM`. Это небольшое количество и оно укладывается в рекомендацию для [LowCardinality](/sql-reference/data-types/lowcardinality#description) — не превышать 10 000 различных строк в поле типа `LowCardinality(String)`. -### Поля DateTime +### Поля DateTime {#datetime-fields} Согласно разделу **Columns in this Dataset** на [веб‑странице набора данных](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243), в этом наборе данных есть поля даты и времени для начала и окончания зарегистрированного события. Анализ минимальных и максимальных значений полей `CMPLNT_FR_DT` и `CMPLT_TO_DT` позволяет понять, всегда ли эти поля заполняются: @@ -298,7 +298,7 @@ FORMAT PrettyCompact" Требуется внести ещё множество изменений в типы; все их можно определить, следуя тем же шагам анализа. Посмотрите на количество различных строковых значений в поле, минимальные и максимальные значения числовых полей и принимайте решения. Схема таблицы, которая приводится далее в руководстве, содержит много строковых полей с низкой кардинальностью и полей с беззнаковыми целыми числами и очень мало чисел с плавающей точкой. ::: -## Объединение полей даты и времени +## Объединение полей даты и времени {#concatenate-the-date-and-time-fields} Чтобы объединить поля даты и времени `CMPLNT_FR_DT` и `CMPLNT_FR_TM` в одну строку (`String`), которую затем можно привести к типу `DateTime`, выберите выражение с двумя полями, соединёнными оператором конкатенации: `CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM`. Поля `CMPLNT_TO_DT` и `CMPLNT_TO_TM` обрабатываются аналогичным образом. @@ -329,7 +329,7 @@ FORMAT PrettyCompact" ``` -## Преобразование строкового значения даты и времени в тип DateTime64 +## Преобразование строкового значения даты и времени в тип DateTime64 {#convert-the-date-and-time-string-to-a-datetime64-type} Ранее в этом руководстве мы обнаружили, что в TSV-файле есть даты до 1 января 1970 года, что означает, что нам нужен 64-битный тип DateTime64 для хранения дат. Даты также нужно преобразовать из формата `MM/DD/YYYY` в формат `YYYY/MM/DD`. Оба этих действия можно выполнить с помощью функции [`parseDateTime64BestEffort()`](../../sql-reference/functions/type-conversion-functions.md#parsedatetime64besteffort). @@ -390,7 +390,7 @@ FORMAT PrettyCompact" Принятые выше решения относительно типов данных, используемых для столбцов, отражены в приведённой ниже схеме таблицы. Нам также необходимо определить `ORDER BY` и `PRIMARY KEY`, которые будут использоваться в таблице. Должен быть указан как минимум один из `ORDER BY` или `PRIMARY KEY`. Ниже приведены некоторые рекомендации по выбору столбцов для включения в `ORDER BY`; дополнительная информация приведена в разделе *Next Steps* в конце этого документа. -### Операторы `ORDER BY` и `PRIMARY KEY` +### Операторы `ORDER BY` и `PRIMARY KEY` {#order-by-and-primary-key-clauses} * Кортеж `ORDER BY` должен включать поля, которые используются в фильтрах запросов * Для максимального сжатия на диске кортеж `ORDER BY` должен быть упорядочен по возрастанию кардинальности полей @@ -486,7 +486,7 @@ CREATE TABLE NYPD_Complaint ( ``` -### Поиск первичного ключа таблицы +### Поиск первичного ключа таблицы {#finding-the-primary-key-of-a-table} Системная база данных ClickHouse `system`, в частности таблица `system.table`, содержит всю информацию о таблице, которую вы только что создали. Этот запрос показывает `ORDER BY` (ключ сортировки) и `PRIMARY KEY`: @@ -521,7 +521,7 @@ table: NYPD_Complaint Используем утилиту `clickhouse-local` для предварительной обработки данных и `clickhouse-client` для их загрузки. -### Используемые аргументы `clickhouse-local` +### Используемые аргументы `clickhouse-local` {#clickhouse-local-arguments-used} :::tip `table='input'` присутствует в аргументах clickhouse-local ниже. clickhouse-local принимает переданные входные данные (`cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv`) и вставляет их в таблицу. По умолчанию таблица называется `table`. В этом руководстве имя таблицы задано как `input`, чтобы сделать поток данных более наглядным. Последний аргумент clickhouse-local — это запрос, который выбирает данные из таблицы (`FROM input`), после чего результат перенаправляется в `clickhouse-client` для заполнения таблицы `NYPD_Complaint`. @@ -572,7 +572,7 @@ cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv \ ``` -## Проверка данных +## Проверка данных {#validate-data} :::note Набор данных обновляется один или несколько раз в год, поэтому ваши результаты подсчёта могут отличаться от приведённых в этом документе. @@ -616,7 +616,7 @@ WHERE name = 'NYPD_Complaint' ## Выполните несколько запросов {#run-queries} -### Запрос 1. Сравнение количества жалоб по месяцам +### Запрос 1. Сравнение количества жалоб по месяцам {#query-1-compare-the-number-of-complaints-by-month} Запрос: @@ -654,7 +654,7 @@ Query id: 7fbd4244-b32a-4acf-b1f3-c3aa198e74d9 ``` -### Запрос 2. Сравнение общего числа жалоб по районам +### Запрос 2. Сравнение общего числа жалоб по районам {#query-2-compare-total-number-of-complaints-by-borough} Запрос: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md index c09016063a7..13c6e0c4de2 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md @@ -127,7 +127,7 @@ CREATE TABLE `ontime` ORDER BY (Year, Quarter, Month, DayofMonth, FlightDate, IATA_CODE_Reporting_Airline); ``` -## Импорт сырых данных +## Импорт сырых данных {#import-from-raw-data} Загрузка данных: @@ -144,7 +144,7 @@ ls -1 *.zip | xargs -I{} -P $(nproc) bash -c "echo {}; unzip -cq {} '*.csv' | se (если на вашем сервере будет нехватка памяти или возникнут другие проблемы, удалите флаг `-P $(nproc)`) -## Импорт из сохранённой копии +## Импорт из сохранённой копии {#import-from-a-saved-copy} Также вы можете импортировать данные из сохранённой копии с помощью следующего запроса: @@ -155,7 +155,7 @@ INSERT INTO ontime SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazo Снимок был создан 29.05.2022. -## Запросы +## Запросы {#queries} Q0. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md index 80578c5ccda..55aa0bcb402 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md @@ -22,7 +22,7 @@ import stackoverflow from '@site/static/images/getting-started/example-datasets/ Описание схемы этих данных можно найти [здесь](https://meta.stackexchange.com/questions/2677/database-schema-documentation-for-the-public-data-dump-and-sede). -## Заранее подготовленные данные +## Заранее подготовленные данные {#pre-prepared-data} Мы предоставляем копию этих данных в формате Parquet, актуальную по состоянию на апрель 2024 года. Хотя этот набор данных и невелик для ClickHouse с точки зрения количества строк (60 миллионов постов), он содержит значительные объемы текста и большие столбцы строкового типа (String). @@ -33,7 +33,7 @@ CREATE DATABASE stackoverflow Приведённые ниже замеры времени относятся к кластеру ClickHouse Cloud с 96 GiB памяти и 24 vCPU, расположенному в регионе `eu-west-2`. Набор данных находится в регионе `eu-west-3`. -### Публикации +### Публикации {#posts} ```sql CREATE TABLE stackoverflow.posts @@ -73,7 +73,7 @@ INSERT INTO stackoverflow.posts SELECT * FROM s3('https://datasets-documentation Публикации также доступны по годам, например, по адресу [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 @@ -96,7 +96,7 @@ INSERT INTO stackoverflow.votes SELECT * FROM s3('https://datasets-documentation Голоса также доступны по годам, например, по адресу [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 @@ -120,7 +120,7 @@ INSERT INTO stackoverflow.comments SELECT * FROM s3('https://datasets-documentat Комментарии также доступны по годам, например, по адресу: [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 @@ -147,7 +147,7 @@ INSERT INTO stackoverflow.users SELECT * FROM s3('https://datasets-documentation ``` -### Значки +### Значки {#badges} ```sql CREATE TABLE stackoverflow.badges @@ -168,7 +168,7 @@ INSERT INTO stackoverflow.badges SELECT * FROM s3('https://datasets-documentatio ``` -### PostLinks +### PostLinks {#postlinks} ```sql CREATE TABLE stackoverflow.postlinks @@ -188,7 +188,7 @@ INSERT INTO stackoverflow.postlinks SELECT * FROM s3('https://datasets-documenta ``` -### PostHistory +### PostHistory {#posthistory} ```sql CREATE TABLE stackoverflow.posthistory @@ -217,7 +217,7 @@ INSERT INTO stackoverflow.posthistory SELECT * FROM s3('https://datasets-documen Исходный набор данных доступен в сжатом XML-формате (7zip) по адресу [https://archive.org/download/stackexchange](https://archive.org/download/stackexchange) — файлы с префиксом `stackoverflow.com*`. -### Загрузка +### Загрузка {#download} ```bash wget https://archive.org/download/stackexchange/stackoverflow.com-Badges.7z @@ -232,7 +232,7 @@ wget https://archive.org/download/stackexchange/stackoverflow.com-Votes.7z Размер этих файлов может достигать 35 ГБ, и их загрузка может занять около 30 минут в зависимости от интернет-соединения — сервер загрузки ограничивает скорость примерно до 20 МБ/с. -### Преобразование в JSON +### Преобразование в JSON {#convert-to-json} На момент написания ClickHouse не имеет встроенной поддержки XML в качестве входного формата. Чтобы загрузить данные в ClickHouse, мы сначала преобразуем их в NDJSON. @@ -260,7 +260,7 @@ p7zip -d stackoverflow.com-Posts.7z ```bash mkdir posts cd posts -# следующая команда разбивает входной xml-файл на подфайлы по 10000 строк +# следующая команда разбивает входной xml-файл на подфайлы по 10000 строк {#the-following-splits-the-input-xml-file-into-sub-files-of-10000-rows} tail +3 ../Posts.xml | head -n -1 | split -l 10000 --filter='{ printf "\n"; cat - ; printf "\n"; } > $FILE' - ``` @@ -283,7 +283,7 @@ clickhouse local --query "SELECT * FROM file('posts.json', JSONEachRow, 'Id Int3 Несколько простых запросов для начала работы. -### Самые популярные теги на Stack Overflow +### Самые популярные теги на Stack Overflow {#most-popular-tags-on-stack-overflow} ```sql @@ -313,7 +313,7 @@ LIMIT 10 ``` -### Пользователь с наибольшим количеством ответов (активные учётные записи) +### Пользователь с наибольшим количеством ответов (активные учётные записи) {#user-with-the-most-answers-active-accounts} Для учётной записи требуется `UserId`. @@ -340,7 +340,7 @@ LIMIT 5 ``` -### Самые популярные статьи о ClickHouse +### Самые популярные статьи о ClickHouse {#clickhouse-related-posts-with-the-most-views} ```sql SELECT @@ -371,7 +371,7 @@ LIMIT 10 ``` -### Самые спорные публикации +### Самые спорные публикации {#most-controversial-posts} ```sql SELECT diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md index 4d5645690b4..41684aad26c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md @@ -13,12 +13,12 @@ keywords: ['пример набора данных', 'tpch', 'бенчмарк', **Ссылки** -- [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](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 -## Генерация и импорт данных +## Генерация и импорт данных {#data-generation-and-import} Сначала клонируйте репозиторий TPC-H и скомпилируйте генератор данных: @@ -58,7 +58,6 @@ make * В соответствии с разделом 1.4.2.1 определения таблиц не используют необязательные ограничения `NOT NULL`, даже если `dbgen` генерирует их по умолчанию. Производительность запросов `SELECT` в ClickHouse не зависит от наличия или отсутствия ограничений `NOT NULL`. * В соответствии с разделом 1.3.1 мы используем собственные типы данных ClickHouse (например, `Int32`, `String`) для реализации абстрактных типов данных, указанных в спецификации (например, `Identifier`, `Variable text, size N`). Единственный эффект этого — лучшая читаемость; типы данных SQL-92, генерируемые `dbgen` (например, `INTEGER`, `VARCHAR(40)`), также будут работать в ClickHouse. - ```sql CREATE TABLE nation ( n_nationkey Int32, @@ -169,7 +168,6 @@ clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO lineitem FORMA Вместо использования tpch-kit и самостоятельной генерации таблиц вы можете импортировать данные из общедоступного бакета S3. Перед этим обязательно создайте пустые таблицы, используя приведённые выше операторы `CREATE`. - ```sql -- Коэффициент масштабирования 1 INSERT INTO nation SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/nation.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1; @@ -194,8 +192,7 @@ INSERT INTO lineitem SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws. ::: - -## Запросы +## Запросы {#queries} :::note Для получения корректных результатов в соответствии со стандартом SQL необходимо включить настройку [`join_use_nulls`](../../operations/settings/settings.md#join_use_nulls). @@ -348,7 +345,6 @@ ORDER BY **Q5** - ```sql SELECT n_name, @@ -496,7 +492,6 @@ ORDER BY **Q9** - ```sql SELECT nation, @@ -850,7 +845,6 @@ WHERE **Q20** - ```sql SELECT s_name, diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md index 69e792d9e55..2ecf71eeafa 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md @@ -26,7 +26,7 @@ keywords: ['пример набора данных', 'погода', 'тайва - [Предварительно обработанная версия](#pre-processed-data) данных для ClickHouse, которые были очищены, переработаны и обогащены. Этот набор данных охватывает период с 1896 по 2023 год. - [Скачать исходные «сырые» данные](#original-raw-data) и преобразовать их в формат, требуемый ClickHouse. Пользователи, которые хотят добавить собственные столбцы, могут изучить или доработать свои подходы. -### Предобработанные данные +### Предобработанные данные {#pre-processed-data} Набор данных был преобразован из формата «одно измерение на строку» в формат «одна строка по идентификатору метеостанции и дате измерения», т.е. @@ -47,16 +47,16 @@ C0X100,2016-01-01 04:00:00,1021.2,15.8,74,1.7,8.0,,,,,,,,,,,,,,,,,,,,,,, ```bash wget https://storage.googleapis.com/taiwan-weather-observaiton-datasets/preprocessed_weather_daily_1896_2023.tar.gz -# Опционально: Проверьте контрольную сумму +# Опционально: Проверьте контрольную сумму {#option-validate-the-checksum} md5sum preprocessed_weather_daily_1896_2023.tar.gz -# Контрольная сумма должна совпадать с: 11b484f5bd9ddafec5cfb131eb2dd008 +# Контрольная сумма должна совпадать с: 11b484f5bd9ddafec5cfb131eb2dd008 {#checksum-should-be-equal-to-11b484f5bd9ddafec5cfb131eb2dd008} tar -xzvf preprocessed_weather_daily_1896_2023.tar.gz daily_weather_preprocessed_1896_2023.csv -# Опционально: Проверьте контрольную сумму +# Опционально: Проверьте контрольную сумму {#option-validate-the-checksum} md5sum daily_weather_preprocessed_1896_2023.csv -# Контрольная сумма должна совпадать с: 1132248c78195c43d93f843753881754 +# Контрольная сумма должна совпадать с: 1132248c78195c43d93f843753881754 {#checksum-should-be-equal-to-1132248c78195c43d93f843753881754} ``` @@ -64,7 +64,7 @@ md5sum daily_weather_preprocessed_1896_2023.csv Далее приведены сведения о шагах по загрузке исходных необработанных данных, которые затем можно преобразовать и конвертировать по своему усмотрению. -#### Загрузка +#### Загрузка {#download} Чтобы скачать исходные сырые данные: @@ -73,9 +73,9 @@ 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 -# Опционально: Проверка контрольной суммы +# Опционально: Проверка контрольной суммы {#option-validate-the-checksum} md5sum raw_data_weather_daily_1896_2023.tar.gz -# Контрольная сумма должна совпадать с: b66b9f137217454d655e3004d7d1b51a +# Контрольная сумма должна совпадать с: b66b9f137217454d655e3004d7d1b51a {#checksum-should-be-equal-to-b66b9f137217454d655e3004d7d1b51a} tar -xzvf raw_data_weather_daily_1896_2023.tar.gz 466920_1928.csv @@ -84,23 +84,23 @@ tar -xzvf raw_data_weather_daily_1896_2023.tar.gz 466920_1931.csv ... -# Опционально: Проверка контрольной суммы +# Опционально: Проверка контрольной суммы {#option-validate-the-checksum} cat *.csv | md5sum -# Контрольная сумма должна совпадать с: b26db404bf84d4063fac42e576464ce1 +# Контрольная сумма должна совпадать с: b26db404bf84d4063fac42e576464ce1 {#checksum-should-be-equal-to-b26db404bf84d4063fac42e576464ce1} ``` -#### Получение данных метеостанций Тайваня +#### Получение данных метеостанций Тайваня {#retrieve-the-taiwan-weather-stations} ```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 +# Опционально: Преобразование кодировки UTF-8-BOM в UTF-8 {#option-convert-the-utf-8-bom-to-utf-8-encoding} sed -i '1s/^\xEF\xBB\xBF//' weather_sta_list.csv ``` -## Создание схемы таблицы +## Создание схемы таблицы {#create-table-schema} Создайте таблицу MergeTree в ClickHouse (через клиент ClickHouse). @@ -144,7 +144,7 @@ ORDER BY (MeasuredDate); ## Вставка данных в ClickHouse {#inserting-into-clickhouse} -### Вставка данных из локального файла +### Вставка данных из локального файла {#inserting-from-local-file} Данные можно вставить из локального файла следующим образом (в клиенте ClickHouse): @@ -165,7 +165,7 @@ INSERT INTO tw_weather_data FROM INFILE '/path/to/daily_weather_preprocessed_189 ``` -### Вставка из URL +### Вставка из URL {#inserting-from-url} ```sql INSERT INTO tw_weather_data SELECT * @@ -176,7 +176,7 @@ FROM url('https://storage.googleapis.com/taiwan-weather-observaiton-datasets/dai Чтобы узнать, как ускорить этот процесс, ознакомьтесь с нашей публикацией в блоге о [настройке загрузки больших объёмов данных](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part2). -## Проверка числа строк и объёма данных +## Проверка числа строк и объёма данных {#check-data-rows-and-sizes} 1. Посмотрим, сколько строк было вставлено: @@ -210,7 +210,7 @@ WHERE (`table` = 'tw_weather_data') AND active ## Примеры запросов {#sample-queries} -### Q1: Получите максимальное значение температуры точки росы для каждой метеостанции за заданный год +### Q1: Получите максимальное значение температуры точки росы для каждой метеостанции за заданный год {#q1-retrieve-the-highest-dew-point-temperature-for-each-weather-station-in-the-specific-year} ```sql SELECT @@ -257,7 +257,7 @@ GROUP BY StationId ``` -### Q2: Выборка сырых данных за заданный интервал времени, по полям и метеостанции +### Q2: Выборка сырых данных за заданный интервал времени, по полям и метеостанции {#q2-raw-data-fetching-with-the-specific-duration-time-range-fields-and-weather-station} ```sql SELECT diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md index b784a8a0bc4..25dfa2e506a 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md @@ -13,7 +13,7 @@ keywords: ['пример набора данных', 'недвижимость - Описание полей: https://www.gov.uk/guidance/about-the-price-paid-data - Содержит данные HM Land Registry © Crown copyright and database right 2021. Эти данные распространяются по лицензии Open Government Licence v3.0. -## Создание таблицы +## Создание таблицы {#create-table} ```sql CREATE DATABASE uk; @@ -40,7 +40,7 @@ ORDER BY (postcode1, postcode2, addr1, addr2); ``` -## Предобработка и вставка данных +## Предобработка и вставка данных {#preprocess-import-data} Мы будем использовать функцию `url` для потоковой передачи данных в ClickHouse. Сначала нам нужно предварительно обработать часть входящих данных, включая: @@ -95,7 +95,7 @@ FROM url( Дождитесь, пока данные будут вставлены — это может занять одну-две минуты в зависимости от скорости сети. -## Проверка данных +## Проверка данных {#validate-data} Проверим, что всё сработало, посмотрев, сколько строк было записано: @@ -119,7 +119,7 @@ WHERE name = 'uk_price_paid' Давайте выполним несколько запросов, чтобы проанализировать данные: -### Запрос 1. Средняя цена по годам +### Запрос 1. Средняя цена по годам {#average-price} ```sql runnable SELECT @@ -133,7 +133,7 @@ ORDER BY year ``` -### Запрос 2. Средняя цена по годам в Лондоне +### Запрос 2. Средняя цена по годам в Лондоне {#average-price-london} ```sql runnable SELECT @@ -150,7 +150,7 @@ ORDER BY year Что-то произошло с ценами на жильё в 2020 году! Однако, вероятно, это не стало сюрпризом... -### Запрос 3. Самые дорогие районы +### Запрос 3. Самые дорогие районы {#most-expensive-neighborhoods} ```sql runnable SELECT diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md index 7e958bd2ce4..0e75010ffb5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md @@ -241,7 +241,7 @@ keywords: ['пример набора данных', 'youtube', 'образцы ## Вопросы {#questions} -### Если отключить комментарии, уменьшится ли вероятность того, что кто-то поставит лайк или дизлайк? +### Если отключить комментарии, уменьшится ли вероятность того, что кто-то поставит лайк или дизлайк? {#create-the-table} Когда комментарии отключены, станут ли люди чаще ставить лайки или дизлайки, чтобы выразить своё отношение к видео? @@ -297,7 +297,7 @@ ORDER BY Включение комментариев, как правило, коррелирует с более высоким уровнем вовлечённости. -### Как со временем меняется количество видео — какие при этом можно выделить события? +### Как со временем меняется количество видео — какие при этом можно выделить события? {#insert-data} ```sql SELECT @@ -336,7 +336,7 @@ ORDER BY month ASC; Всплеск числа авторов, загружающих видео, [в период COVID-19 заметен](https://www.theverge.com/2020/3/27/21197642/youtube-with-me-style-videos-views-coronavirus-cook-workout-study-home-beauty). -### Больше субтитров со временем: когда это произошло +### Больше субтитров со временем: когда это произошло {#count-row-numbers} С развитием технологий распознавания речи создавать субтитры для видео стало проще, чем когда-либо: YouTube добавил автоматическое создание субтитров в конце 2009 года — стал ли это переломным моментом? @@ -374,7 +374,7 @@ ORDER BY month ASC; Это привело к запуску очень успешной кампании, призывавшей авторов добавлять субтитры к своим видео для слабослышащих и глухих зрителей. -### Лидеры по загрузкам во времени +### Лидеры по загрузкам во времени {#explore-the-data} ```sql WITH uploaders AS @@ -467,7 +467,7 @@ ORDER BY ``` -### Как распределяются представления? +### Как распределяются представления? {#if-someone-disables-comments-does-it-lower-the-chance-someone-will-actually-click-like-or-dislike} ```sql SELECT diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/index.md index fd852dc3ec7..e7da3264997 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/index.md @@ -9,9 +9,7 @@ title: 'Учебные руководства и примеры наборов doc_type: 'landing-page' --- - - -# Учебные материалы и примеры наборов данных +# Учебные материалы и примеры наборов данных {#tutorials-and-example-datasets} У нас есть множество ресурсов, которые помогут вам начать работу и понять, как работает ClickHouse: @@ -25,7 +23,6 @@ doc_type: 'landing-page' {/* Приведённая ниже таблица автоматически генерируется на этапе сборки скриптом https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh */ } - {/*AUTOGENERATED_START*/ } | Страница | Описание | diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md index 5fcbfa1a77b..df327cf753f 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md @@ -1,99 +1,143 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; + + # Установка ClickHouse на Debian/Ubuntu {#install-from-deb-packages} -> Рекомендуется использовать официальные предварительно скомпилированные `deb` пакеты для **Debian** или **Ubuntu**. +> Рекомендуется использовать официальные предкомпилированные пакеты `deb` для **Debian** или **Ubuntu**. + ## Настройка репозитория Debian {#setup-the-debian-repository} -Для установки ClickHouse выполните следующие команды: +Чтобы установить ClickHouse, выполните следующие команды: + + + ```bash -# Установка необходимых пакетов +# Установите необходимые пакеты {#install-prerequisite-packages} sudo apt-get install -y apt-transport-https ca-certificates curl gnupg +``` + -# Загрузка GPG ключа ClickHouse и сохранение его в связке ключей +# Загрузите GPG‑ключ ClickHouse и сохраните его в ключевом хранилище {#download-the-clickhouse-gpg-key-and-store-it-in-the-keyring} curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg -# Получение архитектуры системы + + +# Определите архитектуру системы {#get-the-system-architecture} ARCH=$(dpkg --print-architecture) -# Добавление репозитория ClickHouse в источники apt + + +# Добавьте репозиторий ClickHouse в список источников пакетов apt {#add-the-clickhouse-repository-to-apt-sources} echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg arch=${ARCH}] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list -# Обновление списков пакетов apt + + +# Обновить списки пакетов apt {#update-apt-package-lists} + sudo apt-get update + ``` -- Вы можете заменить `stable` на `lts` для использования различных [типов релизов](/knowledgebase/production) в зависимости от ваших потребностей. -- Вы можете загрузить и установить пакеты вручную с [packages.clickhouse.com](https://packages.clickhouse.com/deb/pool/main/c/). -
+- Вы можете заменить `stable` на `lts`, чтобы использовать различные [типы релизов](/knowledgebase/production) в зависимости от ваших потребностей. +- Вы можете скачать и установить пакеты вручную с [packages.clickhouse.com](https://packages.clickhouse.com/deb/pool/main/c/). +
-Старый метод для установки deb-пакетов для устаревших дистрибутивов +Устаревший метод установки deb-пакетов для дистрибутивов +``` + + ```bash -# Установка необходимых пакетов +# Установите необходимые пакеты {#install-prerequisite-packages} sudo apt-get install apt-transport-https ca-certificates dirmngr +``` -# Добавление GPG ключа ClickHouse для аутентификации пакетов + +# Добавьте GPG-ключ ClickHouse для аутентификации пакетов {#add-the-clickhouse-gpg-key-to-authenticate-packages} sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754 -# Добавление репозитория ClickHouse в источники apt + + +# Добавьте репозиторий ClickHouse в список источников APT {#add-the-clickhouse-repository-to-apt-sources} echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \ -/etc/apt/sources.list.d/clickhouse.list + /etc/apt/sources.list.d/clickhouse.list + + -# Обновление списков пакетов apt +# Обновите списки пакетов apt {#update-apt-package-lists} sudo apt-get update -# Установка пакетов сервера и клиента ClickHouse + + +# Установите пакеты сервера и клиента ClickHouse {#install-clickhouse-server-and-client-packages} sudo apt-get install -y clickhouse-server clickhouse-client -# Запуск службы сервера ClickHouse + + +# Запустите службу сервера ClickHouse {#start-the-clickhouse-server-service} sudo service clickhouse-server start -# Запуск клиента командной строки ClickHouse -clickhouse-client # или "clickhouse-client --password", если вы установили пароль. + + +# Запустите клиент командной строки ClickHouse {#launch-the-clickhouse-command-line-client} + +clickhouse-client # или "clickhouse-client --password", если вы указали пароль. + ```
+``` + ## Установка сервера и клиента ClickHouse {#install-clickhouse-server-and-client} + ```bash sudo apt-get install -y clickhouse-server clickhouse-client ``` + ## Запуск ClickHouse {#start-clickhouse-server} -Для запуска сервера ClickHouse выполните: +Чтобы запустить сервер ClickHouse, выполните следующую команду: + ```bash sudo service clickhouse-server start ``` -Для запуска клиента ClickHouse выполните: +Чтобы запустить клиент ClickHouse, выполните: + ```bash clickhouse-client ``` -Если вы установили пароль для вашего сервера, то вам нужно будет выполнить: +Если вы задали пароль для своего сервера, вам потребуется выполнить: + ```bash clickhouse-client --password ``` + ## Установка автономного ClickHouse Keeper {#install-standalone-clickhouse-keeper} :::tip -В производственных средах мы настоятельно рекомендуем запускать ClickHouse Keeper на выделенных узлах. +В производственных средах настоятельно рекомендуется запускать ClickHouse Keeper на выделенных узлах. В тестовых средах, если вы решите запускать ClickHouse Server и ClickHouse Keeper на одном сервере, -то вам не нужно устанавливать ClickHouse Keeper, так как он включен в ClickHouse server. +то вам не нужно отдельно устанавливать ClickHouse Keeper, так как он включён в ClickHouse Server. ::: -Для установки `clickhouse-keeper` на автономных серверах ClickHouse Keeper выполните: +Чтобы установить `clickhouse-keeper` на автономные серверы ClickHouse Keeper, выполните: + ```bash sudo apt-get install -y clickhouse-keeper ``` + ## Включение и запуск ClickHouse Keeper {#enable-and-start-clickhouse-keeper} + ```bash sudo systemctl enable clickhouse-keeper sudo systemctl start clickhouse-keeper @@ -102,20 +146,21 @@ sudo systemctl status clickhouse-keeper
+ ## Пакеты {#packages} -Ниже подробно описаны различные доступные deb пакеты: +Доступные deb-пакеты описаны ниже: -| Пакет | Описание | -|--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `clickhouse-common-static` | Устанавливает скомпилированные бинарные файлы ClickHouse. | -| `clickhouse-server` | Создает символическую ссылку для `clickhouse-server` и устанавливает конфигурацию сервера по умолчанию. | -| `clickhouse-client` | Создает символическую ссылку для `clickhouse-client` и других инструментов, связанных с клиентом, и устанавливает файлы конфигурации клиента. | -| `clickhouse-common-static-dbg` | Устанавливает скомпилированные бинарные файлы ClickHouse с отладочной информацией. | -| `clickhouse-keeper` | Используется для установки ClickHouse Keeper на выделенных узлах ClickHouse Keeper. Если вы запускаете ClickHouse Keeper на том же сервере, что и сервер ClickHouse, то вам не нужно устанавливать этот пакет. Устанавливает ClickHouse Keeper и файлы конфигурации ClickHouse Keeper по умолчанию. | +| Package | Description | +|--------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `clickhouse-common-static` | Устанавливает скомпилированные бинарные файлы ClickHouse. | +| `clickhouse-server` | Создает символическую ссылку для `clickhouse-server` и устанавливает конфигурацию сервера по умолчанию. | +| `clickhouse-client` | Создает символическую ссылку для `clickhouse-client` и другие клиентские утилиты, а также устанавливает файлы конфигурации клиента. | +| `clickhouse-common-static-dbg` | Устанавливает скомпилированные бинарные файлы ClickHouse с отладочной информацией. | +| `clickhouse-keeper` | Используется для установки ClickHouse Keeper на выделенные узлы ClickHouse Keeper. Если вы запускаете ClickHouse Keeper на том же сервере, что и сервер ClickHouse, устанавливать этот пакет не нужно. Устанавливает ClickHouse Keeper и конфигурационные файлы ClickHouse Keeper по умолчанию. |
:::info -Если вам нужно установить конкретную версию ClickHouse, вы должны установить все пакеты одной и той же версии: +Если вам нужно установить определенную версию ClickHouse, необходимо установить все пакеты одной и той же версии: `sudo apt-get install clickhouse-server=21.8.5.7 clickhouse-client=21.8.5.7 clickhouse-common-static=21.8.5.7` -::: \ No newline at end of file +::: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md index f49c5d136ce..aa6e0a09b84 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md @@ -1,4 +1,4 @@ -# Установка ClickHouse с помощью Docker +# Установка ClickHouse с помощью Docker {#install-clickhouse-using-docker} Руководство на [Docker Hub](https://hub.docker.com/r/clickhouse/clickhouse-server/) приведено ниже для удобства. Доступные Docker-образы используют @@ -33,9 +33,9 @@ docker pull clickhouse/clickhouse-server -## Как использовать этот образ +## Как использовать этот образ {#how-to-use-image} -### Запуск экземпляра сервера +### Запуск экземпляра сервера {#start-server-instance} ```bash docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server @@ -45,18 +45,18 @@ docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickh По умолчанию описанный выше экземпляр сервера запускается от имени пользователя `default` без пароля. -### Подключение к нему из нативного клиента +### Подключение к нему из нативного клиента {#connect-to-it-from-native-client} ```bash docker run -it --rm --network=container:some-clickhouse-server --entrypoint clickhouse-client clickhouse/clickhouse-server -# ИЛИ +# ИЛИ {#or} docker exec -it some-clickhouse-server clickhouse-client ``` Подробнее о клиенте ClickHouse см. в разделе [ClickHouse client](/interfaces/cli). -### Подключение с помощью curl +### Подключение с помощью curl {#connect-to-it-using-curl} ```bash echo "SELECT 'Hello, ClickHouse!'" | docker run -i --rm --network=container:some-clickhouse-server buildpack-deps:curl curl 'http://localhost:8123/?query=' -s --data-binary @- @@ -64,14 +64,14 @@ echo "SELECT 'Hello, ClickHouse!'" | docker run -i --rm --network=container:some Подробную информацию об HTTP-интерфейсе см. в разделе [ClickHouse HTTP Interface](/interfaces/http). -### Остановка и удаление контейнера +### Остановка и удаление контейнера {#stopping-removing-container} ```bash docker stop some-clickhouse-server docker rm some-clickhouse-server ``` -### Сеть +### Сеть {#networking} :::note Предопределённый пользователь `default` не имеет сетевого доступа, пока для него не задан пароль, @@ -98,7 +98,7 @@ echo 'SELECT version()' | curl 'http://localhost:8123/' --data-binary @- Пользователь по умолчанию в приведённом выше примере доступен только для запросов с localhost ::: -### Томa +### Томa {#volumes} Обычно для обеспечения сохранности данных имеет смысл смонтировать в контейнер следующие каталоги: @@ -119,7 +119,7 @@ docker run -d \ * `/docker-entrypoint-initdb.d/` - каталог со скриптами инициализации базы данных (см. ниже). -## Возможности Linux +## Возможности Linux {#linear-capabilities} У ClickHouse есть дополнительная функциональность, для работы которой требуется включить несколько [возможностей Linux (capabilities)](https://man7.org/linux/man-pages/man7/capabilities.7.html). @@ -134,29 +134,29 @@ docker run -d \ Дополнительные сведения см. в разделе ["Настройка возможностей CAP_IPC_LOCK и CAP_SYS_NICE в Docker"](/knowledgebase/configure_cap_ipc_lock_and_cap_sys_nice_in_docker) -## Конфигурация +## Конфигурация {#configuration} Контейнер открывает порт 8123 для [HTTP-интерфейса](https://clickhouse.com/docs/interfaces/http_interface/) и порт 9000 для [нативного клиента](https://clickhouse.com/docs/interfaces/tcp/). Конфигурация ClickHouse представлена файлом «config.xml» ([документация](https://clickhouse.com/docs/operations/configuration_files/)). -### Запуск экземпляра сервера с собственной конфигурацией +### Запуск экземпляра сервера с собственной конфигурацией {#start-server-instance-with-custom-config} ```bash docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 -v /path/to/your/config.xml:/etc/clickhouse-server/config.xml clickhouse/clickhouse-server ``` -### Запуск сервера от имени отдельного пользователя +### Запуск сервера от имени отдельного пользователя {#start-server-custom-user} ```bash -# Директория $PWD/data/clickhouse должна существовать и принадлежать текущему пользователю +# Директория $PWD/data/clickhouse должна существовать и принадлежать текущему пользователю {#pwddataclickhouse-should-exist-and-be-owned-by-current-user} docker run --rm --user "${UID}:${GID}" --name some-clickhouse-server --ulimit nofile=262144:262144 -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server ``` Когда вы используете образ с примонтированными локальными каталогами, вам, вероятно, нужно указать пользователя, чтобы сохранить корректное владение файлами. Используйте аргумент `--user` и смонтируйте `/var/lib/clickhouse` и `/var/log/clickhouse-server` внутрь контейнера. В противном случае образ будет выдавать ошибку и не запустится. -### Запуск сервера от root +### Запуск сервера от root {#start-server-from-root} Запуск сервера от root полезен в случаях, когда включено пространство имён пользователей. Чтобы сделать это, выполните: @@ -165,7 +165,7 @@ docker run --rm --user "${UID}:${GID}" --name some-clickhouse-server --ulimit no docker run --rm -e CLICKHOUSE_RUN_AS_ROOT=1 --name clickhouse-server-userns -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server ``` -### Как создать базу данных и пользователя по умолчанию при запуске +### Как создать базу данных и пользователя по умолчанию при запуске {#how-to-create-default-db-and-user} Иногда может потребоваться при запуске контейнера создать пользователя (по умолчанию используется пользователь с именем `default`) и базу данных. Это можно сделать с помощью переменных окружения `CLICKHOUSE_DB`, `CLICKHOUSE_USER`, `CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT` и `CLICKHOUSE_PASSWORD`: @@ -173,7 +173,7 @@ docker run --rm -e CLICKHOUSE_RUN_AS_ROOT=1 --name clickhouse-server-userns -v " docker run --rm -e CLICKHOUSE_DB=my_database -e CLICKHOUSE_USER=username -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=password -p 9000:9000/tcp clickhouse/clickhouse-server ``` -#### Управление пользователем `default` +#### Управление пользователем `default` {#managing-default-user} Пользователь `default` по умолчанию не имеет сетевого доступа, если не заданы ни `CLICKHOUSE_USER`, ни `CLICKHOUSE_PASSWORD`, ни `CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT`. @@ -184,7 +184,7 @@ docker run --rm -e CLICKHOUSE_SKIP_USER_SETUP=1 -p 9000:9000/tcp clickhouse/clic ``` -## Как расширить этот образ +## Как расширить этот образ {#how-to-extend-image} Чтобы выполнить дополнительную инициализацию в образе, производном от этого, добавьте один или несколько скриптов `*.sql`, `*.sql.gz` или `*.sh` в каталог `/docker-entrypoint-initdb.d`. После того как entrypoint-скрипт вызовет `initdb`, он выполнит все файлы `*.sql`, запустит все исполняемые скрипты `*.sh` и подключит (source) все неисполняемые скрипты `*.sh`, найденные в этом каталоге, для дальнейшей инициализации перед запуском сервиса.\ Также вы можете задать переменные окружения `CLICKHOUSE_USER` & `CLICKHOUSE_PASSWORD`, которые будут использоваться clickhouse-client во время инициализации. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md index 3a16793617a..a20cc32147d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md @@ -1,4 +1,4 @@ -# Установка ClickHouse с помощью tgz-архивов +# Установка ClickHouse с помощью tgz-архивов {#install-clickhouse-using-tgz-archives} > Рекомендуется использовать официальные предкомпилированные `tgz`-архивы для всех дистрибутивов Linux, где установка пакетов `deb` или `rpm` невозможна. @@ -20,7 +20,7 @@ -## Получите последнюю версию ClickHouse +## Получите последнюю версию ClickHouse {#get-latest-version} Получите последнюю версию ClickHouse с GitHub и сохраните её в переменной `LATEST_VERSION`. @@ -31,7 +31,7 @@ export LATEST_VERSION ``` -## Определите архитектуру системы +## Определите архитектуру системы {#detect-system-architecture} Определите архитектуру системы и задайте переменную ARCH соответствующим образом: @@ -44,7 +44,7 @@ esac ``` -## Загрузка tar-архивов для каждого компонента ClickHouse +## Загрузка tar-архивов для каждого компонента ClickHouse {#download-tarballs} Скачайте tar-архивы для каждого компонента ClickHouse. Цикл сначала пытается использовать пакеты, специфичные для архитектуры, затем при необходимости переходит к универсальным. @@ -65,7 +65,7 @@ done ```bash -# Извлечение и установка пакета clickhouse-common-static +# Извлечение и установка пакета clickhouse-common-static {#extract-and-install-clickhouse-common-static-package} 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" @@ -75,7 +75,7 @@ sudo "clickhouse-common-static-$LATEST_VERSION/install/doinst.sh" ```bash -# Извлеките и установите пакет отладочных символов +# Извлеките и установите пакет отладочных символов {#extract-and-install-debug-symbols-package} 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" @@ -85,7 +85,7 @@ sudo "clickhouse-common-static-dbg-$LATEST_VERSION/install/doinst.sh" ```bash -# Извлечение и установка серверного пакета с конфигурацией +# Извлечение и установка серверного пакета с конфигурацией {#extract-and-install-server-package-with-configuration} tar -xzvf "clickhouse-server-$LATEST_VERSION-${ARCH}.tgz" \ || tar -xzvf "clickhouse-server-$LATEST_VERSION.tgz" sudo "clickhouse-server-$LATEST_VERSION/install/doinst.sh" configure @@ -96,7 +96,7 @@ sudo /etc/init.d/clickhouse-server start # Запуск сервера ```bash -# Извлечь и установить клиентский пакет +# Извлечь и установить клиентский пакет {#extract-and-install-client-package} tar -xzvf "clickhouse-client-$LATEST_VERSION-${ARCH}.tgz" \ || tar -xzvf "clickhouse-client-$LATEST_VERSION.tgz" sudo "clickhouse-client-$LATEST_VERSION/install/doinst.sh" diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md index 9f49a18deb2..610900f143c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md @@ -5,12 +5,12 @@ import privacy_allow from "@site/static/images/knowledgebase/fix-the-developer-v -# Установите ClickHouse с помощью Homebrew +# Установите ClickHouse с помощью Homebrew {#install-clickhouse-using-homebrew} -## Установка с помощью формулы Homebrew сообщества +## Установка с помощью формулы Homebrew сообщества {#install-using-community-homebrew-formula} Чтобы установить ClickHouse на macOS с помощью [Homebrew](https://brew.sh/), воспользуйтесь формулой Homebrew, поддерживаемой сообществом ClickHouse ([clickhouse](https://formulae.brew.sh/cask/clickhouse)). @@ -19,7 +19,7 @@ brew install --cask clickhouse ``` -## Исправление ошибки проверки разработчика в macOS +## Исправление ошибки проверки разработчика в macOS {#fix-developer-verification-error-macos} Если вы устанавливаете ClickHouse с помощью `brew`, вы можете столкнуться с ошибкой со стороны macOS. По умолчанию macOS не запускает приложения или инструменты, созданные разработчиком, подлинность которого не может быть подтверждена. @@ -30,7 +30,7 @@ brew install --cask clickhouse Чтобы обойти эту ошибку проверки, нужно убрать приложение из карантина macOS — либо найдя соответствующую настройку в окне **System Settings**, используя терминал, либо переустановив ClickHouse. -### Процесс через системные настройки +### Процесс через системные настройки {#system-settings-process} Самый простой способ убрать исполняемый файл `clickhouse` из карантина: @@ -50,7 +50,7 @@ brew install --cask clickhouse Теперь вы должны иметь возможность запускать команды `clickhouse` в терминале. -### Процесс через терминал +### Процесс через терминал {#terminal-process} Иногда нажатие кнопки `Allow Anyway` не решает эту проблему, и в этом случае вы можете выполнить этот процесс через командную строку. Или вы можете просто предпочитать использовать командную строку! diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md index a9b25d487e0..c7b0e931dab 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md @@ -1,11 +1,11 @@ -# Установка ClickHouse через скрипт с использованием curl +# Установка ClickHouse через скрипт с использованием curl {#install-clickhouse-via-script-using-curl} Если вам не нужно устанавливать ClickHouse для production-среды, самый быстрый способ настройки — запустить установочный скрипт с помощью curl. Скрипт автоматически определит подходящий бинарный файл для вашей ОС. -## Установка ClickHouse с помощью curl +## Установка ClickHouse с помощью curl {#install-clickhouse-using-curl} Выполните следующую команду, чтобы скачать один бинарный файл для вашей операционной системы. @@ -18,7 +18,7 @@ curl https://clickhouse.com/ | sh ::: -## Запустите clickhouse-local +## Запустите clickhouse-local {#start-clickhouse-local} `clickhouse-local` позволяет обрабатывать локальные и удалённые файлы, используя мощный SQL-синтаксис ClickHouse и без какой-либо предварительной настройки. Данные таблиц @@ -32,7 +32,7 @@ curl https://clickhouse.com/ | sh ``` -## Запуск clickhouse-server +## Запуск clickhouse-server {#start-clickhouse-server} Если вы хотите хранить данные, вам потребуется запустить `clickhouse-server`. Вы можете запустить сервер ClickHouse с помощью следующей команды: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md index de97b67d73a..32576a9da4e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md @@ -5,7 +5,7 @@ -## Настройка RPM-репозитория +## Настройка RPM-репозитория {#setup-the-rpm-repository} Добавьте официальный репозиторий, выполнив следующую команду: @@ -24,7 +24,7 @@ sudo zypper --gpg-auto-import-keys refresh clickhouse-stable В шагах ниже команду `yum install` можно заменить на `zypper install` в зависимости от используемого менеджера пакетов. -## Установка сервера и клиента ClickHouse +## Установка сервера и клиента ClickHouse {#install-clickhouse-server-and-client-1} Установите ClickHouse, выполнив следующие команды: @@ -42,7 +42,7 @@ sudo yum install clickhouse-server-22.8.7.34 ``` -## Запуск сервера ClickHouse +## Запуск сервера ClickHouse {#start-clickhouse-server-1} Чтобы запустить сервер ClickHouse, выполните команду: @@ -65,7 +65,7 @@ clickhouse-client --password ``` -## Установка отдельного ClickHouse Keeper +## Установка отдельного ClickHouse Keeper {#install-standalone-clickhouse-keeper-1} :::tip В производственных средах мы настоятельно рекомендуем запускать ClickHouse Keeper на выделенных узлах. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md index 5075f1bc89d..3db2fcee5ed 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md @@ -1,4 +1,4 @@ -# Установка ClickHouse на Windows с помощью WSL +# Установка ClickHouse на Windows с помощью WSL {#install-clickhouse-on-windows-with-wsl} @@ -11,7 +11,7 @@ -## Установка WSL +## Установка WSL {#install-wsl} Откройте Windows PowerShell от имени администратора и выполните следующую команду: @@ -26,7 +26,7 @@ wsl --install ``` -## Установите ClickHouse с помощью скрипта curl +## Установите ClickHouse с помощью скрипта curl {#install-clickhouse-via-script-using-curl} Выполните следующую команду, чтобы установить ClickHouse с помощью скрипта curl: @@ -42,7 +42,7 @@ curl https://clickhouse.com/ | sh ``` -## Запуск clickhouse-local +## Запуск clickhouse-local {#start-clickhouse-local} `clickhouse-local` позволяет обрабатывать локальные и удалённые файлы с использованием мощного SQL-синтаксиса ClickHouse и без необходимости настройки. Данные таблиц @@ -56,7 +56,7 @@ curl https://clickhouse.com/ | sh ``` -## Запуск clickhouse-server +## Запуск clickhouse-server {#start-clickhouse-server} Если вы хотите обеспечить сохранность данных, вам нужно запустить `clickhouse-server`. Вы можете запустить сервер ClickHouse с помощью следующей команды: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md index 990d3f39aa4..5142035a658 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md @@ -10,7 +10,7 @@ doc_type: 'guide' -## Сборка из исходных кодов +## Сборка из исходных кодов {#compile-from-source} Чтобы вручную собрать ClickHouse, следуйте инструкциям по сборке для [Linux](/development/build.md) или [macOS](/development/build-osx.md). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx index f587de616b5..4dd9b2770db 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx @@ -18,32 +18,12 @@ import Docker from './_snippets/_docker.md' import {CardPrimary} from '@clickhouse/click-ui/bundled'; import {galaxyOnClick} from '@site/src/lib/galaxy/galaxy' +# Инструкции по установке \{#installation-instructions\} -# Инструкции по установке + - - -
+
Или выберите ниже платформу, дистрибутив и способ установки, чтобы просмотреть инструкции по установке ClickHouse (open source): -} - quickinstall={} - debian_prod={} - rpm_prod={} - tar_prod={} - macos_prod={} - docker={} -/> \ No newline at end of file +} quickinstall={} debian_prod={} rpm_prod={} tar_prod={} macos_prod={} docker={} /> \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/playground.md b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/playground.md index fc626e5b653..0a45394e905 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/playground.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/playground.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# Песочница ClickHouse +# Песочница ClickHouse {#clickhouse-playground} [ClickHouse Playground](https://sql.clickhouse.com) позволяет экспериментировать с ClickHouse, мгновенно выполняя запросы без необходимости развертывать собственный сервер или кластер. В Playground доступно несколько примеров наборов данных. @@ -40,7 +40,7 @@ doc_type: 'guide' -## Примеры +## Примеры {#examples} Пример HTTPS-эндпоинта с использованием `curl`: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx index ecef4f95d81..dc52945164c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx @@ -20,17 +20,16 @@ import data_sources from '@site/static/images/_snippets/data_sources.png'; import select_data_source from '@site/static/images/_snippets/select_data_source.png'; import client_details from '@site/static/images/_snippets/client_details.png'; import new_rows_from_csv from '@site/static/images/_snippets/new_rows_from_csv.png'; -import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; +import SQLConsoleDetail from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_launch_sql_console.md'; - -# Быстрый старт с ClickHouse Cloud +# Быстрый старт с ClickHouse Cloud \{#clickhouse-cloud-quick-start\} > Самый быстрый и простой способ начать работу с ClickHouse — создать новый -сервис в [ClickHouse Cloud](https://console.clickhouse.cloud). В этом руководстве по быстрому старту вы сможете настроить систему -в три простых шага. +> сервис в [ClickHouse Cloud](https://console.clickhouse.cloud). В этом руководстве по быстрому старту вы сможете настроить систему +> в три простых шага. - ## Создайте сервис ClickHouse + ## Создайте сервис ClickHouse \{#1-create-a-clickhouse-service\} Чтобы создать бесплатный сервис ClickHouse в [ClickHouse Cloud](https://console.clickhouse.cloud), необходимо зарегистрироваться, выполнив следующие действия: @@ -59,7 +58,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; Поздравляем! Ваш сервис ClickHouse Cloud запущен и работает, процесс подключения завершён. Продолжайте чтение, чтобы узнать, как начать приём данных и выполнять запросы к ним. - ## Подключение к ClickHouse + ## Подключение к ClickHouse \{#2-connect-to-clickhouse\} Существует два способа подключения к ClickHouse: @@ -68,7 +67,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md';
- ### Подключение через SQL-консоль + ### Подключение через SQL-консоль \{#connect-using-sql-console\} Для быстрого начала работы ClickHouse предоставляет веб-консоль SQL, на которую вы будете перенаправлены после завершения онбординга. @@ -88,7 +87,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; Вот и всё — вы готовы начать использовать свой новый сервис ClickHouse! - ### Подключение приложения + ### Подключение приложения \{#connect-with-your-app\} Нажмите кнопку подключения в меню навигации. Откроется модальное окно с учетными данными для вашего сервиса и инструкциями по подключению с использованием вашего интерфейса или клиентских библиотек. @@ -98,7 +97,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; Если вы не видите клиент для вашего языка программирования, ознакомьтесь со списком [интеграций](/integrations). - ## Добавление данных + ## Добавление данных \{#3-add-data\} ClickHouse эффективнее всего работает с данными! Существует несколько способов добавления данных, большинство из которых доступны на странице Data Sources в навигационном меню. @@ -114,7 +113,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; * Загрузите файл — поддерживаемые форматы: JSON, CSV и TSV * Загрузка данных из файла по URL - ### ClickPipes + ### ClickPipes \{#clickpipes\} [ClickPipes](http://clickhouse.com/docs/integrations/clickpipes) — управляемая платформа интеграции, которая упрощает приём данных из различных источников до нескольких нажатий кнопок. Разработанная для самых требовательных рабочих нагрузок, надёжная и масштабируемая архитектура ClickPipes обеспечивает стабильную производительность и отказоустойчивость. ClickPipes можно использовать как для долгосрочной потоковой передачи данных, так и для однократной загрузки. @@ -122,7 +121,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md';
- ### Добавление данных через SQL Console + ### Добавление данных через SQL Console \{#add-data-using-the-sql-console\} Как и большинство систем управления базами данных, ClickHouse логически группирует таблицы в **базы данных**. Для создания новой базы данных в ClickHouse используйте команду [`CREATE DATABASE`](../../sql-reference/statements/create/database.md): @@ -163,7 +162,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; Существует множество движков таблиц на выбор, но для простой таблицы на одноузловом сервере ClickHouse оптимальным выбором будет [`MergeTree`](/engines/table-engines/mergetree-family/mergetree.md). ::: - #### Краткое введение в первичные ключи + #### Краткое введение в первичные ключи \{#a-brief-intro-to-primary-keys\} Прежде чем двигаться дальше, важно понять, как работают первичные ключи в ClickHouse (их реализация может оказаться неожиданной!): @@ -183,7 +182,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; Для углубленного изучения основных концепций ClickHouse см. ["Основные концепции"](../../managing-data/core-concepts/index.md). - #### Вставка данных в таблицу + #### Вставка данных в таблицу \{#insert-data-into-your-table\} Вы можете использовать знакомую команду [`INSERT INTO TABLE`](../../sql-reference/statements/insert-into.md) в ClickHouse, но важно понимать, что каждая вставка в таблицу [`MergeTree`](/engines/table-engines/mergetree-family/mergetree.md) приводит к созданию **части** в хранилище. @@ -213,7 +212,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; SELECT * FROM helloworld.my_first_table ``` - ### Добавление данных с помощью клиента ClickHouse + ### Добавление данных с помощью клиента ClickHouse \{#add-data-using-the-clickhouse-client\} Вы также можете подключиться к вашему сервису ClickHouse Cloud с помощью инструмента командной строки [**clickhouse client**](/interfaces/cli). Нажмите `Connect` в левом меню для доступа к этим данным. В диалоговом окне выберите `Native` из выпадающего списка: @@ -293,7 +292,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; exit ``` - ### Загрузка файла + ### Загрузка файла \{#upload-a-file\} Распространённая задача при начале работы с базой данных — загрузить имеющиеся данные из файлов. Мы предоставляем образцы данных онлайн, которые можно использовать для демонстрации работы с данными о кликах (clickstream) — они включают идентификатор пользователя, посещённый URL и временную метку события. @@ -328,9 +327,9 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; ## Что дальше? \{#whats-next\} -- В [руководстве](/tutorial.md) вы загрузите 2 миллиона строк в таблицу и выполните несколько аналитических запросов -- У нас есть список [примеров наборов данных](/getting-started/index.md) с инструкциями по их загрузке -- Посмотрите наше 25-минутное видео [Начало работы с ClickHouse](https://clickhouse.com/company/events/getting-started-with-clickhouse/) -- Если ваши данные поступают из внешнего источника, ознакомьтесь с [коллекцией руководств по интеграции](/integrations/index.mdx) по подключению к очередям сообщений, базам данных, пайплайнам и многому другому -- Если вы используете инструмент визуализации (UI/BI), ознакомьтесь с [руководствами по подключению пользовательского интерфейса к ClickHouse](/integrations/data-visualization) -- Руководство по [первичным ключам](/guides/best-practices/sparse-primary-indexes.md) содержит всё, что вам нужно знать о первичных ключах и о том, как их определять \ No newline at end of file +* В [руководстве](/tutorial.md) вы загрузите 2 миллиона строк в таблицу и выполните несколько аналитических запросов +* У нас есть список [примеров наборов данных](/getting-started/index.md) с инструкциями по их загрузке +* Посмотрите наше 25-минутное видео [Начало работы с ClickHouse](https://clickhouse.com/company/events/getting-started-with-clickhouse/) +* Если ваши данные поступают из внешнего источника, ознакомьтесь с [коллекцией руководств по интеграции](/integrations/index.mdx) по подключению к очередям сообщений, базам данных, пайплайнам и многому другому +* Если вы используете инструмент визуализации (UI/BI), ознакомьтесь с [руководствами по подключению пользовательского интерфейса к ClickHouse](/integrations/data-visualization) +* Руководство по [первичным ключам](/guides/best-practices/sparse-primary-indexes.md) содержит всё, что вам нужно знать о первичных ключах и о том, как их определять \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx index 8d1929f269d..d8e3c1e1e86 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx +++ b/i18n/ru/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx @@ -14,16 +14,15 @@ import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; import {VerticalStepper} from '@clickhouse/click-ui/bundled'; - -# Быстрый старт с ClickHouse OSS +# Быстрый старт с ClickHouse OSS \{#clickhouse-oss-quick-start\} > В этом кратком руководстве по быстрому старту вы за 8 -простых шагов настроите ClickHouse OSS. Вы скачаете подходящий бинарный файл для своей ОС, -узнаете, как запускать сервер ClickHouse, и воспользуетесь клиентом ClickHouse, чтобы создать таблицу, -затем вставите в неё данные и выполните запрос для выборки этих данных. +> простых шагов настроите ClickHouse OSS. Вы скачаете подходящий бинарный файл для своей ОС, +> узнаете, как запускать сервер ClickHouse, и воспользуетесь клиентом ClickHouse, чтобы создать таблицу, +> затем вставите в неё данные и выполните запрос для выборки этих данных. - ## Загрузка ClickHouse + ## Загрузка ClickHouse \{#download-the-binary\} ClickHouse работает нативно на Linux, FreeBSD и macOS, а на Windows — через [WSL](https://learn.microsoft.com/en-us/windows/wsl/about). Самый простой способ загрузить ClickHouse локально — выполнить @@ -57,7 +56,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; Для пользователей Mac: Если вы получаете ошибки о том, что разработчик бинарного файла не может быть проверен, см. ["Исправление ошибки проверки разработчика в MacOS"](https://clickhouse.com/docs/knowledgebase/fix-developer-verification-error-in-macos). ::: - ## Запуск сервера + ## Запуск сервера \{#start-the-server\} Выполните следующую команду для запуска сервера ClickHouse: @@ -69,7 +68,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; [уровень логирования по умолчанию](https://clickhouse.com/docs/knowledgebase/why_default_logging_verbose) установлен в `trace`, а не в `warning`. - ## Запуск клиента + ## Запуск клиента \{#start-the-client\} Используйте `clickhouse-client` для подключения к вашему сервису ClickHouse. Откройте новый терминал, перейдите в каталог, где сохранён бинарный файл `clickhouse`, и @@ -85,7 +84,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; my-host :) ``` - ## Создание таблицы + ## Создание таблицы \{#create-a-table\} Используйте `CREATE TABLE` для создания новой таблицы. Стандартные SQL DDL-команды работают в ClickHouse с одним дополнением — таблицы в ClickHouse требуют @@ -104,7 +103,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; PRIMARY KEY (user_id, timestamp) ``` - ## Вставка данных + ## Вставка данных \{#insert-data\} Вы можете использовать знакомую команду `INSERT INTO TABLE` с ClickHouse, но важно понимать, что каждая вставка в таблицу `MergeTree` приводит к созданию в хранилище @@ -125,7 +124,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; (101, 'Гранулы — это наименьшие порции читаемых данных', now() + 5, 3.14159 ) ``` - ## Запросы к новой таблице + ## Запросы к новой таблице \{#query-your-new-table\} Запрос `SELECT` можно написать так же, как в любой другой SQL-базе данных: @@ -148,7 +147,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; 4 строки в наборе. Прошло: 0.008 сек. ``` - ## Вставка собственных данных + ## Вставка собственных данных \{#insert-your-own-data\} Следующий шаг — загрузить ваши данные в ClickHouse. Для приёма данных доступно множество [табличных функций](/sql-reference/table-functions/index.md) и [интеграций](/integrations). Примеры приведены на вкладках @@ -366,7 +365,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; - ## Исследование данных + ## Исследование данных \{#explore\} * Ознакомьтесь с разделом [Основные концепции](/managing-data/core-concepts), чтобы познакомиться с основами того, как ClickHouse работает «под капотом». * Ознакомьтесь с [углублённым руководством](tutorial.md), которое гораздо глубже раскрывает ключевые концепции и возможности ClickHouse. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/index.md index b013cbb0be6..53aca3cdf5e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/index.md @@ -7,13 +7,12 @@ keywords: ['оптимизация производительности', 'лу doc_type: 'reference' --- -import TableOfContents from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; +import TableOfContents from '@site/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; +# Производительность и оптимизация {#performance-and-optimizations} -# Производительность и оптимизация - -В этом разделе приведены рекомендации и лучшие практики по улучшению производительности при работе с ClickHouse. -Мы рекомендуем пользователям сначала ознакомиться с разделом [Основные концепции](/parts), +В этом разделе приведены рекомендации и лучшие практики по улучшению производительности при работе с ClickHouse. +Мы рекомендуем пользователям сначала ознакомиться с разделом [Основные концепции](/parts), в котором рассмотрены ключевые понятия, необходимые для оптимизации производительности. - \ No newline at end of file + \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md index ba689533664..af8d05f6252 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md @@ -17,7 +17,7 @@ import visual05 from '@site/static/images/guides/best-practices/prewhere_05.gif' import Image from '@theme/IdealImage'; -# Как работает оптимизация PREWHERE? +# Как работает оптимизация PREWHERE? {#how-does-the-prewhere-optimization-work} [Предложение PREWHERE](/sql-reference/statements/select/prewhere) — это оптимизация выполнения запроса в ClickHouse. Она уменьшает объём операций ввода-вывода и ускоряет выполнение запроса, избегая ненужного чтения данных и отфильтровывая лишние данные до чтения со встроенного диска столбцов, не участвующих в фильтрации. @@ -109,7 +109,7 @@ ClickHouse начинает обработку PREWHERE, ① читая выбр -## Как измерить влияние PREWHERE +## Как измерить влияние PREWHERE {#how-to-measure-prewhere-impact} Чтобы убедиться, что PREWHERE действительно ускоряет ваши запросы, вы можете сравнить их производительность с включённой и выключенной настройкой `optimize_move_to_prewhere`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md index 332c2023cce..1b0d0f96257 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md @@ -11,7 +11,7 @@ import queryOptimizationDiagram1 from '@site/static/images/guides/best-practices import Image from '@theme/IdealImage'; -# Простое руководство по оптимизации запросов +# Простое руководство по оптимизации запросов {#a-simple-guide-for-query-optimization} В этом разделе на распространённых сценариях показано, как использовать различные методы повышения производительности и оптимизации, такие как [анализатор](/operations/analyzer), [профилирование запросов](/operations/optimizing-performance/sampling-query-profiler) и [отказ от использования Nullable-столбцов](/optimize/avoid-nullable-columns), чтобы улучшить производительность выполнения запросов в ClickHouse. @@ -61,7 +61,7 @@ ClickHouse предоставляет богатый набор инструме -## Набор данных +## Набор данных {#dataset} Мы используем реальный пример, чтобы проиллюстрировать наш подход к оптимизации производительности запросов.  @@ -112,9 +112,9 @@ ORDER BY tuple() ``` -## Найдите медленные запросы +## Найдите медленные запросы {#spot-the-slow-queries} -### Журнал запросов +### Журнал запросов {#query-logs} По умолчанию ClickHouse собирает и записывает информацию о каждом выполненном запросе в [журналы запросов](/operations/system-tables/query_log). Эти данные хранятся в таблице `system.query_log`.  @@ -431,7 +431,7 @@ _Наконец, будьте внимательны к выбросам: дов -## Базовая оптимизация +## Базовая оптимизация {#basic-optimization} Теперь, когда у нас есть фреймворк для тестирования, можно приступать к оптимизации. @@ -439,7 +439,7 @@ _Наконец, будьте внимательны к выбросам: дов В зависимости от того, как вы осуществляли приём данных, вы могли использовать [возможности](/interfaces/schema-inference) ClickHouse для вывода схемы таблицы на основе принятых данных. Хотя это очень удобно на начальном этапе, если вы хотите оптимизировать производительность запросов, вам потребуется пересмотреть схему данных, чтобы она наилучшим образом соответствовала вашему сценарию применения. -### Nullable +### Nullable {#nullable} Как описано в [документации по лучшим практикам](/best-practices/select-data-types#avoid-nullable-columns), по возможности избегайте столбцов с типом Nullable. Их часто хочется использовать, так как они делают механизм ингестии данных более гибким, но они негативно влияют на производительность, поскольку каждый раз приходится обрабатывать дополнительный столбец. @@ -485,7 +485,7 @@ dropoff_location_id_nulls: 0 У нас есть только два столбца со значениями NULL: `mta_tax` и `payment_type`. Остальные поля не должны использовать тип столбца `Nullable`. -### Низкая кардинальность +### Низкая кардинальность {#low-cardinality} Простая оптимизация для строковых типов — максимально эффективно использовать тип данных LowCardinality. Как описано в [документации по низкой кардинальности](/sql-reference/data-types/lowcardinality), ClickHouse применяет словарное кодирование к столбцам LowCardinality, что значительно повышает производительность запросов.  @@ -515,7 +515,7 @@ uniq(vendor_id): 3 Благодаря низкой кардинальности эти четыре столбца — `ratecode_id`, `pickup_location_id`, `dropoff_location_id` и `vendor_id` — являются хорошими кандидатами для типа данных LowCardinality. -### Оптимизируйте тип данных +### Оптимизируйте тип данных {#optimize-data-type} ClickHouse поддерживает большое количество типов данных. Для оптимизации производительности и уменьшения объёма занимаемого на диске пространства данных убедитесь, что вы выбираете наименьший возможный тип данных, подходящий для вашего сценария использования.  @@ -538,7 +538,7 @@ Query id: 4306a8e1-2a9c-4b06-97b4-4d902d2233eb Для дат следует выбирать такую точность, которая соответствует вашему набору данных и лучше всего подходит для выполнения запросов, которые вы планируете запускать. -### Применим оптимизации +### Применим оптимизации {#apply-the-optimizations} Давайте создадим новую таблицу, чтобы использовать оптимизированную схему и повторно выполнить приём данных. @@ -604,7 +604,7 @@ ORDER BY size DESC Новая таблица значительно меньше предыдущей. Мы наблюдаем сокращение объёма дискового пространства, занимаемого таблицей, примерно на 34% (7,38 GiB против 4,89 GiB). -## Важность первичных ключей +## Важность первичных ключей {#the-importance-of-primary-keys} Первичные ключи в ClickHouse работают иначе, чем в большинстве традиционных систем управления базами данных. В таких системах первичные ключи обеспечивают уникальность и целостность данных. Любая попытка вставки дублирующихся значений первичного ключа отклоняется, а для быстрого поиска обычно создаётся индекс на основе B-tree или хэша.  @@ -616,7 +616,7 @@ ORDER BY size DESC Другие возможности, поддерживаемые ClickHouse, такие как проекция (Projection) или материализованное представление, позволяют использовать другой набор первичных ключей для тех же данных. Во второй части этой серии статей в блоге это будет рассмотрено подробнее.  -### Выбор первичных ключей +### Выбор первичных ключей {#choose-primary-keys} Выбор корректного набора первичных ключей — сложная тема, и для нахождения наилучшей комбинации могут потребоваться компромиссы и эксперименты.  diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md index f007f07f47c..befb3ef4e91 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md @@ -17,7 +17,7 @@ import visual05 from '@site/static/images/guides/best-practices/query-parallelis import Image from '@theme/IdealImage'; -# Как ClickHouse выполняет запросы параллельно +# Как ClickHouse выполняет запросы параллельно {#how-clickhouse-executes-a-query-in-parallel} ClickHouse [создан для высокой скорости](/concepts/why-clickhouse-is-so-fast). Он выполняет запросы в высокопараллельном режиме, используя все доступные ядра CPU, распределяя данные по потокам обработки и часто подводя оборудование к пределам его возможностей. @@ -66,7 +66,7 @@ ClickHouse [создан для высокой скорости](/concepts/why-c -## Мониторинг параллелизма запросов +## Мониторинг параллелизма запросов {#monitoring-query-parallelism} Используйте эти инструменты, чтобы убедиться, что ваш запрос полностью задействует доступные ресурсы CPU и диагностировать случаи, когда это не так. @@ -126,12 +126,12 @@ FROM Примечание: читайте визуализацию слева направо. Каждая строка представляет параллельный конвейер обработки, который передаёт данные блок за блоком, применяя преобразования, такие как фильтрация, агрегация и финальные стадии обработки. В этом примере вы видите четыре параллельных конвейера, соответствующих настройке `max_threads = 4`. -### Балансировка нагрузки между конвейерами обработки +### Балансировка нагрузки между конвейерами обработки {#load-balancing-across-processing-lanes} Обратите внимание, что операторы `Resize` в физическом плане выше [переразбивают на части и перераспределяют](/academic_overview#4-2-multi-core-parallelization) потоки блоков данных между конвейерами обработки, чтобы поддерживать их равномерную загрузку. Такое перебалансирование особенно важно, когда диапазоны данных различаются по количеству строк, удовлетворяющих предикатам запроса, иначе некоторые конвейеры могут быть перегружены, в то время как другие простаивают. Перераспределяя работу, более быстрые конвейеры фактически помогают более медленным, оптимизируя общее время выполнения запроса. -## Почему max_threads не всегда соблюдается +## Почему max_threads не всегда соблюдается {#why-max-threads-isnt-always-respected} Как отмечалось выше, количество параллельных потоков обработки `n` контролируется параметром `max_threads`, который по умолчанию равен числу ядер CPU, доступных ClickHouse на сервере: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md index a51f9455a12..c8e59e8fbde 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md @@ -10,7 +10,7 @@ keywords: ['индексы пропуска данных', 'пропуск да -# Примеры индексов пропуска данных +# Примеры индексов пропуска данных {#data-skipping-index-examples} На этой странице собраны примеры индексов пропуска данных ClickHouse, показано, как объявить каждый тип, когда их использовать и как проверить, что они используются. Все возможности работают с [таблицами семейства MergeTree](/engines/table-engines/mergetree-family/mergetree). @@ -33,7 +33,7 @@ ClickHouse поддерживает пять типов индексов про В каждом разделе приводятся примеры с демонстрационными данными и показывается, как проверить использование индекса при выполнении запроса. -## Индекс MinMax +## Индекс MinMax {#minmax-index} Индекс `minmax` лучше всего подходит для диапазонных предикатов по слабо упорядоченным данным или по столбцам, коррелированным с `ORDER BY`. @@ -64,7 +64,7 @@ SELECT count() FROM events WHERE ts >= now() - 3600; См. [подробный пример](/best-practices/use-data-skipping-indices-where-appropriate#example) с `EXPLAIN` и отсечением данных. -## Индекс set +## Индекс set {#set-index} Используйте индекс `set`, когда локальная кардинальность на уровне блока низкая; он неэффективен, если в каждом блоке много различных значений. @@ -81,7 +81,7 @@ SELECT * FROM events WHERE user_id IN (101, 202); Процесс создания и материализации, а также эффект до/после показаны в [базовом руководстве по работе](/optimize/skipping-indexes#basic-operation). -## Универсальный Bloom-фильтр (скалярный) +## Универсальный Bloom-фильтр (скалярный) {#generic-bloom-filter-scalar} Индекс `bloom_filter` хорошо подходит для поиска «иголки в стоге сена» по условию равенства или проверки принадлежности (оператор IN). Он принимает необязательный параметр — вероятность ложноположительных срабатываний (по умолчанию 0.025). @@ -96,7 +96,7 @@ SELECT * FROM events WHERE value IN (7, 42, 99); ``` -## N-граммный фильтр Блума (ngrambf_v1) для поиска подстрок +## N-граммный фильтр Блума (ngrambf_v1) для поиска подстрок {#n-gram-bloom-filter-ngrambf-v1-for-substring-search} Индекс `ngrambf_v1` разбивает строки на n-граммы. Он хорошо подходит для запросов вида `LIKE '%...%'`. Поддерживаются типы String/FixedString/Map (через mapKeys/mapValues), а также настраиваемые размер, количество хэшей и значение seed. Дополнительные сведения см. в документации по [N-граммному фильтру Блума](/engines/table-engines/mergetree-family/mergetree#n-gram-bloom-filter). @@ -133,7 +133,7 @@ SELECT bfEstimateFunctions(4300, bfEstimateBmSize(4300, 0.0001)) AS k; -- ~13 См. [документацию по параметрам](/engines/table-engines/mergetree-family/mergetree#n-gram-bloom-filter) для получения подробных рекомендаций по настройке. -## Токен-блум-фильтр (tokenbf_v1) для поиска по словам +## Токен-блум-фильтр (tokenbf_v1) для поиска по словам {#token-bloom-filter-tokenbf-v1-for-word-based-search} `tokenbf_v1` индексирует токены, разделённые небуквенно-цифровыми символами. Используйте его с [`hasToken`](/sql-reference/functions/string-search-functions#hasToken), с шаблонами слов `LIKE` или с операторами равенства (`=`) и `IN`. Поддерживает типы `String`/`FixedString`/`Map`. @@ -153,7 +153,7 @@ SELECT count() FROM logs WHERE hasToken(lower(msg), 'exception'); См. примеры по наблюдаемости и рекомендации по выбору token vs ngram [здесь](/use-cases/observability/schema-design#bloom-filters-for-text-search). -## Добавление индексов при выполнении CREATE TABLE (несколько примеров) +## Добавление индексов при выполнении CREATE TABLE (несколько примеров) {#add-indexes-during-create-table-multiple-examples} Индексы пропуска данных также поддерживают составные выражения и типы `Map`/`Tuple`/`Nested`. Это показано в примере ниже: @@ -175,7 +175,7 @@ ORDER BY u64; ``` -## Материализация индекса на существующих данных и проверка +## Материализация индекса на существующих данных и проверка {#materializing-on-existing-data-and-verifying} Вы можете добавить индекс к уже существующим частям данных с помощью `MATERIALIZE` и проверить отсечение с помощью `EXPLAIN` или трассировочных журналов, как показано ниже: @@ -211,7 +211,7 @@ SET send_logs_level = 'trace'; -## Временно игнорировать или принудительно использовать индексы +## Временно игнорировать или принудительно использовать индексы {#temporarily-ignore-or-force-indexes} Отключайте отдельные индексы по имени для конкретных запросов во время тестирования и устранения неполадок. Также доступны настройки для принудительного использования индексов при необходимости. См. [`ignore_data_skipping_indices`](/operations/settings/settings#ignore_data_skipping_indices). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md index 45006697f1b..7e09f3a40c9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md @@ -13,7 +13,7 @@ import bad_skip from '@site/static/images/guides/best-practices/bad_skip.png'; import Image from '@theme/IdealImage'; -# Что такое индексы пропуска данных в ClickHouse +# Что такое индексы пропуска данных в ClickHouse {#understanding-clickhouse-data-skipping-indexes} @@ -29,7 +29,7 @@ import Image from '@theme/IdealImage'; -## Базовый принцип работы +## Базовый принцип работы {#basic-operation} Пользователи могут использовать индексы пропуска данных (Data Skipping Indexes) только для таблиц семейства MergeTree. Каждый индекс пропуска данных имеет четыре основных аргумента: @@ -121,11 +121,11 @@ SET send_logs_level='trace'; default.skip_table (933d4b2c-8cea-4bf9-8c93-c56e900eefd1) (SelectExecutor): Индекс `vix` пропустил 6102/6104 гранул. ``` -## Типы индексов пропуска данных +## Типы индексов пропуска данных {#skip-index-types} {/* vale off */ } -### minmax +### minmax {#minmax} {/* vale on */ } @@ -137,7 +137,7 @@ SET send_logs_level='trace'; {/* vale off */ } -### SET +### SET {#set} {/* vale on */ } @@ -146,7 +146,7 @@ SET send_logs_level='trace'; Затраты, производительность и эффективность этого индекса зависят от кардинальности внутри блоков. Если каждый блок содержит большое количество уникальных значений, то либо вычисление условия запроса по большому набору индекса будет очень ресурсоёмким, либо индекс не будет применён, потому что он пуст из‑за превышения max_size. -### Типы фильтров Блума +### Типы фильтров Блума {#bloom-filter-types} *Фильтр Блума* — это структура данных, которая позволяет эффективно по памяти проверять принадлежность к набору ценой небольшой вероятности ложноположительных результатов. Ложноположительные срабатывания не являются существенной проблемой в случае пропускающих индексов, поскольку единственный недостаток — чтение нескольких лишних блоков. Однако возможность ложноположительных срабатываний означает, что индексированное выражение, как правило, должно быть истинным, иначе часть корректных данных может быть пропущена. @@ -187,7 +187,7 @@ SET send_logs_level='trace'; -## Рекомендации по использованию skip index +## Рекомендации по использованию skip index {#skip-best-practices} Skip-индексы неочевидны, особенно для пользователей, привыкших к вторичным строковым индексам из мира СУБД или инвертированным индексам из документных хранилищ. Чтобы получить от них пользу, применение индекса пропуска данных (data skipping index) в ClickHouse должно позволять избежать достаточного количества чтений гранул, чтобы компенсировать стоимость вычисления индекса. Критически важно, что если значение встречается хотя бы один раз в индексируемом блоке, это означает, что весь блок должен быть считан в память и обработан, а затраты на вычисление индекса окажутся напрасными. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md index d029a951e34..c8440883b2e 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md @@ -36,7 +36,7 @@ import sparsePrimaryIndexes15b from '@site/static/images/guides/best-practices/s import Image from '@theme/IdealImage'; -# Практическое введение в первичные индексы ClickHouse +# Практическое введение в первичные индексы ClickHouse {#a-practical-introduction-to-primary-indexes-in-clickhouse} ## Введение {#introduction} @@ -73,7 +73,7 @@ import Image from '@theme/IdealImage'; Все показатели времени выполнения, приведённые в этом документе, основаны на локальном запуске ClickHouse 22.2.1 на MacBook Pro с чипом Apple M1 Pro и 16 ГБ оперативной памяти. -### Полное сканирование таблицы +### Полное сканирование таблицы {#a-full-table-scan} Чтобы увидеть, как выполняется запрос по нашему набору данных без первичного ключа, создадим таблицу (с движком таблиц MergeTree), выполнив следующий SQL DDL‑оператор: @@ -150,7 +150,7 @@ LIMIT 10; └────────────────────────────────┴───────┘ 10 rows in set. Elapsed: 0.022 sec. -# highlight-next-line +# highlight-next-line {#highlight-next-line} Обработано 8,87 млн строк, 70,45 МБ (398,53 млн строк/с., 3,17 ГБ/с.) ``` @@ -172,7 +172,7 @@ LIMIT 10; Ниже подробно показано, как ClickHouse строит и использует свой разрежённый первичный индекс. Позже в статье мы обсудим лучшие практики выбора, удаления и упорядочивания столбцов таблицы, используемых для построения индекса (столбцов первичного ключа). -### Таблица с первичным ключом +### Таблица с первичным ключом {#a-table-with-a-primary-key} Создайте таблицу с составным первичным ключом по столбцам UserID и URL: @@ -496,7 +496,7 @@ SELECT UserID, URL FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID Последствия этого для производительности выполнения запросов мы рассмотрим подробнее позже. -### Первичный индекс используется для отбора гранул +### Первичный индекс используется для отбора гранул {#the-primary-index-is-used-for-selecting-granules} Теперь мы можем выполнять запросы с использованием первичного индекса. @@ -528,7 +528,7 @@ LIMIT 10; └────────────────────────────────┴───────┘ 10 rows in set. Elapsed: 0.005 sec. -# highlight-next-line +# highlight-next-line {#highlight-next-line} Обработано 8,19 тыс. строк, 740,18 КБ (1,53 млн. строк/с., 138,59 МБ/с.) ``` @@ -539,13 +539,13 @@ LIMIT 10; ```response ...Executor): Key condition: (column 0 in [749927693, 749927693]) -# highlight-next-line +# highlight-next-line {#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 +# highlight-next-line {#highlight-next-line} 1/1083 marks by primary key, 1 marks to read from 1 ranges ...Reading ...approx. 8192 rows starting from 1441792 ``` @@ -594,7 +594,7 @@ LIMIT 10; │ UserID │ │ Condition: (UserID in [749927693, 749927693]) │ │ Parts: 1/1 │ -# highlight-next-line +# highlight-next-line {#highlight-next-line} │ Granules: 1/1083 │ └───────────────────────────────────────────────────────────────────────────────────────┘ @@ -713,7 +713,7 @@ ClickHouse нужно найти (и потоково считать все зн -### Вторичные ключевые столбцы могут быть (не)эффективными +### Вторичные ключевые столбцы могут быть (не)эффективными {#secondary-key-columns-can-not-be-inefficient} Когда запрос фильтрует данные по столбцу, который является частью составного ключа и при этом является первым ключевым столбцом, [ClickHouse выполняет алгоритм бинарного поиска по индексным меткам этого ключевого столбца](#the-primary-index-is-used-for-selecting-granules). @@ -759,7 +759,7 @@ LIMIT 10; └────────────┴───────┘ 10 строк в наборе. Прошло: 0.086 сек. -# highlight-next-line +# highlight-next-line {#highlight-next-line} Обработано 8.81 млн строк, 799.69 МБ (102.11 млн строк/с., 9.27 ГБ/с.) ``` @@ -771,11 +771,11 @@ LIMIT 10; ```response ...Executor): Условие по ключу: (столбец 1 в ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): Использован общий поиск с исключениями по индексу для части all_1_9_2 за 1537 шагов ...Executor): Выбрано 1/1 частей по ключу партиционирования, 1 часть по первичному ключу, -# highlight-next-line +# highlight-next-line {#highlight-next-line} 1076/1083 засечек по первичному ключу, 1076 засечек для чтения из 5 диапазонов ...Executor): Чтение примерно 8814592 строк в 10 потоков ``` @@ -844,7 +844,7 @@ LIMIT 10; В нашем примерном наборе данных оба ключевых столбца (UserID, URL) имеют схожую высокую кардинальность, и, как уже объяснялось, универсальный алгоритм поиска с исключением не очень эффективен, когда предшествующий ключевой столбец для столбца URL имеет высокую (или схожую) кардинальность. -### Примечание об индексе пропуска данных +### Примечание об индексе пропуска данных {#note-about-data-skipping-index} Из-за схожей высокой кардинальности `UserID` и `URL` наша [фильтрация запросов по URL](/guides/best-practices/sparse-primary-indexes#secondary-key-columns-can-not-be-inefficient) также не дала бы существенного выигрыша от создания [вторичного индекса пропуска данных](./skipping-indexes.md) на столбце `URL` в нашей [таблице с составным первичным ключом (UserID, URL)](#a-table-with-a-primary-key). @@ -909,7 +909,7 @@ ClickHouse создал дополнительный индекс, которы -### Вариант 1: вторичные таблицы +### Вариант 1: вторичные таблицы {#option-1-secondary-tables} @@ -989,7 +989,7 @@ LIMIT 10; └────────────┴───────┘ 10 строк в наборе. Затрачено: 0.017 сек. -# highlight-next-line +# highlight-next-line {#highlight-next-line} Обработано 319.49 тысяч строк, 11.38 MB (18.41 million rows/s., 655.75 MB/s.) ``` @@ -1005,13 +1005,13 @@ LIMIT 10; ```response ...Executor): Условие по ключу: (столбец 0 в ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): Выполняется бинарный поиск по диапазону индекса для части all_1_9_2 (1083 гранулы) ...Executor): Найдена (ЛЕВАЯ) граничная гранула: 644 ...Executor): Найдена (ПРАВАЯ) граничная гранула: 683 ...Executor): Найден непрерывный диапазон за 19 шагов ...Executor): Выбрано 1/1 частей по ключу партиционирования, 1 часть по первичному ключу, -# highlight-next-line +# highlight-next-line {#highlight-next-line} 39/1083 гранул по первичному ключу, 39 гранул для чтения из 1 диапазона ...Executor): Чтение примерно 319488 строк с использованием 2 потоков ``` @@ -1146,7 +1146,7 @@ LIMIT 10; └────────────┴───────┘ 10 строк в наборе. Прошло: 0.026 сек. -# highlight-next-line +# highlight-next-line {#highlight-next-line} Обработано 335.87 тыс. строк, 13.54 МБ (12.91 млн строк/с., 520.38 МБ/с.) ``` @@ -1159,7 +1159,7 @@ LIMIT 10; ```response ...Executor): Key condition: (column 0 in ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): Running binary search on index range ... ... ...Executor): Selected 4/4 parts by partition key, 4 parts by primary key, @@ -1236,7 +1236,7 @@ LIMIT 10; └────────────┴───────┘ 10 строк в наборе. Прошло: 0.029 сек. -# highlight-next-line +# highlight-next-line {#highlight-next-line} Обработано 319.49 тыс. строк, 1 1.38 МБ (11.05 млн строк/сек., 393.58 МБ/сек.) ``` @@ -1249,14 +1249,14 @@ LIMIT 10; ```response ...Executor): Условие по ключу: (столбец 0 в ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): Выполняется бинарный поиск по диапазону индекса для части prj_url_userid (1083 гранулы) ...Executor): ... # highlight-next-line ...Executor): Выбрана полная обычная проекция prj_url_userid ...Executor): требуемые столбцы проекции: URL, UserID ...Executor): Выбрано 1/1 частей по ключу партиции, 1 частей по первичному ключу, -# highlight-next-line +# highlight-next-line {#highlight-next-line} 39/1083 гранул по первичному ключу, 39 гранул для чтения из 1 диапазона ...Executor): Чтение приблизительно 319488 строк с использованием 2 потоков ``` @@ -1448,7 +1448,7 @@ WHERE UserID = 112304 Причина в том, что [generic exclusion search algorithm](https://github.com/ClickHouse/ClickHouse/blob/22.3/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp#L1444) работает наиболее эффективно, когда [гранулы](#the-primary-index-is-used-for-selecting-granules) выбираются по столбцу вторичного ключа, при этом предшествующий ему столбец ключа имеет более низкую кардинальность. Мы подробно показали это в [предыдущем разделе](#generic-exclusion-search-algorithm) данного руководства. -### Оптимальный коэффициент сжатия файлов данных +### Оптимальный коэффициент сжатия файлов данных {#efficient-filtering-on-secondary-key-columns} Этот запрос сравнивает коэффициент сжатия столбца `UserID` в двух таблицах, созданных выше: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md index 855aa7ff57a..83890616327 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md @@ -19,8 +19,7 @@ import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; Используемый язык запросов задаётся параметром `dialect`. - -## Стандартный SQL +## Стандартный SQL {#standard-sql} Стандартный SQL — язык запросов, используемый в ClickHouse по умолчанию. @@ -28,8 +27,7 @@ import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; SET dialect = 'clickhouse' ``` - -## Конвейерный реляционный язык запросов (PRQL) +## Конвейерный реляционный язык запросов (PRQL) {#pipelined-relational-query-language-prql} @@ -52,8 +50,7 @@ aggregate { Внутренне ClickHouse транспилирует PRQL в SQL для выполнения запросов PRQL. - -## Язык запросов Kusto (KQL) +## Язык запросов Kusto (KQL) {#kusto-query-language-kql} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md b/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md index 9e565577392..cd2f4576e75 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md @@ -6,13 +6,11 @@ keywords: ['materialized view', 'агрегация'] doc_type: 'guide' --- - - -# Каскадные материализованные представления +# Каскадные материализованные представления {#cascading-materialized-views} Этот пример демонстрирует, как создать материализованное представление, а затем — как создать второе материализованное представление на основе первого (каскадно). На этой странице вы увидите, как это сделать, узнаете о многих возможностях и ограничениях. Разные варианты использования можно реализовать, создавая материализованное представление, использующее в качестве источника другое материализованное представление. - + + + + allowfullscreen +/> -
+
ClickHouse предоставляет несколько подходов к работе с JSON, каждый из которых имеет свои преимущества, недостатки и области применения. В этом руководстве мы рассмотрим, как загружать JSON и оптимально проектировать схему. Руководство состоит из следующих разделов: -- [Loading JSON](/integrations/data-formats/json/loading) - Загрузка и выполнение запросов к структурированному и полуструктурированному JSON в ClickHouse с использованием простых схем. -- [JSON schema inference](/integrations/data-formats/json/inference) - Использование автоматического вывода схемы JSON для выполнения запросов к JSON и создания схем таблиц. -- [Designing JSON schema](/integrations/data-formats/json/schema) - Этапы проектирования и оптимизации схемы JSON. -- [Exporting JSON](/integrations/data-formats/json/exporting) - Как экспортировать JSON. -- [Handling other JSON Formats](/integrations/data-formats/json/other-formats) - Рекомендации по работе с форматами JSON, отличными от формата с разделением по строкам (NDJSON). -- [Other approaches to modeling JSON](/integrations/data-formats/json/other-approaches) - Устаревшие подходы к моделированию JSON. **Не рекомендуется к использованию.** \ No newline at end of file +* [Loading JSON](/integrations/data-formats/json/loading) - Загрузка и выполнение запросов к структурированному и полуструктурированному JSON в ClickHouse с использованием простых схем. +* [JSON schema inference](/integrations/data-formats/json/inference) - Использование автоматического вывода схемы JSON для выполнения запросов к JSON и создания схем таблиц. +* [Designing JSON schema](/integrations/data-formats/json/schema) - Этапы проектирования и оптимизации схемы JSON. +* [Exporting JSON](/integrations/data-formats/json/exporting) - Как экспортировать JSON. +* [Handling other JSON Formats](/integrations/data-formats/json/other-formats) - Рекомендации по работе с форматами JSON, отличными от формата с разделением по строкам (NDJSON). +* [Other approaches to modeling JSON](/integrations/data-formats/json/other-approaches) - Устаревшие подходы к моделированию JSON. **Не рекомендуется к использованию.** \ No newline at end of file diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md index f7691d59497..7dc6de90385 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md @@ -17,7 +17,7 @@ doc_type: 'guide' -## Загрузка структурированного JSON +## Загрузка структурированного JSON {#loading-structured-json} В этом разделе предполагается, что данные находятся в формате [`NDJSON`](https://github.com/ndjson/ndjson-spec) (Newline delimited JSON — JSON, где объекты разделены переводами строки), который в ClickHouse известен как [`JSONEachRow`](/interfaces/formats/JSONEachRow), и хорошо структурированы, то есть имена и типы столбцов фиксированы. Формат `NDJSON` является предпочтительным для загрузки JSON из‑за своей компактности и эффективного использования места, но поддерживаются и другие форматы как для [ввода, так и вывода](/interfaces/formats/JSON). @@ -124,7 +124,7 @@ FORMAT JSONEachRow В этих примерах используется формат `JSONEachRow`. Поддерживаются и другие распространённые форматы JSON; примеры их загрузки приведены [здесь](/integrations/data-formats/json/other-formats). -## Загрузка полуструктурированного JSON +## Загрузка полуструктурированного JSON {#loading-semi-structured-json} В нашем предыдущем примере мы загружали JSON с фиксированной структурой и хорошо известными именами ключей и типами. На практике так бывает не всегда — ключи могут добавляться, а их типы меняться. Это часто встречается в сценариях, связанных с данными для наблюдаемости (Observability). @@ -200,7 +200,7 @@ LIMIT 2 Обратите внимание на разницу в производительности при загрузке данных. Для JSON-столбца при вставке требуется определение типов, а также дополнительное место для хранения, если есть столбцы, содержащие значения более чем одного типа. Хотя тип JSON можно настроить (см. [Проектирование схемы JSON](/integrations/data-formats/json/schema)) так, чтобы его производительность была сопоставима с явным объявлением столбцов, по умолчанию он намеренно остаётся гибким. Однако эта гибкость имеет свою цену. -### Когда использовать тип JSON +### Когда использовать тип JSON {#when-to-use-the-json-type} Используйте тип JSON, когда ваши данные: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md index 0464a38de60..dc9bb5522cb 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md @@ -6,9 +6,7 @@ keywords: ['json', 'formats'] doc_type: 'reference' --- - - -# Другие подходы к моделированию JSON +# Другие подходы к моделированию JSON {#other-approaches-to-modeling-json} **Ниже приведены альтернативные подходы к моделированию JSON в ClickHouse. Они приведены для полноты и использовались до появления типа JSON, поэтому, как правило, не рекомендуются и не применяются в большинстве сценариев.** @@ -16,9 +14,7 @@ doc_type: 'reference' К разным объектам в одной и той же схеме можно применять разные техники. Например, для одних объектов лучше всего подойдет тип `String`, а для других — тип `Map`. Обратите внимание, что после выбора типа `String` больше не требуется принимать какие-либо решения о схеме. Напротив, в ключ `Map` можно вложить подчиненные объекты, включая `String`, представляющую JSON, как показано ниже: ::: - - -## Использование типа String +## Использование типа String {#using-string} Если объекты очень динамичны, не имеют предсказуемой структуры и содержат произвольные вложенные объекты, следует использовать тип `String`. Значения можно извлекать во время выполнения запроса с помощью JSON‑функций, как показано ниже. @@ -95,7 +91,6 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.j 0 строк в наборе. Прошло: 25.186 с. Обработано 2.52 миллиона строк, 1.38 ГБ (99.89 тысячи строк/с, 54.79 МБ/с.) ``` - Предположим, мы хотим посчитать количество статей, выпущенных по годам. Сравним следующий запрос, использующий только строковое поле, с [структурированной версией](/integrations/data-formats/json/inference#creating-tables) схемы: ```sql @@ -156,7 +151,7 @@ LIMIT 10 Гибкость такого подхода имеет очевидную цену в виде потерь производительности и усложнения синтаксиса, поэтому его следует использовать только для высокодинамичных объектов в схеме. -### Простые JSON-функции +### Простые JSON-функции {#simple-json-functions} Выше приведены примеры использования семейства функций JSON*. Они используют полноценный JSON-парсер на базе [simdjson](https://github.com/simdjson/simdjson), который строго относится к разбору и различает одноимённые поля на разных уровнях вложенности. Эти функции способны корректно обрабатывать синтаксически правильный, но плохо отформатированный JSON, например с двойными пробелами между ключами. @@ -174,7 +169,6 @@ LIMIT 10 В то время как следующий пример будет успешно разобран: - ````json {"@timestamp":893964617,"clientip":"40.135.0.0","request":{"method":"GET", "path":"/images/hm_bg.jpg","version":"HTTP/1.0"},"status":200,"size":24736} @@ -209,8 +203,7 @@ LIMIT 10 Приведённый выше запрос использует `simpleJSONExtractString` для извлечения ключа `created`, учитывая, что нам нужно только первое значение для даты публикации. В этом случае ограничения функций `simpleJSON*` приемлемы ради повышения производительности. - -## Использование типа Map +## Использование типа Map {#using-map} Если объект используется для хранения произвольных ключей (преимущественно одного типа), рассмотрите использование типа `Map`. В идеале количество уникальных ключей не должно превышать нескольких сотен. Тип `Map` также можно использовать для объектов с вложенными объектами при условии, что последние однородны по своим типам. В целом мы рекомендуем использовать тип `Map` для лейблов и тегов, например лейблов подов Kubernetes в логах. @@ -224,7 +217,7 @@ LIMIT 10 При моделировании объектов как `Map` в качестве ключа используется строка (`String`), в которой хранится имя ключа JSON. Поэтому `Map` всегда будет иметь вид `Map(String, T)`, где `T` зависит от данных. ::: -#### Примитивные значения +#### Примитивные значения {#primitive-values} Простейшее применение `Map` — когда объект содержит значения одного и того же примитивного типа. В большинстве случаев это означает использование типа `String` для значения `T`. @@ -281,13 +274,12 @@ SELECT company.labels['type'] AS type FROM people Полный набор функций `Map`, доступных для выполнения запросов, описан [здесь](/sql-reference/functions/tuple-map-functions.md). Если ваши данные не имеют согласованного типа, существуют функции для выполнения [необходимого приведения типов](/sql-reference/functions/type-conversion-functions). -#### Значения объектов +#### Значения объектов {#object-values} Тип `Map` также можно использовать для представления объектов с вложенными объектами, при условии, что у последних согласованы их типы. Предположим, ключ `tags` для нашего объекта `persons` требует согласованной структуры, где вложенный объект для каждого `tag` имеет столбцы `name` и `time`. Упрощённый пример такого JSON-документа может выглядеть следующим образом: - ```json { "id": 1, @@ -360,8 +352,7 @@ FORMAT JSONEachRow } ``` - -## Использование типа Nested +## Использование типа Nested {#using-nested} Тип [Nested](/sql-reference/data-types/nested-data-structures/nested) можно использовать для моделирования статических объектов, которые редко изменяются, в качестве альтернативы `Tuple` и `Array(Tuple)`. В целом мы рекомендуем избегать использования этого типа для JSON, поскольку его поведение часто оказывается запутанным. Основное преимущество `Nested` заключается в том, что подколонки могут использоваться в ключах сортировки. @@ -396,11 +387,11 @@ CREATE table http ) ENGINE = MergeTree() ORDER BY (status, timestamp); ``` -### flatten_nested +### flatten_nested {#flatten_nested} Параметр `flatten_nested` управляет поведением типа данных `Nested`. -#### flatten_nested=1 +#### flatten_nested=1 {#flatten_nested1} Значение `1` (по умолчанию) не поддерживает произвольную глубину вложенности. При таком значении проще всего рассматривать вложенную структуру данных как несколько столбцов [Array](/sql-reference/data-types/array) одинаковой длины. Поля `method`, `path` и `version` фактически являются отдельными столбцами `Array(Type)` с одним критическим ограничением: **длина полей `method`, `path` и `version` должна быть одинаковой.** Если мы воспользуемся `SHOW CREATE TABLE`, это иллюстрируется следующим образом: @@ -471,10 +462,9 @@ SELECT clientip, status, size, `request.method` FROM http WHERE has(request.meth Получена 1 строка. Время выполнения: 0.002 сек. ``` - Обратите внимание, что использование `Array` для подстолбцов означает, что можно потенциально использовать весь спектр [функций работы с массивами](/sql-reference/functions/array-functions), включая клаузу [`ARRAY JOIN`](/sql-reference/statements/select/array-join), что полезно, если ваши столбцы содержат несколько значений. -#### flatten_nested=0 +#### flatten_nested=0 {#flatten_nested0} Это позволяет использовать произвольный уровень вложенности и означает, что вложенные столбцы остаются одним массивом `Tuple` — по сути, они становятся тем же самым, что и `Array(Tuple)`. @@ -546,7 +536,7 @@ SELECT clientip, status, size, `request.method` FROM http WHERE has(request.meth Получена 1 строка. Время выполнения: 0.002 сек. ``` -### Пример +### Пример {#example} Более объёмный пример приведённых выше данных доступен в общедоступном бакете в S3 по адресу: `s3://datasets-documentation/http/`. @@ -584,7 +574,6 @@ size FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/doc Чтобы выполнять запросы к этим данным, нам необходимо обращаться к полям запроса как к массивам. Ниже мы агрегируем ошибки и HTTP-методы за фиксированный период времени. - ```sql SELECT status, request.method[1] AS method, count() AS c FROM http @@ -604,7 +593,7 @@ ORDER BY c DESC LIMIT 5; 5 строк в наборе. Прошло: 0,007 сек. ``` -### Использование парных массивов +### Использование парных массивов {#using-pairwise-arrays} Парные массивы обеспечивают баланс между гибкостью представления JSON в виде строк (`String`) и производительностью более структурированного подхода. Схема гибкая в том смысле, что любые новые поля потенциально могут быть добавлены в корень. Однако это требует значительно более сложного синтаксиса запросов и несовместимо с вложенными структурами. @@ -668,7 +657,6 @@ GROUP BY method, status ORDER BY c DESC LIMIT 5; └────────┴────────┴───────┘ ``` - 5 строк в наборе. Прошло времени: 0.383 сек. Обработано 8.22 млн строк, 1.97 ГБ (21.45 млн строк/с, 5.15 ГБ/с.) Пиковое потребление памяти: 51.35 МиБ. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md index 4e5974300f5..db143fbcf73 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md @@ -13,11 +13,11 @@ import json_offsets from '@site/static/images/integrations/data-ingestion/data-f import shared_json_column from '@site/static/images/integrations/data-ingestion/data-formats/json_shared_column.png'; -# Проектирование схемы +# Проектирование схемы {#designing-your-schema} Хотя [вывод схемы](/integrations/data-formats/json/inference) можно использовать для формирования начальной схемы JSON‑данных и выполнения запросов к JSON‑файлам непосредственно в хранилище, например в S3, пользователям следует стремиться разработать оптимизированную версионируемую схему для своих данных. Ниже рассматривается рекомендуемый подход к моделированию JSON‑структур. -## Статический и динамический JSON +## Статический и динамический JSON {#static-vs-dynamic-json} Основная задача при определении схемы для JSON — определить подходящий тип для значения каждого ключа. Мы рекомендуем рекурсивно применять к каждому ключу в иерархии JSON следующие правила, чтобы определить соответствующий тип для каждого ключа. @@ -92,7 +92,7 @@ import shared_json_column from '@site/static/images/integrations/data-ingestion/ Структуры с сотнями или тысячами статических ключей можно считать динамическими, так как редко бывает реалистично статически объявлять для них столбцы. Тем не менее, при возможности [пропускайте пути](#using-type-hints-and-skipping-paths), которые не нужны, чтобы сократить затраты как на хранение, так и на определение типов. ::: -## Обработка статических структур +## Обработка статических структур {#handling-static-structures} Мы рекомендуем обрабатывать статические структуры с помощью именованных кортежей (`Tuple`). Массивы объектов могут храниться в массивах кортежей, то есть `Array(Tuple)`. Внутри самих кортежей столбцы и их соответствующие типы должны определяться по тем же правилам. Это может приводить к вложенным `Tuple` для представления вложенных объектов, как показано ниже. @@ -203,7 +203,7 @@ ORDER BY company.name ``` -### Обработка значений по умолчанию +### Обработка значений по умолчанию {#handling-default-values} Даже если объекты JSON структурированы, они часто разреженные и содержат только подмножество известных ключей. К счастью, тип `Tuple` не требует, чтобы в JSON-полезной нагрузке присутствовали все столбцы. Если какие-либо из них не указаны, будут использованы значения по умолчанию. @@ -282,7 +282,7 @@ FORMAT PrettyJSONEachRow ::: -### Обработка новых столбцов +### Обработка новых столбцов {#handling-new-columns} Хотя структурированный подход наиболее прост, когда ключи JSON статичны, его все же можно использовать и в том случае, если изменения схемы можно спланировать, то есть новые ключи известны заранее и схему можно соответствующим образом изменить. @@ -360,7 +360,7 @@ SELECT id, nickname FROM people ``` -## Обработка полуструктурированных/динамических структур +## Обработка полуструктурированных/динамических структур {#handling-semi-structured-dynamic-structures} Если JSON-данные являются полуструктурированными, где ключи могут динамически добавляться и/или иметь несколько типов, рекомендуется использовать тип [`JSON`](/sql-reference/data-types/newjson). @@ -491,7 +491,7 @@ SELECT id, nickname FROM people - **Избежание риска взрывного роста числа столбцов** – хотя тип JSON масштабируется потенциально до тысяч столбцов, где подстолбцы хранятся как отдельные столбцы, это может привести к «взрыву» файлов столбцов, когда создаётся чрезмерное количество файлов столбцов, что ухудшает производительность. Чтобы минимизировать этот риск, базовый [тип Dynamic](/sql-reference/data-types/dynamic), используемый JSON, предоставляет параметр [`max_dynamic_paths`](/sql-reference/data-types/newjson#reading-json-paths-as-sub-columns), который ограничивает количество уникальных путей, хранимых как отдельные файлы столбцов. После достижения порога дополнительные пути сохраняются в общем файле столбца с использованием компактного кодированного формата, что позволяет сохранить производительность и эффективность хранения при обеспечении гибкости ингестии данных. Однако доступ к этому общему файлу столбца менее эффективен по производительности. Обратите внимание, что столбец JSON может использоваться с [подсказками типов](#using-type-hints-and-skipping-paths). Столбцы с «подсказками» будут обеспечивать ту же производительность, что и выделенные столбцы. - **Упрощённая интроспекция путей и типов** – хотя тип JSON поддерживает [функции интроспекции](/sql-reference/data-types/newjson#introspection-functions) для определения выведенных типов и путей, статические структуры зачастую проще исследовать, например, с помощью `DESCRIBE`. -### Один столбец JSON +### Один столбец JSON {#single-json-column} Этот подход полезен для прототипирования и задач data engineering. В продакшене старайтесь использовать `JSON` только для динамических подструктур, когда это действительно необходимо. @@ -667,7 +667,7 @@ FROM people ``` -### Целевой столбец JSON +### Целевой столбец JSON {#targeted-json-column} Хотя такой подход полезен при прототипировании и решении задач инженерии данных, в продуктивной среде мы рекомендуем по возможности использовать явную схему. @@ -767,7 +767,7 @@ FORMAT PrettyJsonEachRow ``` -### Использование подсказок типов и пропуска путей +### Использование подсказок типов и пропуска путей {#using-type-hints-and-skipping-paths} Подсказки типов позволяют указать тип для пути и его подстолбца, предотвращая излишний вывод типов. Рассмотрим следующий пример, в котором мы задаём типы для JSON-ключей `dissolved`, `employees` и `founded` внутри JSON-столбца `company.labels`. @@ -934,7 +934,7 @@ FORMAT PrettyJSONEachRow В результате для наборов данных, которые в основном однородны, но при этом выигрывают от гибкости JSON, подсказки типов предоставляют удобный способ сохранить производительность без необходимости переработки схемы или конвейера приёма данных. -### Настройка динамических путей +### Настройка динамических путей {#configuring-dynamic-paths} ClickHouse хранит каждый JSON-путь как подколонку в настоящем колоночном формате, обеспечивая те же преимущества по производительности, что и для традиционных столбцов — например, сжатие, SIMD-ускоренную обработку и минимальное дисковое I/O. Каждая уникальная комбинация пути и типа в ваших JSON-данных может быть вынесена в отдельный файловый столбец на диске. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md index 0faf3e900d3..9652f1d8def 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md @@ -10,7 +10,7 @@ keywords: ['parquet', 'колоночный формат', 'формат дан -# Работа с Parquet в ClickHouse +# Работа с Parquet в ClickHouse {#working-with-parquet-in-clickhouse} Parquet — это эффективный файловый формат для хранения данных в колоночном формате. ClickHouse поддерживает как чтение, так и запись файлов Parquet. @@ -24,7 +24,7 @@ ClickHouse поддерживает как чтение, так и запись -## Импорт из Parquet +## Импорт из Parquet {#importing-from-parquet} Перед загрузкой данных мы можем использовать функцию [file()](/sql-reference/functions/files.md/#file), чтобы изучить структуру [примерного файла формата Parquet](assets/data.parquet): @@ -64,7 +64,7 @@ LIMIT 3; ::: -## Импорт в существующую таблицу +## Импорт в существующую таблицу {#importing-to-an-existing-table} Создадим таблицу, в которую будем импортировать данные в формате Parquet: @@ -103,7 +103,7 @@ LIMIT 5; Обратите внимание, что ClickHouse автоматически преобразовал строки формата Parquet (в столбце `date`) в тип `Date`. Это происходит потому, что ClickHouse выполняет приведение типов на основе типов в целевой таблице. -## Загрузка локального файла на удалённый сервер +## Загрузка локального файла на удалённый сервер {#inserting-a-local-file-to-remote-server} Если вы хотите загрузить локальный файл Parquet на удалённый сервер ClickHouse, вы можете сделать это, передав его содержимое в `clickhouse-client` через pipe, как показано ниже: @@ -112,7 +112,7 @@ clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet ``` -## Создание новых таблиц из файлов Parquet +## Создание новых таблиц из файлов Parquet {#creating-new-tables-from-parquet-files} Поскольку ClickHouse читает схему файлов Parquet, мы можем динамически создавать таблицы: @@ -141,7 +141,7 @@ DESCRIBE TABLE imported_from_parquet; По умолчанию ClickHouse строго проверяет имена столбцов, их типы и значения. Но иногда при импорте можно игнорировать несуществующие столбцы или неподдерживаемые значения. Это можно настроить с помощью [настроек Parquet](/interfaces/formats/Parquet#format-settings). -## Экспорт в формат Parquet +## Экспорт в формат Parquet {#exporting-to-parquet-format} :::tip При использовании `INTO OUTFILE` с ClickHouse Cloud команды в `clickhouse client` нужно запускать на той машине (хосте), на которую будет записан файл. @@ -159,7 +159,7 @@ FORMAT Parquet В результате в текущем рабочем каталоге будет создан файл `export.parquet`. -## Типы данных ClickHouse и Parquet +## Типы данных ClickHouse и Parquet {#clickhouse-and-parquet-data-types} Типы данных ClickHouse и Parquet в основном совпадают, но всё же [имеют некоторые отличия](/interfaces/formats/Parquet#data-types-matching-parquet). Например, ClickHouse экспортирует тип `DateTime` как значение типа `int64` в формате Parquet. Если затем импортировать его обратно в ClickHouse, мы увидим числа ([файл time.parquet](assets/time.parquet)): diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md index dfeb10aafaa..c6717999b4d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md @@ -9,13 +9,13 @@ keywords: ['формат SQL', 'экспорт данных', 'импорт да -# Вставка и выгрузка SQL-данных в ClickHouse +# Вставка и выгрузка SQL-данных в ClickHouse {#inserting-and-dumping-sql-data-in-clickhouse} ClickHouse можно легко интегрировать в OLTP‑инфраструктуры баз данных разными способами. Один из вариантов — передавать данные между другими базами данных и ClickHouse с помощью SQL‑дампов. -## Создание SQL-дампов +## Создание SQL-дампов {#creating-sql-dumps} Данные можно выгрузить в формате SQL с помощью [SQLInsert](/interfaces/formats/SQLInsert). ClickHouse запишет данные в виде `INSERT INTO VALUES(...` и будет использовать настройку [`output_format_sql_insert_table_name`](/operations/settings/settings-formats.md/#output_format_sql_insert_table_name) в качестве имени таблицы: @@ -46,7 +46,7 @@ mysql some_db < dump.sql SET output_format_sql_insert_max_batch_size = 1000; ``` -### Экспорт набора значений +### Экспорт набора значений {#exporting-a-set-of-values} В ClickHouse есть формат [Values](/interfaces/formats/Values), который аналогичен SQL INSERT, но опускает оператор `INSERT INTO table VALUES` и содержит только набор значений: @@ -59,7 +59,7 @@ SELECT * FROM some_data LIMIT 3 FORMAT Values ``` -## Импорт данных из SQL-дампов +## Импорт данных из SQL-дампов {#inserting-data-from-sql-dumps} Для чтения SQL-дампов используется формат [MySQLDump](/interfaces/formats/MySQLDump): diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md index 4dfdbc17ceb..f65e20847f1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md @@ -10,13 +10,13 @@ keywords: ['форматы данных', 'шаблоны', 'regex', 'польз -# Импорт и экспорт произвольных текстовых данных с помощью форматов Template и Regex в ClickHouse +# Импорт и экспорт произвольных текстовых данных с помощью форматов Template и Regex в ClickHouse {#importing-and-exporting-custom-text-data-using-templates-and-regex-in-clickhouse} Нам часто приходится работать с данными в произвольных текстовых форматах. Это может быть нестандартный формат, некорректный JSON или «сломанный» CSV. Использование стандартных парсеров, таких как CSV или JSON, в таких случаях не всегда работает. Но в ClickHouse для этого предусмотрены мощные форматы Template и Regex. -## Импорт на основе шаблона +## Импорт на основе шаблона {#importing-based-on-a-template} Предположим, что мы хотим импортировать данные из следующего [файла журнала](assets/error.log): @@ -88,7 +88,7 @@ GROUP BY request └──────────────────────────────────────────────────┴─────────┘ ``` -### Пропуск пробелов +### Пропуск пробелов {#skipping-whitespaces} Рекомендуется использовать [TemplateIgnoreSpaces](/interfaces/formats/TemplateIgnoreSpaces), который позволяет игнорировать пробелы между разделителями в шаблоне: @@ -98,7 +98,7 @@ TemplateIgnoreSpaces --> "p1:${p1:CSV}, p2:${p2:CSV}" ``` -## Экспорт данных с использованием шаблонов +## Экспорт данных с использованием шаблонов {#exporting-data-using-templates} Мы также можем экспортировать данные в любой текстовый формат с помощью шаблонов. В этом случае нужно создать два файла: @@ -142,7 +142,7 @@ FORMAT Template SETTINGS format_template_resultset = 'output.results', --- Прочитано 1000 строк за 0.001380604 --- ``` -### Экспорт в HTML-файлы +### Экспорт в HTML-файлы {#exporting-to-html-files} Результаты, сформированные по шаблону, также можно экспортировать в файлы с помощью предложения [`INTO OUTFILE`](/sql-reference/statements/select/into-outfile.md). Сгенерируем HTML-файлы на основе указанных форматов [resultset](assets/html.results) и [row](assets/html.row): @@ -157,7 +157,7 @@ SETTINGS format_template_resultset = 'html.results', format_template_row = 'html.row' ``` -### Экспорт в XML +### Экспорт в XML {#exporting-to-xml} Формат шаблона можно использовать для генерации файлов любого текстового формата, включая XML. Просто подготовьте соответствующий шаблон и выполните экспорт. @@ -203,7 +203,7 @@ FORMAT XML ``` -## Импорт данных на основе регулярных выражений +## Импорт данных на основе регулярных выражений {#importing-data-based-on-regular-expressions} Формат [Regexp](/interfaces/formats/Regexp) предназначен для более сложных случаев, когда входные данные необходимо разбирать более сложным способом. Давайте разберём наш пример с файлом [error.log](assets/error.log), но на этот раз извлечём имя файла и протокол, чтобы сохранить их в отдельные столбцы. Для начала подготовим для этого новую таблицу: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md index d37457d767b..6e2d3f1b687 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md @@ -6,7 +6,7 @@ description: 'Главная страница раздела об ингести doc_type: 'landing-page' --- -# Ингестия данных +# Ингестия данных {#data-ingestion} ClickHouse интегрируется с рядом решений для интеграции и трансформации данных. Для получения дополнительной информации ознакомьтесь со страницами ниже: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md index 94cb56c155a..63838b7a23c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md @@ -6,7 +6,7 @@ title: 'Источники данных' doc_type: 'landing-page' --- -# Источники данных +# Источники данных {#data-sources} ClickHouse позволяет с лёгкостью выполнять приём данных в базу данных из различных источников. Дополнительную информацию см. на следующих страницах: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md index 6d621c92536..1cb59452e6c 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md @@ -17,7 +17,7 @@ import dynamodb_map_columns from '@site/static/images/integrations/data-ingestio import Image from '@theme/IdealImage'; -# CDC из DynamoDB в ClickHouse +# CDC из DynamoDB в ClickHouse {#cdc-from-dynamodb-to-clickhouse} @@ -50,9 +50,9 @@ import Image from '@theme/IdealImage'; -## 3. Загрузка снимка в ClickHouse +## 3. Загрузка снимка в ClickHouse {#3-load-the-snapshot-into-clickhouse} -### Создайте необходимые таблицы +### Создайте необходимые таблицы {#create-necessary-tables} Данные снимка из DynamoDB будут выглядеть примерно так: @@ -115,7 +115,7 @@ ORDER BY id; * Таблица должна использовать ключ партиционирования в качестве ключа сортировки (задаваемого в `ORDER BY`) * Строки с одинаковым ключом сортировки будут очищаться от дубликатов на основе столбца `version`. -### Создание snapshot ClickPipe +### Создание snapshot ClickPipe {#create-the-snapshot-clickpipe} Теперь вы можете создать ClickPipe для загрузки snapshot-данных из S3 в ClickHouse. Следуйте руководству по S3 ClickPipe [здесь](/integrations/clickpipes/object-storage), но используйте следующие настройки: @@ -146,7 +146,7 @@ https://{bucket}.s3.amazonaws.com/{prefix}/AWSDynamoDB/{export-id}/data/* -## 5. Очистка (необязательно) +## 5. Очистка (необязательно) {#5-cleanup-optional} После завершения снапшотного ClickPipe вы можете удалить таблицу снимка и материализованное представление. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md index 802f77d3da7..9b57b6703ae 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md @@ -16,7 +16,7 @@ import Jdbc02 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-02 import Jdbc03 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-03.png'; -# Подключение ClickHouse к внешним источникам данных с помощью JDBC +# Подключение ClickHouse к внешним источникам данных с помощью JDBC {#connecting-clickhouse-to-external-data-sources-with-jdbc} :::note Использование JDBC требует ClickHouse JDBC Bridge, поэтому вам понадобится использовать `clickhouse-local` на локальной машине, чтобы передавать данные из вашей базы данных в ClickHouse Cloud. Перейдите на страницу [**Using clickhouse-local**](/cloud/migration/clickhouse-local#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge) в разделе **Migrate** документации для получения подробной информации. @@ -44,7 +44,7 @@ import Jdbc03 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-03 -## Установка ClickHouse JDBC Bridge локально +## Установка ClickHouse JDBC Bridge локально {#install-the-clickhouse-jdbc-bridge-locally} Самый простой способ использовать ClickHouse JDBC Bridge — установить и запустить его на той же машине, где работает ClickHouse: @@ -107,7 +107,7 @@ java -jar clickhouse-jdbc-bridge-2.0.7-shaded.jar ::: -## Использование JDBC-подключения из ClickHouse +## Использование JDBC-подключения из ClickHouse {#use-the-jdbc-connection-from-within-clickhouse} Теперь ClickHouse может получать доступ к данным MySQL с помощью [табличной функции jdbc](/sql-reference/table-functions/jdbc.md) или [движка таблицы JDBC](/engines/table-engines/integrations/jdbc.md). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md index f60acf8d735..8f824b5de13 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md @@ -10,27 +10,24 @@ doc_type: 'guide' import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - -# Подключение ClickHouse к PostgreSQL +# Подключение ClickHouse к PostgreSQL {#connecting-clickhouse-to-postgresql} На этой странице рассматриваются следующие варианты интеграции PostgreSQL с ClickHouse: -- использование движка таблиц `PostgreSQL` для чтения данных из таблицы PostgreSQL -- использование экспериментального движка баз данных `MaterializedPostgreSQL` для синхронизации базы данных в PostgreSQL с базой данных в ClickHouse +* использование движка таблиц `PostgreSQL` для чтения данных из таблицы PostgreSQL +* использование экспериментального движка баз данных `MaterializedPostgreSQL` для синхронизации базы данных в PostgreSQL с базой данных в ClickHouse :::tip Мы рекомендуем использовать [ClickPipes](/integrations/clickpipes/postgres) — управляемый сервис интеграции для ClickHouse Cloud на базе PeerDB. В качестве альтернативы [PeerDB](https://github.com/PeerDB-io/peerdb) доступен как open-source CDC‑инструмент, специально разработанный для репликации базы данных PostgreSQL как в самостоятельно развернутый ClickHouse, так и в ClickHouse Cloud. ::: - - -## Использование табличного движка PostgreSQL +## Использование табличного движка PostgreSQL {#using-the-postgresql-table-engine} Табличный движок `PostgreSQL` позволяет выполнять операции **SELECT** и **INSERT** над данными, хранящимися на удалённом сервере PostgreSQL, из ClickHouse. В этой статье иллюстрируются базовые способы интеграции на примере одной таблицы. -### 1. Настройка PostgreSQL +### 1. Настройка PostgreSQL {#1-setting-up-postgresql} 1. В `postgresql.conf` добавьте следующую запись, чтобы разрешить PostgreSQL прослушивать сетевые интерфейсы: @@ -93,7 +90,7 @@ psql -U clickhouse_user -W -d db_in_psg -h <ваш_хост_postgresql> Обратитесь к ClickHouse [Cloud Endpoints API](/cloud/get-started/query-endpoints), чтобы получить сведения об исходящем трафике. ::: -### 2. Определите таблицу в ClickHouse +### 2. Определите таблицу в ClickHouse {#2-define-a-table-in-clickhouse} 1. Подключитесь к `clickhouse-client`: @@ -131,7 +128,7 @@ ENGINE = PostgreSQL('postgres-host.domain.com:5432', 'db_in_psg', 'table1', 'cli См. страницу документации [PostgreSQL table engine](/engines/table-engines/integrations/postgresql) для полного списка параметров. ::: -### 3 Тестирование интеграции +### 3 Тестирование интеграции {#3-test-the-integration} 1. В ClickHouse просмотрите несколько первых строк: @@ -166,7 +163,6 @@ VALUES SELECT * FROM db_in_ch.table1 ``` - Ответ должен выглядеть следующим образом: ```response @@ -208,8 +204,7 @@ id | column1 В этом примере была продемонстрирована базовая интеграция между PostgreSQL и ClickHouse с использованием движка таблицы `PostrgeSQL`. Ознакомьтесь с [документацией по движку таблицы PostgreSQL](/engines/table-engines/integrations/postgresql), чтобы узнать о дополнительных возможностях, таких как указание схем, возврат только подмножества столбцов и подключение к нескольким репликам. Также рекомендуем ознакомиться с записью в блоге [ClickHouse and PostgreSQL - a match made in data heaven - part 1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres). - -## Использование движка базы данных MaterializedPostgreSQL +## Использование движка базы данных MaterializedPostgreSQL {#using-the-materializedpostgresql-database-engine} @@ -220,7 +215,7 @@ id | column1 ***В описанных ниже процедурах используются PostgreSQL CLI (psql) и ClickHouse CLI (clickhouse-client). Сервер PostgreSQL установлен на Linux. Далее приведены минимальные настройки для новой тестовой установки базы данных PostgreSQL.*** -### 1. В PostgreSQL +### 1. В PostgreSQL {#1-in-postgresql} 1. В `postgresql.conf` установите минимальные параметры прослушивания, уровень WAL для репликации и слоты репликации: @@ -275,7 +270,6 @@ VALUES 7. Настройте PostgreSQL так, чтобы он разрешал подключения к новой базе данных новому пользователю для репликации. Ниже приведена минимально необходимая запись, которую нужно добавить в файл `pg_hba.conf`: - ```text # TYPE DATABASE USER ADDRESS METHOD host db1 clickhouse_user 192.168.1.0/24 password @@ -349,7 +343,7 @@ Query id: df2381ac-4e30-4535-b22e-8be3894aaafc └────┴─────────┘ ``` -### 3. Проверьте базовую репликацию +### 3. Проверьте базовую репликацию {#2-in-clickhouse} 1. В PostgreSQL добавьте новые строки: @@ -385,7 +379,7 @@ Query id: b0729816-3917-44d3-8d1a-fed912fb59ce └────┴─────────┘ ``` -### 4. Итоги +### 4. Итоги {#3-test-basic-replication} В данном руководстве по интеграции был рассмотрен простой пример репликации базы данных с одной таблицей, однако существуют и более продвинутые варианты, включая репликацию всей базы данных или добавление новых таблиц и схем к уже настроенным репликациям. Хотя DDL-команды не поддерживаются в этой схеме репликации, движок можно настроить на обнаружение изменений и перезагрузку таблиц при внесении структурных изменений. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md index 5765282fa5c..6decd83a1f8 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md @@ -40,7 +40,7 @@ import clickhouse_result from '@site/static/images/integrations/data-ingestion/e import Image from '@theme/IdealImage'; -# Интеграция EMQX с ClickHouse +# Интеграция EMQX с ClickHouse {#integrating-emqx-with-clickhouse} @@ -63,7 +63,7 @@ import Image from '@theme/IdealImage'; -## Получение сервиса ClickHouse Cloud +## Получение сервиса ClickHouse Cloud {#get-your-clickhouse-cloudservice} В ходе этой настройки мы развернули экземпляр ClickHouse в AWS в регионе N. Virginia (us-east -1), при этом экземпляр EMQX Cloud также был развернут в том же регионе. @@ -153,7 +153,7 @@ EMQX Cloud по умолчанию не допускает анонимные п -## Интеграция EMQX Cloud с ClickHouse Cloud +## Интеграция EMQX Cloud с ClickHouse Cloud {#integration-emqx-cloud-with-clickhouse-cloud} [EMQX Cloud Data Integrations](https://docs.emqx.com/en/cloud/latest/rule_engine/introduction.html#general-flow) используется для настройки правил обработки и реакции на потоки сообщений EMQX и события устройств. Data Integrations не только предоставляет понятное и гибкое «конфигурируемое» архитектурное решение, но также упрощает процесс разработки, повышает удобство использования и снижает степень связности между бизнес-системой и EMQX Cloud. Кроме того, он обеспечивает превосходную инфраструктуру для кастомизации проприетарных возможностей EMQX Cloud. @@ -163,7 +163,7 @@ EMQX Cloud предлагает более 30 нативных интеграц -### Создание ресурса ClickHouse +### Создание ресурса ClickHouse {#create-clickhouse-resource} Нажмите «Data Integrations» в левом меню и затем «View All Resources». Вы найдете ClickHouse в разделе Data Persistence или можете выполнить поиск по ClickHouse. @@ -177,7 +177,7 @@ EMQX Cloud предлагает более 30 нативных интеграц -### Создание нового правила +### Создание нового правила {#create-a-new-rule} Во время создания ресурса вы увидите всплывающее окно, и нажатие кнопки «New» перенаправит вас на страницу создания правила. @@ -212,7 +212,7 @@ FROM Теперь нажмите кнопку «NEXT». На этом шаге вы указываете EMQX Cloud, как записывать обработанные данные в вашу базу данных ClickHouse. -### Добавьте ответное действие +### Добавьте ответное действие {#add-a-response-action} Если у вас только один ресурс, вам не нужно изменять «Resource» и «Action Type». Вам нужно только задать SQL‑шаблон. Ниже приведён пример, используемый в этом руководстве: @@ -225,7 +225,7 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ Это шаблон для вставки данных в ClickHouse; здесь вы можете увидеть, как используются переменные. -### Просмотр сведений о правиле +### Просмотр сведений о правиле {#view-rules-details} Нажмите «Confirm» и «View Details». Теперь всё должно быть корректно настроено. На странице сведений о правиле вы можете убедиться, что интеграция данных работает. @@ -234,13 +234,13 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ Все MQTT-сообщения, отправленные в топик `temp_hum/emqx`, будут сохранены в вашей базе данных ClickHouse Cloud. -## Сохранение данных в ClickHouse +## Сохранение данных в ClickHouse {#saving-data-into-clickhouse} Мы будем имитировать данные о температуре и влажности и отправлять их в EMQX Cloud через MQTT X, а затем использовать EMQX Cloud Data Integrations для сохранения данных в ClickHouse Cloud. -### Публикация MQTT‑сообщений в EMQX Cloud +### Публикация MQTT‑сообщений в EMQX Cloud {#publish-mqtt-messages-to-emqx-cloud} Вы можете использовать любой MQTT‑клиент или SDK для публикации сообщений. В этом руководстве мы будем использовать [MQTT X](https://mqttx.app/) — удобный MQTT‑клиент, предоставляемый EMQ. @@ -274,13 +274,13 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ -### Просмотр мониторинга правил +### Просмотр мониторинга правил {#view-rules-monitoring} Проверьте мониторинг правил и убедитесь, что счётчик успешных срабатываний увеличился на единицу. -### Проверка сохранённых данных +### Проверка сохранённых данных {#check-the-data-persisted} Теперь пришло время посмотреть на данные в ClickHouse Cloud. В идеале данные, которые вы отправляете с помощью MQTTX, попадут в EMQX Cloud и будут сохранены в базе данных ClickHouse Cloud с помощью встроенной интеграции данных. @@ -293,6 +293,6 @@ SELECT * FROM emqx.temp_hum; -### Итоги +### Итоги {#summary} Вы не написали ни единой строки кода, а данные MQTT уже поступают из EMQX Cloud в ClickHouse Cloud. С EMQX Cloud и ClickHouse Cloud вам не нужно управлять инфраструктурой — вы можете сосредоточиться на разработке IoT‑приложений, пока данные надёжно хранятся в ClickHouse Cloud. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md index fb80c5ac0cf..c01cd2bab10 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md @@ -25,7 +25,7 @@ import airbyte09 from '@site/static/images/integrations/data-ingestion/etl-tools import PartnerBadge from '@theme/badges/PartnerBadge'; -# Подключение Airbyte к ClickHouse +# Подключение Airbyte к ClickHouse {#connect-airbyte-to-clickhouse} @@ -72,7 +72,7 @@ import PartnerBadge from '@theme/badges/PartnerBadge'; -## Добавьте ClickHouse в качестве приемника данных +## Добавьте ClickHouse в качестве приемника данных {#2-add-clickhouse-as-a-destination} В этом разделе мы покажем, как добавить экземпляр ClickHouse в качестве приемника данных. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md index fb9cf050ab2..f3ccbdf96a3 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md @@ -13,7 +13,7 @@ keywords: ['apache beam', 'потоковая обработка', 'пакетн import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Интеграция Apache Beam и ClickHouse +# Интеграция Apache Beam и ClickHouse {#integrating-apache-beam-and-clickhouse} @@ -29,9 +29,9 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## Настройка пакета ClickHouse для Apache Beam +## Настройка пакета ClickHouse для Apache Beam {#setup-of-the-apache-beam-clickhouse-package} -### Установка пакета +### Установка пакета {#package-installation} Добавьте следующую зависимость в используемую систему управления пакетами: @@ -50,7 +50,7 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; Артефакты можно найти в [официальном репозитории Maven](https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-io-clickhouse). -### Пример кода +### Пример кода {#code-example} Следующий пример считывает CSV‑файл с именем `input.csv` как коллекцию `PCollection`, преобразует его в объект `Row` (используя определённую схему) и вставляет в локальный экземпляр ClickHouse с помощью `ClickHouseIO`: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md index 6048ae1c2ca..188cd0480b1 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md @@ -21,7 +21,7 @@ import bp_ck_9 from '@site/static/images/integrations/data-ingestion/etl-tools/b import PartnerBadge from '@theme/badges/PartnerBadge'; -# Подключение BladePipe к ClickHouse +# Подключение BladePipe к ClickHouse {#connect-bladepipe-to-clickhouse} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md index 7220213d65a..9667959ac4b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md @@ -12,7 +12,7 @@ import TOCInline from '@theme/TOCInline'; import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Возможности и конфигурации +# Возможности и конфигурации {#features-and-configurations} @@ -22,7 +22,7 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## Конфигурация Profile.yml +## Конфигурация Profile.yml {#profile-yml-configurations} Чтобы подключиться к ClickHouse из dbt, вам потребуется добавить [профиль](https://docs.getdbt.com/docs/core/connect-data-platform/connection-profiles) в файл `profiles.yml`. Профиль ClickHouse должен соответствовать следующему синтаксису: @@ -65,14 +65,14 @@ your_profile_name: compress_block_size: [1048576] # Размер блока сжатия, если сжатие включено ``` -### Схема и база данных +### Схема и база данных {#schema-vs-database} Идентификатор отношения модели dbt `database.schema.table` не совместим с ClickHouse, поскольку ClickHouse не поддерживает `schema`. Поэтому используется упрощённый вариант `schema.table`, где `schema` — это база данных ClickHouse. Использование базы данных `default` не рекомендуется. -### Предупреждение об операторе SET +### Предупреждение об операторе SET {#set-statement-warning} Во многих средах использование оператора SET для сохранения настройки ClickHouse, применяемой ко всем запросам dbt, ненадёжно и может приводить к неожиданным сбоям. Это особенно актуально при использовании HTTP‑подключений через балансировщик нагрузки, @@ -81,7 +81,7 @@ your_profile_name: в свойстве "custom_settings" профиля dbt как рекомендуемую практику, вместо того чтобы полагаться на оператор "SET" в pre-hook, как иногда предлагается. -### Настройка `quote_columns` +### Настройка `quote_columns` {#setting-quote_columns} Чтобы избежать предупреждения, обязательно явно задайте значение параметра `quote_columns` в файле `dbt_project.yml`. Дополнительную информацию смотрите в [документации по quote_columns](https://docs.getdbt.com/reference/resource-configs/quote_columns). @@ -91,14 +91,14 @@ seeds: +quote_columns: false #или `true`, если в заголовках столбцов CSV есть пробелы ``` -### О кластере ClickHouse +### О кластере ClickHouse {#about-the-clickhouse-cluster} При использовании кластера ClickHouse нужно учитывать две вещи: * Установку настройки `cluster`. * Обеспечение согласованности чтения после записи (read-after-write), особенно если вы используете более одного потока (`threads`). -#### Настройка кластера +#### Настройка кластера {#cluster-setting} Настройка `cluster` в профиле позволяет dbt-clickhouse работать с кластером ClickHouse. Если `cluster` задан в профиле, по умолчанию **все модели будут создаваться с оператором `ON CLUSTER`**, за исключением моделей, использующих движок **Replicated**. К ним относятся: @@ -129,7 +129,7 @@ seeds: Если модель была создана без настройки `cluster`, dbt-clickhouse обнаружит это и выполнит все DDL/DML без предложения `on cluster` для этой модели. -#### Согласованность чтения после записи (read-after-write) +#### Согласованность чтения после записи (read-after-write) {#read-after-write-consistency} dbt полагается на модель согласованности чтения после вставки (read-after-insert). Это несовместимо с кластерами ClickHouse с более чем одной репликой, если вы не можете гарантировать, что все операции будут направляться на одну и ту же реплику. В повседневной работе с dbt вы можете не столкнуться с проблемами, но в зависимости от конфигурации кластера есть несколько стратегий, позволяющих обеспечить такую гарантию: @@ -137,9 +137,9 @@ dbt полагается на модель согласованности чте * Если вы используете кластер с самостоятельным размещением (self-hosted), убедитесь, что все запросы dbt отправляются на одну и ту же реплику ClickHouse. Если поверх него есть балансировщик нагрузки, попробуйте использовать механизм `replica aware routing`/`sticky sessions`, чтобы всегда попадать на одну и ту же реплику. Добавление настройки `select_sequential_consistency = 1` в кластерах вне ClickHouse Cloud [не рекомендуется](https://clickhouse.com/docs/operations/settings/settings#select_sequential_consistency). -## Общая информация о возможностях +## Общая информация о возможностях {#general-information-about-features} -### Общие конфигурации таблиц +### Общие конфигурации таблиц {#general-table-configurations} | Option | Description | Default if any | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | @@ -157,7 +157,7 @@ dbt полагается на модель согласованности чте | definer | Если `sql_security` установлено в значение `definer`, необходимо указать любого существующего пользователя или `CURRENT_USER` в предложении `definer`. | | | projections | Список [проекций](/data-modeling/projections), которые будут созданы. Подробности см. в разделе [О проекциях](#projections). | | -#### О data skipping индексах +#### О data skipping индексах {#data-skipping-indexes} Data skipping индексы доступны только для материализации `table`. Чтобы добавить список data skipping индексов в таблицу, используйте конфигурацию `indexes`: @@ -171,7 +171,7 @@ Data skipping индексы доступны только для материа ) }} ``` -#### О проекциях +#### О проекциях {#projections} Вы можете добавить [проекции](/data-modeling/projections) к материализациям типов `table` и `distributed_table` с помощью конфигурации `projections`: @@ -189,7 +189,7 @@ Data skipping индексы доступны только для материа **Примечание**: Для распределённых таблиц проекция применяется к таблицам `_local`, а не к распределённой прокси-таблице. -### Поддерживаемые движки таблиц +### Поддерживаемые движки таблиц {#supported-table-engines} | Тип | Подробности | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -200,7 +200,7 @@ Data skipping индексы доступны только для материа | EmbeddedRocksDB | [https://clickhouse.com/docs/en/engines/table-engines/integrations/embedded-rocksdb](https://clickhouse.com/docs/en/engines/table-engines/integrations/embedded-rocksdb) | | Hive | [https://clickhouse.com/docs/en/engines/table-engines/integrations/hive](https://clickhouse.com/docs/en/engines/table-engines/integrations/hive) | -### Поддерживаемые экспериментальные движки таблиц +### Поддерживаемые экспериментальные движки таблиц {#experimental-supported-table-engines} | Тип | Подробности | @@ -211,7 +211,7 @@ Data skipping индексы доступны только для материа Если вы столкнётесь с проблемами при подключении к ClickHouse из dbt с одним из вышеуказанных движков, пожалуйста, сообщите о проблеме [здесь](https://github.com/ClickHouse/dbt-clickhouse/issues). -### Примечание о настройках моделей +### Примечание о настройках моделей {#a-note-on-model-settings} В ClickHouse есть несколько типов/уровней «настроек». В конфигурации модели выше настраиваются два их типа. `settings` означает секцию `SETTINGS`, @@ -224,7 +224,7 @@ Data skipping индексы доступны только для материа доступны в таблице `system.settings`). В целом рекомендуются настройки по умолчанию, а любое использование этих свойств следует тщательно исследовать и протестировать. -### Конфигурация столбцов +### Конфигурация столбцов {#column-configuration} > ***ПРИМЕЧАНИЕ:*** Приведённые ниже параметры конфигурации столбцов требуют применения [контрактов моделей](https://docs.getdbt.com/docs/collaborate/govern/model-contracts). @@ -233,7 +233,7 @@ Data skipping индексы доступны только для материа | codec | Строка, состоящая из аргументов, передаваемых в `CODEC()` в DDL-описании столбца. Например: `codec: "Delta, ZSTD"` будет скомпилирована в выражение `CODEC(Delta, ZSTD)`. | | | ttl | Строка, состоящая из [TTL-выражения (time-to-live)](https://clickhouse.com/docs/guides/developer/ttl), которое определяет TTL-правило в DDL-описании столбца. Например: `ttl: ts + INTERVAL 1 DAY` будет скомпилирована в выражение `TTL ts + INTERVAL 1 DAY`. | | -#### Пример конфигурации схемы +#### Пример конфигурации схемы {#example-of-schema-configuration} ```yaml models: @@ -251,7 +251,7 @@ models: ttl: ts + INTERVAL 1 DAY ``` -#### Добавление сложных типов данных +#### Добавление сложных типов данных {#adding-complex-types} dbt автоматически определяет тип данных каждого столбца, анализируя SQL, используемый для создания модели. Однако в некоторых случаях этот процесс может некорректно определить тип данных, что приводит к конфликтам с типами, указанными в свойстве контракта `data_type`. Чтобы избежать этого, рекомендуется использовать функцию `CAST()` в SQL-коде модели для явного указания требуемого типа. Например: @@ -276,9 +276,9 @@ group by event_type ``` -## Возможности +## Возможности {#features} -### Материализация: view +### Материализация: view {#materialization-view} Модель dbt может быть создана как [представление ClickHouse](https://clickhouse.com/docs/en/sql-reference/table-functions/view/) и настроена с использованием следующего синтаксиса: @@ -297,7 +297,7 @@ models: {{ config(materialized = "view") }} ``` -### Материализация: таблица +### Материализация: таблица {#materialization-table} Модель dbt может быть создана как [таблица ClickHouse](https://clickhouse.com/docs/en/operations/system-tables/tables/) и настроена с использованием следующего синтаксиса: @@ -326,7 +326,7 @@ models: ) }} ``` -### Материализация: incremental +### Материализация: incremental {#materialization-incremental} Модель таблицы будет пересоздаваться при каждом выполнении dbt. Это может быть неосуществимо и крайне затратно для больших наборов данных или сложных трансформаций. Чтобы решить эту проблему и сократить время сборки, модель dbt может быть создана как инкрементальная таблица ClickHouse и настраивается с помощью следующего синтаксиса: @@ -358,7 +358,7 @@ models: ) }} ``` -#### Конфигурации +#### Конфигурации {#configurations} Конфигурации, специфические для этого типа материализации, перечислены ниже: @@ -369,11 +369,11 @@ models: | `incremental_strategy` | Стратегия, используемая для инкрементальной материализации. Поддерживаются `delete+insert`, `append`, `insert_overwrite` или `microbatch`. Дополнительные сведения о стратегиях см. [здесь](/integrations/dbt/features-and-configurations#incremental-model-strategies). | Необязателен (по умолчанию: 'default') | | `incremental_predicates` | Дополнительные условия, которые будут применяться к инкрементальной материализации (применяются только для стратегии `delete+insert`). | Необязателен | -#### Стратегии инкрементальных моделей +#### Стратегии инкрементальных моделей {#incremental-model-strategies} `dbt-clickhouse` поддерживает три стратегии инкрементальных моделей. -##### Стратегия по умолчанию (устаревшая) +##### Стратегия по умолчанию (устаревшая) {#default-legacy-strategy} Исторически ClickHouse имел лишь ограниченную поддержку операций обновления и удаления в форме асинхронных «мутаций». Чтобы эмулировать ожидаемое поведение dbt, @@ -384,7 +384,7 @@ dbt-clickhouse по умолчанию создаёт новую временн идёт не так до завершения операции; однако, поскольку она включает полное копирование исходной таблицы, её выполнение может быть дорогим и медленным. -##### Стратегия Delete+Insert +##### Стратегия Delete+Insert {#delete-insert-strategy} ClickHouse добавил «облегчённые удаления» (lightweight deletes) как экспериментальную возможность в версии 22.8. Облегчённые удаления значительно @@ -466,7 +466,7 @@ ClickHouse добавил «облегчённые удаления» (lightweig Для этой стратегии требуется, чтобы `partition_by` был задан в конфигурации модели. Все остальные параметры конфигурации модели, относящиеся к стратегиям, игнорируются. -### Materialization: materialized_view (экспериментально) +### Materialization: materialized_view (экспериментально) {#materialized-view} Материализация `materialized_view` должна представлять собой запрос `SELECT` из существующей (исходной) таблицы. Адаптер создаст целевую таблицу с именем модели @@ -501,7 +501,7 @@ select a,b,c from {{ source('raw', 'table_2') }} > вы получите следующее предупреждение: > `Warning - Table was detected with the same pattern as model name but was not found in this run. In case it is a renamed mv that was previously part of this model, drop it manually (!!!) ` -#### Догрузка данных +#### Догрузка данных {#data-catch-up} В настоящее время при создании материализованного представления (MV) целевая таблица сначала заполняется историческими данными, и только затем создается само MV. @@ -518,7 +518,7 @@ select a,b,c from {{ source('raw', 'table_2') }} )}} ``` -#### Обновляемые материализованные представления +#### Обновляемые материализованные представления {#refreshable-materialized-views} Чтобы использовать [Refreshable Materialized View](https://clickhouse.com/docs/en/materialized-view/refreshable-materialized-view), при необходимости скорректируйте следующие параметры в вашей MV‑модели (все эти параметры должны быть заданы внутри @@ -550,7 +550,7 @@ select a,b,c from {{ source('raw', 'table_2') }} }} ``` -#### Ограничения +#### Ограничения {#limitations} * При создании обновляемого материализованного представления (MV) в ClickHouse, которое имеет зависимость, ClickHouse не выдаёт ошибку, если указанная зависимость не существует на момент создания. Вместо этого обновляемое MV остаётся в @@ -563,14 +563,14 @@ select a,b,c from {{ source('raw', 'table_2') }} гарантируется. * Функциональность обновляемости не тестировалась с несколькими mv, направляющими данные в одну и ту же целевую модель. -### Материализация: dictionary (экспериментальная) +### Материализация: dictionary (экспериментальная) {#materialization-dictionary} См. тесты в [https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/dictionary/test_dictionary.py](https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/dictionary/test_dictionary.py) для примеров того, как реализовывать материализации для словарей ClickHouse. -### Материализация: distributed_table (экспериментальная) +### Материализация: distributed_table (экспериментальная) {#materialization-distributed-table} Распределённая таблица создаётся следующими шагами: @@ -585,7 +585,7 @@ select a,b,c from {{ source('raw', 'table_2') }} корректное выполнение последующих операций инкрементальной материализации. Это может привести к тому, что некоторые вставки в распределённые таблицы будут выполняться медленнее, чем ожидается. -#### Пример модели распределённой таблицы +#### Пример модели распределённой таблицы {#distributed-table-model-example} ```sql {{ @@ -601,7 +601,7 @@ select id, created_at, item from {{ source('db', 'table') }} ``` -#### Сгенерированные миграции +#### Сгенерированные миграции {#distributed-table-generated-migrations} ```sql CREATE TABLE db.table_local on cluster cluster ( @@ -621,7 +621,7 @@ CREATE TABLE db.table on cluster cluster ( ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id)); ``` -### materialization: distributed_incremental (экспериментальная) +### materialization: distributed_incremental (экспериментальная) {#materialization-distributed-incremental} Инкрементальная модель, основанная на той же идее, что и распределённая таблица; основная сложность — корректно обрабатывать все стратегии инкрементального обновления. @@ -632,7 +632,7 @@ CREATE TABLE db.table on cluster cluster ( Заменяются только таблицы шардов, потому что распределённая таблица не хранит данные. Распределённая таблица пересоздаётся только при включённом режиме full_refresh или если структура таблицы могла измениться. -#### Пример распределённой инкрементальной модели +#### Пример распределённой инкрементальной модели {#distributed-incremental-model-example} ```sql @@ -649,7 +649,7 @@ select id, created_at, item from {{ source('db', 'table') }} ``` -#### Сгенерированные миграции +#### Сгенерированные миграции {#distributed-incremental-generated-migrations} ```sql CREATE TABLE db.table_local on cluster cluster ( @@ -668,7 +668,7 @@ CREATE TABLE db.table on cluster cluster ( ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id)); ``` -### Snapshot +### Snapshot {#snapshot} Снимки dbt позволяют фиксировать изменения изменяемой модели со временем. В свою очередь, это позволяет выполнять запросы к моделям в разрезе конкретного момента времени, когда аналитики могут «заглянуть в прошлое» и увидеть предыдущее состояние модели. Эта функциональность поддерживается коннектором ClickHouse и настраивается с помощью следующего синтаксиса: @@ -687,7 +687,7 @@ CREATE TABLE db.table on cluster cluster ( Для получения дополнительной информации о конфигурации см. справочную страницу [snapshot configs](https://docs.getdbt.com/docs/build/snapshots#snapshot-configs). -### Контракты и ограничения +### Контракты и ограничения {#contracts-and-constraints} Поддерживаются только контракты с точным совпадением типов столбцов. Например, контракт с типом столбца UInt32 завершится с ошибкой, если модель вернёт UInt64 или другой целочисленный тип. @@ -695,9 +695,9 @@ ClickHouse также поддерживает *только* ограничен ограничения CHECK на уровне отдельных столбцов не поддерживаются. (См. документацию ClickHouse по первичным ключам/ключам ORDER BY.) -### Дополнительные макросы ClickHouse +### Дополнительные макросы ClickHouse {#additional-clickhouse-macros} -#### Вспомогательные макросы материализации моделей +#### Вспомогательные макросы материализации моделей {#model-materialization-utility-macros} Следующие макросы включены для упрощения создания специфичных для ClickHouse таблиц и представлений: @@ -714,7 +714,7 @@ ClickHouse также поддерживает *только* ограничен * `ttl_config` -- использует свойство конфигурации модели `ttl` для назначения выражения TTL таблицы ClickHouse. По умолчанию TTL не назначен. -#### Вспомогательный макрос s3Source +#### Вспомогательный макрос s3Source {#s3source-helper-macro} Макрос `s3source` упрощает процесс выборки данных ClickHouse непосредственно из S3 с помощью табличной функции ClickHouse S3. Он работает за счёт diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md index 649eb95cf67..ffddbfc0a79 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md @@ -20,7 +20,7 @@ import dbt_07 from '@site/static/images/integrations/data-ingestion/etl-tools/db import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Руководства +# Руководства {#guides} @@ -39,13 +39,13 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## Настройка +## Настройка {#setup} Следуйте инструкциям из раздела [Настройка dbt и адаптера ClickHouse](/integrations/dbt), чтобы подготовить ваше окружение. **Важно: приведённые ниже инструкции протестированы с Python 3.9.** -### Подготовка ClickHouse +### Подготовка ClickHouse {#prepare-clickhouse} dbt особенно эффективен при моделировании сильно связанных реляционных данных. В качестве примера мы предоставляем небольшой набор данных IMDB со следующей реляционной схемой. Этот набор данных взят из [репозитория реляционных наборов данных](https://relational.fit.cvut.cz/dataset/IMDb). Он тривиален по сравнению с типичными схемами, используемыми с dbt, но является удобным для работы примером: @@ -672,7 +672,7 @@ SELECT * FROM imdb_dbt.actor_summary ORDER BY num_movies DESC LIMIT 2; +------+-------------------+----------+------------------+------+---------+-------------------+ ``` -### Внутреннее устройство +### Внутреннее устройство {#internals} Мы можем определить, какие запросы выполнялись для реализации описанного выше инкрементального обновления, обратившись к журналу запросов ClickHouse. @@ -694,7 +694,7 @@ AND event_time > subtractMinutes(now(), 15) ORDER BY event_time LIMIT 100; Такая стратегия может создавать сложности на очень больших моделях. Для получения дополнительной информации см. раздел [Limitations](/integrations/dbt#limitations). -### Стратегия append (режим только вставки) +### Стратегия append (режим только вставки) {#append-strategy-inserts-only-mode} Чтобы обойти ограничения, связанные с большими наборами данных в инкрементальных моделях, адаптер использует параметр конфигурации dbt `incremental_strategy`. Его можно установить в значение `append`. В этом случае обновлённые строки вставляются непосредственно в целевую таблицу (т.е. `imdb_dbt.actor_summary`), и временная таблица не создаётся. Примечание: режим только append требует, чтобы ваши данные были неизменяемыми или чтобы дубликаты были допустимы. Если вам нужна инкрементальная модель таблицы, поддерживающая изменение строк, не используйте этот режим! @@ -796,7 +796,7 @@ WHERE id > (SELECT max(id) FROM imdb_dbt.actor_summary) OR updated_at > (SELECT В этом прогоне непосредственно в таблицу `imdb_dbt.actor_summary` добавляются только новые строки, при этом создание таблицы не выполняется. -### Режим удаления и вставки (экспериментальный) +### Режим удаления и вставки (экспериментальный) {#deleteinsert-mode-experimental} Традиционно ClickHouse имел лишь ограниченную поддержку операций обновления и удаления в виде асинхронных [Mutations](/sql-reference/statements/alter/index.md). Эти операции могут быть крайне ресурсоёмкими по вводу-выводу, и, как правило, их следует избегать. @@ -821,7 +821,7 @@ WHERE id > (SELECT max(id) FROM imdb_dbt.actor_summary) OR updated_at > (SELECT -### режим insert_overwrite (экспериментальный) +### режим insert_overwrite (экспериментальный) {#insert_overwrite-mode-experimental} Выполняет следующие шаги: @@ -840,7 +840,7 @@ WHERE id > (SELECT max(id) FROM imdb_dbt.actor_summary) OR updated_at > (SELECT -## Создание снимка +## Создание снимка {#creating-a-snapshot} Снимки dbt позволяют зафиксировать изменения изменяемой модели во времени. Это, в свою очередь, позволяет выполнять запросы к моделям на состояние в конкретный момент времени, когда аналитики могут «оглядываться назад» и просматривать предыдущее состояние модели. Это достигается с помощью [измерений типа 2 (Slowly Changing Dimensions)](https://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2:_add_new_row), где столбцы from и to фиксируют период, в течение которого строка считалась актуальной. Эта функциональность поддерживается адаптером ClickHouse и продемонстрирована ниже. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md index 160aa72e408..312be5a3a71 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md @@ -95,9 +95,9 @@ dbt предоставляет 4 типа материализации: -## Настройка dbt и адаптера ClickHouse +## Настройка dbt и адаптера ClickHouse {#setup-of-dbt-and-the-clickhouse-adapter} -### Установка dbt-core и dbt-clickhouse +### Установка dbt-core и dbt-clickhouse {#install-dbt-core-and-dbt-clickhouse} dbt предоставляет несколько способов установки интерфейса командной строки (CLI), которые подробно описаны [здесь](https://docs.getdbt.com/dbt-cli/install/overview). Мы рекомендуем использовать `pip` для установки как dbt, так и dbt-clickhouse. @@ -105,7 +105,7 @@ dbt предоставляет несколько способов устано pip install dbt-core dbt-clickhouse ``` -### Укажите в dbt параметры подключения к нашему экземпляру ClickHouse. +### Укажите в dbt параметры подключения к нашему экземпляру ClickHouse. {#provide-dbt-with-the-connection-details-for-our-clickhouse-instance} Настройте профиль `clickhouse-service` в файле `~/.dbt/profiles.yml` и задайте параметры schema, host, port, user и password. Полный список вариантов конфигурации подключения доступен на странице [Возможности и параметры конфигурации](/integrations/dbt/features-and-configurations): @@ -125,7 +125,7 @@ clickhouse-service: secure: True # Use TLS (native protocol) or HTTPS (http protocol) ``` -### Создайте проект dbt +### Создайте проект dbt {#create-a-dbt-project} Теперь вы можете использовать этот профиль в одном из существующих проектов или создать новый с помощью: @@ -139,17 +139,17 @@ dbt init project_name profile: 'clickhouse-service' ``` -### Тестирование соединения +### Тестирование соединения {#test-connection} Выполните `dbt debug` с помощью инструмента командной строки (CLI), чтобы проверить, может ли dbt подключиться к ClickHouse. Убедитесь, что в ответе присутствует строка `Connection test: [OK connection ok]`, означающая успешное соединение. Перейдите на [страницу руководств](/integrations/dbt/guides), чтобы узнать больше о том, как использовать dbt с ClickHouse. -### Тестирование и развертывание моделей (CI/CD) +### Тестирование и развертывание моделей (CI/CD) {#testing-and-deploying-your-models-ci-cd} Существует множество способов тестировать и развертывать ваш dbt‑проект. У dbt есть рекомендации по [рекомендуемым рабочим процессам](https://docs.getdbt.com/best-practices/best-practice-workflows#pro-tips-for-workflows) и [CI‑заданиям](https://docs.getdbt.com/docs/deploy/ci-jobs). Мы рассмотрим несколько стратегий, но имейте в виду, что их может потребоваться существенно адаптировать под ваш конкретный сценарий. -#### CI/CD с простыми тестами данных и модульными тестами +#### CI/CD с простыми тестами данных и модульными тестами {#ci-with-simple-data-tests-and-unit-tests} Один из простых способов запустить ваш CI‑конвейер — развернуть кластер ClickHouse внутри задания и запускать ваши модели на нём. Перед запуском моделей вы можете загрузить демонстрационные данные в этот кластер. Можно просто использовать [seed](https://docs.getdbt.com/reference/commands/seed), чтобы наполнить промежуточную среду подмножеством ваших боевых данных. @@ -157,7 +157,7 @@ profile: 'clickhouse-service' Шаг CD может быть столь же простым, как запуск `dbt build` для вашего боевого кластера ClickHouse. -#### Более полный этап CI/CD: использование свежих данных, тестирование только затронутых моделей +#### Более полный этап CI/CD: использование свежих данных, тестирование только затронутых моделей {#more-complete-ci-stage} Одна из распространённых стратегий — использовать задания [Slim CI](https://docs.getdbt.com/best-practices/best-practice-workflows#run-only-modified-models-to-test-changes-slim-ci), в которых повторно разворачиваются только изменённые модели (и их зависимости вверх и вниз по потоку). Этот подход использует артефакты ваших боевых прогонов (например, [dbt manifest](https://docs.getdbt.com/reference/artifacts/manifest-json)), чтобы сократить время выполнения проекта и гарантировать отсутствие расхождений схем между средами. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md index 4d80f22edb9..d642e695838 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md @@ -10,7 +10,7 @@ doc_type: 'guide' import PartnerBadge from '@theme/badges/PartnerBadge'; -# Подключение dlt к ClickHouse +# Подключение dlt к ClickHouse {#connect-dlt-to-clickhouse} @@ -18,9 +18,9 @@ import PartnerBadge from '@theme/badges/PartnerBadge'; -## Установка dlt с ClickHouse +## Установка dlt с ClickHouse {#install-dlt-with-clickhouse} -### Установите библиотеку `dlt` с зависимостями для ClickHouse: +### Установите библиотеку `dlt` с зависимостями для ClickHouse: {#to-install-the-dlt-library-with-clickhouse-dependencies} ```bash pip install "dlt[clickhouse]" @@ -99,7 +99,7 @@ dataset_table_separator = "___" # Разделитель для имё ```bash -# разместите это в начале вашего toml-файла, перед началом любых секций. +# разместите это в начале вашего toml-файла, перед началом любых секций. {#keep-it-at-the-top-of-your-toml-file-before-any-section-starts} destination.clickhouse.credentials="clickhouse://dlt:Dlt*12345789234567@localhost:9000/dlt?secure=1" ``` @@ -156,7 +156,7 @@ ClickHouse поддерживает следующие табличной функции GCS ClickHouse, которую dlt использует под капотом. @@ -240,10 +240,10 @@ dlt передаст эти учетные данные в ClickHouse, кото * Обеспечить работу файлового назначения с GCS в режиме совместимости с S3 * Поддержка области промежуточного размещения Google Cloud Storage -### Поддержка dbt +### Поддержка dbt {#dbt-support} Интеграция с dbt в целом поддерживается через dbt-clickhouse. -### Синхронизация состояния `dlt` +### Синхронизация состояния `dlt` {#syncing-of-dlt-state} Это назначение полностью поддерживает синхронизацию состояния dlt. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md index 5b36309f52f..9e0045831f5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md @@ -14,7 +14,7 @@ keywords: ['fivetran', 'перемещение данных', 'etl', 'ClickHouse import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Fivetran и ClickHouse Cloud +# Fivetran и ClickHouse Cloud {#fivetran-and-clickhouse-cloud} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md index 8db1dd93213..1398184be7d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md @@ -11,7 +11,7 @@ integration: - category: 'data_ingestion' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; import nifi01 from '@site/static/images/integrations/data-ingestion/etl-tools/nifi_01.png'; import nifi02 from '@site/static/images/integrations/data-ingestion/etl-tools/nifi_02.png'; @@ -31,7 +31,7 @@ import nifi15 from '@site/static/images/integrations/data-ingestion/etl-tools/ni import CommunityMaintainedBadge from '@theme/badges/CommunityMaintained'; -# Подключение Apache NiFi к ClickHouse +# Подключение Apache NiFi к ClickHouse {#connect-apache-nifi-to-clickhouse} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md index 86c85ff1d07..20c56ada410 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md @@ -10,7 +10,7 @@ integration: - support_level: 'partner' - category: 'data_ingestion' - website: 'https://vector.dev/' -keywords: ['vector', 'сбор логов', 'Обзервабилити', 'ингестия данных', 'конвейер'] +keywords: ['vector', 'сбор логов', 'наблюдаемость', 'ингестия данных', 'конвейер'] --- import Image from '@theme/IdealImage'; @@ -18,8 +18,7 @@ import vector01 from '@site/static/images/integrations/data-ingestion/etl-tools/ import vector02 from '@site/static/images/integrations/data-ingestion/etl-tools/vector_02.png'; import PartnerBadge from '@theme/badges/PartnerBadge'; - -# Integrating Vector with ClickHouse +# Integrating Vector with ClickHouse {#integrating-vector-with-clickhouse} @@ -32,214 +31,202 @@ ClickHouse превосходно справляется с хранением **Предварительные требования:** -- У вас уже установлен и запущен ClickHouse -- У вас установлен Vector +* У вас уже установлен и запущен ClickHouse +* У вас установлен Vector + ## Создайте базу данных и таблицу {#1-create-a-database-and-table} + Создайте таблицу для хранения событий логов: -## Создайте базу данных и таблицу - -Создайте таблицу для хранения событий логов: - -1. Начните с новой базы данных с именем `nginxdb`: - -```sql -CREATE DATABASE IF NOT EXISTS nginxdb -``` - -2. Вставьте всё событие лога одной строкой. Очевидно, что это не лучший формат для аналитики по данным логов, но ниже мы разберёмся с этим, используя ***материализованные представления***. - -```sql -CREATE TABLE IF NOT EXISTS nginxdb.access_logs ( - message String -) -ENGINE = MergeTree() -ORDER BY tuple() -``` - -:::note -**ORDER BY** установлен в значение **tuple()** (пустой кортеж), так как пока нет необходимости задавать первичный ключ. -::: - - -## Настройка Nginx - -На этом шаге будет показано, как настроить логирование Nginx. - -1. Следующее свойство `access_log` отправляет логи в `/var/log/nginx/my_access.log` в формате **combined**. - Это значение указывается в секции `http` файла `nginx.conf`: - -```bash -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - access_log /var/log/nginx/my_access.log combined; - sendfile on; - keepalive_timeout 65; - include /etc/nginx/conf.d/*.conf; -} -``` - -2. Обязательно перезапустите Nginx, если вам пришлось изменить `nginx.conf`. - -3. Сгенерируйте несколько записей в журнале доступа, посетив страницы на вашем веб-сервере. - Логи в формате **combined** выглядят следующим образом: - -```bash -192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -192.168.208.1 - - [12/Oct/2021:03:31:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -``` - + 1. Начните с новой базы данных с именем `nginxdb`: -## Настройка Vector + ```sql + CREATE DATABASE IF NOT EXISTS nginxdb + ``` -Vector собирает, преобразует и маршрутизирует логи, метрики и трейсы (далее — **sources**) в различные системы/клиентов (далее — **sinks**), включая поддержку ClickHouse «из коробки». -Sources и sinks задаются в конфигурационном файле **vector.toml**. + 2. Вставьте всё событие лога одной строкой. Очевидно, что это не лучший формат для аналитики по данным логов, но ниже мы разберёмся с этим, используя ***материализованные представления***. -1. Следующий файл **vector.toml** определяет **source** типа **file**, который отслеживает (tail) конец файла **my_access.log**, а также **sink**, использующий таблицу **access_logs**, описанную выше: + ```sql + CREATE TABLE IF NOT EXISTS nginxdb.access_logs ( + message String + ) + ENGINE = MergeTree() + ORDER BY tuple() + ``` -```bash -[sources.nginx_logs] -type = "file" -include = [ "/var/log/nginx/my_access.log" ] -read_from = "end" + :::note + **ORDER BY** установлен в значение **tuple()** (пустой кортеж), так как пока нет необходимости задавать первичный ключ. + ::: -[sinks.clickhouse] -type = "clickhouse" -inputs = ["nginx_logs"] -endpoint = "http://clickhouse-server:8123" -database = "nginxdb" -table = "access_logs" -skip_unknown_fields = true -``` + ## Настройка Nginx {#2--configure-nginx} -2. Запустите Vector, используя приведённую выше конфигурацию. Обратитесь к [документации Vector](https://vector.dev/docs/) для получения дополнительных сведений об определении источников и приёмников. + На этом шаге будет показано, как настроить логирование Nginx. -3. Убедитесь, что журналы доступа записываются в ClickHouse, выполнив следующий запрос. В вашей таблице должны отобразиться журналы доступа: + 1. Следующее свойство `access_log` отправляет логи в `/var/log/nginx/my_access.log` в формате **combined**. + Это значение указывается в секции `http` файла `nginx.conf`: -```sql -SELECT * FROM nginxdb.access_logs -``` + ```bash + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log /var/log/nginx/my_access.log combined; + sendfile on; + keepalive_timeout 65; + include /etc/nginx/conf.d/*.conf; + } + ``` - + 2. Обязательно перезапустите Nginx, если вам пришлось изменить `nginx.conf`. + 3. Сгенерируйте несколько записей в журнале доступа, посетив страницы на вашем веб-сервере. + Логи в формате **combined** выглядят следующим образом: -## Разбор логов + ```bash + 192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + 192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + 192.168.208.1 - - [12/Oct/2021:03:31:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + ``` -Хранить логи в ClickHouse полезно, но сохранение каждого события в виде одной строки не дает больших возможностей для анализа данных. -Далее мы рассмотрим, как разбирать события логов с помощью [материализованного представления](/materialized-view/incremental-materialized-view). + ## Настройка Vector {#3-configure-vector} -**Материализованное представление** работает подобно триггеру на INSERT в SQL. Когда строки данных вставляются в исходную таблицу, материализованное представление выполняет над ними некоторые преобразования и вставляет результаты в целевую таблицу. -Материализованное представление можно настроить так, чтобы формировать разобранное представление событий логов в **access_logs**. -Ниже приведен пример одного такого события лога: + Vector собирает, преобразует и маршрутизирует логи, метрики и трейсы (далее — **sources**) в различные системы/клиентов (далее — **sinks**), включая поддержку ClickHouse «из коробки». + Sources и sinks задаются в конфигурационном файле **vector.toml**. -```bash -192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -``` - -В ClickHouse есть различные функции для разбора приведённой выше строки. Функция [`splitByWhitespace`](/sql-reference/functions/splitting-merging-functions#splitByWhitespace) разбирает строку по пробельным символам и возвращает каждый токен в виде элемента массива. -Для демонстрации выполните следующую команду: - -```sql title="Query" -SELECT splitByWhitespace('192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') -``` - -```text title="Response" -["192.168.208.1","-","-","[12/Oct/2021:15:32:43","+0000]","\"GET","/","HTTP/1.1\"","304","0","\"-\"","\"Mozilla/5.0","(Macintosh;","Intel","Mac","OS","X","10_15_7)","AppleWebKit/537.36","(KHTML,","like","Gecko)","Chrome/93.0.4577.63","Safari/537.36\""] -``` - -В некоторых строках есть лишние символы, а user agent (сведения о браузере) не требуется парсить, но -получившийся массив близок к нужному. - -Аналогично функции `splitByWhitespace`, функция [`splitByRegexp`](/sql-reference/functions/splitting-merging-functions#splitByRegexp) разбивает строку на массив по регулярному выражению. -Выполните следующую команду, которая вернёт две строки. - -```sql -SELECT splitByRegexp('\S \d+ "([^"]*)"', '192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') -``` - -Обратите внимание, что вторая возвращаемая строка — это User-Agent, успешно разобранный из лога: - -```text -["192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] \"GET / HTTP/1.1\" 30"," \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\""] -``` - -Прежде чем перейти к итоговой команде `CREATE MATERIALIZED VIEW`, давайте рассмотрим ещё пару функций, используемых для очистки данных. -Например, поле `RequestMethod` имеет значение `"GET`, то есть содержит лишнюю двойную кавычку. -Вы можете использовать функцию [`trimBoth` (псевдоним `trim`)](/sql-reference/functions/string-functions#trimBoth), чтобы удалить двойную кавычку: - -```sql -SELECT trim(LEADING '"' FROM '"GET') -``` - -Строка с датой начинается с квадратной скобки и при этом имеет формат, который ClickHouse не может разобрать как дату. -Однако, если мы заменим разделитель с двоеточия (**:**) на запятую (**,**), разбор уже работает отлично: - -```sql -SELECT parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM '[12/Oct/2021:15:32:43'), ':', ' ')) -``` - - -Теперь мы готовы определить материализованное представление. -Определение ниже включает `POPULATE`, что означает, что существующие строки в **access_logs** будут обработаны и вставлены сразу же. -Выполните следующую SQL-команду: - -```sql -CREATE MATERIALIZED VIEW nginxdb.access_logs_view -( - RemoteAddr String, - Client String, - RemoteUser String, - TimeLocal DateTime, - RequestMethod String, - Request String, - HttpVersion String, - Status Int32, - BytesSent Int64, - UserAgent String -) -ENGINE = MergeTree() -ORDER BY RemoteAddr -POPULATE AS -WITH - splitByWhitespace(message) as split, - splitByRegexp('\S \d+ "([^"]*)"', message) as referer -SELECT - split[1] AS RemoteAddr, - split[2] AS Client, - split[3] AS RemoteUser, - parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM split[4]), ':', ' ')) AS TimeLocal, - trim(LEADING '"' FROM split[6]) AS RequestMethod, - split[7] AS Request, - trim(TRAILING '"' FROM split[8]) AS HttpVersion, - split[9] AS Status, - split[10] AS BytesSent, - trim(BOTH '"' from referer[2]) AS UserAgent -FROM - (SELECT message FROM nginxdb.access_logs) -``` - -Теперь убедитесь, что всё работает. -Вы должны увидеть журналы доступа, корректно разобранные по столбцам: - -```sql -SELECT * FROM nginxdb.access_logs_view -``` - - - -:::note -В приведённом выше примере данные сохраняются в двух таблицах, но вы можете изменить исходную таблицу `nginxdb.access_logs`, чтобы использовать движок таблиц [`Null`](/engines/table-engines/special/null). -Разобранные данные по-прежнему будут попадать в таблицу `nginxdb.access_logs_view`, но исходные данные не будут сохраняться в таблице. -::: + 1. Следующий файл **vector.toml** определяет **source** типа **file**, который отслеживает (tail) конец файла **my_access.log**, а также **sink**, использующий таблицу **access_logs**, описанную выше: + ```bash + [sources.nginx_logs] + type = "file" + include = [ "/var/log/nginx/my_access.log" ] + read_from = "end" + + [sinks.clickhouse] + type = "clickhouse" + inputs = ["nginx_logs"] + endpoint = "http://clickhouse-server:8123" + database = "nginxdb" + table = "access_logs" + skip_unknown_fields = true + ``` + + 2. Запустите Vector, используя приведённую выше конфигурацию. Обратитесь к [документации Vector](https://vector.dev/docs/) для получения дополнительных сведений об определении источников и приёмников. + + 3. Убедитесь, что журналы доступа записываются в ClickHouse, выполнив следующий запрос. В вашей таблице должны отобразиться журналы доступа: + + ```sql + SELECT * FROM nginxdb.access_logs + ``` + + + + ## Разбор логов {#4-parse-the-logs} + + Хранить логи в ClickHouse полезно, но сохранение каждого события в виде одной строки не дает больших возможностей для анализа данных. + Далее мы рассмотрим, как разбирать события логов с помощью [материализованного представления](/materialized-view/incremental-materialized-view). + + **Материализованное представление** работает подобно триггеру на INSERT в SQL. Когда строки данных вставляются в исходную таблицу, материализованное представление выполняет над ними некоторые преобразования и вставляет результаты в целевую таблицу. + Материализованное представление можно настроить так, чтобы формировать разобранное представление событий логов в **access_logs**. + Ниже приведен пример одного такого события лога: + + ```bash + 192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + ``` + + В ClickHouse есть различные функции для разбора приведённой выше строки. Функция [`splitByWhitespace`](/sql-reference/functions/splitting-merging-functions#splitByWhitespace) разбирает строку по пробельным символам и возвращает каждый токен в виде элемента массива. + Для демонстрации выполните следующую команду: + + ```sql title="Query" + SELECT splitByWhitespace('192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') + ``` + + ```text title="Response" + ["192.168.208.1","-","-","[12/Oct/2021:15:32:43","+0000]","\"GET","/","HTTP/1.1\"","304","0","\"-\"","\"Mozilla/5.0","(Macintosh;","Intel","Mac","OS","X","10_15_7)","AppleWebKit/537.36","(KHTML,","like","Gecko)","Chrome/93.0.4577.63","Safari/537.36\""] + ``` + + В некоторых строках есть лишние символы, а user agent (сведения о браузере) не требуется парсить, но + получившийся массив близок к нужному. + + Аналогично функции `splitByWhitespace`, функция [`splitByRegexp`](/sql-reference/functions/splitting-merging-functions#splitByRegexp) разбивает строку на массив по регулярному выражению. + Выполните следующую команду, которая вернёт две строки. + + ```sql + SELECT splitByRegexp('\S \d+ "([^"]*)"', '192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') + ``` + + Обратите внимание, что вторая возвращаемая строка — это User-Agent, успешно разобранный из лога: + + ```text + ["192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] \"GET / HTTP/1.1\" 30"," \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\""] + ``` + + Прежде чем перейти к итоговой команде `CREATE MATERIALIZED VIEW`, давайте рассмотрим ещё пару функций, используемых для очистки данных. + Например, поле `RequestMethod` имеет значение `"GET`, то есть содержит лишнюю двойную кавычку. + Вы можете использовать функцию [`trimBoth` (псевдоним `trim`)](/sql-reference/functions/string-functions#trimBoth), чтобы удалить двойную кавычку: + + ```sql + SELECT trim(LEADING '"' FROM '"GET') + ``` + + Строка с датой начинается с квадратной скобки и при этом имеет формат, который ClickHouse не может разобрать как дату. + Однако, если мы заменим разделитель с двоеточия (**:**) на запятую (**,**), разбор уже работает отлично: + + ```sql + SELECT parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM '[12/Oct/2021:15:32:43'), ':', ' ')) + ``` + + Теперь мы готовы определить материализованное представление. + Определение ниже включает `POPULATE`, что означает, что существующие строки в **access_logs** будут обработаны и вставлены сразу же. + Выполните следующую SQL-команду: + + ```sql + CREATE MATERIALIZED VIEW nginxdb.access_logs_view + ( + RemoteAddr String, + Client String, + RemoteUser String, + TimeLocal DateTime, + RequestMethod String, + Request String, + HttpVersion String, + Status Int32, + BytesSent Int64, + UserAgent String + ) + ENGINE = MergeTree() + ORDER BY RemoteAddr + POPULATE AS + WITH + splitByWhitespace(message) as split, + splitByRegexp('\S \d+ "([^"]*)"', message) as referer + SELECT + split[1] AS RemoteAddr, + split[2] AS Client, + split[3] AS RemoteUser, + parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM split[4]), ':', ' ')) AS TimeLocal, + trim(LEADING '"' FROM split[6]) AS RequestMethod, + split[7] AS Request, + trim(TRAILING '"' FROM split[8]) AS HttpVersion, + split[9] AS Status, + split[10] AS BytesSent, + trim(BOTH '"' from referer[2]) AS UserAgent + FROM + (SELECT message FROM nginxdb.access_logs) + ``` + + Теперь убедитесь, что всё работает. + Вы должны увидеть журналы доступа, корректно разобранные по столбцам: + + ```sql + SELECT * FROM nginxdb.access_logs_view + ``` + + + + :::note + В приведённом выше примере данные сохраняются в двух таблицах, но вы можете изменить исходную таблицу `nginxdb.access_logs`, чтобы использовать движок таблиц [`Null`](/engines/table-engines/special/null). + Разобранные данные по-прежнему будут попадать в таблицу `nginxdb.access_logs_view`, но исходные данные не будут сохраняться в таблице. + ::: > Используя Vector, который требует лишь простой установки и быстрой настройки, вы можете отправлять журналы с сервера Nginx в таблицу ClickHouse. Используя материализованное представление, вы можете разобрать эти журналы по столбцам для упрощения аналитики. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md index 23f45f96d9a..302eb98e87d 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md @@ -8,13 +8,13 @@ doc_type: 'guide' keywords: ['Google Cloud Storage ClickHouse', 'интеграция GCS с ClickHouse', 'MergeTree на базе GCS', 'хранение данных ClickHouse в GCS', 'Google Cloud ClickHouse'] --- -import BucketDetails from '@site/docs/_snippets/_GCS_authentication_and_bucket.md'; +import BucketDetails from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_GCS_authentication_and_bucket.md'; import Image from '@theme/IdealImage'; import GCS_examine_bucket_1 from '@site/static/images/integrations/data-ingestion/s3/GCS-examine-bucket-1.png'; import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestion/s3/GCS-examine-bucket-2.png'; -# Интеграция Google Cloud Storage с ClickHouse +# Интеграция Google Cloud Storage с ClickHouse {#integrate-google-cloud-storage-with-clickhouse} :::note Если вы используете ClickHouse Cloud в [Google Cloud](https://cloud.google.com), эта страница к вам не относится, так как ваши сервисы уже используют [Google Cloud Storage](https://cloud.google.com/storage). Если вы хотите выполнять `SELECT` или `INSERT` данных из GCS, обратитесь к табличной функции [`gcs`](/sql-reference/table-functions/gcs). @@ -24,13 +24,13 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio -## MergeTree с хранилищем в GCS +## MergeTree с хранилищем в GCS {#gcs-backed-mergetree} -### Создание диска +### Создание диска {#creating-a-disk} Чтобы использовать bucket GCS как диск, сначала необходимо объявить его в конфигурации ClickHouse в файле в каталоге `conf.d`. Ниже приведён пример объявления диска GCS. Эта конфигурация включает несколько секций для настройки GCS‑«диска», кэша и политики, которая указывается в DDL‑запросах при создании таблиц на диске GCS. Каждая из них описана ниже. -#### Storage configuration > disks > gcs +#### Storage configuration > disks > gcs {#storage_configuration--disks--gcs} Эта часть конфигурации показана на выделенном фрагменте и задаёт следующее: @@ -68,7 +68,7 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio ``` -#### Конфигурация хранилища > disks > cache +#### Конфигурация хранилища > disks > cache {#storage_configuration--disks--cache} Пример конфигурации, показанный ниже, включает кэш в памяти объёмом 10Gi для диска `gcs`. @@ -106,7 +106,7 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio ``` -#### Конфигурация хранилища > policies > gcs_main +#### Конфигурация хранилища > policies > gcs_main {#storage_configuration--policies--gcs_main} Политики хранения в конфигурации позволяют выбирать, где размещаются данные. Политика, показанная ниже, позволяет хранить данные на диске `gcs`, указывая политику `gcs_main`. Например, `CREATE TABLE ... SETTINGS storage_policy='gcs_main'`. @@ -141,7 +141,7 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio Полный список настроек, относящихся к этому описанию диска, можно найти [здесь](/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3). -### Создание таблицы +### Создание таблицы {#creating-a-table} Если вы настроили диск на использование бакета с правом записи, вы сможете создать таблицу, как в примере ниже. Ради краткости мы используем подмножество столбцов набора данных NYC taxi и отправляем данные напрямую в таблицу на базе GCS: @@ -179,11 +179,11 @@ INSERT INTO trips_gcs SELECT trip_id, pickup_date, pickup_datetime, dropoff_date SELECT passenger_count, avg(tip_amount) AS avg_tip, avg(total_amount) AS avg_amount FROM trips_gcs GROUP BY passenger_count; ``` -### Работа с репликацией +### Работа с репликацией {#handling-replication} Репликация с использованием дисков GCS может быть реализована с помощью движка таблиц `ReplicatedMergeTree`. Подробности см. в руководстве [репликация одного шарда в двух регионах GCP с использованием GCS](#gcs-multi-region). -### Дополнительные материалы +### Дополнительные материалы {#learn-more} [Cloud Storage XML API](https://cloud.google.com/storage/docs/xml-api/overview) совместим с некоторыми инструментами и библиотеками, которые работают с такими сервисами, как Amazon Simple Storage Service (Amazon S3). @@ -305,13 +305,13 @@ ClickHouse Keeper для работы требует двух узлов, поэ ``` -### Настройка сервера ClickHouse +### Настройка сервера ClickHouse {#configure-clickhouse-server} :::note best practice На некоторых шагах этого руководства вам потребуется поместить конфигурационный файл в `/etc/clickhouse-server/config.d/`. Это каталог по умолчанию в системах Linux для файлов переопределения конфигурации. Когда вы помещаете эти файлы в этот каталог, ClickHouse объединяет их содержимое с конфигурацией по умолчанию. Размещая эти файлы в каталоге `config.d`, вы избежите потери настроек при обновлении. ::: -#### Сеть +#### Сеть {#networking} По умолчанию ClickHouse прослушивает только loopback‑интерфейс; в реплицированной конфигурации требуется сетевое взаимодействие между серверами. Включите прослушивание на всех сетевых интерфейсах: @@ -321,7 +321,7 @@ ClickHouse Keeper для работы требует двух узлов, поэ ``` -#### Удалённые серверы ClickHouse Keeper +#### Удалённые серверы ClickHouse Keeper {#remote-clickhouse-keeper-servers} Репликация координируется ClickHouse Keeper. Этот конфигурационный файл идентифицирует узлы ClickHouse Keeper по имени хоста и номеру порта. @@ -346,7 +346,7 @@ ClickHouse Keeper для работы требует двух узлов, поэ ``` -#### Удалённые серверы ClickHouse +#### Удалённые серверы ClickHouse {#remote-clickhouse-servers} Этот файл задаёт имя хоста и порт каждого сервера ClickHouse в кластере. Конфигурационный файл по умолчанию содержит примеры описаний кластеров; чтобы отображались только полностью настроенные кластеры, к записи `remote_servers` добавляется тег `replace="true"`, чтобы при слиянии этой конфигурации с конфигурацией по умолчанию она заменяла секцию `remote_servers`, а не дополняла её. @@ -372,7 +372,7 @@ ClickHouse Keeper для работы требует двух узлов, поэ ``` -#### Идентификация реплики +#### Идентификация реплики {#replica-identification} Этот файл настраивает параметры, связанные с путём в ClickHouse Keeper. В частности, в нём задаются макросы, используемые для идентификации реплики, к которой относятся данные. На одном сервере реплика должна быть указана как `replica_1`, а на другом сервере — как `replica_2`. Эти имена можно изменить: например, в нашем случае, когда одна реплика хранится в Южной Каролине, а другая — в Северной Вирджинии, значениями могут быть `carolina` и `virginia`; просто убедитесь, что на каждой машине они отличаются. @@ -390,7 +390,7 @@ ClickHouse Keeper для работы требует двух узлов, поэ ``` -#### Хранение в GCS +#### Хранение в GCS {#storage-in-gcs} Конфигурация хранилища ClickHouse включает `disks` и `policies`. Диск, настраиваемый ниже, называется `gcs` и имеет `type` `s3`. Тип `s3` используется, потому что ClickHouse обращается к бакету GCS так, как если бы это был бакет AWS S3. Понадобятся две копии этой конфигурации — по одной для каждого узла сервера ClickHouse. @@ -438,7 +438,7 @@ ClickHouse Keeper для работы требует двух узлов, поэ ``` -### Запустите ClickHouse Keeper +### Запустите ClickHouse Keeper {#start-clickhouse-keeper} Используйте команды, соответствующие вашей операционной системе, например: @@ -448,7 +448,7 @@ sudo systemctl start clickhouse-keeper sudo systemctl status clickhouse-keeper ``` -#### Проверьте статус ClickHouse Keeper +#### Проверьте статус ClickHouse Keeper {#check-clickhouse-keeper-status} Отправляйте команды в ClickHouse Keeper с помощью `netcat`. Например, команда `mntr` возвращает состояние кластера ClickHouse Keeper. Если выполнить эту команду на каждом узле Keeper, вы увидите, что один из них является лидером, а два других — ведомыми: @@ -464,11 +464,11 @@ zk_max_latency 11 zk_min_latency 0 zk_packets_received 1783 zk_packets_sent 1783 -# highlight-start +# highlight-start {#highlight-start} zk_num_alive_connections 2 zk_outstanding_requests 0 zk_server_state leader -# highlight-end +# highlight-end {#highlight-end} zk_znode_count 135 zk_watch_count 8 zk_ephemerals_count 3 @@ -477,13 +477,13 @@ zk_key_arena_size 28672 zk_latest_snapshot_size 0 zk_open_file_descriptor_count 182 zk_max_file_descriptor_count 18446744073709551615 -# highlight-start +# highlight-start {#highlight-start} zk_followers 2 zk_synced_followers 2 -# highlight-end +# highlight-end {#highlight-end} ``` -### Запуск сервера ClickHouse +### Запуск сервера ClickHouse {#start-clickhouse-server} На `chnode1` и `chnode` выполните: @@ -495,9 +495,9 @@ sudo service clickhouse-server start sudo service clickhouse-server status ``` -### Проверка +### Проверка {#verification} -#### Проверка конфигурации дисков +#### Проверка конфигурации дисков {#verify-disk-configuration} `system.disks` должна содержать записи для каждого диска: @@ -565,7 +565,7 @@ cache_path: 3 строки в наборе. Прошло: 0,002 сек. ```` -#### Убедитесь, что таблицы, созданные на кластере, создаются на обоих узлах +#### Убедитесь, что таблицы, созданные на кластере, создаются на обоих узлах {#verify-that-tables-created-on-the-cluster-are-created-on-both-nodes} ```sql -- highlight-next-line create table trips on cluster 'cluster_1S_2R' ( @@ -600,7 +600,7 @@ SETTINGS storage_policy='gcs_main' 2 строки в наборе. Затрачено: 0.641 сек. ``` -#### Убедитесь, что данные можно вставить +#### Убедитесь, что данные можно вставить {#verify-that-data-can-be-inserted} ```sql INSERT INTO trips SELECT @@ -621,7 +621,7 @@ FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz' LIMIT 1000000 ``` -#### Убедитесь, что для таблицы используется политика хранения данных `gcs_main`. +#### Убедитесь, что для таблицы используется политика хранения данных `gcs_main`. {#verify-that-the-storage-policy-gcs_main-is-used-for-the-table} ```sql SELECT @@ -647,14 +647,14 @@ formatReadableSize(total_bytes): 36.42 MiB Получена 1 строка. Прошло: 0.002 сек. ``` -#### Проверьте в консоли Google Cloud +#### Проверьте в консоли Google Cloud {#verify-in-google-cloud-console} Если открыть бакеты, вы увидите, что в каждом из них создана папка с именем, указанным в конфигурационном файле `storage.xml`. Разверните папки, и вы увидите множество файлов, соответствующих разделам данных. -#### Бакет для первой реплики +#### Бакет для первой реплики {#bucket-for-replica-one} -#### Бакет для второй реплики +#### Бакет для второй реплики {#bucket-for-replica-two} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md index 165620a4a2f..27254572a12 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md @@ -11,7 +11,7 @@ keywords: ['Google Dataflow ClickHouse', 'Dataflow ClickHouse integration', 'Apa import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Интеграция Google Dataflow с ClickHouse +# Интеграция Google Dataflow с ClickHouse {#integrating-google-dataflow-with-clickhouse} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md index 377baf37e09..83e9ac6257b 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md @@ -11,7 +11,7 @@ keywords: ['Dataflow Java Runner', 'Google Dataflow ClickHouse', 'Apache Beam Ja import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Java-раннер Dataflow +# Java-раннер Dataflow {#dataflow-java-runner} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md index 5287c52fd46..b688aea96f5 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md @@ -11,7 +11,7 @@ keywords: ['google dataflow', 'gcp', 'конвейер данных', 'шабл import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Шаблоны Google Dataflow +# Шаблоны Google Dataflow {#google-dataflow-templates} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md index 188f6dfc2ab..3f3ef364b30 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md @@ -19,7 +19,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Шаблон Dataflow BigQuery to ClickHouse +# Шаблон Dataflow BigQuery to ClickHouse {#dataflow-bigquery-to-clickhouse-template} Шаблон BigQuery to ClickHouse представляет собой пакетный конвейер обработки данных, который выполняет приём данных из таблицы BigQuery в таблицу ClickHouse. Шаблон может считывать всю таблицу или фильтровать определённые записи с помощью заданного SQL-запроса. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md index 2180f44e4df..f55fd0de7be 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md @@ -9,7 +9,7 @@ doc_type: 'guide' keywords: ['загрузка локальных файлов в ClickHouse', 'импорт локальных файлов в ClickHouse', 'загрузка файлов через clickhouse-client'] --- -# Вставка локальных файлов +# Вставка локальных файлов {#insert-local-files} Вы можете использовать `clickhouse-client` для потоковой загрузки локальных файлов в сервис ClickHouse. Это позволяет предварительно обрабатывать данные с помощью множества мощных и удобных функций ClickHouse. Рассмотрим пример... @@ -79,7 +79,6 @@ LIMIT 7 Результат: - ```response │ 488 │ comment │ mynameishere │ 2007-02-22 14:48:18 │ «Жаль. Javascript-в-браузере и Ajax — это оба грязные хаки, которые заставляют программистов делать всевозможные постыдные вещи. И результатом становятся кривоватые HTML‑фокусы. Java, при всех своих недостатках, достаточно чиста, когда запускается в среде апплета. У неё есть все преимущества перед JITBAJAX, за исключением проблем с установкой и тяжёлого процесса загрузки. Yahoo games, похоже, едва ли не единственная успешная история с апплетами. Конечно, раньше сколько-нибудь сложные апплеты обычно были слишком большими для dial‑up‑аккаунтов, которые были у людей. Сейчас, по крайней мере, это уже не так.» │ [454927] │ ['It','s','too','bad','Javascript','in','the','browser','and','Ajax','are','both','nasty','hacks','that','force','programmers','to','do','all','sorts','of','shameful','things','And','the','result','is','wanky','html','tricks','Java','for','its','faults','is','fairly','clean','when','run','in','the','applet','environment','It','has','every','superiority','over','JITBAJAX','except','for','install','issues','and','a','chunky','load','process','Yahoo','games','seems','like','just','about','the','only','applet','success','story','Of','course','back','in','the','day','non','trivial','Applets','tended','to','be','too','large','for','the','dial','up','accounts','people','had','At','least','that','is','changed'] │ │ 575 │ comment │ leoc │ 2007-02-23 00:09:49 │ «Сейчас я не могу найти ссылку, но, *кажется*, только что читал что‑то, из чего следует, что процесс установки апплета Apollo будет включать диалог подтверждения вида "install-this-application?" с последующей загрузкой примерно на 30 секунд. Если так, то Apollo менее многообещающ, чем я надеялся. Такой тип установки может считаться малообременительным по меркам настольных приложений, но он не сравним с лёгкостью запуска браузерного AJAX‑ или Flash‑приложения. (Подумайте, насколько просто впервые воспользоваться maps.google.com.)

Наверняка хотя бы будет так, что приложения Apollo по умолчанию запускаются в недоверенном режиме (untrusted), а уже установленное приложение будет запускаться автоматически, когда вы откроете в браузере URL, с которого его скачали?» │ [455071] │ ['I','can','t','find','the','reference','now','but','I','think','I','ve','just','read','something','suggesting','that','the','install','process','for','an','Apollo','applet','will','involve','an','34','install','this','application','34','confirmation','dialog','followed','by','a','download','of','30','seconds','or','so','If','so','then','Apollo','s','less','promising','than','I','hoped','That','kind','of','install','may','be','low','friction','by','desktop','app','standards','but','it','doesn','t','compare','to','the','ease','of','starting','a','browser','based','AJAX','or','Flash','application','Consider','how','easy','it','is','to','use','maps','google','com','for','the','first','time','p','Surely','it','will','at','least','be','that','Apollo','applications','will','run','untrusted','by','default','and','that','an','already','installed','app','will','start','automatically','whenever','you','take','your','browser','to','the','URL','you','downloaded','it','from'] │ diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md index 3628bc5e175..24d00e76ecb 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md @@ -12,11 +12,11 @@ integration: - website: 'https://clickhouse.com/cloud/clickpipes' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/ru/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; -# Интеграция Confluent Cloud с ClickHouse +# Интеграция Confluent Cloud с ClickHouse {#integrating-confluent-cloud-with-clickhouse}

\ No newline at end of file + + + + +fullscreen; +picture-in-picture" + allowfullscreen + />
-
+
根据当前数据所在的位置,有多种方式可以将数据迁移到 ClickHouse Cloud: -- [自托管迁移到 Cloud](/cloud/migration/clickhouse-to-cloud):使用 `remoteSecure` 函数传输数据 -- [其他 DBMS](/cloud/migration/clickhouse-local):将 [clickhouse-local] ETL 工具与适用于当前 DBMS 的相应 ClickHouse 表函数配合使用 -- [任意数据源!](/cloud/migration/etl-tool-to-clickhouse):使用众多常用的 ETL/ELT 工具之一连接各种不同的数据源 -- [对象存储](/integrations/migration/object-storage-to-clickhouse):轻松将 S3 中的数据插入到 ClickHouse 中 +* [自托管迁移到 Cloud](/cloud/migration/clickhouse-to-cloud):使用 `remoteSecure` 函数传输数据 +* [其他 DBMS](/cloud/migration/clickhouse-local):将 [clickhouse-local] ETL 工具与适用于当前 DBMS 的相应 ClickHouse 表函数配合使用 +* [任意数据源!](/cloud/migration/etl-tool-to-clickhouse):使用众多常用的 ETL/ELT 工具之一连接各种不同的数据源 +* [对象存储](/integrations/migration/object-storage-to-clickhouse):轻松将 S3 中的数据插入到 ClickHouse 中 在示例 [从 Redshift 迁移](/migrations/redshift/migration-guide) 中,我们展示了三种不同的数据迁移方式,将数据迁移到 ClickHouse。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md index 5481f5ffa19..61b243f1d39 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/01_overview.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# ClickHouse 与 PostgreSQL 对比 +# ClickHouse 与 PostgreSQL 对比 {#comparing-clickhouse-and-postgresql} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md index fa1ab35a7a5..24b3f03629b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/appendix.md @@ -129,7 +129,7 @@ ClickHouse Cloud 在 S3 上只保留一份数据副本,并配合多个计算 -## 压缩 +## 压缩 {#compression} 由于 ClickHouse 采用列式存储,相比 Postgres,压缩效果通常会显著更好。如下图所示,我们对比了在这两个数据库中存储所有 Stack Overflow 表时的空间需求: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md index c4a4686eb07..fcc34130fd0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/01_migration_guide_part1.md @@ -31,49 +31,49 @@ import Image from '@theme/IdealImage'; ```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 表 +# posts 表 {#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 +# posthistory {#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 表 +# votes 表 {#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 徽章 +# badges 徽章 {#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 +# postlinks {#postlinks} wget [https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz](https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz) gzip -d postlinks.sql.gz @@ -87,9 +87,9 @@ psql < postlinks.sql ``` -## 迁移数据 +## 迁移数据 {#migrating-data} -### 实时复制(CDC) +### 实时复制(CDC) {#real-time-replication-or-cdc} 请参阅此[指南](/integrations/clickpipes/postgres),为 PostgreSQL 配置 ClickPipes。该指南涵盖了多种不同类型的 Postgres 源实例。 @@ -125,7 +125,7 @@ ORDER BY id; 完成设置后,ClickPipes 会开始将 PostgreSQL 中的所有数据迁移到 ClickHouse。根据网络状况和部署规模,对于 Stack Overflow 数据集,这通常只需要几分钟。 -### 手动批量加载与定期更新 +### 手动批量加载与定期更新 {#initial-bulk-load-with-periodic-updates} 采用手动方式时,可以通过以下方法完成数据集的初始批量加载: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md index ae30c969daa..b4566b4e4ed 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/02_migration_guide_part2.md @@ -21,7 +21,7 @@ doc_type: 'guide' -## 在 ClickHouse 中优化查询 +## 在 ClickHouse 中优化查询 {#optimize-queries-in-clickhouse} 虽然可以在对查询做最少改写的情况下完成迁移,但建议充分利用 ClickHouse 的特性,以显著简化查询并进一步提升查询性能。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md index ec56435b52b..ba4af208d41 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/02_postgres/migration_guide/03_migration_guide_part3.md @@ -49,7 +49,7 @@ import Image from '@theme/IdealImage'; -## 分区 +## 分区 {#partitions} Postgres 用户对表分区这一概念应该很熟悉:通过将表拆分为更小、更易管理的片段(称为分区),以提升大型数据库的性能和可管理性。分区可以通过在指定列(例如日期)上使用范围、指定列表,或基于键的哈希来实现。这使管理员可以基于特定条件(如日期范围或地理位置)来组织数据。分区有助于通过分区裁剪和更高效的索引来提升查询性能,从而实现更快速的数据访问。同时,它也有助于维护任务,例如备份和数据清理,因为可以针对单个分区而不是整个表执行操作。此外,通过将负载分布到多个分区,分区还能显著提高 PostgreSQL 数据库的可扩展性。 @@ -76,7 +76,7 @@ PARTITION BY toYear(CreationDate) 有关分区的完整介绍,请参阅 ["Table partitions"](/partitions)。 -### 分区的应用场景 +### 分区的应用场景 {#applications-of-partitions} ClickHouse 中的分区与 Postgres 的应用场景类似,但也存在一些细微差别。更具体地说: @@ -132,7 +132,7 @@ ALTER TABLE posts -## 物化视图与投影 +## 物化视图与投影 {#materialized-views-vs-projections} Postgres 允许在单个表上创建多个索引,从而可以针对多种访问模式进行优化。这种灵活性使管理员和开发人员能够根据特定查询和运维需求定制数据库性能。ClickHouse 的投影(projections)概念虽然与此并非完全等价,但允许用户为一张表指定多个 `ORDER BY` 子句。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md index 096da1fcf13..8865e6998e7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/01_overview.md @@ -12,7 +12,7 @@ import bigquery_1 from '@site/static/images/migrations/bigquery-1.png'; import Image from '@theme/IdealImage'; -# ClickHouse Cloud 与 BigQuery 对比 +# ClickHouse Cloud 与 BigQuery 对比 {#comparing-clickhouse-cloud-and-bigquery} @@ -186,7 +186,7 @@ ClickHouse 提供了标准 SQL,并在此基础上进行了大量扩展和改 -## 数组 +## 数组 {#arrays} 与 BigQuery 仅有 8 个数组函数相比,ClickHouse 提供了 80 多个[内置数组函数](/sql-reference/functions/array-functions),可以优雅而简洁地对各种问题进行建模和求解。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md index 3896de9a6ec..86b82068521 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/02_migrating-to-clickhouse-cloud.md @@ -75,7 +75,7 @@ CDC(变更数据捕获)是指在两个数据库之间保持表数据同步 -## 模式设计 +## 模式设计 {#designing-schemas} Stack Overflow 数据集包含许多相关的表。我们建议优先迁移主表。这不一定是最大的那张表,而是您预计会收到最多分析查询的那张表。这样可以帮助您熟悉 ClickHouse 的核心概念。随着后续添加更多表,为了充分利用 ClickHouse 的特性并获得最佳性能,可能需要对该表进行重新建模。我们在[数据建模文档](/data-modeling/schema-design#next-data-modeling-techniques)中对这一建模过程进行了探讨。 @@ -108,7 +108,7 @@ CREATE TABLE stackoverflow.posts ( ); ``` -### 优化数据类型 +### 优化数据类型 {#optimizing-types} 按照[此处所述的流程](/data-modeling/schema-design)进行后,将得到如下模式: @@ -174,11 +174,11 @@ INSERT INTO stackoverflow.posts SELECT * FROM gcs( 'gs://clickhouse-public-datas -## 数据建模技术 +## 数据建模技术 {#data-modeling-techniques} 我们建议从 BigQuery 迁移的用户阅读[在 ClickHouse 中进行数据建模的指南](/data-modeling/schema-design)。该指南使用相同的 Stack Overflow 数据集,并结合 ClickHouse 的特性来探索多种建模方法。 -### 分区 +### 分区 {#partitions} BigQuery 用户应该已经熟悉表分区的概念:通过将表拆分为更小、更易管理的部分(称为分区),来提升大型数据库的性能和可管理性。分区可以通过在指定列(例如日期)上使用范围分区、定义列表分区,或者基于键的哈希分区来实现。这使得管理员可以根据特定条件(例如日期范围或地理位置)来组织数据。 @@ -205,7 +205,7 @@ ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) PARTITION BY toYear(CreationDate) ``` -#### 应用场景 +#### 应用场景 {#applications} ClickHouse 中的分区与 BigQuery 有类似的应用场景,但存在一些细微差异。更具体地说: @@ -259,7 +259,7 @@ Ok. -## 物化视图与投影 +## 物化视图与投影 {#materialized-views-vs-projections} ClickHouse 的投影(projection)概念允许用户为同一张表指定多个 `ORDER BY` 子句。 @@ -397,7 +397,7 @@ WHERE UserId = 8592047 ``` -## 在 ClickHouse 中重写 BigQuery 查询 +## 在 ClickHouse 中重写 BigQuery 查询 {#rewriting-bigquery-queries-in-clickhouse} 下文给出了 BigQuery 与 ClickHouse 的对比查询示例。该列表旨在演示如何利用 ClickHouse 的特性来大幅简化查询。这里的示例使用完整的 Stack Overflow 数据集(截至 2024 年 4 月)。 @@ -465,7 +465,7 @@ LIMIT 5 ``` -## 聚合函数 +## 聚合函数 {#aggregate-functions} 在条件允许的情况下,用户应尽可能利用 ClickHouse 的聚合函数。下面我们展示如何使用 [`argMax` 函数](/sql-reference/aggregate-functions/reference/argmax) 来计算每一年浏览次数最多的问题。 @@ -520,7 +520,7 @@ MaxViewCount: 66975 ``` -## 条件和数组 +## 条件和数组 {#conditionals-and-arrays} 条件和数组函数可以显著简化查询。下面的查询会计算在 2022 年到 2023 年间,出现次数超过 10000 次的标签中,百分比增幅最大的那些标签。请注意,得益于条件函数、数组函数以及在 `HAVING` 和 `SELECT` 子句中重复使用别名的能力,下面的 ClickHouse 查询非常简洁。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md index 2276b4afab1..c24a5e61814 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/03_bigquery/03_loading-data.md @@ -30,7 +30,7 @@ _本指南适用于 ClickHouse Cloud 以及自托管的 ClickHouse v23.5 及以 -## 将表数据导出到 GCS +## 将表数据导出到 GCS {#1-export-table-data-to-gcs} 在此步骤中,我们使用 [BigQuery SQL workspace](https://cloud.google.com/bigquery/docs/bigquery-web-ui) 来执行 SQL 命令。下面的示例中,我们使用 [`EXPORT DATA`](https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements) 语句,将名为 `mytable` 的 BigQuery 表导出到一个 GCS 存储桶中。 @@ -67,7 +67,7 @@ END WHILE; * Parquet 作为列式格式,是更好的交换格式,因为它天然具备压缩特性,并且对 BigQuery 导出和 ClickHouse 查询都更快。 -## 将数据从 GCS 导入 ClickHouse +## 将数据从 GCS 导入 ClickHouse {#2-importing-data-into-clickhouse-from-gcs} 导出完成后,我们即可将这些数据导入到 ClickHouse 表中。可以使用 [ClickHouse SQL console](/integrations/sql-clients/sql-console) 或 [`clickhouse-client`](/interfaces/cli) 来执行以下命令。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md index 227c4659ba0..ddced0f3d36 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/01_overview.md @@ -13,7 +13,7 @@ import cloud_architecture from '@site/static/images/cloud/onboard/discover/use_c import Image from '@theme/IdealImage'; -# 从 Snowflake 迁移到 ClickHouse +# 从 Snowflake 迁移到 ClickHouse {#snowflake-to-clickhouse-migration} > 本文档介绍如何将数据从 Snowflake 迁移到 ClickHouse。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md index 6f05d894808..2fafdbe7714 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/02_migration_guide.md @@ -12,7 +12,7 @@ import migrate_snowflake_clickhouse from '@site/static/images/migrations/migrate import Image from '@theme/IdealImage'; -# 从 Snowflake 迁移到 ClickHouse +# 从 Snowflake 迁移到 ClickHouse {#migrate-from-snowflake-to-clickhouse} > 本指南介绍如何将数据从 Snowflake 迁移到 ClickHouse。 @@ -21,7 +21,7 @@ import Image from '@theme/IdealImage'; -## 从 Snowflake 导出数据 +## 从 Snowflake 导出数据 {#1-exporting-data-from-snowflake} @@ -59,7 +59,7 @@ COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 heade 对于大约 5TB 的数据集(单个文件最大 150MB),在同一 AWS `us-east-1` 区域使用 2X-Large Snowflake 仓库时,将数据复制到 S3 存储桶大约需要 30 分钟。 -## 导入 ClickHouse +## 导入 ClickHouse {#2-importing-to-clickhouse} 将数据暂存到中间对象存储后,就可以使用 ClickHouse 的函数(例如 [s3 表函数](/sql-reference/table-functions/s3))将数据插入到表中,如下所示。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md index 2218bedf103..72b7745644a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/04_snowflake/03_sql_translation_reference.md @@ -10,7 +10,7 @@ doc_type: 'guide' -# Snowflake SQL 转换指南 +# Snowflake SQL 转换指南 {#snowflake-sql-translation-guide} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md index 9e02ee52184..33ea300a539 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/05_elastic/01_overview.md @@ -8,6 +8,6 @@ show_related_blogs: true doc_type: 'landing-page' --- -# Elasticsearch 到 ClickHouse 的迁移 +# Elasticsearch 到 ClickHouse 的迁移 {#elasticsearch-to-clickhouse-migration} 在可观测性相关的使用场景中,请参阅 [Elasticsearch 到 ClickStack 的迁移文档](/use-cases/observability/clickstack/migration/elastic)。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md index 0bf5d4cae1c..f5b6d8fab56 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/01_overview.md @@ -9,7 +9,7 @@ doc_type: 'guide' -# 从 Amazon Redshift 迁移到 ClickHouse +# 从 Amazon Redshift 迁移到 ClickHouse {#amazon-redshift-to-clickhouse-migration} > 本文档对如何将数据从 Amazon Redshift 迁移到 ClickHouse 进行简介。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md index eb6c643cb3c..60414051a8f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/02_migration_guide.md @@ -7,9 +7,8 @@ title: '从 Amazon Redshift 迁移到 ClickHouse 指南' doc_type: 'guide' --- -import MigrationGuide from '@site/docs/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' +import MigrationGuide from '@site/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/redshift/_snippets/_migration_guide.md' +# 从 Amazon Redshift 迁移到 ClickHouse 指南 {#amazon-redshift-to-clickhouse-migration-guide} -# 从 Amazon Redshift 迁移到 ClickHouse 指南 - - \ No newline at end of file + \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md index db4ff876992..68984128a4f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/06_redshift/03_sql_translation_reference.md @@ -9,7 +9,7 @@ doc_type: 'reference' -# Amazon Redshift SQL 转换指南 +# Amazon Redshift SQL 转换指南 {#amazon-redshift-sql-translation-guide} @@ -52,9 +52,9 @@ doc_type: 'reference' -## DDL 语法 +## DDL 语法 {#compression} -### 排序键 +### 排序键 {#sorting-keys} ClickHouse 和 Redshift 都有“排序键”的概念,用于定义数据在存储时的排序方式。Redshift 使用 `SORTKEY` 子句来定义排序键: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md index 29e44477964..81531876604 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/07_OSS_to_Cloud/01_clickhouse-to-cloud.md @@ -8,7 +8,7 @@ keywords: ['迁移', 'ClickHouse Cloud', 'OSS', '将自托管迁移到 Cloud'] --- import Image from '@theme/IdealImage'; -import AddARemoteSystem from '@site/docs/_snippets/_add_remote_ip_access_list_detail.md'; +import AddARemoteSystem from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_add_remote_ip_access_list_detail.md'; import self_managed_01 from '@site/static/images/integrations/migration/self-managed-01.png'; import self_managed_02 from '@site/static/images/integrations/migration/self-managed-02.png'; import self_managed_03 from '@site/static/images/integrations/migration/self-managed-03.png'; @@ -16,16 +16,13 @@ import self_managed_04 from '@site/static/images/integrations/migration/self-man import self_managed_05 from '@site/static/images/integrations/migration/self-managed-05.png'; import self_managed_06 from '@site/static/images/integrations/migration/self-managed-06.png'; +# 在自托管 ClickHouse 与 ClickHouse Cloud 之间迁移 {#migrating-between-self-managed-clickhouse-and-clickhouse-cloud} -# 在自托管 ClickHouse 与 ClickHouse Cloud 之间迁移 - - + 本指南将说明如何将自托管 ClickHouse 服务器迁移到 ClickHouse Cloud,以及如何在不同的 ClickHouse Cloud 服务之间进行迁移。[`remoteSecure`](/sql-reference/table-functions/remote) 函数在 `SELECT` 和 `INSERT` 查询中使用,以便访问远程 ClickHouse 服务器,这使得迁移数据表变得非常简单,只需编写一个嵌套 `SELECT` 的 `INSERT INTO` 查询即可完成。 - - -## 从自托管 ClickHouse 迁移到 ClickHouse Cloud +## 从自托管 ClickHouse 迁移到 ClickHouse Cloud {#migrating-from-self-managed-clickhouse-to-clickhouse-cloud} @@ -36,7 +33,7 @@ ClickHouse Cloud 会自动处理纵向和横向扩展。无需再考虑如何对 在本示例中,自托管 ClickHouse 服务器是*源端*,ClickHouse Cloud 服务是*目标端*。 -### 概览 +### 概览 {#overview} 流程如下: @@ -46,11 +43,11 @@ ClickHouse Cloud 会自动处理纵向和横向扩展。无需再考虑如何对 4. 从目标端的 IP 访问列表中移除源服务器(如适用) 5. 从源服务中删除该只读用户 -### 在两个系统之间迁移表: +### 在两个系统之间迁移表: {#migration-of-tables-from-one-system-to-another} 本示例会将一个表从自托管 ClickHouse 服务器迁移到 ClickHouse Cloud。 -### 在源 ClickHouse 系统上(当前托管数据的系统) +### 在源 ClickHouse 系统上(当前托管数据的系统) {#on-the-source-clickhouse-system-the-system-that-currently-hosts-the-data} * 添加一个可以读取源表(本例中为 `db.table`)的只读用户 @@ -72,7 +69,7 @@ FROM system.tables WHERE database = 'db' AND table = 'table' ``` -### 在目标 ClickHouse Cloud 系统上: +### 在目标 ClickHouse Cloud 系统上: {#on-the-destination-clickhouse-cloud-system} * 创建目标数据库: @@ -119,8 +116,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 'default', 'PASS') SELECT * FROM db.table ``` - -## 在 ClickHouse Cloud 服务之间迁移 +## 在 ClickHouse Cloud 服务之间迁移 {#migrating-between-clickhouse-cloud-services} @@ -143,7 +139,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 6. 在目标服务上重新建立 IP 访问列表 7. 从源服务中移除只读用户 -#### 在源服务中添加只读用户 +#### 在源服务中添加只读用户 {#add-a-read-only-user-to-the-source-service} * 添加一个只读用户,用于读取源表(本示例中为 `db.table`): @@ -164,7 +160,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', where database = 'db' and table = 'table' ``` -#### 在目标服务上复制表结构 +#### 在目标服务上复制表结构 {#duplicate-the-table-structure-on-the-destination-service} 在目标服务上,如果数据库尚不存在,则先创建数据库: @@ -181,7 +177,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', CREATE TABLE db.table ... ``` -#### 允许对源服务的远程访问 +#### 允许对源服务的远程访问 {#allow-remote-access-to-the-source-service} 为了将数据从源服务拉取到目标服务,源服务必须允许来自外部的连接。请在源服务上临时禁用“IP Access List(IP 访问列表)”功能。 @@ -191,7 +187,7 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 修改访问列表,并临时将访问范围设置为 **Anywhere(任意地址)**。详细信息请参阅 [IP Access List](/cloud/security/setting-ip-filters) 文档。 -#### 将数据从源服务复制到目标服务 +#### 将数据从源服务复制到目标服务 {#copy-the-data-from-source-to-destination} * 使用 `remoteSecure` 函数从源 ClickHouse Cloud 服务拉取数据。 连接到目标服务,并在目标 ClickHouse Cloud 服务上运行以下命令: @@ -203,11 +199,11 @@ remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', * 在目标服务中验证数据 -#### 在源服务上重新建立 IP 访问列表 +#### 在源服务上重新建立 IP 访问列表 {#re-establish-the-ip-access-list-on-the-source} 如果之前导出了访问列表,则可以通过 **Share** 进行重新导入;否则,请重新将各条访问记录添加到访问列表中。 -#### 移除只读的 `exporter` 用户 +#### 移除只读的 `exporter` 用户 {#remove-the-read-only-exporter-user} ```sql DROP USER exporter diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md index 7b886152e93..073f00c42a7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/01_clickhouse-local-etl.md @@ -11,14 +11,14 @@ import Image from '@theme/IdealImage'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; -import AddARemoteSystem from '@site/docs/_snippets/_add_remote_ip_access_list_detail.md'; +import AddARemoteSystem from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_add_remote_ip_access_list_detail.md'; import ch_local_01 from '@site/static/images/integrations/migration/ch-local-01.png'; import ch_local_02 from '@site/static/images/integrations/migration/ch-local-02.png'; import ch_local_03 from '@site/static/images/integrations/migration/ch-local-03.png'; import ch_local_04 from '@site/static/images/integrations/migration/ch-local-04.png'; -# 使用 clickhouse-local 迁移到 ClickHouse +# 使用 clickhouse-local 迁移到 ClickHouse {#migrating-to-clickhouse-using-clickhouse-local} @@ -94,21 +94,21 @@ ClickHouse 为 [MySQL](/engines/table-engines/integrations/mysql/)、[PostgreSQL -## 示例 1:使用集成引擎从 MySQL 迁移到 ClickHouse Cloud +## 示例 1:使用集成引擎从 MySQL 迁移到 ClickHouse Cloud {#example-1-migrating-from-mysql-to-clickhouse-cloud-with-an-integration-engine} 我们将使用 [integration 表引擎](/engines/table-engines/integrations/mysql/)(由 [mysql 表函数](/sql-reference/table-functions/mysql/) 动态创建)从源 MySQL 数据库读取数据,并使用 [remoteSecure 表函数](/sql-reference/table-functions/remote/) 将数据写入您在 ClickHouse Cloud 服务上的目标表中。 -### 在目标 ClickHouse Cloud 服务上: +### 在目标 ClickHouse Cloud 服务上: {#on-the-destination-clickhouse-cloud-service} -#### 创建目标数据库: +#### 创建目标数据库: {#create-the-destination-database} ```sql CREATE DATABASE db ``` -#### 创建一个目标表,使其表结构与 MySQL 表相同: +#### 创建一个目标表,使其表结构与 MySQL 表相同: {#create-a-destination-table-that-has-a-schema-equivalent-to-the-mysql-table} ```sql CREATE TABLE db.table ... @@ -118,9 +118,9 @@ CREATE TABLE db.table ... ClickHouse Cloud 目标表的表结构必须与源 MySQL 表的表结构保持一致(列名和列顺序必须相同,且列的数据类型必须兼容)。 ::: -### 在运行 clickhouse-local 的主机上: +### 在运行 clickhouse-local 的主机上: {#on-the-clickhouse-local-host-machine} -#### 使用迁移查询语句运行 clickhouse-local: +#### 使用迁移查询语句运行 clickhouse-local: {#run-clickhouse-local-with-the-migration-query} ```sql ./clickhouse-local --query " @@ -135,16 +135,16 @@ SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');" ::: -## 示例 2:使用 JDBC bridge 将 MySQL 迁移到 ClickHouse Cloud +## 示例 2:使用 JDBC bridge 将 MySQL 迁移到 ClickHouse Cloud {#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge} 我们将使用 [JDBC 集成表引擎](/engines/table-engines/integrations/jdbc.md)(由 [jdbc 表函数](/sql-reference/table-functions/jdbc.md) 动态创建),配合 [ClickHouse JDBC Bridge](https://github.com/ClickHouse/clickhouse-jdbc-bridge) 和 MySQL JDBC 驱动,从源 MySQL 数据库读取数据,并使用 [remoteSecure 表函数](/sql-reference/table-functions/remote.md) 将数据写入 ClickHouse Cloud 服务中的目标表。 -### 在目标 ClickHouse Cloud 服务上: +### 在目标 ClickHouse Cloud 服务上: {#on-the-destination-clickhouse-cloud-service-1} -#### 创建目标数据库: +#### 创建目标数据库: {#create-the-destination-database-1} ```sql CREATE DATABASE db diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md index 0a19e1792f1..caff40358f9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/02_etl-tool-to-clickhouse.md @@ -10,15 +10,14 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import third_party_01 from '@site/static/images/integrations/migration/third-party-01.png'; +# 使用第三方 ETL 工具 {#using-a-3rd-party-etl-tool} -# 使用第三方 ETL 工具 - - + 将数据从外部数据源迁移到 ClickHouse 的一个很好的选择,是使用众多流行的 ETL/ELT 工具之一。我们提供以下相关文档: -- [Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) -- [dbt](/integrations/data-ingestion/etl-tools/dbt/index.md) -- [Vector](/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) +* [Airbyte](/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) +* [dbt](/integrations/data-ingestion/etl-tools/dbt/index.md) +* [Vector](/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) 此外,还有许多其他 ETL/ELT 工具可以与 ClickHouse 集成,请查阅所使用工具的文档以获取详细信息。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md index a4ffa3f686f..3c3ce652b33 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/02_migrate/01_migration_guides/08_other_methods/03_object-storage-to-clickhouse.md @@ -9,16 +9,15 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import object_storage_01 from '@site/static/images/integrations/migration/object-storage-01.png'; +# 将数据从云对象存储迁移到 ClickHouse Cloud {#move-data-from-cloud-object-storage-to-clickhouse-cloud} -# 将数据从云对象存储迁移到 ClickHouse Cloud - - + 如果你将云对象存储用作数据湖并希望将这些数据导入 ClickHouse Cloud,或者当前数据库系统可以直接将数据导出到云对象存储,那么可以使用以下表函数,将存储在云对象存储中的数据迁移到 ClickHouse Cloud 表中: -- [s3](/sql-reference/table-functions/s3.md) 或 [s3Cluster](/sql-reference/table-functions/s3Cluster.md) -- [gcs](/sql-reference/table-functions/gcs) -- [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage) +* [s3](/sql-reference/table-functions/s3.md) 或 [s3Cluster](/sql-reference/table-functions/s3Cluster.md) +* [gcs](/sql-reference/table-functions/gcs) +* [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage) 如果当前数据库系统无法直接将数据导出到云对象存储,你可以使用[第三方 ETL/ELT 工具](/cloud/migration/etl-tool-to-clickhouse)或 [clickhouse-local](/cloud/migration/clickhouse-local),先将数据从当前数据库系统迁移到云对象存储,然后在第二步再将这些数据迁移到 ClickHouse Cloud 表中。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md index c632dbef4a4..ba8f98f5738 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/03_tune/resource_tour.md @@ -7,12 +7,12 @@ hide_title: true doc_type: 'guide' --- -import TableOfContentsBestPractices from '@site/docs/best-practices/_snippets/_table_of_contents.md'; -import TableOfContentsOptimizationAndPerformance from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; -import TableOfContentsSecurity from '@site/docs/cloud/_snippets/_security_table_of_contents.md'; +import TableOfContentsBestPractices from '@site/i18n/zh/docusaurus-plugin-content-docs/current/best-practices/_snippets/_table_of_contents.md'; +import TableOfContentsOptimizationAndPerformance from '@site/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; +import TableOfContentsSecurity from '@site/i18n/zh/docusaurus-plugin-content-docs/current/cloud/_snippets/_security_table_of_contents.md'; -# 资源导览 +# 资源导览 {#resource-tour} 本文旨在为您概述文档中可用的资源,帮助您充分发挥 ClickHouse Cloud 部署的价值。 您可以按以下主题浏览资源: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/index.md index 21dd61d6c13..78cfbcf5194 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/onboard/index.md @@ -9,7 +9,7 @@ keywords: ['上手引导', '入门', '云端配置', '快速入门', '简介'] -# ClickHouse Cloud 入门 +# ClickHouse Cloud 入门 {#get-started-with-clickhouse-cloud} 初次使用 ClickHouse Cloud,不知从何入手?本文档部分将指导您完成快速部署和运行所需的全部步骤。我们将入门指南划分为三个子部分,帮助您在探索 ClickHouse Cloud 的过程中循序渐进地完成各项配置。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md index ebe542c9ce2..ae0334e3395 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_02.md @@ -12,7 +12,7 @@ doc_type: 'changelog' -#### 不向后兼容的变更 +#### 不向后兼容的变更 {#backward-incompatible-change} * 在嵌套类型中对可疑/实验性类型进行校验。此前我们不会在 Array/Tuple/Map 等嵌套类型中校验这类类型(JSON 除外)。[#59385](https://github.com/ClickHouse/ClickHouse/pull/59385)([Kruglov Pavel](https://github.com/Avogar))。 * 排序子句 `ORDER BY ALL`(在 v23.12 中引入)已被 `ORDER BY *` 取代。之前的语法对于包含名为 `all` 的列的表而言过于容易出错。[#59450](https://github.com/ClickHouse/ClickHouse/pull/59450)([Robert Schulze](https://github.com/rschu1ze))。 @@ -29,7 +29,7 @@ doc_type: 'changelog' -#### 新功能 +#### 新功能 {#new-feature} * 支持返回值计数及其误差的 topk/topkweighed 模式。 [#54508](https://github.com/ClickHouse/ClickHouse/pull/54508) ([UnamedRus](https://github.com/UnamedRus)). * 新增语法,允许在视图/物化视图中指定定义者用户(definer user)。这样可以在未对底层表显式授予权限的情况下,通过视图执行 SELECT/INSERT 操作。[#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) ([pufit](https://github.com/pufit))。 @@ -57,7 +57,7 @@ doc_type: 'changelog' -#### 性能优化 +#### 性能优化 {#performance-improvement} * 在 `SELECT` 子句中消除了对 `GROUP BY` 键使用 `min`/`max`/`any`/`anyLast` 聚合函数的情况。[#52230](https://github.com/ClickHouse/ClickHouse/pull/52230) ([JackyWoo](https://github.com/JackyWoo))。 * 在处理多个 [nullable] 列时提升序列化聚合方法的性能。这是 [#51399](https://github.com/ClickHouse/ClickHouse/issues/51399) 的通用化版本,同时不牺牲抽象层的完整性。[#55809](https://github.com/ClickHouse/ClickHouse/pull/55809)([Amos Bird](https://github.com/amosbird))。 @@ -86,7 +86,7 @@ doc_type: 'changelog' -#### 改进 +#### 改进 {#improvement} * 在对物化视图运行 MODIFY COLUMN 查询时,检查内部表的结构以确保所有列均存在。[#47427](https://github.com/ClickHouse/ClickHouse/pull/47427) ([sunny](https://github.com/sunny19930321))。 * 新增了表 `system.keywords`,其中包含解析器中的所有关键字。主要是为了更好地支持模糊测试和语法高亮。 [#51808](https://github.com/ClickHouse/ClickHouse/pull/51808) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov))。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md index f74695431ea..3460352d38c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_05.md @@ -10,7 +10,7 @@ doc_type: 'changelog' -# V24.5 Cloud 版本变更日志 +# V24.5 Cloud 版本变更日志 {#v245-changelog-for-cloud} 基于 v24.5 版本的 ClickHouse Cloud 服务相关变更。 @@ -128,7 +128,7 @@ doc_type: 'changelog' -# 改进 +# 改进 {#improvements} * 移除 `optimize_monotonous_functions_in_order_by` 设置,该设置正逐渐变成空操作(no-op)。[#63004](https://github.com/ClickHouse/ClickHouse/pull/63004) (Raúl Marín)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md index 32de2aef8ea..9a5c5929ef3 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_06.md @@ -10,7 +10,7 @@ doc_type: 'changelog' -# V24.6 版 Cloud 更新日志 +# V24.6 版 Cloud 更新日志 {#v246-changelog-for-cloud} v24.6 版本中与 ClickHouse Cloud 服务相关的更改。 @@ -110,7 +110,7 @@ v24.6 版本中与 ClickHouse Cloud 服务相关的更改。 -## 错误修复(官方稳定版本中用户可见的异常行为) +## 错误修复(官方稳定版本中用户可见的异常行为) {#bug-fix-user-visible-misbehavior-in-an-official-stable-release} * 修复了在与 IN 和 indexHint() 一起使用时 'set' 跳过索引不起作用的问题。#62083 (Michael Kolupaev)。 * 修复在表未使用自适应粒度时,带有 FINAL 关键字的查询返回错误结果的问题。#62432(Duc Canh Le)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md index c4d8c1228ce..91bad566910 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/01_changelog/02_release_notes/24_10.md @@ -22,7 +22,7 @@ doc_type: 'changelog' -## 新功能 +## 新功能 {#new-feature} * 可刷新物化视图已经可以在生产环境中使用。[#70550](https://github.com/ClickHouse/ClickHouse/pull/70550)([Michael Kolupaev](https://github.com/al13n321))。Replicated 数据库现已支持可刷新物化视图。[#60669](https://github.com/ClickHouse/ClickHouse/pull/60669)([Michael Kolupaev](https://github.com/al13n321))。 * 函数 `toStartOfInterval()` 现在新增了一个重载,可用于模拟 TimescaleDB 的 `time_bucket()` 函数以及 PostgreSQL 的 `date_bin()` 函数([#55619](https://github.com/ClickHouse/ClickHouse/issues/55619))。它允许将日期或时间戳值,对齐到从*任意*起点开始的给定时间间隔的整数倍(而不是以 0000-01-01 00:00:00.000 作为*固定*起点)。例如,`SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30'));` 会返回 `2023-01-01 14:44:30`,这是以起点 `2023-01-01 14:35:30` 开始的 1 分钟间隔的整数倍。[#56738](https://github.com/ClickHouse/ClickHouse/pull/56738)([Yarik Briukhovetskyi](https://github.com/yariks5s))。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md index 09c9438efdd..73f50852bd9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/02_architecture.md @@ -11,7 +11,7 @@ import Image from '@theme/IdealImage'; import Architecture from '@site/static/images/cloud/reference/architecture.png'; -# ClickHouse Cloud 架构 +# ClickHouse Cloud 架构 {#clickhouse-cloud-architecture} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md index 38b34fffde7..2510653ffdd 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/01_billing_overview.md @@ -181,9 +181,9 @@ ClickHouse Cloud 会根据计算、存储、[数据传输](/cloud/manage/network -## 常见问题 +## 常见问题 {#faqs} -### 什么是 ClickHouse Credit(CHC)? +### 什么是 ClickHouse Credit(CHC)? {#what-is-chc} ClickHouse Credit 是针对客户使用 ClickHouse Cloud 的一单位额度,等同于一(1)美元,并按 ClickHouse 届时发布的有效价目表进行折算。 @@ -191,27 +191,27 @@ ClickHouse Credit 是针对客户使用 ClickHouse Cloud 的一单位额度, 如果您通过 Stripe 支付账单,那么在您的 Stripe 发票上会看到 1 CHC 等于 0.01 美元。这是为了在 Stripe 上实现精确计费,因为 Stripe 无法针对我们标准 SKU(1 CHC = 1 美元)按非整数数量进行计费。 ::: -### 在哪里可以找到旧版定价信息? +### 在哪里可以找到旧版定价信息? {#find-legacy-pricing} 旧版定价信息可以在[这里](https://clickhouse.com/pricing?legacy=true)找到。 -### 计算资源是如何计量的? +### 计算资源是如何计量的? {#how-is-compute-metered} ClickHouse Cloud 以每分钟为单位计量计算资源,粒度为每 8GB 内存。 计算费用会根据服务等级、区域和云服务提供商而变化。 -### 磁盘存储是如何计算的? +### 磁盘存储是如何计算的? {#how-is-storage-on-disk-calculated} ClickHouse Cloud 使用云对象存储,并根据存储在 ClickHouse 表中的数据压缩后大小来计量用量。 存储费用在各服务等级之间相同,但会根据区域和云服务提供商而变化。 -### 备份是否计入总存储? +### 备份是否计入总存储? {#do-backups-count-toward-total-storage} 存储和备份都会计入存储用量,并分别计费。 所有服务默认保留一个备份,保留时间为一天。 需要额外备份的用户可以在 Cloud 控制台的“设置”标签页中配置额外的[备份](/cloud/manage/backups/overview)。 -### 我该如何估算压缩比? +### 我该如何估算压缩比? {#how-do-i-estimate-compression} 压缩率会因数据集而异。 压缩率变化的程度取决于数据本身的可压缩性(高基数字段和低基数字段的数量), @@ -228,12 +228,12 @@ FROM system.tables WHERE name = <你的表名> ``` -### 如果我有自管部署,ClickHouse 提供哪些工具来预估在云端运行服务的成本? +### 如果我有自管部署,ClickHouse 提供哪些工具来预估在云端运行服务的成本? {#what-tools-does-clickhouse-offer-to-estimate-the-cost-of-running-a-service-in-the-cloud-if-i-have-a-self-managed-deployment} ClickHouse 查询日志会捕获[关键指标](/operations/system-tables/query_log),可用于估算在 ClickHouse Cloud 中运行工作负载的成本。 关于从自管环境迁移到 ClickHouse Cloud 的详细信息,请参阅[迁移文档](/cloud/migration/clickhouse-to-cloud),如有进一步问题,请联系 [ClickHouse Cloud 支持](https://console.clickhouse.cloud/support)。 -### ClickHouse Cloud 提供哪些计费选项? +### ClickHouse Cloud 提供哪些计费选项? {#what-billing-options-are-available-for-clickhouse-cloud} ClickHouse Cloud 支持以下计费选项: @@ -245,11 +245,11 @@ ClickHouse Cloud 支持以下计费选项: 用于 PAYG 的 ClickHouse Cloud credits 按 $0.01 为单位开具发票,使我们能够根据客户的实际使用量按部分 ClickHouse credits 收费。这不同于承诺支出型 ClickHouse credits,后者是以整 $1 为单位预付购买。 ::: -### 我可以删除我的信用卡吗? +### 我可以删除我的信用卡吗? {#can-i-delete-my-credit-card} 您无法在计费 UI 中移除信用卡,但可以随时更新。这有助于确保您的组织始终具有有效的付款方式。如果您需要移除信用卡,请联系 [ClickHouse Cloud 支持](https://console.clickhouse.cloud/support) 获取帮助。 -### 计费周期有多长? +### 计费周期有多长? {#how-long-is-the-billing-cycle} 计费采用月度周期,开始日期为创建 ClickHouse Cloud 组织的日期。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md index 0e247f3b8ea..1225bf6ff4a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/02_marketplace/aws-marketplace-payg.md @@ -1,7 +1,7 @@ --- slug: /cloud/billing/marketplace/aws-marketplace-payg -title: 'AWS Marketplace 按需计费(PAYG)' -description: '通过 AWS Marketplace 以按需计费(PAYG)方式订阅 ClickHouse Cloud。' +title: 'AWS Marketplace 按需付费 (PAYG)' +description: '通过 AWS Marketplace 以按需付费 (PAYG) 方式订阅 ClickHouse Cloud。' keywords: ['aws', 'marketplace', 'billing', 'PAYG'] doc_type: 'guide' --- @@ -17,68 +17,67 @@ import aws_marketplace_payg_8 from '@site/static/images/cloud/manage/billing/mar import aws_marketplace_payg_9 from '@site/static/images/cloud/manage/billing/marketplace/aws-marketplace-payg-9.png'; import Image from '@theme/IdealImage'; -通过 [AWS Marketplace](https://aws.amazon.com/marketplace) 上的按需付费(PAYG)公共报价开始使用 ClickHouse Cloud。 +在 [AWS Marketplace](https://aws.amazon.com/marketplace) 上通过 PAYG(按需付费)公共优惠开始使用 ClickHouse Cloud。 -## 先决条件 {#prerequisites} +## 前提条件 {#prerequisites} - 一个已由计费管理员开通购买权限的 AWS 账户。 - 要进行购买,您必须使用该账户登录 AWS Marketplace。 -- 若要将 ClickHouse 组织关联到您的订阅,您必须是该组织的管理员。 +- 要将 ClickHouse 组织关联到您的订阅,您必须是该组织的管理员。 :::note -一个 AWS 账户只能订阅一个 “ClickHouse Cloud - 按量付费” 订阅,并且该订阅只能关联一个 ClickHouse 组织。 +一个 AWS 账户最多只能订阅一个“ClickHouse Cloud - Pay As You Go”订阅,并且该订阅只能关联到一个 ClickHouse 组织。 ::: - - ## 注册步骤 {#steps-to-sign-up} ### 搜索 ClickHouse Cloud - Pay As You Go {#search-payg} -前往 [AWS Marketplace](https://aws.amazon.com/marketplace),搜索 “ClickHouse Cloud - Pay As You Go”。 +前往 [AWS Marketplace](https://aws.amazon.com/marketplace),搜索“ClickHouse Cloud - Pay As You Go”。 ### 查看购买选项 {#purchase-options} -点击该[产品页面](https://aws.amazon.com/marketplace/pp/prodview-p4gwofrqpkltu),然后点击 **View purchase options**。 +点击该[商品详情页](https://aws.amazon.com/marketplace/pp/prodview-p4gwofrqpkltu),然后点击 **View purchase options**。 - + ### 订阅 {#subscribe} -在下一个页面中,点击 **Subscribe**。 +在下一屏上点击 **subscribe**。 :::note -**Purchase order (PO) number(采购订单号)** 为可选项,可以忽略。 +**采购订单(PO)号** 为可选项,可以忽略。 +**此商品有两个可选报价。** 如果选择 “ClickHouse Cloud - Pay As You Go Free Trial” 报价,您将订阅一个由 AWS 管理的 30 天免费试用。需要注意的是,30 天结束后,此商品订阅将终止,您需要在该商品页面重新订阅另一个 “ClickHouse Cloud - Pay As You Go” 报价,才能继续使用 ClickHouse Pay As You Go。 ::: - + -### 设置你的账户 {#set-up-your-account} +### 设置您的账户 {#set-up-your-account} -请注意,此时设置尚未完成,你的 ClickHouse Cloud 组织尚未通过 Marketplace 计费。你现在需要在 Marketplace 订阅页面中点击 **Set up your account**,跳转到 ClickHouse Cloud 完成配置。 +请注意,此时设置尚未完成,您的 ClickHouse Cloud 组织也尚未通过 Marketplace 计费。您现在需要在 Marketplace 订阅页面中点击 **Set up your account**,跳转到 ClickHouse Cloud 完成最终设置。 - + -跳转到 ClickHouse Cloud 后,你可以使用现有账户登录,或者注册一个新账户。此步骤非常关键,以便我们将你的 ClickHouse Cloud 组织绑定到你的 AWS Marketplace 计费。 +重定向至 ClickHouse Cloud 后,您可以使用现有账户登录,或注册新账户。此步骤非常重要,以便我们将您的 ClickHouse Cloud 组织与 AWS Marketplace 计费绑定。 -:::note[新 ClickHouse Cloud 用户] -如果你是新的 ClickHouse Cloud 用户,请按照下面的步骤操作。 +:::note[ClickHouse Cloud 新用户] +如果您是 ClickHouse Cloud 新用户,请按照以下步骤操作。 :::
新用户步骤 -如果你是新的 ClickHouse Cloud 用户,请点击页面底部的 **Register**。系统会提示你创建新用户并验证邮箱。完成邮箱验证后,你可以关闭 ClickHouse Cloud 登录页面,然后在 https://console.clickhouse.cloud 使用新用户名登录。 +如果您是 ClickHouse Cloud 新用户,请点击页面底部的 **Register**。系统会提示您创建一个新用户并验证邮箱。完成邮箱验证后,您可以关闭 ClickHouse Cloud 登录页面,并在 https://console.clickhouse.cloud 使用新的用户名登录。 :::note[新用户] -你还需要提供一些关于你业务的基本信息。请参见下面的截图。 +您还需要提供一些关于您业务的基本信息。请参见下方截图。 ::: @@ -87,24 +86,22 @@ import Image from '@theme/IdealImage';
-如果你是现有的 ClickHouse Cloud 用户,只需使用你的账户凭证登录即可。 +如果您是现有的 ClickHouse Cloud 用户,只需使用您的账号凭据登录即可。 ### 将 Marketplace 订阅添加到组织 {#add-marketplace-subscription} -成功登录后,你可以选择创建一个新组织,将其计费绑定到此 Marketplace 订阅;也可以选择一个现有组织,将其计费绑定到此订阅。 +成功登录后,您可以选择创建一个新组织,将此 Marketplace 订阅的计费归到该组织;也可以选择一个现有组织,将其计费归到此订阅下。 -完成此步骤后,你的组织将连接到该 AWS 订阅,所有用量将通过你的 AWS 账户计费。 +完成此步骤后,您的组织将关联到此 AWS 订阅,所有用量都会通过您的 AWS 账户计费。 -你可以在 ClickHouse UI 中该组织的计费页面确认计费已成功关联到 AWS Marketplace。 +您可以在 ClickHouse UI 中该组织的计费页面确认,计费现在确实已关联到 AWS Marketplace。
- - ## 支持 {#support} -如果您遇到任何问题,请随时联系[我们的支持团队](https://clickhouse.com/support/program)。 +如果您遇到任何问题,请随时联系[我们的支持团队](https://clickhouse.com/support/program)。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/03_clickpipes/clickpipes_for_cdc.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/03_clickpipes/clickpipes_for_cdc.md index 340d796b08f..31801f12579 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/03_clickpipes/clickpipes_for_cdc.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/03_clickpipes/clickpipes_for_cdc.md @@ -63,15 +63,15 @@ Postgres CDC 连接器分为两个主要阶段运行: #### 月度费用明细 {#cost-breakdown} -**摄取数据(CDC)** +**摄取数据(CDC)**: -2 个管道 × 500 GB = 1,000 GB 每月 +$$ 2 \text{ 个管道} \times 500 \text{ GB} = 1,000 \text{ GB 每月} $$ -1,000 GB × $0.20/GB = $200 +$$ 1,000 \text{ GB} \times \$0.20/\text{GB} = \$200 $$ **计算资源**: -1 个计算单元 × $0.20/小时 × 730 小时(约一个月) = $146 +$$1 \text{ 个计算单元} \times \$0.20/\text{小时} \times 730 \text{ 小时(约一个月)} = \$146$$ :::note 计算资源在两个管道之间共享 @@ -79,7 +79,7 @@ Postgres CDC 连接器分为两个主要阶段运行: **月度总费用**: -$200 (摄取) + $146 (计算资源) = $346 +$$\$200 \text{ (摄取)} + \$146 \text{ (计算资源)} = \$346$$ ## Postgres CDC ClickPipes 常见问题解答 {#faq-postgres-cdc-clickpipe} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx index cb106cb441e..14206f5852b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/04_network-data-transfer.mdx @@ -7,7 +7,7 @@ doc_type: 'guide' keywords: ['计费', '网络传输', '数据出站', '成本', '定价'] --- -import NetworkPricing from '@site/docs/cloud/reference/_snippets/_network_transfer_rates.md'; +import NetworkPricing from '@site/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/_snippets/_network_transfer_rates.md'; ClickHouse Cloud 会监控并计量入站和出站的数据传输量。 这包括所有进出 ClickHouse Cloud 的数据,以及区域内和跨区域的数据传输。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md index ab7ffda14a9..64d77d586de 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/05_payment-thresholds.md @@ -7,9 +7,9 @@ keywords: ['计费', '支付阈值', '自动开票', '发票'] doc_type: 'guide' --- -# 付款阈值 +# 付款阈值 {#payment-thresholds} -当你在某一 ClickHouse Cloud 计费周期内的应付金额达到 10,000 美元(USD)或等值金额时,系统将会自动从你的付款方式中扣款。扣款失败将在宽限期结束后导致你的服务被暂停或终止。 +当你在某一 ClickHouse Cloud 计费周期内的应付金额达到 10,000 美元(USD)或等值金额时,系统将会自动从你的付款方式中扣款。扣款失败将在宽限期结束后导致你的服务被暂停或终止。 :::note 此付款阈值不适用于与 ClickHouse 签订了承诺消费合同或其他协商合同协议的客户。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md index f8f3454ca5d..f05658e7511 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/03_billing/06_billing_compliance.md @@ -11,7 +11,7 @@ import billing_compliance from '@site/static/images/cloud/manage/billing_complia import Image from '@theme/IdealImage'; -# ClickHouse Cloud 计费合规 +# ClickHouse Cloud 计费合规 {#clickhouse-cloud-billing-compliance} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md index 324aebcfbea..f3b5449378d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/05_supported-regions.md @@ -10,7 +10,7 @@ doc_type: 'reference' import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge' -# 受支持的云区域 +# 受支持的云区域 {#supported-cloud-regions} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md index 801199cb76b..161cd7408f4 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/08_settings.md @@ -10,8 +10,7 @@ doc_type: 'guide' import Image from '@theme/IdealImage'; import cloud_settings_sidebar from '@site/static/images/cloud/manage/cloud-settings-sidebar.png'; - -# 配置设置 +# 配置设置 {#configuring-settings} 要为特定[用户](/operations/access-rights#user-account-management)或[角色](/operations/access-rights#role-management)指定 ClickHouse Cloud 服务的设置,必须使用[基于 SQL 的 Settings Profiles](/operations/access-rights#settings-profiles-management)。应用 Settings Profiles 可以确保你配置的设置在服务停止、处于空闲状态或升级时仍然保持不变。要了解有关 Settings Profiles 的更多信息,请参阅[此页面](/operations/settings/settings-profiles.md)。 @@ -19,4 +18,4 @@ import cloud_settings_sidebar from '@site/static/images/cloud/manage/cloud-setti 若要进一步了解可以为 ClickHouse Cloud 服务指定的设置,请在[我们的文档](/operations/settings)中按类别查看所有可用设置。 - \ No newline at end of file + \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md index 6fb5b3a42bf..633855714f0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/09_security/03_compliance-overview.md @@ -10,7 +10,7 @@ import BetaBadge from '@theme/badges/BetaBadge'; import EnterprisePlanFeatureBadge from '@theme/badges/EnterprisePlanFeatureBadge'; -# 安全与合规报告 +# 安全与合规报告 {#security-and-compliance-reports} ClickHouse 会评估客户在安全与合规方面的需求,并会根据额外报告请求持续扩展相关项目。有关更多信息或下载报告,请访问我们的[信任中心(Trust Center)](https://trust.clickhouse.com)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md index 10950b45226..dd2adbaceab 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/11_account-close.md @@ -37,7 +37,7 @@ doc_type: 'guide' -## 申请关闭账户 +## 申请关闭账户 {#request-account-closure} 我们必须对关闭和删除请求进行身份验证。为确保您的请求能够尽快处理,请按照以下步骤操作。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/index.md index d336123b7e0..0e4cf8d4043 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/cloud/reference/index.md @@ -7,7 +7,7 @@ description: 'Cloud 参考部分的概览页' doc_type: 'landing-page' --- -# 云端参考 +# 云端参考 {#cloud-reference} 本节作为 ClickHouse Cloud 更多技术细节的参考指南,包含以下页面: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/concepts/glossary.md b/i18n/zh/docusaurus-plugin-content-docs/current/concepts/glossary.md index a4e8dc8d71e..a7ffce3acd9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/concepts/glossary.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/concepts/glossary.md @@ -10,7 +10,7 @@ doc_type: 'reference' {/* no-glossary */ } -# 词汇表 +# 词汇表 {#glossary} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/concepts/olap.md b/i18n/zh/docusaurus-plugin-content-docs/current/concepts/olap.md index d364b33754b..d3d67924e83 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/concepts/olap.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/concepts/olap.md @@ -10,7 +10,7 @@ doc_type: 'reference' -# 什么是 OLAP? +# 什么是 OLAP? {#what-is-olap} [OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing) 是 Online Analytical Processing(联机分析处理)的缩写。这个术语范围很广,可以从两个角度来理解:技术角度和业务角度。在最高层面上,你可以简单地将这个短语反向理解: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx b/i18n/zh/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx index 98ea29515bb..9a151e45baf 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx +++ b/i18n/zh/docusaurus-plugin-content-docs/current/concepts/why-clickhouse-is-so-fast.mdx @@ -18,7 +18,7 @@ doc_type: 'guide' ## 存储层:并发插入彼此之间是相互隔离的 \{#storage-layer-concurrent-inserts-are-isolated-from-each-other\} - + + + + + + + \ No newline at end of file + - + -## Projection 如何工作? {#how-do-projections-work} +## Projections 如何工作? {#how-do-projections-work} -在实际应用中,可以将 Projection 看作是原始表上的一个额外的、隐藏的表。Projection 可以具有与原始表不同的行排序,因此其主索引也可以不同,并且它可以自动、增量地预计算聚合值。因此,使用 Projection 为加速查询执行提供了两个“调优手段”: +在实践中,可以将 Projection 看作是原始表的一个额外的隐藏表。Projection 可以拥有与原始表不同的行顺序,因此也可以拥有不同的主索引,并且它可以自动、增量地预计算聚合值。因此,使用 Projections 可以通过两个“调优手段”来加速查询执行: - **正确使用主索引** - **预计算聚合** -Projection 在某些方面与 [物化视图](/materialized-views) 类似,它们同样允许你拥有多种行排序方式,并在插入时预计算聚合。 -Projection 会自动更新并与原始表保持同步,而物化视图则需要显式更新。当查询针对原始表时,ClickHouse 会自动采样主键并选择一个既能生成同样正确结果、又需要读取数据量最少的表,如下图所示: +Projections 在某些方面类似于 [物化视图](/materialized-views) +,它们同样允许你使用多种行顺序,并在插入时预计算聚合。 +Projections 会自动更新,并与原始表保持同步;这与物化视图(Materialized Views)不同,后者需要显式更新。当查询针对原始表时, +ClickHouse 会自动对主键进行采样,并选择一个既能生成相同正确结果、又需要读取数据量最少的表,如下图所示: -### 通过 `_part_offset` 实现更智能的存储 {#smarter_storage_with_part_offset} - -从 25.5 版本开始,ClickHouse 在 Projection 中支持虚拟列 `_part_offset`,它提供了一种定义 Projection 的新方式。 - -现在有两种定义 Projection 的方式: +### 使用 `_part_offset` 的更智能存储 {#smarter_storage_with_part_offset} -- **存储完整列(原有行为)**:Projection 包含完整数据,可以被直接读取,当过滤条件与 Projection 的排序顺序匹配时性能更高。 +从 25.5 版本开始,ClickHouse 在 projection 中支持虚拟列 `_part_offset`,这为定义 projection 提供了一种新的方式。 -- **仅存储排序键 + `_part_offset`**:Projection 的工作方式类似索引。 - ClickHouse 使用 Projection 的主索引定位匹配的行,但从基表中读取实际数据。这样可以降低存储开销,但在查询时会稍微增加 I/O。 +现在有两种定义 projection 的方式: -上述两种方式也可以混合使用,将部分列直接存储在 Projection 中,而其他列通过 `_part_offset` 间接访问。 +- **存储完整列(原有行为)**:projection 包含完整数据,可以被直接读取,当过滤条件与 projection 的排序顺序匹配时,可以获得更快的查询性能。 +- **仅存储排序键 + `_part_offset`**:projection 的工作方式类似索引。 + ClickHouse 使用 projection 的主索引来定位匹配的行,但从基表中读取实际数据。 + 这样可以减少存储开销,但在查询时会略微增加 I/O。 +上述方法也可以混合使用,在 projection 中直接存储部分列,而通过 `_part_offset` 间接存储其他列。 ## 何时使用 Projections? {#when-to-use-projections} -Projections 对新用户来说是一个颇具吸引力的功能,因为它会在数据插入时自动维护。此外,查询只需发送到单个表,查询优化器会在可能的情况下利用 Projections 来加快响应时间。 +Projections 对新用户而言非常有吸引力,因为它们会在数据插入时自动维护。并且,查询只需发送到单个表,并在可能时利用 projections 来加速响应时间。 -这与 Materialized Views 形成对比:使用后者时,用户必须根据过滤条件选择合适的已优化目标表,或重写查询。这会对用户应用提出更高要求,并增加客户端侧的复杂度。 +这与物化视图不同,后者要求用户根据过滤条件选择适当的已优化目标表,或者重写查询。这会对用户应用提出更高要求,并增加客户端的复杂度。 -尽管有这些优势,Projections 也存在一些固有的限制,用户应当了解,因此应谨慎、少量地部署。 +尽管有这些优点,projections 也存在一些固有限制,用户应当了解这些限制,因此应谨慎使用,避免过度依赖。 -- Projections 不允许为源表和(隐藏的)目标表使用不同的 TTL,而 Materialized Views 允许使用不同的 TTL。 -- 启用 Projections 的表不支持轻量级更新和删除。 -- Materialized Views 可以链式使用:一个 Materialized View 的目标表可以作为另一个 Materialized View 的源表,依此类推。而 Projections 不支持这种用法。 -- Projections 不支持 join,而 Materialized Views 支持。 -- Projections 不支持过滤(`WHERE` 子句),而 Materialized Views 支持。 +- Projections 不允许对源表和(隐藏的)目标表使用不同的 TTL,而物化视图允许使用不同的 TTL。 +- 对包含 projections 的表,不支持轻量级更新和删除。 +- 物化视图可以链式使用:一个物化视图的目标表可以作为另一个物化视图的源表,依此类推。而 projections 无法做到这一点。 +- Projection 定义不支持 join,但物化视图支持。不过,对包含 projections 的表进行的查询可以自由使用 join。 +- Projection 定义不支持过滤条件(`WHERE` 子句),但物化视图支持。不过,对包含 projections 的表进行的查询可以自由使用过滤条件。 -我们建议在以下场景中使用 Projections: +我们建议在以下场景使用 projections: -- 需要对数据进行完全重新排序时。虽然 Projection 中的表达式理论上可以使用 `GROUP BY`,但 Materialized Views 在维护聚合方面更高效。查询优化器也更有可能利用只进行简单重排的 Projections,即 `SELECT * ORDER BY x`。用户可以在该表达式中仅选择部分列,以降低存储占用。 -- 用户能够接受潜在的存储占用增加以及将数据写入两次所带来的开销。请测试对插入速度的影响,并[评估存储开销](/data-compression/compression-in-clickhouse)。 +- 需要对数据进行完全重新排序时。虽然理论上,projection 中的表达式可以使用 `GROUP BY`,但物化视图在维护聚合方面更有效。查询优化器也更有可能利用仅做简单重排的 projections,即 `SELECT * ORDER BY x`。用户可以在该表达式中选择列的子集,以减少存储占用。 +- 用户能够接受可能带来的存储占用增加,以及将数据写入两次的额外开销时。请测试其对插入速度的影响,并[评估存储开销](/data-compression/compression-in-clickhouse)。 +## 示例 {#examples} +### 在非主键列上进行过滤 {#filtering-without-using-primary-keys} -## 示例 +在这个示例中,我们将向你展示如何为表添加一个投影(projection)。 +我们还将了解如何利用该投影加速在非主键列上进行过滤的查询。 -### 在不属于主键的列上进行过滤 +在本示例中,我们将使用 New York Taxi Data +数据集(可在 [sql.clickhouse.com](https://sql.clickhouse.com/) 获取),该数据集按 `pickup_datetime` 排序。 -在这个示例中,我们将介绍如何为一张表添加一个 projection。 -同时,我们还将说明如何使用该 projection 来加速在不属于表主键的列上进行过滤的查询。 - -在本示例中,我们将使用可在 [sql.clickhouse.com](https://sql.clickhouse.com/) 获取的 New York Taxi Data -数据集,该数据集按 `pickup_datetime` 排序。 - -让我们编写一个简单的查询,找出所有乘客给司机小费 -大于 200 美元的行程 ID: +现在我们来编写一个简单的查询语句,找出所有乘客 +给司机小费超过 200 美元的行程 ID: ```sql runnable SELECT @@ -99,34 +96,35 @@ FROM nyc_taxi.trips WHERE tip_amount > 200 AND trip_duration_min > 0 ORDER BY tip_amount, trip_id ASC ``` -请注意,由于我们在过滤不在 `ORDER BY` 中的 `tip_amount`,ClickHouse 不得不执行全表扫描。下面我们来加快这个查询。 +请注意,由于我们正在对未包含在 `ORDER BY` 中的 `tip_amount` 进行过滤,ClickHouse +不得不执行一次全表扫描。我们来加速这个查询。 -为了保留原始表和查询结果,我们将创建一个新表,并使用 `INSERT INTO SELECT` 来复制数据: +为了保留原始表及其结果,我们将创建一个新表,并使用 `INSERT INTO SELECT` 来复制数据: ```sql CREATE TABLE nyc_taxi.trips_with_projection AS nyc_taxi.trips; INSERT INTO nyc_taxi.trips_with_projection SELECT * FROM nyc_taxi.trips; ``` -要添加一个 projection,我们使用 `ALTER TABLE` 语句结合 `ADD PROJECTION` 语句: +要添加投影,我们使用 `ALTER TABLE` 语句配合 `ADD PROJECTION` 语句: ```sql ALTER TABLE nyc_taxi.trips_with_projection -添加 投影 prj_tip_amount +ADD PROJECTION prj_tip_amount ( SELECT * ORDER BY tip_amount, dateDiff('minutes', pickup_datetime, dropoff_datetime) ) ``` -在添加 projection 之后,必须使用 `MATERIALIZE PROJECTION` -语句,这样其中的数据才会根据上面指定的查询进行物理排序并重写: +在添加 projection 之后,需要使用 `MATERIALIZE PROJECTION` +语句,使其中的数据根据上面指定的查询进行物理排序并重写: ```sql ALTER TABLE nyc.trips_with_projection MATERIALIZE PROJECTION prj_tip_amount ``` -现在我们已经添加了投影,让我们再运行一次这个查询: +现在我们已经添加了投影,再来运行一次该查询: ```sql runnable SELECT @@ -137,9 +135,9 @@ FROM nyc_taxi.trips_with_projection WHERE tip_amount > 200 AND trip_duration_min ORDER BY tip_amount, trip_id ASC ``` -请注意,我们显著减少了查询时间,并且需要扫描的行数也更少了。 +请注意,我们显著减少了查询时间,且需要扫描的行数也更少了。 -我们可以通过查询 `system.query_log` 表来确认上述查询确实使用了我们创建的投影: +我们可以通过查询 `system.query_log` 表来确认上面的查询确实使用了我们创建的投影: ```sql SELECT query, projections @@ -157,29 +155,30 @@ WHERE query_id='' └───────────────────────────────────────────────────────────────────────────────┴──────────────────────────────────┘ ``` -### 使用投影加速英国房价支付查询 -为了演示如何使用投影来提升查询性能,我们来看一个基于真实数据集的示例。在本示例中,我们将使用来自我们的 [UK Property Price Paid](https://clickhouse.com/docs/getting-started/example-datasets/uk-price-paid) -教程中的表,该表包含 3003 万行记录。该数据集同样可以在我们的 +### 使用投影加速英国房价已付数据查询 {#using-projections-to-speed-up-UK-price-paid} + +为了演示如何使用投影来加速查询性能,我们 +通过一个真实数据集的示例来说明。在本示例中,我们将 +使用 [UK Property Price Paid](https://clickhouse.com/docs/getting-started/example-datasets/uk-price-paid) +教程中的表,该表包含 3003 万行数据。此数据集也可在 [sql.clickhouse.com](https://sql.clickhouse.com/?query_id=6IDMHK3OMR1C97J6M9EUQS) -环境中使用。 +环境中获取。 -如果您希望了解该表是如何创建以及数据是如何插入的,可以参考《[The UK property prices dataset](/getting-started/example-datasets/uk-price-paid)》页面。 +如果您想了解表的创建方式和数据插入过程,可以参阅 ["英国房产价格数据集"](/getting-started/example-datasets/uk-price-paid) 页面。 -我们可以在该数据集上运行两个简单的查询。第一个查询列出伦敦房价最高的各郡, -第二个则计算各个郡的平均价格: +我们可以对此数据集运行两个简单的查询。第一个查询列出伦敦地区支付价格最高的郡县,第二个查询计算各郡县的平均价格: ```sql runnable SELECT county, price FROM uk.uk_price_paid -WHERE town = '伦敦' +WHERE town = 'LONDON' ORDER BY price DESC LIMIT 3 ``` - ```sql runnable SELECT county, @@ -190,8 +189,7 @@ ORDER BY avg(price) DESC LIMIT 3 ``` -请注意,尽管查询速度非常快,这两条查询仍然对整张表的 3003 万行数据进行了全表扫描, -这是因为在创建表时的 `ORDER BY` 子句中,既没有包含 `town` 列,也没有包含 `price` 列: +请注意,尽管查询速度很快,但两个查询都对全部 3003 万行进行了全表扫描,这是因为在创建表时,`town` 和 `price` 都不在 ORDER BY 语句中: ```sql CREATE TABLE uk.uk_price_paid @@ -203,18 +201,16 @@ ENGINE = MergeTree ORDER BY (postcode1, postcode2, addr1, addr2); ``` -让我们看看是否可以使用投影来加速这个查询。 +让我们看看能否使用投影来加速这个查询。 -为保留原始表及其结果,我们将创建一个新表,并使用 `INSERT INTO SELECT` 复制数据: +为了保留原始表和结果,我们将创建一个新表并使用 `INSERT INTO SELECT` 复制数据: ```sql CREATE TABLE uk.uk_price_paid_with_projections AS uk_price_paid; INSERT INTO uk.uk_price_paid_with_projections SELECT * FROM uk.uk_price_paid; ``` -我们创建并填充投影 `prj_oby_town_price`,它会生成一个附加的(隐藏的)表, -该表带有主索引,并按 town 和 price 排序,用于优化如下查询: -在指定 town 中列出最高价格对应的 counties。 +我们创建并填充投影 `prj_oby_town_price`,它会生成一个额外的(隐藏)表,该表具有主索引,按城镇和价格排序,用于优化查询特定城镇中最高成交价格的郡县列表: ```sql ALTER TABLE uk.uk_price_paid_with_projections @@ -233,10 +229,10 @@ ALTER TABLE uk.uk_price_paid_with_projections SETTINGS mutations_sync = 1 ``` -[`mutations_sync`](/operations/settings/settings#mutations_sync) 设置用于强制以同步方式执行。 +[`mutations_sync`](/operations/settings/settings#mutations_sync) 设置用于强制执行同步操作。 -我们创建并填充投影 `prj_gby_county` —— 一个额外的(隐藏的)表, -用于以增量方式预先计算所有现有的 130 个英国郡的 avg(price) 聚合值: +我们创建并填充投影 `prj_gby_county` —— 一个额外的(隐藏)表, +用于增量预计算所有现有 130 个英国郡的 avg(price) 聚合值: ```sql ALTER TABLE uk.uk_price_paid_with_projections @@ -256,14 +252,14 @@ SETTINGS mutations_sync = 1 ``` :::note -如果在如上面 `prj_gby_county` 投影那样的投影中使用了 `GROUP BY` 子句,那么(隐藏)表的底层存储引擎会变为 `AggregatingMergeTree`,并且所有聚合函数都会被转换为 `AggregateFunction`。这可以确保正确地进行增量数据聚合。 +如果在投影中使用了 `GROUP BY` 子句(例如上面的 `prj_gby_county` 投影),则(隐藏)表的底层存储引擎会变为 `AggregatingMergeTree`,所有聚合函数会被转换为 `AggregateFunction`。这可确保正确的增量数据聚合。 ::: -下图是主表 `uk_price_paid_with_projections` 及其两个投影的可视化示意图: +下图展示了主表 `uk_price_paid_with_projections` 及其两个投影的可视化: - + -如果现在再次运行查询,列出伦敦中成交价格最高的三个价格及其所属郡,我们就会看到查询性能有所提升: +如果现在再次运行查询以列出伦敦成交价格最高的三个区县,可以看到查询性能有所提升: ```sql runnable SELECT @@ -275,7 +271,7 @@ ORDER BY price DESC LIMIT 3 ``` -同样,对于列出平均支付价格最高的三个英国郡县的查询: +同样,对于列出英国平均房价最高的三个郡的查询: ```sql runnable SELECT @@ -287,19 +283,19 @@ ORDER BY avg(price) DESC LIMIT 3 ``` -请注意,这两个查询都是针对原始表执行的,并且在我们创建这两个 projection 之前,这两个查询都会进行一次全表扫描(从磁盘流式读取全部 3003 万行数据)。 +请注意,这两个查询都针对原始表,并且在创建这两个投影之前,两个查询都执行了全表扫描(从磁盘读取了全部 3003 万行数据)。 -另外请注意,用于列出伦敦中支付价格最高的前三个郡的查询,会流式读取 217 万行数据。而当我们直接使用一张专门为该查询优化的第二张表时,仅有 8.192 万行数据从磁盘被流式读取。 +另外请注意,用于列出伦敦中成交价最高的三个县(county)的查询正在流式处理 217 万行数据。而当我们直接使用为该查询优化的第二张表时,只从磁盘流式读取了 8.192 万行数据。 -造成这一差异的原因在于,目前上文提到的 `optimize_read_in_order` 优化尚不支持用于 projection。 +造成这一差异的原因是,目前上文提到的 `optimize_read_in_order` 优化尚不支持应用于投影(projection)。 -我们检查 `system.query_log` 表,以确认 ClickHouse 为上述两个查询自动使用了这两个 projection(见下方的 projections 列): +我们检查 `system.query_log` 表,可以看到 ClickHouse 在上面的两个查询中自动使用了两个投影(参见下面的 projections 列): ```sql SELECT tables, query, - query_duration_ms::String || ' 毫秒' AS query_duration, + query_duration_ms::String || ' ms' AS query_duration, formatReadableQuantity(read_rows) AS read_rows, projections FROM clusterAllReplicas(default, system.query_log) @@ -309,7 +305,6 @@ ORDER BY initial_query_start_time DESC FORMAT Vertical ``` - ```response 第 1 行: ────── @@ -343,20 +338,22 @@ projections: ['uk.uk_price_paid_with_projections.prj_obj_town_price'] 返回 2 行。耗时:0.006 秒。 ``` -### 更多示例 -以下示例使用相同的英国价格数据集,对比使用和不使用投影的查询。 +### 更多示例 {#further-examples} + +以下示例继续使用相同的英国价格数据集,对比使用和不使用投影的查询。 -为了保持原始表(及其性能)不受影响,我们再次使用 `CREATE AS` 和 `INSERT INTO SELECT` 创建该表的副本。 +为了保持原始表及其性能不受影响,我们再次使用 `CREATE AS` 和 `INSERT INTO SELECT` 创建该表的副本。 ```sql CREATE TABLE uk.uk_price_paid_with_projections_v2 AS uk.uk_price_paid; INSERT INTO uk.uk_price_paid_with_projections_v2 SELECT * FROM uk.uk_price_paid; ``` -#### 构建 Projection -让我们基于维度 `toYear(date)`、`district` 和 `town` 创建一个聚合 Projection: +#### 构建 Projection {#build-projection} + +让我们基于 `toYear(date)`、`district` 和 `town` 这三个维度创建一个聚合 Projection: ```sql ALTER TABLE uk.uk_price_paid_with_projections_v2 @@ -376,7 +373,7 @@ ALTER TABLE uk.uk_price_paid_with_projections_v2 ) ``` -为现有数据填充该投影。(如果不进行物化,则该投影只会为之后新插入的数据创建): +为已有数据填充该 projection。(如果不进行物化,则该 projection 只会针对新插入的数据创建): ```sql ALTER TABLE uk.uk_price_paid_with_projections_v2 @@ -384,9 +381,10 @@ ALTER TABLE uk.uk_price_paid_with_projections_v2 SETTINGS mutations_sync = 1 ``` -下面的查询对比了启用和未启用投影(projection)时的性能。要禁用投影,我们使用设置项 [`optimize_use_projections`](/operations/settings/settings#optimize_use_projections),该设置默认开启。 +以下查询对比了启用和未启用投影时的性能。若要禁用投影功能,请使用设置 [`optimize_use_projections`](/operations/settings/settings#optimize_use_projections),该设置默认是启用的。 -#### 查询 1:每年平均价格 + +#### 查询 1:各年份的平均价格 {#average-price-projections} ```sql runnable SELECT @@ -410,9 +408,10 @@ ORDER BY year ASC ``` -结果应该相同,但后一个示例的性能会更好! +结果应该是相同的,但后一个示例的性能会更优! + -#### 查询 2:伦敦每年的平均价格 +#### 查询 2:伦敦历年平均价格 {#average-price-london-projections} ```sql runnable SELECT @@ -437,9 +436,10 @@ GROUP BY year ORDER BY year ASC ``` -#### 查询 3:最昂贵的社区 -需要将条件 (date >= '2020-01-01') 修改为与投影维度 (`toYear(date) >= 2020)` 一致: +#### 查询 3:最昂贵的街区 {#most-expensive-neighborhoods-projections} + +条件 (date >= '2020-01-01') 需要进行修改,以便与投影维度 (`toYear(date) >= 2020)` 保持一致: ```sql runnable SELECT @@ -459,7 +459,6 @@ LIMIT 100 SETTINGS optimize_use_projections=0 ``` - ```sql runnable SELECT town, @@ -477,17 +476,22 @@ ORDER BY price DESC LIMIT 100 ``` -同样,结果是相同的,但请注意第二个查询的性能有所提升。 +同样,结果相同,但请注意第二个查询的执行性能有所提升。 + -### 在一个查询中组合多个 projection +### 在单个查询中组合投影 {#combining-projections} -从 25.6 版本开始,在上一版本引入对 `_part_offset` 的支持基础上,ClickHouse 现在可以在带有多个过滤条件的单个查询中使用多个 projection 来加速查询。 +从 25.6 版本开始,在前一版本引入的 `_part_offset` 支持基础之上,ClickHouse +现在可以在带有多个过滤条件的单个查询中使用多个投影来加速查询。 -需要强调的是,ClickHouse 仍然只会从一个 projection(或基础表)中读取数据,但可以利用其他 projection 的主索引在读取前裁剪掉不必要的 part。对于在多个列上进行过滤、且每个过滤条件可能匹配到不同 projection 的查询,这一特性尤其有用。 +需要注意的是,ClickHouse 仍然只会从一个投影(或基础表)中读取数据, +但可以利用其他投影的主键索引在读取之前剪枝掉不必要的 part。 +这对于在多个列上进行过滤,且每一列可能分别匹配到不同投影的查询尤其有用。 -> 当前,该机制只能裁剪整个 part,尚不支持粒度级别的裁剪。 +> 当前,该机制只会剪枝整个 part。尚不支持粒度级(granule-level)的剪枝。 -为了演示这一点,我们定义了一个表(其 projection 使用 `_part_offset` 列),并插入了五行示例数据,以对应上面的示意图。 +为演示这一点,我们定义表(带有使用 `_part_offset` 列的投影), +并插入与上文图示相对应的五行示例数据。 ```sql CREATE TABLE page_views @@ -513,7 +517,7 @@ SETTINGS max_bytes_to_merge_at_max_space_in_pool = 1; -- 禁用合并 ``` -然后向该表中插入数据: +然后向表中插入数据: ```sql INSERT INTO page_views VALUES ( @@ -529,72 +533,71 @@ INSERT INTO page_views VALUES ( ``` :::note -注意:此表为了演示使用了自定义设置,例如单行 granule 和禁用 part 合并,这些设置不推荐用于生产环境。 +注意:该表为了演示使用了自定义设置,例如单行 granule(粒度单元)以及禁用 part 合并,这些设置不建议在生产环境中使用。 ::: 此设置会产生: * 五个独立的 part(每插入一行生成一个 part) -* 每行一个主键索引项(在基础表和每个 projection 中都是如此) -* 每个 part 中正好包含一行数据 +* 每行一个主键索引条目(在基础表和每个 projection 中) +* 每个 part 都只包含一行 -在此设置下,我们运行一个同时在 `region` 和 `user_id` 上过滤的查询。 +在此设置下,我们运行一个同时按 `region` 和 `user_id` 进行过滤的查询。 由于基础表的主键索引是基于 `event_date` 和 `id` 构建的, -在这里并没有帮助,因此 ClickHouse 会使用: +在这里帮不上忙,因此 ClickHouse 会改为使用: * `region_proj` 按 `region` 剪枝 part * `user_id_proj` 进一步按 `user_id` 剪枝 part -可以通过 `EXPLAIN projections = 1` 看到这一行为,它展示了 -ClickHouse 如何选择并应用 projection。 +可以使用 `EXPLAIN projections = 1` 观察这一行为,它会展示 ClickHouse 如何选择并应用 projection。 ```sql EXPLAIN projections=1 SELECT * FROM page_views WHERE region = 'us_west' AND user_id = 107; ``` - ```response ┌─explain────────────────────────────────────────────────────────────────────────────────┐ - 1. │ 表达式 ((投影名称 + 投影)) │ - 2. │ 表达式 │ - 3. │ 从 MergeTree 读取 (default.page_views) │ + 1. │ Expression ((投影名称 + 投影)) │ + 2. │ Expression │ + 3. │ ReadFromMergeTree (default.page_views) │ 4. │ 投影: │ 5. │ 名称: region_proj │ - 6. │ 描述: 投影已分析并用于数据分片级过滤 │ + 6. │ 描述: 投影已分析并用于数据分片级别过滤 │ 7. │ 条件: (region in ['us_west', 'us_west']) │ 8. │ 搜索算法: 二分查找 │ - 9. │ 数据分片数: 3 │ -10. │ 标记数: 3 │ -11. │ 范围数: 3 │ + 9. │ 数据分片: 3 │ +10. │ 标记: 3 │ +11. │ 范围: 3 │ 12. │ 行数: 3 │ -13. │ 已过滤数据分片数: 2 │ +13. │ 已过滤数据分片: 2 │ 14. │ 名称: user_id_proj │ -15. │ 描述: 投影已分析并用于数据分片级过滤 │ +15. │ 描述: 投影已分析并用于数据分片级别过滤 │ 16. │ 条件: (user_id in [107, 107]) │ 17. │ 搜索算法: 二分查找 │ -18. │ 数据分片数: 1 │ -19. │ 标记数: 1 │ -20. │ 范围数: 1 │ +18. │ 数据分片: 1 │ +19. │ 标记: 1 │ +20. │ 范围: 1 │ 21. │ 行数: 1 │ -22. │ 已过滤数据分片数: 2 │ +22. │ 已过滤数据分片: 2 │ └────────────────────────────────────────────────────────────────────────────────────────┘ ``` -`EXPLAIN` 的输出(如上所示)从上到下展示了逻辑查询计划: +`EXPLAIN` 的输出(如上所示)自上而下展示了逻辑查询计划: -| 行号 | 描述 | -| ----- | ----------------------------------------------------------------------------- | -| 3 | 计划从 `page_views` 基表读取数据 | -| 5-13 | 使用 `region_proj` 来定位满足 region = 'us_west' 的 3 个分片,剪枝掉 5 个分片中的 2 个 | -| 14-22 | 使用 `user_id_proj` 来定位满足 `user_id = 107` 的 1 个分片,进一步剪枝掉剩余 3 个分片中的 2 个 | -最终,基表中只读取了 **5 个分片中的 1 个**。 -通过结合多个投影的索引分析,ClickHouse 显著减少了扫描的数据量, -在保持较低存储开销的同时提升了性能。 +| 行号 | 描述 | +|------|---------------------------------------------------------------------------------------------------| +| 3 | 计划从 `page_views` 基表中读取数据 | +| 5-13 | 使用 `region_proj` 来定位 `region = 'us_west'` 的 3 个分片,从而在 5 个分片中裁剪掉 2 个 | +| 14-22| 使用 `user_id_proj` 来定位 `user_id = 107` 的 1 个分片,进一步从剩余的 3 个分片中再裁剪掉 2 个 | +最终,只需要从基表中读取 **5 个分片中的 1 个**。 +通过结合多个 projection 的索引分析结果,ClickHouse 能显著减少扫描的数据量, +在保持存储开销较低的同时提升性能。 ## 相关内容 {#related-content} -- [ClickHouse 主索引实用介绍](/guides/best-practices/sparse-primary-indexes#option-3-projections) + +- [ClickHouse 主键索引实用入门指南](/guides/best-practices/sparse-primary-indexes#option-3-projections) - [物化视图](/docs/materialized-views) -- [ALTER PROJECTION](/sql-reference/statements/alter/projection) +- [ALTER PROJECTION](/sql-reference/statements/alter/projection) \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md b/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md index 285e324dfef..1458736cce9 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/projections/2_materialized-views-versus-projections.md @@ -3,80 +3,74 @@ slug: /managing-data/materialized-views-versus-projections sidebar_label: '物化视图 vs 投影' title: '物化视图与投影' hide_title: false -description: '本文比较 ClickHouse 中的物化视图与投影,包括它们的使用场景、性能以及局限性。' +description: '本文比较 ClickHouse 中的物化视图和投影,包括它们的使用场景、性能以及局限性。' doc_type: 'reference' keywords: ['物化视图', '投影', '差异'] --- -> 用户经常会问:在什么情况下应该使用物化视图,而不是投影?在本文中,我们将探讨二者之间的关键差异,以及在某些场景下为何更适合选择其中一种而非另一种。 +> 用户经常会问:在什么情况下应该使用物化视图,而什么时候应该使用投影?在本文中,我们将探讨二者之间的关键差异,以及在某些场景下为何可能更适合选择其中之一。 +## 关键差异概览 {#key-differences} +下表总结了在不同考量维度下,物化视图与投影之间的关键差异。 -## 关键差异总结 {#key-differences} +| Aspect | Materialized views | Projections | +|----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Data storage and location | 将结果存储在一个**单独、显式的目标表**中,在向源表插入数据时充当 `INSERT` 触发器。 | 投影会创建经过优化的数据布局,这些数据在物理上**与主表数据一起存储**,并且对用户不可见。 | +| Update mechanism | 在对源表执行 `INSERT` 时(对于增量物化视图)**同步**运行。注意:也可以通过可刷新的物化视图按计划进行**调度**刷新。 | 在对主表执行 `INSERT` 时,在后台进行**异步**更新。 | +| Query interaction | 使用物化视图时需要**直接查询目标表**,这意味着在编写查询时,用户必须意识到物化视图的存在。 | 投影由 ClickHouse 查询优化器**自动选择**,对用户是透明的,用户无需为利用投影而修改针对该表的查询。从 25.6 版本开始,还可以基于多个投影进行过滤。 | +| Handling `UPDATE` / `DELETE` | 对源表上的 `UPDATE` 或 `DELETE` 操作**不会自动做出反应**,因为物化视图并不了解源表,仅作为对源表的 `INSERT` 触发器。这可能导致源表和目标表之间的数据陈旧,需要通过变通方案或定期全量刷新(通过可刷新的物化视图)来解决。 | 默认情况下,**与 `DELETED` 行不兼容**(尤其是轻量级删除)。可以通过 `lightweight_mutation_projection_mode`(v24.7+)启用兼容性。 | +| `JOIN` support | 支持。可刷新的物化视图可用于复杂的反规范化。增量物化视图仅在最左侧表插入时触发。 | 不支持。在投影定义中不支持使用 `JOIN` 操作来过滤物化后的数据。不过,查询在与包含投影的表进行 `JOIN` 时可以正常工作——投影会优化单个表的访问。 | +| `WHERE` clause in definition | 支持。可以包含 `WHERE` 子句以在物化之前过滤数据。 | 不支持。在投影定义中不支持使用 `WHERE` 子句来过滤物化后的数据。 | +| Chaining capabilities | 支持,一个物化视图的目标表可以作为另一个物化视图的源表,从而实现多阶段流水线。 | 不支持。投影不能进行链式组合。 | +| Applicable table engines | 可用于多种源表引擎,但目标表通常属于 `MergeTree` 家族。 | **仅可用于** `MergeTree` 家族表引擎。 | +| Failure handling | 在插入数据期间发生故障意味着目标表中的数据会丢失,从而导致潜在的不一致性。 | 故障在后台被**静默**处理。查询可以无缝混合已物化和未物化的数据分片。 | +| Operational overhead | 需要显式创建目标表,并且通常需要手动回填历史数据。使用 `UPDATE`/`DELETE` 保持一致性会增加复杂度。 | 投影自动维护并保持同步,通常具有更低的运维负担。 | +| `FINAL` query compatibility | 通常兼容,但往往需要在目标表上使用 `GROUP BY`。 | **无法与** `FINAL` 查询配合使用。 | +| Lazy materialization | 支持。 | 使用延迟物化特性时需要监控投影兼容性问题。可能需要设置 `query_plan_optimize_lazy_materialization = false`。 | +| Parallel replicas | 支持。 | 不支持。 | +| [`optimize_read_in_order`](/operations/settings/settings#optimize_read_in_order) | 支持。 | 支持。 | +| Lightweight updates and deletes | 支持。 | 不支持。 | -下表总结了在各个考量维度上,物化视图与投影之间的主要差异。 - -| 方面 | 物化视图 | 投影 | -|---------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 数据存储与位置 | 将结果存储在一个**单独、显式的目标表**中,在向源表插入数据时充当插入触发器。 | 投影会创建经过优化的数据布局,这些数据在物理上**与主表数据一同存储**,并且对用户不可见。 | -| 更新机制 | 在对源表执行 `INSERT` 时(对于增量物化视图)**同步**运行。注意:也可以通过可刷新的物化视图将其设置为**按计划调度**。 | 在对主表执行 `INSERT` 后,于后台**异步**更新。 | -| 查询交互 | 使用物化视图时,需要**直接查询目标表**,这意味着用户在编写查询时需要了解物化视图的存在。 | 投影会由 ClickHouse 的查询优化器**自动选择**,对用户是透明的,用户无需为了使用投影而修改针对包含投影的表的查询。从 25.6 版本开始,也可以按照多个投影进行过滤。 | -| 处理 `UPDATE` / `DELETE` | 对源表上的 `UPDATE` 或 `DELETE` 操作**不会自动响应**,因为物化视图不了解源表,仅充当源表的插入触发器。这可能导致源表与目标表之间的数据陈旧,需要通过变通方案或定期全量刷新(通过可刷新物化视图)来解决。 | 默认情况下,与被标记为 **`DELETED` 的行不兼容**(尤其是轻量级删除)。可以通过启用 `lightweight_mutation_projection_mode`(v24.7+)来实现兼容性。 | -| `JOIN` 支持 | 支持。可刷新物化视图可用于复杂的反规范化场景。增量物化视图仅在最左侧表插入时触发。 | 不支持。投影定义中不支持 `JOIN` 操作来过滤物化后的数据。 | -| 定义中的 `WHERE` 子句 | 支持。可以在定义中包含 `WHERE` 子句,以在物化前过滤数据。 | 不支持。投影定义中不支持使用 `WHERE` 子句来过滤物化数据。 | -| 串联能力 | 支持。一个物化视图的目标表可以作为另一个物化视图的源表,从而实现多阶段流水线。 | 不支持。投影不能被串联使用。 | -| 适用的表引擎 | 可以与多种源表引擎配合使用,但目标表通常使用 `MergeTree` 系列表引擎。 | **仅适用于** `MergeTree` 系列表引擎。 | -| 失败处理 | 在插入数据期间发生失败时,目标表中的数据会丢失,从而可能导致不一致。 | 失败会在后台被**静默**处理。查询可以无缝混合使用已物化和未物化的数据片段。 | -| 运维开销 | 需要显式创建目标表,并且通常需要手动回填数据。使用 `UPDATE`/`DELETE` 维持一致性会增加复杂度。 | 投影会自动维护并保持同步,通常具有更低的运维负担。 | -| `FINAL` 查询兼容性 | 一般兼容,但通常需要在目标表上使用 `GROUP BY`。 | 与 `FINAL` 查询**不兼容**。 | -| 惰性物化 | 支持。 | 使用惰性物化特性时,需要监控投影兼容性问题。你可能需要设置 `query_plan_optimize_lazy_materialization = false`。 | -| 并行副本 | 支持。 | 不支持。 | -| [`optimize_read_in_order`](/operations/settings/settings#optimize_read_in_order) | 支持。 | 支持。 | -| 轻量级更新与删除 | 支持。 | 不支持。 | - - - -## 比较物化视图和投影 {#choose-between} +## 对比物化视图和投影 {#choose-between} ### 何时选择物化视图 {#choosing-materialized-views} -在以下情况下,你应考虑使用物化视图: - -- 处理 **实时 ETL 和多阶段数据管道**:你需要在数据到达时执行复杂转换、聚合或路由,并可能通过链式视图跨多个阶段处理数据。 -- 需要 **复杂反规范化**:你需要将来自多个来源(表、子查询或字典)的数据预先关联到一个单一、针对查询优化的表中,尤其是在可以接受使用可刷新的物化视图进行周期性全量刷新的情况下。 -- 希望 **显式控制模式(schema)**:你需要一个独立的目标表,用其自身的 schema 和引擎来存储预计算结果,为数据建模提供更大的灵活性。 -- 希望在 **摄取阶段进行过滤**:你需要在数据被物化之前进行过滤,从而减少写入目标表的数据量。 - -### 何时避免使用物化视图 {#avoid-materialized-views} +在以下情况下,应考虑使用物化视图: -在以下情况下,你应考虑避免使用物化视图: +- 处理 **实时 ETL 和多阶段数据管道**:需要在数据到达时执行复杂转换、聚合或路由分发,并且可能通过串联视图跨多个阶段处理。 +- 需要 **复杂的反规范化**:需要将来自多个源(表、子查询或字典)的数据预先关联(join)到单个、针对查询优化的表中,尤其是在可以接受使用可刷新的物化视图进行周期性全量刷新时。 +- 希望获得 **显式的 schema 控制**:需要一个具有自己 schema 和引擎的独立目标表来存放预计算结果,从而在数据建模上获得更大的灵活性。 +- 希望在 **摄取时进行过滤**:需要在数据被物化之前对其进行过滤,从而减少写入目标表的数据量。 -- **源数据经常被更新或删除**:如果没有额外策略来处理源表和目标表之间的一致性,增量物化视图可能会变得陈旧且不一致。 -- **更偏好简单性和自动优化**:例如你希望避免管理单独的目标表。 +### 何时应避免使用物化视图 {#avoid-materialized-views} -### 何时选择投影 {#choosing-projections} +在以下情况下,应考虑避免使用物化视图: -在以下情况下,你应考虑使用投影: +- **源数据经常被更新或删除**:如果没有额外的策略来处理源表和目标表之间的一致性,增量物化视图可能会变得过时且不一致。 +- **更倾向于保持简单并依赖自动优化**:例如你希望避免管理单独的目标表时。 -- **优化单表查询**:你的主要目标是通过提供备用排序顺序、优化对非主键列的过滤,或为单个表预计算聚合结果,以加速对单个基础表的查询。 -- 需要 **查询透明性**:你希望查询直接针对原始表而无需修改,并依赖 ClickHouse 为给定查询选择最优的数据布局。 +### 何时选择使用投影(projections){#choosing-projections} -### 何时避免使用投影 {#avoid-projections} +在以下情况下,应当考虑使用 projections: -在以下情况下,你应考虑避免使用投影: +- **为单个表优化查询**:你的主要目标是通过提供备用排序顺序、优化不属于主键的列上的过滤条件,或为单个表预先计算聚合,从而加速对单个基础表的查询。 +- 你希望实现**查询透明性(query transparency)**:你希望在不修改查询的情况下,始终针对原始表执行查询,并依赖 ClickHouse 为给定查询自动选择最优的数据布局。 -- **需要复杂数据转换或多阶段 ETL**:投影在其定义中不支持 `JOIN` 操作,无法调整为构建多步管道,并且无法处理某些 SQL 特性,如窗口函数或复杂的 `CASE` 表达式。因此,它们不适合复杂数据转换。 -- **需要对物化数据进行显式过滤**:投影在其定义中不支持 `WHERE` 子句来过滤要物化到投影本身的数据。 -- **使用非 MergeTree 表引擎**:投影仅适用于使用 `MergeTree` 系列表引擎的表。 -- **必须依赖 `FINAL` 查询**:投影无法与 `FINAL` 查询配合使用,而后者有时用于去重。 -- 你需要使用 [parallel replicas](/deployment-guides/parallel-replicas),而这在投影中不受支持。 +### 何时应避免使用 Projection {#avoid-projections} +在以下情况下,应考虑避免使用 Projection: +- **需要复杂数据转换或多阶段 ETL 时**:Projection 定义不支持 `JOIN` 操作,不能通过链式组合构建多步管道,也无法处理某些 SQL 特性,如窗口函数或复杂的 `CASE` 表达式。虽然针对带有 Projection 的表执行查询时可以自由使用 `JOIN`,但 Projection 本身并不适合承担复杂的数据转换逻辑。 +- **需要对物化数据进行显式过滤时**:Projection 在定义中不支持使用 `WHERE` 子句来过滤将被物化到该 Projection 中的数据。 +- **使用非 MergeTree 表引擎时**:Projection 仅适用于使用 `MergeTree` 系列表引擎的表。 +- **需要使用 `FINAL` 查询时**:Projection 无法与 `FINAL` 查询配合使用,而 `FINAL` 查询有时会用于去重。 +- **需要使用 [parallel replicas](/deployment-guides/parallel-replicas) 时**:Projection 不支持该特性。 ## 总结 {#summary} -物化视图和投影都是用于优化查询和转换数据的强大工具。总体来说,我们不建议将它们视为非此即彼的选择。相反,可以将它们以互补的方式一起使用,从而最大化查询性能。因此,在 ClickHouse 中选择物化视图还是投影,实际上取决于具体的使用场景和访问模式。 +物化视图和投影(projection)都是用于优化查询和转换数据的强大工具,我们并不建议把它们看作非此即彼的二选一方案。相反,你可以将二者组合、互补使用,以最大化查询性能。因此,在 ClickHouse 中选择物化视图还是投影,很大程度上取决于你的具体用例和访问模式。 -一般来说,当需要将一个或多个源表中的数据聚合到一个目标表中,或在大规模上执行复杂转换时,应考虑使用物化视图。物化视图非常适合将开销昂贵的聚合工作从查询时转移到写入时。它们非常适用于按日或按月的汇总、实时仪表盘或数据摘要。 +作为一个经验法则,当你需要将一个或多个源表中的数据聚合到目标表,或者需要在大规模数据上执行复杂转换时,应优先考虑使用物化视图。物化视图非常适合将代价高昂的聚合工作从查询时刻前移到写入时刻。它们非常适用于按日或按月的汇总(rollup)、实时看板以及数据概览或汇总等场景。 -另一方面,当需要优化那些在与表主键(主键决定了磁盘上数据的物理排序)不同的列上进行过滤的查询时,应使用投影。当无法再更改表的主键,或者访问模式比主键所能支持的更加多样化时,投影尤其有用。 +另一方面,当你需要优化的查询在过滤条件中使用的列,与表主键(决定数据在磁盘上物理排序的列)不同的时候,应考虑使用投影。尤其是在无法再更改表主键,或者你的访问模式比主键能够支持的情况更加多样化时,投影会格外有用。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md b/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md index 8e50d03e9a4..00a2620a01e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/data-modeling/schema-design.md @@ -12,7 +12,6 @@ import Image from '@theme/IdealImage'; 理解高效的 schema 设计是优化 ClickHouse 性能的关键,其中的诸多选择往往需要在不同方案之间进行权衡,最优方案取决于实际查询模式,以及数据更新频率、延迟要求和数据量等因素。本指南概述了用于优化 ClickHouse 性能的 schema 设计最佳实践和数据建模技术。 - ## Stack Overflow 数据集 {#stack-overflow-dataset} 在本指南的示例中,我们使用 Stack Overflow 数据集的一个子集。该数据集包含自 2008 年至 2024 年 4 月在 Stack Overflow 上产生的每一条帖子、投票、用户、评论和徽章。该数据以 Parquet 格式提供,使用下方所示的 schema,存储在 S3 bucket `s3://datasets-documentation/stackoverflow/parquet/` 中: @@ -27,9 +26,7 @@ Stack Overflow 数据集包含多张相互关联的表。在任何数据建模 上述 schema 在本指南中是刻意未进行最优设计的。 - - -## 建立初始 schema +## 建立初始 schema {#establish-initial-schema} 由于 `posts` 表将是大多数分析查询的目标,我们重点为该表建立 schema。此数据位于公共 S3 bucket `s3://datasets-documentation/stackoverflow/parquet/posts/*.parquet` 中,每年一个文件。 @@ -129,7 +126,6 @@ INSERT INTO posts SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3. > 上述查询会加载 6000 万行。对于 ClickHouse 来说这算小规模,但网络连接较慢的用户可能希望只加载一部分数据。可以通过使用 glob 通配模式指定要加载的年份来实现,例如 `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`。关于如何使用 glob 模式来筛选文件子集,请参阅[此处](/sql-reference/table-functions/file#globs-in-path)。 - ## 优化类型 {#optimizing-types} ClickHouse 查询性能的秘密之一是压缩。 @@ -154,8 +150,6 @@ ClickHouse 中的压缩主要受 3 个因素影响:排序键(ordering key) 通过将这些简单规则应用到我们的 posts 表,我们可以为每一列识别出一个最优类型: - - | 列 | 是否为数值 | 最小值,最大值 | 唯一值 | 空值 | 注释 | 优化类型 | | ----------------------- | ----- | ------------------------------------------------------------ | -------- | -- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `PostTypeId` | 是 | 1, 8 | 8 | 否 | | `Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8)` | @@ -227,8 +221,7 @@ INSERT INTO posts_v2 SELECT * FROM posts ClickHouse 中的主(排序)键 来自 OLTP 数据库的用户通常会在 ClickHouse 中寻找与之对应的等价概念。 - -## 选择排序键 +## 选择排序键 {#choosing-an-ordering-key} 在 ClickHouse 通常使用的规模下,内存和磁盘效率至关重要。数据以称为 part 的数据块形式写入 ClickHouse 表,并在后台根据规则对这些 part 进行合并。在 ClickHouse 中,每个 part 都有自己的主索引。当 part 被合并时,合并后 part 的主索引也会被合并。每个 part 的主索引对每一组行只包含一个索引条目——这种技术称为稀疏索引(sparse indexing)。 @@ -247,7 +240,7 @@ ClickHouse 中的主(排序)键 在确定用于排序键的列子集时,需要按特定顺序声明这些列。此顺序会显著影响查询中对排序键中后续列进行过滤的效率,以及表数据文件的压缩比。通常,最好按基数(cardinality)从低到高来排列键。这需要与以下事实进行权衡:对在排序键中位置靠后的列进行过滤,其效率会低于对位置靠前列的过滤。在这些行为之间取得平衡,并结合你的访问模式进行考虑(最重要的是要测试不同方案)。 -### 示例 +### 示例 {#example} 将上述指南应用于我们的 `posts` 表,假设用户希望执行按日期和帖子类型过滤的分析,例如: @@ -279,7 +272,6 @@ LIMIT 3 让我们选择列 `PostTypeId` 和 `CreationDate` 作为排序键。 - 在我们的场景中,我们假定用户始终会按 `PostTypeId` 进行过滤。它的基数为 8,是作为排序键首个元素的合理选择。鉴于按日期粒度进行过滤通常已经足够(同时按日期时间过滤也会受益),因此我们将 `toDate(CreationDate)` 作为键的第二个组成部分。这样也会生成更小的索引,因为日期可以用 16 位来表示,从而加快过滤速度。我们键中的最后一个条目是 `CommentCount`,用于辅助找到评论数最多的帖子(最终排序)。 ```sql @@ -335,7 +327,6 @@ LIMIT 3 对于希望通过使用特定数据类型和合理排序键来提升压缩效果的用户,请参阅 [Compression in ClickHouse](/data-compression/compression-in-clickhouse)。如果需要进一步提高压缩率,我们还推荐参考其中的 [Choosing the right column compression codec](/data-compression/compression-in-clickhouse#choosing-the-right-column-compression-codec) 部分。 - ## 下一步:数据建模技术 {#next-data-modeling-techniques} 到目前为止,我们只迁移了一张表。虽然这已经让我们能够介绍一些核心的 ClickHouse 概念,但大多数 schema 往往没有这么简单。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/index.md index 33d3134dfee..1408971097d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/index.md @@ -6,7 +6,7 @@ keywords: ['部署指南', '扩展', '集群部署', '复制', '容错'] doc_type: 'landing-page' --- -# 部署与扩展 +# 部署与扩展 {#deployment-and-scaling} 本节涵盖以下主题: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx index d42ce49ccf1..324d42dbbe1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx +++ b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/parallel-replicas.mdx @@ -20,7 +20,6 @@ import image_9 from '@site/static/images/deployment-guides/parallel-replicas-9.p - ## 简介 \{#introduction\} ClickHouse 处理查询的速度极快,但这些查询是如何在多台服务器之间被分发并并行执行的呢? @@ -38,22 +37,25 @@ ClickHouse 处理查询的速度极快,但这些查询是如何在多台服务 上图展示了客户端查询分布式表时发生的过程:
    -
  1. - SELECT 查询被任意发送到某个节点上的分布式表 - (通过轮询策略,或在经过负载均衡器路由到特定服务器之后)。 - 该节点随后将作为协调器。 -
  2. -
  3. - 节点会根据分布式表中指定的信息,定位需要执行查询的每个分片, - 并将查询发送给各个分片。 -
  4. -
  5. - 每个分片在本地读取、过滤并聚合数据,然后将可合并的中间状态 - 返回给协调器。 -
  6. -
  7. - 协调器节点对数据进行合并,然后将响应返回给客户端。 -
  8. +
  9. + SELECT 查询被任意发送到某个节点上的分布式表 + (通过轮询策略,或在经过负载均衡器路由到特定服务器之后)。 + 该节点随后将作为协调器。 +
  10. + +
  11. + 节点会根据分布式表中指定的信息,定位需要执行查询的每个分片, + 并将查询发送给各个分片。 +
  12. + +
  13. + 每个分片在本地读取、过滤并聚合数据,然后将可合并的中间状态 + 返回给协调器。 +
  14. + +
  15. + 协调器节点对数据进行合并,然后将响应返回给客户端。 +
当我们引入副本时,流程基本相同,唯一的区别是每个分片中只有一个副本会执行查询, @@ -62,7 +64,7 @@ ClickHouse 处理查询的速度极快,但这些查询是如何在多台服务 ## 非分片架构 \{#non-sharded-architecture\} ClickHouse Cloud 的架构与上文所介绍的架构有很大差异。 -(参见 ["ClickHouse Cloud Architecture"](https://clickhouse.com/docs/cloud/reference/architecture) +(参见 ["ClickHouse Cloud Architecture"](https://clickhouse.com/docs/cloud/reference/architecture) 了解更多详情。)由于计算与存储的分离,以及几乎无限的存储容量,对分片的需求就不那么重要了。 下图展示了 ClickHouse Cloud 的架构: @@ -86,39 +88,46 @@ Keeper 集群确保我们拥有元数据的唯一可信来源。各个副本可 使用并行副本时:
    -
  1. - 来自客户端的查询在经过负载均衡器后被发送到某个节点。该节点成为此查询的协调节点。 -
  2. -
  3. - 该节点分析每个 part 的索引,并选择需要处理的合适 part 和粒度。 -
  4. -
  5. - 协调节点将工作负载拆分成一组可以分配给不同副本的粒度。 -
  6. -
  7. - 每组粒度由相应的副本进行处理,完成后将可合并的中间状态发送给协调节点。 -
  8. -
  9. - 最后,协调节点合并来自各副本的所有结果,然后将响应返回给客户端。 -
  10. +
  11. + 来自客户端的查询在经过负载均衡器后被发送到某个节点。该节点成为此查询的协调节点。 +
  12. + +
  13. + 该节点分析每个 part 的索引,并选择需要处理的合适 part 和粒度。 +
  14. + +
  15. + 协调节点将工作负载拆分成一组可以分配给不同副本的粒度。 +
  16. + +
  17. + 每组粒度由相应的副本进行处理,完成后将可合并的中间状态发送给协调节点。 +
  18. + +
  19. + 最后,协调节点合并来自各副本的所有结果,然后将响应返回给客户端。 +
上述步骤描述了并行副本在理论上的工作方式。 然而在实践中,存在许多因素会阻碍这套逻辑完美运行:
    -
  1. - 某些副本可能不可用。 -
  2. -
  3. - ClickHouse 中的复制是异步的,在某些时间点上,一些副本可能不具有相同的 part。 -
  4. -
  5. - 副本之间的尾延迟需要以某种方式进行处理。 -
  6. -
  7. - 文件系统缓存会根据各副本上的活动在副本之间有所差异,这意味着随机分配任务在缓存局部性方面可能导致性能不够理想。 -
  8. +
  9. + 某些副本可能不可用。 +
  10. + +
  11. + ClickHouse 中的复制是异步的,在某些时间点上,一些副本可能不具有相同的 part。 +
  12. + +
  13. + 副本之间的尾延迟需要以某种方式进行处理。 +
  14. + +
  15. + 文件系统缓存会根据各副本上的活动在副本之间有所差异,这意味着随机分配任务在缓存局部性方面可能导致性能不够理想。 +
在接下来的小节中,我们将讨论如何克服这些因素。 @@ -130,18 +139,21 @@ Keeper 集群确保我们拥有元数据的唯一可信来源。各个副本可
    -
  1. - 来自客户端的查询在经过负载均衡器后被发送到某个节点,该节点成为此查询的协调节点。 -
  2. -
  3. - 协调节点发送请求,从集群中所有副本获取公告。副本对于某个表当前分区(parts)集合的视图可能略有不同。因此,我们需要收集这些信息以避免做出错误的调度决策。 -
  4. -
  5. - 随后,协调节点使用这些公告来确定一组可分配给不同副本的粒度单元。例如,在这里我们可以看到,没有来自 part 3 的粒度被分配给副本 2,因为该副本在其公告中未声明该分区。还要注意,没有任务被分配给副本 3,因为该副本没有提供公告。 -
  6. -
  7. - 在每个副本都处理完其粒度子集上的查询,并将可合并状态发送回协调节点之后,协调节点会合并结果,并将响应返回给客户端。 -
  8. +
  9. + 来自客户端的查询在经过负载均衡器后被发送到某个节点,该节点成为此查询的协调节点。 +
  10. + +
  11. + 协调节点发送请求,从集群中所有副本获取公告。副本对于某个表当前分区(parts)集合的视图可能略有不同。因此,我们需要收集这些信息以避免做出错误的调度决策。 +
  12. + +
  13. + 随后,协调节点使用这些公告来确定一组可分配给不同副本的粒度单元。例如,在这里我们可以看到,没有来自 part 3 的粒度被分配给副本 2,因为该副本在其公告中未声明该分区。还要注意,没有任务被分配给副本 3,因为该副本没有提供公告。 +
  14. + +
  15. + 在每个副本都处理完其粒度子集上的查询,并将可合并状态发送回协调节点之后,协调节点会合并结果,并将响应返回给客户端。 +
### 动态协调 \{#dynamic-coordination\} @@ -155,37 +167,41 @@ Keeper 集群确保我们拥有元数据的唯一可信来源。各个副本可
    -
  1. - 各副本向协调节点表明它们可以处理任务,同时还可以指定各自能够处理的工作量。 -
  2. -
  3. - 协调节点将任务分配给这些副本。 -
  4. +
  5. + 各副本向协调节点表明它们可以处理任务,同时还可以指定各自能够处理的工作量。 +
  6. + +
  7. + 协调节点将任务分配给这些副本。 +
    -
  1. - 副本 1 和 2 能够非常快速地完成各自的任务,它们会向协调节点请求新的任务。 -
  2. -
  3. - 协调节点为副本 1 和 2 分配新的任务。 -
  4. +
  5. + 副本 1 和 2 能够非常快速地完成各自的任务,它们会向协调节点请求新的任务。 +
  6. + +
  7. + 协调节点为副本 1 和 2 分配新的任务。 +
    -
  1. - 所有副本现在都已完成各自任务的处理,它们会请求更多任务。 -
  2. -
  3. - 协调节点利用公告检查还有哪些任务尚未被处理,但已经没有剩余任务了。 -
  4. -
  5. - 协调节点会告知副本所有内容都已处理完成。随后它会合并所有可合并的状态,并返回查询结果。 -
  6. +
  7. + 所有副本现在都已完成各自任务的处理,它们会请求更多任务。 +
  8. + +
  9. + 协调节点利用公告检查还有哪些任务尚未被处理,但已经没有剩余任务了。 +
  10. + +
  11. + 协调节点会告知副本所有内容都已处理完成。随后它会合并所有可合并的状态,并返回查询结果。 +
### 管理缓存局部性 \{#managing-cache-locality\} @@ -193,34 +209,38 @@ Keeper 集群确保我们拥有元数据的唯一可信来源。各个副本可 最后一个潜在的问题是如何处理缓存局部性。如果多次执行同一个查询,如何确保相同的任务被路由到同一副本?在前面的示例中,我们有如下任务分配:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
副本 1副本 2副本 3
Part 1g1, g6, g7g2, g4, g5g3
Part 2g1g2, g4, g5g3
Part 3g1, g6g2, g4, g5g3
+ + 副本 1副本 2副本 3
Part 1g1, g6, g7g2, g4, g5g3
Part 2g1g2, g4, g5g3
Part 3g1, g6g2, g4, g5g3
为了确保相同的任务被分配到同一副本并能从缓存中获益,会进行两步操作:首先计算分片 + 一组 granule(即一个任务)的哈希值;然后对副本数量取模以进行任务分配。 @@ -252,13 +272,13 @@ Keeper 集群确保我们拥有元数据的唯一可信来源。各个副本可 | Setting | Description | |----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `enable_parallel_replicas` | `0`: 禁用
`1`: 启用
`2`: 强制启用并行副本,如果无法使用并行副本则抛出异常。 | +| `enable_parallel_replicas` | `0`: 禁用
`1`: 启用
`2`: 强制启用并行副本,如果无法使用并行副本则抛出异常。 | | `cluster_for_parallel_replicas` | 用于并行副本的集群名称;如果你使用的是 ClickHouse Cloud,请使用 `default`。 | | `max_parallel_replicas` | 在多个副本上执行查询时可使用的最大副本数;如果指定的值小于集群中的副本数,则会随机选择节点。此值也可以设置得高于实际副本数,以预留水平扩展空间。 | -| `parallel_replicas_min_number_of_rows_per_replica` | 用于根据需要处理的行数来限制所使用的副本数量,实际使用的副本数定义为:
`estimated rows to read` / `min_number_of_rows_per_replica`。 | -| `allow_experimental_analyzer` | `0`: 使用旧分析器
`1`: 使用新分析器。

并行副本的行为可能会因所使用的分析器不同而发生变化。 | +| `parallel_replicas_min_number_of_rows_per_replica` | 用于根据需要处理的行数来限制所使用的副本数量,实际使用的副本数定义为:
`estimated rows to read` / `min_number_of_rows_per_replica`。 | +| `allow_experimental_analyzer` | `0`: 使用旧分析器
`1`: 使用新分析器。

并行副本的行为可能会因所使用的分析器不同而发生变化。 | -## 排查并行副本相关问题 +## 排查并行副本相关问题 \{#investigating-issues-with-parallel-replicas\} 你可以在 [`system.query_log`](/docs/operations/system-tables/query_log) 表中检查每个查询实际使用的设置。你也可以查看 [`system.events`](/docs/operations/system-tables/events) 表,了解服务器上发生的所有事件,并使用 [`clusterAllReplicas`](/docs/sql-reference/table-functions/cluster) 表函数查看所有副本上的表(如果你是云用户,请将集群名设为 `default`)。 @@ -270,7 +290,6 @@ FROM clusterAllReplicas('default', system.events) WHERE event ILIKE '%ParallelReplicas%' ``` -
响应 @@ -331,7 +350,6 @@ WHERE query_id = 'ad40c712-d25d-45c4-b1a1-a28ba8d4019c' ORDER BY event_time_microseconds ASC ``` -
响应 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md index 1047dd6df64..30fd13c46bf 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/01_1_shard_2_replicas.md @@ -9,19 +9,19 @@ keywords: ['复制', '高可用性', '集群搭建', '数据冗余', '容错'] --- import Image from '@theme/IdealImage'; -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; import ReplicationArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/replication.png'; -import ConfigFileNote from '@site/docs/_snippets/_config-files.md'; -import KeeperConfigFileNote from '@site/docs/_snippets/_keeper-config-files.md'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import ServerParameterTable from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigFileNote from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_keeper-config-files.md'; +import ConfigExplanation from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import ServerParameterTable from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; +import KeeperConfig from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > 在本示例中,你将学习如何搭建一个用于数据复制的简单 ClickHouse 集群。 > 一共配置了五台服务器,其中两台用于存储数据副本, @@ -33,7 +33,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## 前置条件 {#pre-requisites} - 您之前已设置过[本地 ClickHouse 服务器](/install) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md index 5a136d87e21..343d6a0aab8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/02_2_shards_1_replica.md @@ -9,19 +9,19 @@ keywords: ['分片', '水平扩展', '分布式数据', '集群部署', '数据 --- import Image from '@theme/IdealImage'; -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; import ShardingArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/sharding.png'; -import ConfigFileNote from '@site/docs/_snippets/_config-files.md'; -import KeeperConfigFileNote from '@site/docs/_snippets/_keeper-config-files.md'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import ServerParameterTable from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigFileNote from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_keeper-config-files.md'; +import ConfigExplanation from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import ServerParameterTable from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_server_parameter_table.mdx'; +import KeeperConfig from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > 在本示例中,你将学习如何搭建一个简单且可扩展的 ClickHouse 集群。 > 集群中共配置了五台服务器,其中两台用于对数据进行分片。 @@ -33,7 +33,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## 前置条件 {#pre-requisites} - 你已经在本地部署过 [ClickHouse 服务器](/install) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md index 0d09c992a3d..fbe30a70f02 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/03_2_shards_2_replicas.md @@ -10,14 +10,14 @@ keywords: ['集群部署', '复制', '分片', '高可用性', '可扩展性'] import Image from '@theme/IdealImage'; import SharedReplicatedArchitecture from '@site/static/images/deployment-guides/replication-sharding-examples/both.png'; -import ConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; -import ListenHost from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; -import KeeperConfig from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; -import KeeperConfigExplanation from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; -import VerifyKeeperStatus from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; -import DedicatedKeeperServers from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; -import ExampleFiles from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; -import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; +import ConfigExplanation from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_config_explanation.mdx'; +import ListenHost from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_listen_host.mdx'; +import KeeperConfig from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_config.mdx'; +import KeeperConfigExplanation from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_keeper_explanation.mdx'; +import VerifyKeeperStatus from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_verify_keeper_using_mntr.mdx'; +import DedicatedKeeperServers from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_dedicated_keeper_servers.mdx'; +import ExampleFiles from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_working_example.mdx'; +import CloudTip from '@site/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/replication-sharding-examples/_snippets/_cloud_tip.mdx'; > 在本示例中,你将学习如何搭建一个既支持复制又支持横向扩展的简单 ClickHouse 集群。 > 该集群由两个分片和两个副本组成,并包含一个由 3 个节点构成的 ClickHouse Keeper 集群, @@ -29,7 +29,6 @@ import CloudTip from '@site/docs/deployment-guides/replication-sharding-examples - ## 前提条件 {#prerequisites} - 已经搭建过[本地 ClickHouse 服务器](/install) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md index 4a5778bab57..8fb89b30fd7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/deployment-guides/terminology.md @@ -8,7 +8,7 @@ doc_type: 'guide' keywords: ['部署', '架构', '复制', '分片', '集群配置'] --- -import ReplicationShardingTerminology from '@site/docs/_snippets/_replication-sharding-terminology.md'; +import ReplicationShardingTerminology from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_replication-sharding-terminology.md'; 本节中的部署示例基于 ClickHouse 支持与服务团队向 ClickHouse 用户提供的建议。这些都是可直接使用的示例,我们建议您先尝试运行,然后根据自身需求进行调整。您也许会在这里找到一个完全符合您需求的示例。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/architecture.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/architecture.md deleted file mode 100644 index 355f0a963f0..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/architecture.md +++ /dev/null @@ -1,324 +0,0 @@ ---- -description: 'ClickHouse 架构及其列式存储设计的全面概览' -sidebar_label: '架构概览' -sidebar_position: 50 -slug: /development/architecture -title: '架构概览' -doc_type: 'reference' ---- - - - -# 架构概览 - -ClickHouse 是一个真正的列式 DBMS。数据按列存储,并在执行过程中以数组(向量或列块)的形式处理。 -在可能的情况下,操作会尽量在数组上执行,而不是针对单个值。 -这被称为“向量化查询执行(vectorized query execution)”,有助于降低实际数据处理的成本。 - -这一理念并不新。 -它可以追溯到 `APL`(A programming language,1957 年)及其后代:`A+`(APL 方言)、`J`(1990 年)、`K`(1993 年)和 `Q`(来自 Kx Systems 的编程语言,2003 年)。 -数组编程广泛用于科学数据处理。在关系型数据库中,这一理念同样不是新鲜事。例如,它被用于 `VectorWise` 系统(也称为 Actian Corporation 的 Actian Vector Analytic Database)。 - -加速查询处理有两种不同的方法:向量化查询执行和运行时代码生成。后者移除了所有间接寻址和动态派发。这两种方法都没有绝对的优劣之分。当运行时代码生成将许多操作融合在一起,从而充分利用 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`。对于 `String` 和 `Array` 列,它由两个向量组成:一个用于存放所有数组元素,并连续排布;另一个用于存放每个数组起始位置的偏移量。还有一种 `ColumnConst`,它在内存中只存储一个值,但对外表现得像一列。 - - - -## Field {#field} - -不过,也可以处理单个值。要表示单个值,会使用 `Field`。`Field` 只是一个由 `UInt64`、`Int64`、`Float64`、`String` 和 `Array` 组成的可判别联合类型。`IColumn` 提供 `operator []` 方法,用于以 `Field` 的形式获取第 n 个值,以及 `insert` 方法,用于在列末尾追加一个 `Field`。这些方法的效率并不高,因为它们需要处理表示单个值的临时 `Field` 对象。还有一些更高效的方法,例如 `insertFrom`、`insertRangeFrom` 等。 - -`Field` 不包含关于表中特定数据类型的充分信息。例如,`UInt8`、`UInt16`、`UInt32` 和 `UInt64` 在 `Field` 中都会表示为 `UInt64`。 - - - -## 抽象泄漏 {#leaky-abstractions} - -`IColumn` 提供了一些用于数据常见关系变换的方法,但它们并不能满足所有需求。比如,`ColumnUInt64` 没有用于计算两列求和的方法,而 `ColumnString` 没有用于执行子串搜索的方法。这些数不胜数的例程都在 `IColumn` 之外实现。 - -针对列的各种函数,既可以使用 `IColumn` 提供的方法来提取 `Field` 值,以通用但低效的方式实现,也可以利用特定 `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 格式中序列化值的辅助方法。`IDataType` 与具体数据格式之间没有直接对应关系。例如,不同的数据格式 `Pretty` 和 `TabSeparated` 都可以使用 `IDataType` 接口中的同一个 `serializeTextEscaped` 辅助方法。 - - - -## Block {#block} - -`Block` 是一个在内存中表示表的一个子集(数据块、chunk)的容器。它本质上是若干三元组的集合:`(IColumn, IDataType, column name)`。在查询执行过程中,数据是以 `Block` 为单位进行处理的。如果我们有一个 `Block`,我们就拥有数据(在 `IColumn` 对象中)、关于其类型的信息(在 `IDataType` 中,用来指示如何处理该列),以及列名。列名可以是表中的原始列名,也可以是用于存放计算临时结果的人工列名。 - -当我们在一个 Block 中对若干列计算某个函数时,会将该函数的结果作为新的列添加到 Block 中,而不会修改作为函数参数的原有列,因为这些操作是不可变的。之后,不再需要的列可以从 Block 中移除,但不能被修改。这种方式便于进行公共子表达式消除。 - -对于每一段被处理的数据 chunk,都会创建一个对应的 Block。请注意,对于相同类型的计算,不同 Block 之间的列名和类型保持一致,只有列数据发生变化。将 Block 的数据部分与 Block 头(header)分离更为合适,因为对于较小的 Block,大量用于复制 shared_ptr 和列名的临时字符串会带来较高的开销。 - - - -## 处理器 {#processors} - -请参阅以下描述:[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/WriteBuffer 只处理字节。`ReadHelpers` 和 `WriteHelpers` 头文件中提供了一些辅助函数,用于进行带格式的输入/输出。例如,有一些辅助函数可以以十进制格式写出一个数字。 - -下面来看看,当你想将结果集以 `JSON` 格式写到 stdout 时会发生什么。 -你已经有一个结果集,可以从拉取式的 `QueryPipeline` 中获取。 -首先,你创建一个 `WriteBufferFromFileDescriptor(STDOUT_FILENO)`,用于向 stdout 写入字节。 -接下来,你将查询管道的结果连接到 `JSONRowOutputFormat`,它使用该 `WriteBuffer` 进行初始化,从而将行以 `JSON` 格式写入 stdout。 -这可以通过 `complete` 方法来完成,该方法会将一个拉取式的 `QueryPipeline` 转换为一个已完成的 `QueryPipeline`。 -在内部,`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`。 - -在大多数情况下,`read` 方法只负责从表中读取指定的列,而不负责任何后续的数据处理。 -所有后续的数据处理都由管线的其他部分完成,这超出了 `IStorage` 的职责范围。 - -但也有一些显著的例外: - -- `AST` 查询会传递给 `read` 方法,表引擎可以利用它来推导索引使用情况,从而减少从表中读取的数据量。 -- 有时表引擎本身可以将数据处理到某个特定阶段。例如,`StorageDistributed` 可以将查询发送到远程服务器,让它们将数据处理到一个可以将不同远程服务器数据合并的阶段,并返回这些预处理的数据。随后由查询解释器完成数据处理。 - -表的 `read` 方法可以返回由多个 `Processor` 组成的 `Pipe`。这些 `Processor` 可以并行地从表中读取数据。 -然后,你可以将这些 `Processor` 与各种其他转换(例如表达式计算或过滤)连接起来,这些转换可以独立计算。 -接着,在它们之上创建一个 `QueryPipeline`,并通过 `PipelineExecutor` 来执行。 - -还存在 `TableFunction`。这些函数会返回一个临时的 `IStorage` 对象,用于在查询的 `FROM` 子句中使用。 - -要快速了解如何实现自己的表引擎,可以查看一些简单的实现,比如 `StorageMemory` 或 `StorageTinyLog`。 - -> 作为 `read` 方法的结果,`IStorage` 会返回 `QueryProcessingStage` —— 即关于查询的哪些部分已经在存储内部完成计算的信息。 - - - -## 解析器 {#parsers} - -使用手写的递归下降解析器来解析查询。例如,`ParserSelectQuery` 只是递归调用用于解析查询各个部分的底层解析器。解析器会创建一个 `AST`。`AST` 由节点表示,这些节点是 `IAST` 的实例。 - -> 由于历史原因,没有使用解析器生成器。 - - - -## 解释器 {#interpreters} - -解释器负责从 AST 创建查询执行流水线(query execution pipeline)。存在一些简单的解释器,例如 `InterpreterExistsQuery` 和 `InterpreterDropQuery`,以及更为复杂的 `InterpreterSelectQuery`。 - -查询执行流水线是由若干 processor 组合而成,这些 processor 可以消费和生成 chunk(具有特定类型的一组列)。 -processor 通过端口进行通信,可以拥有多个输入端口和多个输出端口。 -更详细的说明可以在 [src/Processors/IProcessor.h](https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/IProcessor.h) 中找到。 - -例如,对 `SELECT` 查询进行解释的结果是一个“pulling”类型的 `QueryPipeline`,它带有一个特殊的输出端口,用于读取结果集。 -对 `INSERT` 查询进行解释的结果是一个“pushing”类型的 `QueryPipeline`,它带有一个输入端口,用于写入要插入的数据。 -而对 `INSERT SELECT` 查询进行解释的结果则是一个“completed”类型的 `QueryPipeline`,它既没有输入端口也没有输出端口,但会同时将数据从 `SELECT` 复制到 `INSERT`。 - -`InterpreterSelectQuery` 使用 `ExpressionAnalyzer` 和 `ExpressionActions` 机制来进行查询分析和转换。大多数基于规则的查询优化都在这里完成。`ExpressionAnalyzer` 本身相当混乱,需要重写:应当将各类查询转换和优化提取到独立的类中,以便对查询进行模块化转换。 - -为了解决解释器中存在的问题,已经开发了一个新的 `InterpreterSelectQueryAnalyzer`。这是 `InterpreterSelectQuery` 的新版本,它不再使用 `ExpressionAnalyzer`,并在 `AST` 和 `QueryPipeline` 之间引入了一个额外的抽象层,称为 `QueryTree`。它已经完全可以在生产环境中使用,但如有需要,可以通过将 `enable_analyzer` 设置为 `false` 来将其关闭。 - - - -## 函数 {#functions} - -函数分为普通函数和聚合函数。有关聚合函数,请参阅下一节。 - -普通函数不会改变行数——它们的工作方式好像在独立处理每一行。实际上,函数并不是针对单独的行调用的,而是针对数据的 `Block` 进行调用,以实现向量化查询执行。 - -有一些杂项函数,例如 [blockSize](/sql-reference/functions/other-functions#blockSize)、[rowNumberInBlock](/sql-reference/functions/other-functions#rowNumberInBlock) 和 [runningAccumulate](/sql-reference/functions/other-functions#runningAccumulate),它们利用 Block 级处理并打破了行之间的独立性。 - -ClickHouse 具有强类型系统,因此不会进行隐式类型转换。如果某个函数不支持特定的类型组合,它会抛出异常。但函数可以(通过重载)支持许多不同的类型组合。例如,`plus` 函数(用于实现 `+` 运算符)适用于任意数值类型的组合:`UInt8` + `Float32`、`UInt16` + `Int8` 等等。另外,一些可变参数函数可以接受任意数量的参数,例如 `concat` 函数。 - -实现一个函数可能会稍显不便,因为函数需要显式派发所支持的数据类型和所支持的 `IColumns`。例如,`plus` 函数的代码是通过为每一种数值类型组合以及左、右参数是否为常量或非常量实例化 C++ 模板而生成的。 - -这里是实现运行时代码生成的绝佳位置,可以避免模板代码膨胀。同时,这也使得可以添加诸如融合乘加(fused multiply-add)之类的融合函数,或在一次循环迭代中执行多次比较。 - -在向量化查询执行模式下,函数不会进行短路求值。例如,如果你写 `WHERE f(x) AND g(y)`,即使在 `f(x)` 为零的行上(除非 `f(x)` 是零的常量表达式),两边也都会计算。但如果 `f(x)` 条件的选择性很高,且计算 `f(x)` 比计算 `g(y)` 便宜得多,那么最好实现多遍计算。它会先计算 `f(x)`,然后根据结果过滤列,再仅对更小的、已过滤的数据块计算 `g(y)`。 - - - -## 聚合函数 {#aggregate-functions} - -聚合函数是有状态的函数。它们将传入的值累积到某种状态中,并允许你从该状态中获取结果。它们通过 `IAggregateFunction` 接口进行管理。状态可以非常简单(例如,`AggregateFunctionCount` 的状态只是一个 `UInt64` 值),也可以相当复杂(例如,`AggregateFunctionUniqCombined` 的状态是线性数组、哈希表和 `HyperLogLog` 概率数据结构的组合)。 - -在执行高基数的 `GROUP BY` 查询时,为了同时处理多个状态,这些状态会在 `Arena`(内存池)中分配。状态可以有非平凡的构造函数和析构函数:例如,复杂的聚合状态本身可能会额外分配内存。这就要求在创建和销毁状态时格外注意,正确传递其所有权,并保证正确的销毁顺序。 - -聚合状态可以被序列化和反序列化,以便在分布式查询执行期间通过网络传递,或者在内存(RAM)不足时写入磁盘。它们甚至可以存储在使用 `DataTypeAggregateFunction` 的表中,以实现数据的增量聚合。 - -> 目前聚合函数状态的序列化数据格式尚未进行版本管理。如果聚合状态只是临时存储,这是可以接受的。但我们有用于增量聚合的 `AggregatingMergeTree` 表引擎,并且已经有人在生产环境中使用它。这就是为什么在未来更改任意聚合函数的序列化格式时,必须保证向后兼容性。 - - - -## 服务器 {#server} - -服务器实现了几种不同的接口: - -- 面向任意外部客户端的 HTTP 接口。 -- 面向原生 ClickHouse 客户端,以及在分布式查询执行期间进行跨服务器通信的 TCP 接口。 -- 用于复制时进行数据传输的接口。 - -在内部,它只是一个较为基础的多线程服务器,没有协程或纤程。由于服务器的设计目标不是处理高频的简单查询,而是处理相对低频的复杂查询,因此每个查询都可以处理海量用于分析的数据。 - -服务器会初始化 `Context` 类,为查询执行提供必要的环境:可用数据库列表、用户及其访问权限、设置、集群、进程列表、查询日志等。解释器会使用这个环境。 - -我们对服务器的 TCP 协议保持完全的向后兼容和向前兼容:旧客户端可以与新服务器通信,新客户端也可以与旧服务器通信。但我们不打算无限期地维持这种兼容性,并会在大约一年后移除对旧版本的支持。 - -:::note -对于大多数外部应用程序,我们建议使用 HTTP 接口,因为它简单且易于使用。TCP 协议与内部数据结构的耦合更紧密:它使用内部格式来传递数据块,并为压缩数据使用自定义分帧。我们尚未为该协议发布 C 库,因为这需要链接 ClickHouse 代码库的大部分内容,在实践中不可行。 -::: - - - -## 配置 {#configuration} - -ClickHouse Server 构建在 POCO C++ Libraries 之上,并使用 `Poco::Util::AbstractConfiguration` 来表示其配置。配置由 `Poco::Util::ServerApplication` 类持有,该类继承自 `DaemonBase`,而 `DaemonBase` 又被 `DB::Server` 类继承,`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` 个线程。每个线程专用于一个活动连接。 - -全局线程池是单例类 `GlobalThreadPool`。要从中分配线程,会使用 `ThreadFromGlobalPool`。它提供了类似于 `std::thread` 的接口,但会从全局线程池中获取线程并完成所有必要的初始化。其配置通过以下设置完成: -* `max_thread_pool_size` - 线程池中线程数量上限。 -* `max_thread_pool_free_size` - 等待新作业的空闲线程数量上限。 -* `thread_pool_queue_size` - 已调度作业数量上限。 - -全局线程池是通用的线程池,下面描述的所有线程池都基于它实现。可以将其视为一个分层的线程池体系。任何专用线程池都通过 `ThreadPool` 类从全局线程池获取线程。因此,任何专用线程池的主要目的是限制并发作业数并进行作业调度。如果调度的作业数多于池中的线程数,`ThreadPool` 会按优先级将作业排入一个队列中。每个作业都有一个整数优先级。默认优先级为零。所有优先级值更高的作业会在任何优先级更低的作业之前启动。但对于已经在执行的作业则没有差别,因此优先级只在线程池过载时才会起作用。 - -IO 线程池是一个简单的 `ThreadPool`,可通过 `IOThreadPool::get()` 方法获取。它的配置方式与全局线程池相同,使用 `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` 对象注册任务,线程池会确保同一任务不会同时运行两个作业。它还允许你将任务执行推迟到未来的某个具体时刻,或临时停用该任务。全局 `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` 类)。 - - - -## 并发控制 - -可以并行执行的查询通过 `max_threads` 设置来限制自身的并发度。该设置的默认值经过选择,使单个查询能够以最佳方式利用所有 CPU 核心。但如果存在多个并发查询且每个查询都使用默认的 `max_threads` 设置值,会怎样?此时这些查询将共享 CPU 资源。操作系统会通过不断切换线程来保证公平性,而这会引入一定的性能损耗。`ConcurrencyControl` 用来应对这种损耗,并避免分配过多线程。配置项 `concurrent_threads_soft_limit_num` 用于限制在开始施加某种形式的 CPU 压力之前,最多可以分配多少并发线程。 - -这里引入了 CPU `slot`(槽位)的概念。槽位是并发的基本单位:要运行一个线程,对应的查询必须事先获取一个槽位,并在该线程结束时释放该槽位。服务器中槽位的数量在全局范围内受限。当总需求超过槽位总数时,多个并发查询会竞争 CPU 槽位。`ConcurrencyControl` 负责通过公平的 CPU 槽位调度来解决这种竞争。 - -每个槽位可以看作是一个独立的状态机,具有以下状态: - -* `free`:槽位空闲,可被任意查询分配。 -* `granted`:槽位已被特定查询分配(`allocated`),但尚未被任何线程获取。 -* `acquired`:槽位已被特定查询分配(`allocated`),并已被某个线程获取。 - -注意,已分配(`allocated`)的槽位可以处于两种不同状态:`granted` 和 `acquired`。前者是一个过渡状态,按理说应当非常短暂(从槽位被分配给某个查询的瞬间,到该查询任一线程运行扩容过程的时刻)。 - -```mermaid -stateDiagram-v2 - direction LR - [*] --> 空闲 - 空闲 --> 已分配: 分配 - state 已分配 { - direction LR - [*] --> 已授予 - 已授予 --> 已获取: 获取 - 已获取 --> [*] - } - 已分配 --> 空闲: 释放 -``` - -`ConcurrencyControl` 的 API 由以下函数组成: - -1. 为查询创建资源分配:`auto slots = ConcurrencyControl::instance().allocate(1, max_threads);`。它会分配至少 1 个、至多 `max_threads` 个 slot。注意,第一个 slot 会立即分配,但其余的 slot 可能会在稍后才被分配。因此该限制是软限制,因为每个查询至少都会获得一个线程。 -2. 对于每个线程,必须从这次分配中获取一个 slot:`while (auto slot = slots->tryAcquire()) spawnThread([slot = std::move(slot)] { ... });`。 -3. 更新 slot 的总数量:`ConcurrencyControl::setMaxConcurrency(concurrent_threads_soft_limit_num)`。可以在运行时进行,无需重启服务器。 - -该 API 允许在存在 CPU 压力时,查询至少以一个线程启动,并在之后按需扩展到 `max_threads`。 - - -## 分布式查询执行 {#distributed-query-execution} - -集群中的各个服务器大多是相互独立的。你可以在集群中的某一台服务器或所有服务器上创建一个 `Distributed` 表。`Distributed` 表本身不存储数据——它只为集群中多个节点上的所有本地表提供一个“视图”。当你对 `Distributed` 表执行 SELECT 查询时,它会重写该查询,根据负载均衡设置选择远程节点,并将查询发送给这些节点。`Distributed` 表会请求远程服务器处理查询,直到生成可以在不同服务器之间进行合并的中间结果为止。然后,它接收这些中间结果并进行合并。`Distributed` 表会尽量将尽可能多的工作下推到远程服务器,并尽量减少通过网络传输的中间数据量。 - -当在 IN 或 JOIN 子句中存在子查询,而且每个子查询都使用 `Distributed` 表时,情况会变得更加复杂。对于此类查询,我们有不同的执行策略。 - -分布式查询执行没有全局查询计划。每个节点都仅针对其负责的那一部分拥有本地查询计划。我们目前只有简单的单次分布式查询执行:向远程节点发送查询,然后合并结果。但对于带有高基数 `GROUP BY` 的复杂查询,或包含大量 JOIN 临时数据的查询,这种方式是不可行的。在这种情况下,我们需要在服务器之间对数据进行“重新分布”(reshuffle),这就需要额外的协调。ClickHouse 目前不支持这类查询执行方式,我们仍需在这一方向上进行改进。 - - - -## Merge tree {#merge-tree} - -`MergeTree` 是一类支持按主键建索引的存储引擎族。主键可以是由任意列或表达式组成的元组。`MergeTree` 表中的数据以「part」的形式存储。每个 part 中的数据都按照主键顺序存放,因此数据根据主键元组按字典序排序。表中的所有列在这些 part 中都分别存储在独立的 `column.bin` 文件里。文件由压缩块组成。每个块通常包含 64 KB 到 1 MB 的未压缩数据,具体取决于平均值大小。块由按顺序连续排列的列值构成。对每一列而言,列值的顺序都是相同的(由主键定义顺序),所以当你按多列迭代时,可以获取对应行的列值。 - -主键本身是「稀疏」的。它并不会定位到每一行,而只是定位到某些数据范围。单独的 `primary.idx` 文件为每第 N 行存储主键值,其中 N 称为 `index_granularity`(通常 N = 8192)。同时,对于每一列,我们有带有「mark」的 `column.mrk` 文件,用于保存数据文件中每第 N 行的偏移量。每个 mark 是一对值:文件中压缩块起始位置的偏移量,以及解压后块中数据起始位置的偏移量。通常,压缩块会按 mark 对齐,此时解压后块中的偏移量为零。`primary.idx` 的数据始终驻留在内存中,而 `column.mrk` 文件的数据会被缓存。 - -当我们要从 `MergeTree` 中的某个 part 读取数据时,会查看 `primary.idx` 数据并定位可能包含请求数据的范围,然后查看 `column.mrk` 数据并计算出读取这些范围时的起始偏移量。由于索引是稀疏的,可能会多读一些数据。ClickHouse 不适合承载高负载的简单点查(point query),因为对每个键都必须读取包含 `index_granularity` 行的整个范围,并且对每一列都要解压整个压缩块。我们将索引设计为稀疏,是因为必须在单台服务器上维护万亿级别的行数,同时又不能使索引的内存占用显著增长。另外,由于主键是稀疏的,它不是唯一的:在 INSERT 时它无法检查表中是否已存在该键。你可以在表中拥有许多具有相同键的行。 - -当你向 `MergeTree` 中 `INSERT` 一批数据时,这批数据会按主键顺序排序,并形成一个新的 part。后台线程会定期选取一些 part,将它们合并为一个排序好的单一 part,以保持 part 数量相对较少。这也是它被称为 `MergeTree` 的原因。当然,合并会导致「写放大」。所有 part 都是不可变的:它们只会被创建和删除,而不会被修改。当执行 SELECT 时,会持有表的一个快照(一个 part 集合)。在合并之后,我们还会将旧的 part 保留一段时间,以便更容易在故障后进行恢复,因此如果发现某个合并后的 part 可能损坏,我们可以用它的源 part 来替换它。 - -`MergeTree` 不是 LSM tree,因为它不包含 MEMTABLE 和 LOG:插入的数据会直接写入文件系统。这种行为使 MergeTree 更适合批量插入数据。因此,频繁地插入少量行对 MergeTree 来说并不理想。例如,每秒插入几行是可以的,但如果每秒执行上千次这样的插入,对 MergeTree 来说就并不理想。不过,为了克服这一限制,对于小批量插入我们提供了异步插入模式。我们之所以这样设计,是出于简化系统的考虑,而且我们的应用本身已经是在批量插入数据。 - -有一些 MergeTree 引擎会在后台合并期间执行额外工作。示例包括 `CollapsingMergeTree` 和 `AggregatingMergeTree`。这可以被视为对更新的特殊支持。请记住,这并不是真正的更新,因为用户通常无法控制后台合并执行的时间,并且 `MergeTree` 表中的数据几乎总是存储在多个 part 中,而不是完全合并后的形式。 - - - -## 复制 {#replication} - -在 ClickHouse 中,可以按表级粒度配置复制。你可以在同一台服务器上同时存在部分使用复制和部分不使用复制的表。你还可以以不同的方式对表进行复制,例如,一个表使用两副本复制,另一个表使用三副本复制。 - -复制是通过 `ReplicatedMergeTree` 存储引擎实现的。`ZooKeeper` 中的路径作为参数传给存储引擎。所有在 `ZooKeeper` 中具有相同路径的表会互为副本:它们会同步数据并保持一致性。可以通过创建或删除表的方式动态添加或移除副本。 - -复制采用异步多主架构。你可以向任意一个与 ZooKeeper 建立了会话的副本写入数据,数据会异步复制到所有其他副本。由于 ClickHouse 不支持 UPDATE,复制是无冲突的。由于默认情况下没有对写入进行仲裁确认,如果某个节点发生故障,刚写入的数据可能会丢失。可以通过 `insert_quorum` 设置来启用写入仲裁。 - -复制的元数据存储在 ZooKeeper 中。存在一个复制日志,用于记录要执行的操作。操作包括:获取数据片段(part);合并数据片段;删除分区,等等。每个副本会将复制日志复制到自己的队列中,然后从队列中依次执行这些操作。例如,在插入数据时,会在日志中创建一个“获取该数据片段”的操作,每个副本都会下载该数据片段。各副本之间会协调合并操作,以确保结果在字节级别完全一致。所有数据片段在所有副本上都以相同方式进行合并。某个 leader 会首先发起新的合并并将“合并数据片段”的操作写入日志。多个副本(或全部副本)可以同时成为 leader。可以通过 `merge_tree` 设置 `replicated_can_become_leader` 来阻止某个副本成为 leader。leader 负责调度后台合并任务。 - -复制是物理复制:在节点之间传输的只是压缩后的数据片段,而不是查询。在大多数情况下,各个副本会独立执行合并,以避免网络放大,从而降低网络成本。只有在存在显著复制延迟时,才会通过网络发送大型合并后的数据片段。 - -此外,每个副本会在 ZooKeeper 中存储自己的状态,即数据片段集合及其校验和。当本地文件系统上的状态与 ZooKeeper 中的参考状态出现偏差时,该副本会通过从其他副本下载缺失和损坏的数据片段来恢复一致性。当本地文件系统中存在一些意外或损坏的数据时,ClickHouse 不会直接删除这些数据,而是将其移动到一个单独的目录并不再使用它们。 - -:::note -ClickHouse 集群由若干相互独立的分片组成,每个分片由若干副本组成。该集群**不是弹性的**,因此在添加新分片后,不会自动在分片之间重新均衡数据。相反,通常会将集群负载配置为不均衡。这样的实现方式为你提供了更多控制能力,对于规模相对较小(例如几十个节点)的集群来说是可以接受的。但对于我们在生产环境中使用的、具有数百个节点的集群而言,这种方式就成为了一个显著的缺点。我们应该实现一种跨整个集群的表引擎,使用可动态复制的区域,这些区域可以在集群之间自动拆分和均衡。 -::: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-arm.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-arm.md deleted file mode 100644 index c90c3486f0a..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-arm.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -description: '在 AARCH64 架构上从源码构建 ClickHouse 的指南' -sidebar_label: '在 Linux 上面向 AARCH64 构建' -sidebar_position: 25 -slug: /development/build-cross-arm -title: '如何在 Linux 上面向 AARCH64 构建 ClickHouse' -doc_type: 'guide' ---- - -# 如何在 Linux 上为 AArch64 构建 ClickHouse - -在 AArch64 机器上构建面向 AArch64 的 ClickHouse 时,无需执行任何特殊步骤。 - -要在 x86 Linux 机器上为 AArch64 交叉编译 ClickHouse,请向 `cmake` 传递以下参数:`-DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-aarch64.cmake` \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md deleted file mode 100644 index 74d13a4fe35..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-loongarch.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: '在 LoongArch64 架构上从源码构建 ClickHouse 的指南' -sidebar_label: '在 Linux 上为 LoongArch64 构建' -sidebar_position: 35 -slug: /development/build-cross-loongarch -title: '在 Linux 上为 LoongArch64 构建' -doc_type: 'guide' ---- - - - -# 在 Linux 上为 LoongArch64 构建 - -ClickHouse 对 LoongArch64 提供了实验性支持 - - - -## 构建 ClickHouse - -用于构建的 LLVM 版本必须不低于 19.1.0。 - -```bash -cd ClickHouse -mkdir build-loongarch64 -CC=clang-19 CXX=clang++-19 cmake . -Bbuild-loongarch64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/linux/toolchain-loongarch64.cmake -ninja -C build-loongarch64 -``` - -生成的二进制文件只能在采用 LoongArch64 CPU 架构的 Linux 上运行。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-osx.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-osx.md deleted file mode 100644 index a8b12551c08..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-osx.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: '从 Linux 为 macOS 系统交叉编译 ClickHouse 的指南' -sidebar_label: '在 Linux 上为 macOS 构建' -sidebar_position: 20 -slug: /development/build-cross-osx -title: '在 Linux 上为 macOS 构建' -doc_type: 'guide' ---- - - - -# 如何在 Linux 上为 macOS 构建 ClickHouse - -本指南适用于:当你有一台 Linux 机器,并希望使用它来构建可在 OS X 上运行的 `clickhouse` 二进制可执行文件的情况。 -主要用例是运行在 Linux 机器上的持续集成(CI)检查。 -如果你希望直接在 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`。 - - - -## 安装交叉编译工具链 - -记住安装 `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 - -```bash -cd ClickHouse -mkdir build-darwin -cd build-darwin -CC=clang-19 CXX=clang++-19 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/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md deleted file mode 100644 index 289c027160e..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-riscv.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: '面向 RISC-V 64 架构从源代码构建 ClickHouse 的指南' -sidebar_label: '在 Linux 上为 RISC-V 64 构建' -sidebar_position: 30 -slug: /development/build-cross-riscv -title: '如何在 Linux 上为 RISC-V 64 构建 ClickHouse' -doc_type: 'guide' ---- - - - -# 如何在 RISC-V 64 架构的 Linux 上构建 ClickHouse - -ClickHouse 对 RISC-V 架构提供实验性支持。目前尚无法启用全部功能。 - - - -## 构建 ClickHouse - -在非 RISC-V 机器上为 RISC-V 目标进行交叉编译: - -```bash -cd ClickHouse -mkdir build-riscv64 -CC=clang-19 CXX=clang++-19 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/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md deleted file mode 100644 index 45f0c86b61a..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-cross-s390x.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -description: '在 s390x 架构上从源代码构建 ClickHouse 的指南' -sidebar_label: '在 Linux 上为 s390x(zLinux)构建' -sidebar_position: 30 -slug: /development/build-cross-s390x -title: '在 Linux 上为 s390x(zLinux)构建' -doc_type: 'guide' ---- - - - -# 在 Linux 上构建 s390x(zLinux)版本 - -ClickHouse 目前对 s390x 提供实验性支持。 - - - -## 为 s390x 构建 ClickHouse - -s390x 有两个与 OpenSSL 相关的构建选项: - -* 默认情况下,在 s390x 上 OpenSSL 会被构建为共享库。这与其他所有平台不同,其他平台上 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](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 -``` - -在另一个 shell 中运行 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) 扩展以进行可视化调试。 -* 如果使用 [CMake Variants](https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/variants.md),可以通过 [Command Variable](https://github.com/rioj7/command-variable) 扩展实现动态启动配置。 -* 请确保将后端指向你的 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: 生成调试信息 - buildType: Debug - release: - short: Release - long: 优化生成代码 - buildType: Release - relwithdebinfo: - short: RelWithDebInfo - long: 带调试信息的发布版本 - buildType: RelWithDebInfo - tsan: - short: MinSizeRel - long: 最小体积发布版本 - buildType: MinSizeRel - -toolchain: - default: default - description: 选择工具链 - 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) 使用 qemu 启动 s390x", - "targetCreateCommands": ["target create ${command:cmake.launchTargetPath}"], - "processCreateCommands": ["gdb-remote 2159"], - "preLaunchTask": "运行 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 '正在启动调试器会话' -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": "运行 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": "^启动调试器会话", - "endsPattern": ".*" - } - } - ] - } - ] -} -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-e2k.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build-e2k.md deleted file mode 100644 index 22fad59b925..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-e2k.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -description: '针对 E2K 架构从源代码构建 ClickHouse 的指南' -sidebar_label: '在 Linux 上为 E2K 构建' -sidebar_position: 35 -slug: /development/build-e2k -title: '在 Linux 上为 E2K 构建' -doc_type: 'guide' ---- - - - -# 在 Linux 上为 E2K 构建 - -ClickHouse 对 E2K(Elbrus-2000)的支持仍处于高度实验阶段,目前只能在原生模式下使用最小化配置进行编译,并依赖 e2k 定制构建的库,例如 boost、croaring、libunwind、zstd。 - - - -## 构建 ClickHouse - -构建所需的 LLVM 版本必须大于或等于 20.1.8。 - -```bash -cd ClickHouse -mkdir build-e2k -cmake -DCMAKE_CROSSCOMPILING=OFF -DCOMPILER_CACHE=disabled \ - -DCMAKE_C_COMPILER=/usr/lib/llvm-20/bin/clang -DCMAKE_CXX_COMPILER=/usr/lib/llvm-20/bin/clang++ \ - -DLLD_PATH=/usr/lib/llvm-20/bin/ld.lld \ - -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \ - -DGLIBC_COMPATIBILITY=OFF -DENABLE_JEMALLOC=OFF -DENABLE_LIBRARIES=OFF \ - -DENABLE_SSL=OFF -DWERROR=OFF -DUSE_SIMDJSON=OFF -DENABLE_TESTS=OFF -DBOOST_USE_UCONTEXT=ON .. -ninja -j8 -``` - -生成的二进制文件只能在基于 E2K CPU 架构的 Linux 系统上运行。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-osx.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build-osx.md deleted file mode 100644 index 882fa249717..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build-osx.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -description: '在 macOS 系统上从源代码构建 ClickHouse 的指南' -sidebar_label: '在 macOS 上为 macOS 构建' -sidebar_position: 15 -slug: /development/build-osx -title: '在 macOS 上为 macOS 构建' -keywords: ['MacOS', 'Mac', '构建'] -doc_type: 'guide' ---- - - - -# 如何在 macOS 上为 macOS 构建 ClickHouse - -:::info 你不需要自己构建 ClickHouse! -你可以按照 [Quick Start](https://clickhouse.com/#quick-start) 中的说明安装预编译的 ClickHouse。 -::: - -ClickHouse 可以在 macOS 10.15(Catalina)或更高版本上编译,支持 x86_64(Intel)和 arm64(Apple Silicon)架构。 - -作为编译器,仅支持使用通过 Homebrew 安装的 Clang。 - - - -## 安装前提条件 - -首先,请参阅通用的[前提条件文档](developer-instruction.md)。 - -接下来,安装 [Homebrew](https://brew.sh/) 并运行: - -然后运行: - -```bash -brew update -brew install ccache cmake ninja libtool gettext llvm lld binutils grep findutils nasm bash rust rustup -``` - -:::note -Apple 默认使用不区分大小写的文件系统。虽然这通常不会影响编译(尤其是从头开始的 make 构建通常没问题),但可能会让像 `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 -S . -B build -cmake --build build -# 生成的二进制文件将位于:build/programs/clickhouse -``` - -:::note -如果在链接阶段遇到 `ld: archive member '/' not a mach-o file in ...` 错误,可能需要将标志 `-DCMAKE_AR=/opt/homebrew/opt/llvm/bin/llvm-ar` 设置为使用 llvm-ar。 -::: - - -## 注意事项 - -如果您打算运行 `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` 命令。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/build.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/build.md deleted file mode 100644 index a0fa3fa7f48..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/build.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -description: '在 Linux 系统上从源代码构建 ClickHouse 的分步指南' -sidebar_label: '在 Linux 上构建' -sidebar_position: 10 -slug: /development/build -title: '如何在 Linux 上构建 ClickHouse' -doc_type: 'guide' ---- - - - -# 如何在 Linux 上构建 ClickHouse - -:::info 无需自行构建 ClickHouse! -可以按照 [快速开始](https://clickhouse.com/#quick-start) 中的说明安装预编译的 ClickHouse。 -::: - -ClickHouse 可以在以下平台上构建: - -- x86_64 -- AArch64 -- PowerPC 64 LE(实验性) -- s390/x(实验性) -- RISC-V 64(实验性) - - - -## 前提条件 {#assumptions} - -本教程以 Ubuntu Linux 为基础进行讲解,但通过适当调整,也应适用于其他任何 Linux 发行版。 -用于开发的最低推荐 Ubuntu 版本为 24.04 LTS。 - -本教程假定你已经在本地检出(或克隆)了 ClickHouse 仓库及其所有子模块。 - - - -## 安装前提条件 - -首先,请参阅通用的[前提条件文档](developer-instruction.md)。 - -ClickHouse 使用 CMake 和 Ninja 进行构建。 - -你还可以选择安装 ccache,以便在构建时复用已编译的目标文件。 - -```bash -sudo apt-get update -sudo apt-get install build-essential git cmake ccache python3 ninja-build nasm yasm gawk lsb-release wget software-properties-common gnupg -``` - - -## 安装 Clang 编译器 - -要在 Ubuntu/Debian 上安装 Clang,请使用 [LLVM 提供的自动安装脚本](https://apt.llvm.org/)。 - -```bash -sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" -``` - -对于其他 Linux 发行版,请检查是否可以安装 LLVM 的任一[预构建包](https://releases.llvm.org/download.html)。 - -截至 2025 年 3 月,需要 Clang 19 或更高版本。 -不支持 GCC 或其他编译器。 - - -## 安装 Rust 编译器(可选) {#install-the-rust-compiler-optional} - -:::note -Rust 是 ClickHouse 的一个可选依赖。 -如果未安装 Rust,ClickHouse 的某些功能将不会被编译。 -::: - -首先,按照官方 [Rust 文档](https://www.rust-lang.org/tools/install) 中的步骤安装 `rustup`。 - -与 C++ 依赖类似,ClickHouse 使用 vendoring 来精确控制安装内容,并避免依赖第三方服务(例如 `crates.io` 注册表)。 - -虽然在发布模式下,任何较新的 rustup 工具链版本通常都可以与这些依赖配合使用,但如果你计划启用 sanitizers,则必须使用与 CI 中所用工具链在 `std` 版本上完全一致的 rustup 工具链版本(我们为该版本预先 vendoring 了相关 crates): - - - -```bash -rustup toolchain install nightly-2025-07-07 -rustup default nightly-2025-07-07 -rustup component add rust-src -``` - -## 构建 ClickHouse - -我们建议在 `ClickHouse` 内创建一个单独的 `build` 目录,用于存放所有构建产物: - -```sh -mkdir build -cd build -``` - -你可以为不同的构建类型使用多个不同的目录(例如 `build_release`、`build_debug` 等)。 - -可选:如果你安装了多个编译器版本,可以选择性地指定要使用的具体编译器。 - -```sh -export CC=clang-19 -export CXX=clang++-19 -``` - -在开发阶段,建议使用调试构建。 -与发布构建相比,它们使用较低级别的编译器优化(`-O`),从而带来更好的调试体验。 -此外,类型为 `LOGICAL_ERROR` 的内部异常会立即导致崩溃,而不会被优雅地处理。 - -```sh -cmake -D CMAKE_BUILD_TYPE=Debug .. -``` - -:::note -如果你希望使用 gdb 等调试器,请在上述命令中添加 `-D DEBUG_O_LEVEL="0"`,以禁用所有编译器优化,因为这些优化可能会影响 gdb 查看或访问变量的能力。 -::: - -运行 ninja 进行构建: - -```sh -ninja clickhouse -``` - -如果你想构建所有二进制文件(工具和测试),请直接运行不带任何参数的 ninja: - -```sh -ninja -``` - -可以通过参数 `-j` 控制并行构建作业的数量: - -```sh -ninja -j 1 clickhouse-server clickhouse-client -``` - -:::tip -CMake 为执行上述命令提供了快捷方式: - -```sh -cmake -S . -B build # 配置构建,从代码仓库顶层目录运行 -cmake --build build # 编译 -``` - -::: - - -## 运行 ClickHouse 可执行文件 - -在构建成功完成后,可以在 `ClickHouse//programs/` 中找到可执行文件: - -ClickHouse 服务器会尝试在当前目录中查找配置文件 `config.xml`。 -也可以在命令行中通过 `-C` 指定配置文件。 - -要使用 `clickhouse-client` 连接到 ClickHouse 服务器,打开另一个终端,进入 `ClickHouse/build/programs/`,然后运行 `./clickhouse client`。 - -如果在 macOS 或 FreeBSD 上收到 `Connection refused` 提示,请尝试将主机地址指定为 127.0.0.1: - -```bash -clickhouse client --host 127.0.0.1 -``` - - -## 高级选项 - -### 最小构建 - -如果不需要使用第三方库提供的功能,可以进一步加快构建速度: - -```sh -cmake -DENABLE_LIBRARIES=OFF -``` - -如果出现问题,就只能靠你自己了…… - -Rust 需要网络连接。要禁用 Rust 支持: - -```sh -cmake -DENABLE_RUST=OFF -``` - -### 运行 ClickHouse 可执行文件 - -你可以将系统中安装的生产版本 ClickHouse 二进制文件替换为自己编译的 ClickHouse 二进制文件。 -为此,请按照官方网站上的说明在本机安装 ClickHouse。 -然后运行: - -```bash -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 二进制文件: - -```bash -sudo service clickhouse-server stop -sudo -u clickhouse ClickHouse/build/programs/clickhouse server --config-file /etc/clickhouse-server/config.xml -``` - -### 在任何 Linux 系统上构建 - -在 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 类似的环境中运行任意构建: - -```bash -python -m ci.praktika "BUILD_JOB_NAME" -``` - -其中 BUILD_JOB_NAME 是 CI 报告中显示的作业名称,例如 “Build (arm_release)”、“Build (amd_debug)”。 - -此命令会拉取包含所有所需依赖项的相应 Docker 镜像 `clickhouse/binary-builder`, -并在其中运行构建脚本:`./ci/jobs/build_clickhouse.py`。 - -构建产物将输出到 `./ci/tmp/` 目录中。 - -它同时适用于 AMD 和 ARM 架构,除了 Docker 之外不需要任何其他依赖。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md deleted file mode 100644 index 5b3499cbdd8..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/building_and_benchmarking_deflate_qpl.md +++ /dev/null @@ -1,362 +0,0 @@ ---- -description: '如何构建 ClickHouse 并使用 DEFLATE_QPL 编解码器进行基准测试' -sidebar_label: '构建和基准测试 DEFLATE_QPL' -sidebar_position: 73 -slug: /development/building_and_benchmarking_deflate_qpl -title: '使用 DEFLATE_QPL 构建 ClickHouse' -doc_type: 'guide' ---- - - - -# 使用 DEFLATE_QPL 构建 ClickHouse - -- 请确保你的主机符合 QPL 所需的[先决条件](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#prerequisites) -- 在使用 CMake 构建时,`deflate_qpl` 默认是启用的。如果你不小心修改了该设置,请再次确认构建标志:`ENABLE_QPL=1` - -- 有关通用构建要求,请参阅 ClickHouse 的[通用构建说明](/development/build.md) - - - -# 使用 DEFLATE_QPL 运行基准测试 - - - -## 文件列表 {#files-list} - -[qpl-cmake](https://github.com/ClickHouse/ClickHouse/tree/master/contrib/qpl-cmake) 下的 `benchmark_sample` 目录提供了使用 Python 脚本运行基准测试的示例: - -`client_scripts` 中包含用于运行典型基准测试的 Python 脚本,例如: -- `client_stressing_test.py`:用于在 [1~4] 个服务器实例上进行查询压力测试的 Python 脚本。 -- `queries_ssb.sql`:列出了 [Star Schema Benchmark](/getting-started/example-datasets/star-schema/) 的所有查询。 -- `allin1_ssb.sh`:用于自动一键执行完整基准测试工作流的 shell 脚本。 - -`database_files` 目录用于根据 lz4/deflate/zstd 编解码器存储数据库文件。 - - - -## 自动运行星型模式基准测试: - -```bash -$ cd ./benchmark_sample/client_scripts -$ sh run_ssb.sh -``` - -完成后,请检查该文件夹中的所有结果:`./output/` - -如果出现失败,请按照下文各节中的说明手动运行基准测试。 - - -## 定义 {#definition} - -[CLICKHOUSE_EXE] 指 ClickHouse 可执行程序的路径。 - - - -## 环境 - -* CPU:Sapphire Rapids -* 操作系统要求请参阅 [System Requirements for QPL](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#system-requirements) -* IAA 配置请参阅 [Accelerator Configuration](https://intel.github.io/qpl/documentation/get_started_docs/installation.html#accelerator-configuration) -* 安装 Python 模块: - -```bash -pip3 install clickhouse_driver numpy -``` - -[IAA 自检] - -```bash -$ accel-config list | grep -P 'iax|state' -``` - -期望输出如下: - -```bash - "dev":"iax1", - "state":"已启用", - "state":"已启用", -``` - -如果没有任何输出,说明 IAA 尚未就绪。请重新检查 IAA 的配置。 - - -## 生成原始数据 - -```bash -$ cd ./benchmark_sample -$ mkdir rawdata_dir && cd rawdata_dir -``` - -使用 [`dbgen`](/getting-started/example-datasets/star-schema) 并通过以下参数生成 1 亿行数据: --s 20 - -预计会在 `./benchmark_sample/rawdata_dir/ssb-dbgen` 目录下生成类似 `*.tbl` 的文件: - - -## 数据库配置 - -将数据库配置为使用 LZ4 编解码器 - -```bash -$ cd ./database_dir/lz4 -$ [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -此时你应在控制台中看到 `Connected to ClickHouse server` 这条消息,这表明客户端已成功与服务器建立连接。 - -完成 [Star Schema Benchmark](/getting-started/example-datasets/star-schema) 中提到的以下三个步骤: - -* 在 ClickHouse 中创建表 -* 插入数据。这里应使用 `./benchmark_sample/rawdata_dir/ssb-dbgen/*.tbl` 作为输入数据。 -* 将“星型模式”(star schema)转换为反规范化的“扁平模式”(flat schema) - -使用 IAA Deflate 编解码器配置数据库 - -```bash -$ cd ./database_dir/deflate -$ [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -完成与上文 lz4 相同的三个步骤 - -使用 ZSTD 编解码器配置数据库 - -```bash -$ cd ./database_dir/zstd -$ [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ [CLICKHOUSE_EXE] client -``` - -完成与上文 lz4 相同的三个步骤。 - -[self-check] -对于每种编解码器(lz4/zstd/deflate),请执行以下查询以验证数据库是否已成功创建: - -```sql -SELECT count() FROM lineorder_flat -``` - -你应该会看到如下输出: - -```sql -┌───count()─┐ -│ 119994608 │ -└───────────┘ -``` - -[IAA Deflate 编解码器自检] - -当你首次从客户端执行插入或查询操作时,ClickHouse 服务器控制台应输出如下日志: - -```text -硬件加速 DeflateQpl 编解码器已就绪! -``` - -如果你始终没有看到这条日志,而是看到了如下所示的另一条日志: - -```text -硬件辅助 DeflateQpl 编解码器初始化失败 -``` - -这表示 IAA 设备尚未准备就绪,你需要重新检查 IAA 的配置。 - - -## 使用单实例进行基准测试 - -* 在开始基准测试之前,请禁用 C6,并将 CPU 频率调节策略设置为 `performance` - -```bash -$ cpupower idle-set -d 3 -$ cpupower frequency-set -g performance -``` - -* 为了消除跨 CPU 插槽访问时内存瓶颈的影响,我们使用 `numactl` 将服务端绑定到一个插槽、客户端绑定到另一个插槽。 -* 单实例指的是单个服务端连接单个客户端。 - -现在分别运行 LZ4/Deflate/ZSTD 的基准测试: - -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > lz4.log -``` - -IAA deflate: - -```bash -$ cd ./database_dir/deflate -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > deflate.log -``` - -ZSTD: - -```bash -$ cd ./database_dir/zstd -$ numactl -m 0 -N 0 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 1 > zstd.log -``` - -现在应该能按预期输出三条日志: - -```text -lz4.log -deflate.log -zstd.log -``` - -如何检查性能指标: - -我们主要关注 QPS,请搜索关键字 `QPS_Final` 并收集统计数据。 - - -## 使用多实例进行基准测试 - -* 为了减小过多线程导致的内存瓶颈影响,建议使用多实例来运行基准测试。 -* 多实例是指在多台(2 或 4 台)服务器上分别连接各自的客户端。 -* 需要将一个 socket 上的核心数平均划分,并分别分配给各个服务器。 -* 对于多实例,必须为每种 codec 创建一个新的目录,并按照与单实例类似的步骤插入数据集。 - -这里有 2 点不同: - -* 在客户端侧,你需要在建表和插入数据时,以分配好的端口来启动 ClickHouse。 -* 在服务端侧,你需要使用已指定端口的特定 XML 配置文件来启动 ClickHouse。所有用于多实例的自定义 XML 配置文件已在 ./server_config 目录下提供。 - -这里我们假设每个 socket 有 60 个核心,并以 2 个实例为例。 -启动第一个实例的服务端 -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -``` - -ZSTD: - -```bash -$ cd ./database_dir/zstd -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -``` - -IAA Deflate(基于 IAA 的 Deflate 压缩): - -```bash -$ cd ./database_dir/deflate -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -``` - -[为第二个实例启动服务器] - -LZ4: - -```bash -$ cd ./database_dir && mkdir lz4_s2 && cd lz4_s2 -$ cp ../../server_config/config_lz4_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null& -``` - -ZSTD: - -```bash -$ cd ./database_dir && mkdir zstd_s2 && cd zstd_s2 -$ cp ../../server_config/config_zstd_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null& -``` - -IAA Deflate: - -```bash -$ cd ./database_dir && mkdir deflate_s2 && cd deflate_s2 -$ cp ../../server_config/config_deflate_s2.xml ./ -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null& -``` - -为第二个实例创建表并插入数据 - -创建表: - -```bash -$ [CLICKHOUSE_EXE] client -m --port=9001 -``` - -插入数据: - -```bash -$ [CLICKHOUSE_EXE] client --query "INSERT INTO [TBL_FILE_NAME] FORMAT CSV" < [TBL_FILE_NAME].tbl --port=9001 -``` - -* [TBL_FILE_NAME] 表示文件名,文件名需要匹配如下正则表达式:`*.tbl`,位于 `./benchmark_sample/rawdata_dir/ssb-dbgen` 目录下。 -* `--port=9001` 表示为该 server 实例分配的端口,该端口也在 config_lz4_s2.xml/config_zstd_s2.xml/config_deflate_s2.xml 中进行了定义。对于更多实例,你需要将其替换为 9002 或 9003,这两个值分别对应 s3/s4 实例。如果你未显式指定该参数,则默认端口为 9000,该端口已经被第一个实例占用。 - -使用 2 个实例进行基准测试 - -LZ4: - -```bash -$ cd ./database_dir/lz4 -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_lz4.xml >&/dev/null& -$ cd ./database_dir/lz4_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_lz4_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > lz4_2insts.log -``` - -ZSTD: - - -```bash -$ cd ./database_dir/zstd -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_zstd.xml >&/dev/null& -$ cd ./database_dir/zstd_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_zstd_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > zstd_2insts.log -``` - -IAA Deflate 压缩 - -```bash -$ cd ./database_dir/deflate -$ numactl -C 0-29,120-149 [CLICKHOUSE_EXE] server -C config_deflate.xml >&/dev/null& -$ cd ./database_dir/deflate_s2 -$ numactl -C 30-59,150-179 [CLICKHOUSE_EXE] server -C config_deflate_s2.xml >&/dev/null& -$ cd ./client_scripts -$ numactl -m 1 -N 1 python3 client_stressing_test.py queries_ssb.sql 2 > deflate_2insts.log -``` - -这里 client_stressing_test.py 的最后一个参数 `2` 表示实例数量。若需要更多实例,请将其改为 3 或 4。该脚本最多支持 4 个实例。 - -现在应该会按预期输出三条日志: - -```text -lz4_2insts.log -deflate_2insts.log -zstd_2insts.log -``` - -如何检查性能指标: - -我们重点关注 QPS,请搜索关键字 `QPS_Final` 并收集统计数据。 - -4 个实例的基准测试设置与上述 2 个实例的类似。 -我们建议使用 2 个实例的基准测试数据作为最终报告的评审依据。 - - -## 提示 - -每次启动新的 ClickHouse 服务器之前,请确保没有 ClickHouse 后台进程在运行。请检查并终止旧进程: - -```bash -$ ps -aux| grep clickhouse -$ kill -9 [PID] -``` - -通过将 ./client_scripts/queries_ssb.sql 中的查询列表与官方的 [Star Schema Benchmark](/getting-started/example-datasets/star-schema) 进行比较,你会发现有 3 条查询未被包含:Q1.2/Q1.3/Q3.4。这是因为这些查询的 CPU 利用率非常低(< 10%),不足以体现性能差异。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/continuous-integration.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/continuous-integration.md deleted file mode 100644 index e07639bfa0a..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/continuous-integration.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -description: 'ClickHouse 持续集成系统概览' -sidebar_label: '持续集成(CI)' -sidebar_position: 55 -slug: /development/continuous-integration -title: '持续集成(CI)' -doc_type: 'reference' ---- - - - -# 持续集成(CI) - -当你提交一个 pull request 时,ClickHouse 的[持续集成(CI)系统](tests.md#test-automation)会对你的代码运行一些自动检查。 -这会在代码仓库维护者(ClickHouse 团队成员)审查了你的代码并在 pull request 上添加 `can be tested` 标签之后进行。 -检查结果会显示在 GitHub 的 pull request 页面上,如 [GitHub 检查文档](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-status-checks)所述。 -如果某项检查失败,你可能需要修复它。 -本页面概述了你可能遇到的检查类型,以及可以采取的修复措施。 - -如果看起来检查失败与你的更改无关,则可能是暂时性故障或基础设施问题。 -向该 pull request 推送一个空提交以重新运行 CI 检查: - -```shell -git reset -git commit --allow-empty -git push -``` - -如果你不确定该怎么做,请向维护人员寻求帮助。 - - -## 与 master 合并 {#merge-with-master} - -验证该 PR 是否可以合并到 master 分支。 -如果无法合并,此检查会失败,并显示消息 `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 描述是否符合模板 [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) 编写一条面向用户的变更说明。 - - - -## Docker image {#docker-image} - -构建 ClickHouse server 和 keeper 的 Docker 镜像,以验证它们能够成功构建。 - -### Official docker library tests {#official-docker-library-tests} - -运行来自 [official Docker library](https://github.com/docker-library/official-images/tree/master/test#alternate-config-files) 的测试,以验证 `clickhouse/clickhouse-server` Docker 镜像工作正常。 - -要添加新的测试,请创建目录 `ci/jobs/scripts/docker_server/tests/$test_name`,并在其中添加脚本 `run.sh`。 - -有关这些测试的更多详细信息,请参阅 [CI jobs scripts documentation](https://github.com/ClickHouse/ClickHouse/tree/master/ci/jobs/scripts/docker_server)。 - - - -## 标记检查 {#marker-check} - -此检查表示 CI 系统已开始处理该拉取请求(pull request)。 -当其状态为 `pending` 时,表示尚未启动所有检查。 -在所有检查都已启动后,其状态会变为 `success`。 - - - -## 样式检查 - -对代码库执行各种样式检查。 - -*Style Check* 作业中包含的基础检查: - -##### cpp - -使用 [`ci/jobs/scripts/check_style/check_cpp.sh`](https://github.com/ClickHouse/ClickHouse/blob/master/ci/jobs/scripts/check_style/check_cpp.sh) 脚本执行基于正则表达式的简单代码样式检查(也可以在本地运行)。\ -如果检查失败,请根据[代码样式指南](style.md)修复样式问题。 - -##### codespell, aspell - -检查语法错误和拼写错误。 - -##### mypy - -对 Python 代码执行静态类型检查。 - -### 在本地运行样式检查作业 - -可以在 Docker 容器中本地运行完整的 *Style Check* 作业,命令如下: - -```sh -python -m ci.praktika run "Style check" -``` - -要执行特定检查(例如 *cpp* 检查): - -```sh -python -m ci.praktika run "Style check" --test cpp -``` - -这些命令会拉取 `clickhouse/style-test` Docker 镜像,并在容器化环境中运行该任务。 -除 Python 3 和 Docker 外,无需其他任何依赖。 - - -## 快速测试 - -通常这是在 PR 上运行的第一个检查。 -它会构建 ClickHouse 并运行大部分[无状态功能测试](tests.md#functional-tests),但会省略部分测试。 -如果该步骤失败,在修复之前不会启动后续检查。 -查看报告以确定哪些测试失败,然后按照[这里](/development/tests#running-a-test-locally)的说明在本地重现失败。 - -#### 在本地运行快速测试: - -```sh -python -m ci.praktika run "Fast test" [--test 测试名称] -``` - -这些命令会拉取 `clickhouse/fast-test` Docker 镜像,并在容器化环境中运行该作业。 -只需 Python 3 和 Docker,无需其他依赖。 - - -## 构建检查 - -以多种配置构建 ClickHouse,以便在后续步骤中使用。 - -### 在本地运行构建 - -可以在类似 CI 的本地环境中运行构建,使用: - -```bash -python -m ci.praktika run "" -``` - -除了 Python 3 和 Docker 外不需要其他依赖。 - -#### 可用构建任务 - -构建任务名称与 CI 报告中的名称完全一致: - -**AMD64 构建:** - -* `Build (amd_debug)` - 带调试符号的调试构建 -* `Build (amd_release)` - 优化的发布构建 -* `Build (amd_asan)` - 使用 Address Sanitizer 的构建 -* `Build (amd_tsan)` - 使用 Thread Sanitizer 的构建 -* `Build (amd_msan)` - 使用 Memory Sanitizer 的构建 -* `Build (amd_ubsan)` - 使用 Undefined Behavior Sanitizer 的构建 -* `Build (amd_binary)` - 不带 Thin LTO 的快速发布构建 -* `Build (amd_compat)` - 面向旧系统的兼容性构建 -* `Build (amd_musl)` - 使用 musl libc 的构建 -* `Build (amd_darwin)` - macOS 构建 -* `Build (amd_freebsd)` - FreeBSD 构建 - -**ARM64 构建:** - -* `Build (arm_release)` - ARM64 优化发布构建 -* `Build (arm_asan)` - ARM64 Address Sanitizer 构建 -* `Build (arm_coverage)` - 启用覆盖率插桩的 ARM64 构建 -* `Build (arm_binary)` - 不带 Thin LTO 的 ARM64 快速发布构建 -* `Build (arm_darwin)` - macOS ARM64 构建 -* `Build (arm_v80compat)` - ARMv8.0 兼容性构建 - -**其他架构:** - -* `Build (ppc64le)` - PowerPC 64 位小端 -* `Build (riscv64)` - RISC-V 64 位 -* `Build (s390x)` - IBM System/390 64 位 -* `Build (loongarch64)` - LoongArch 64 位 - -如果任务成功,构建结果将会保存在 `/ci/tmp/build` 目录中。 - -**注意:** 对于不属于 “Other Architectures” 类别(该类别使用交叉编译)的构建,你本地机器的架构必须与构建类型一致,才能按照 `BUILD_JOB_NAME` 要求生成构建产物。 - -#### 示例 - -要在本地运行调试构建: - -```bash -python -m ci.praktika run "Build (amd_debug)" -``` - - -如果上述方法不适用于你的情况,请从构建日志中获取 cmake 选项,并按照[通用构建流程](../development/build.md)进行操作。 - -## Functional stateless tests {#functional-stateless-tests} - -针对在不同配置(release、debug、启用 sanitizer 等)下构建的 ClickHouse 二进制文件运行[无状态功能测试](tests.md#functional-tests)。 -查看报告以了解哪些测试失败,然后按[此处](/development/tests#functional-tests)所述在本地重现这些失败。 -请注意,为了成功重现,你必须使用正确的构建配置——某个测试可能在 AddressSanitizer 配置下失败,但在 Debug 配置下通过。 -从 [CI 构建检查页面](/install/advanced)下载二进制文件,或在本地自行构建。 - - - -## 集成测试 {#integration-tests} - -执行[集成测试](tests.md#integration-tests)。 - - - -## Bugfix validate check {#bugfix-validate-check} - -检查是否添加了新的测试(功能测试或集成测试),或者是否存在在使用 master 分支构建的二进制文件时会失败的已修改测试。 -当拉取请求带有 "pr-bugfix" 标签时,会触发此检查。 - - - -## 压力测试 {#stress-test} - -从多个客户端并发运行无状态功能性测试,以检测与并发相关的错误。如果测试失败: - - * 先修复所有其他测试失败的问题; - * 查看报告以找到服务器日志,并检查日志以排查可能的错误原因。 - - - -## 兼容性检查 {#compatibility-check} - -检查 `clickhouse` 二进制文件能否在使用旧版 libc 的发行版上运行。 -如果检查失败,请联系维护人员寻求帮助。 - - - -## AST fuzzer {#ast-fuzzer} - -运行随机生成的查询以捕获程序错误。 -如果运行失败,请联系项目维护者寻求帮助。 - - - -## 性能测试 {#performance-tests} - -衡量查询性能的变化。 -这是运行时间最长的检查,耗时略低于 6 小时。 -性能测试报告的详细说明见[此处](https://github.com/ClickHouse/ClickHouse/tree/master/docker/test/performance-comparison#how-to-read-the-report)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/contrib.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/contrib.md deleted file mode 100644 index 99a4ea29cef..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/contrib.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: '介绍 ClickHouse 对第三方库的使用情况,以及如何添加和维护第三方库。' -sidebar_label: '第三方库' -sidebar_position: 60 -slug: /development/contrib -title: '第三方库' -doc_type: 'reference' ---- - - - -# 第三方库 - -ClickHouse 出于不同目的会使用第三方库,例如连接到其他数据库、在从磁盘加载/保存到磁盘时对数据进行解码/编码,或实现某些专用 SQL 函数。 -为避免依赖目标系统中可用的库,每个第三方库都会作为 Git 子模块导入到 ClickHouse 的源代码树中,并与 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) - - -## 添加和维护第三方库 {#adding-and-maintaining-third-party-libraries} - -每个第三方库都必须位于 ClickHouse 仓库 `contrib/` 目录下的一个专用子目录中。 -避免直接把外部代码随意拷贝到库目录中。 -应当创建一个 Git 子模块,从外部上游仓库拉取第三方代码。 - -所有被 ClickHouse 使用的子模块都列在 `.gitmodule` 文件中。 -- 如果该库可以“即拿即用”(默认情况),你可以直接引用上游仓库。 -- 如果该库需要打补丁,则在 [GitHub 上 ClickHouse 组织](https://github.com/ClickHouse)下创建该上游仓库的 fork。 - -在后一种情况下,我们的目标是尽可能将自定义补丁与上游提交隔离。 -为此,请从你想集成的分支或标签上创建一个带有 `ClickHouse/` 前缀的分支,例如 `ClickHouse/2024_2`(对应分支 `2024_2`)或 `ClickHouse/release/vX.Y.Z`(对应标签 `release/vX.Y.Z`)。 -避免跟踪上游开发分支 `master` / `main` / `dev`(也就是说,不要在 fork 仓库中使用 `ClickHouse/master` / `ClickHouse/main` / `ClickHouse/dev` 这类以开发分支为基础的前缀分支)。 -这些分支是移动目标,会让正确的版本管理更加困难。 -这类“前缀分支”可以确保从上游仓库拉取变更到 fork 时不会影响自定义的 `ClickHouse/` 分支。 -`contrib/` 中的子模块只能跟踪 fork 的第三方仓库中的 `ClickHouse/` 分支。 - -补丁只会应用到外部库的 `ClickHouse/` 分支上。 - -有两种方式可以做到这一点: -- 你希望在 fork 仓库中某个带 `ClickHouse/` 前缀的分支上做一个新的修复,例如 sanitizer 修复。此时,将修复以带有 `ClickHouse/` 前缀的分支推送上去,例如 `ClickHouse/fix-sanitizer-disaster`。然后从这个新分支向自定义跟踪分支创建一个 PR,例如 `ClickHouse/2024_2 <-- ClickHouse/fix-sanitizer-disaster`,并合并该 PR。 -- 你更新了子模块,需要重新应用之前的补丁。在这种情况下,重新创建旧 PR 有些小题大做。相反,只需将较早的提交 cherry-pick 到新的 `ClickHouse/` 分支(对应新版本)即可。对于包含多个提交的 PR,可以酌情将这些提交 squash 成一个。在最理想的情况下,我们已经将自定义补丁回馈到上游,那么在新版本中就可以省略这些补丁。 - -一旦子模块更新完毕,在 ClickHouse 仓库中更新该子模块,使其指向 fork 中新的提交哈希。 - -在编写第三方库补丁时要以官方仓库为基准,并考虑将补丁贡献回上游仓库。 -这样可以确保其他人也能从补丁中受益,同时不会给 ClickHouse 团队带来额外的维护负担。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/developer-instruction.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/developer-instruction.md deleted file mode 100644 index ae1d412973e..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/developer-instruction.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: 'ClickHouse 开发的前提条件和设置指南' -sidebar_label: '前提条件' -sidebar_position: 5 -slug: /development/developer-instruction -title: '开发前提条件' -doc_type: 'guide' ---- - - - -# 前置条件 - -ClickHouse 可以在 Linux、FreeBSD 和 macOS 上编译构建。 -如果您使用 Windows,仍然可以在运行 Linux 的虚拟机中编译构建 ClickHouse,例如使用运行 Ubuntu 的 [VirtualBox](https://www.virtualbox.org/)。 - - - -## 在 GitHub 上创建代码仓库 - -要开始为 ClickHouse 开发,你需要一个 [GitHub](https://www.github.com/) 账号。 -如果你还没有 SSH 密钥,请先在本地生成一个 SSH 密钥,并将公钥上传到 GitHub,这是提交补丁的前置条件。 - -接下来,在你的个人账号下 fork [ClickHouse 仓库](https://github.com/ClickHouse/ClickHouse/),点击右上角的 “fork” 按钮即可。 - -要贡献更改(例如修复一个 issue 或添加一个功能),请先将你的更改提交到你 fork 中的某个分支,然后创建一个包含这些更改的 “Pull Request” 到主仓库。 - -要使用 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)。 - - -## 将代码仓库克隆到你的开发机器上 - -首先,将源文件下载到你的本地开发环境,即克隆该代码仓库: - -```sh -git clone git@github.com:your_github_username/ClickHouse.git # 将占位符替换为你的 GitHub 用户名 -cd ClickHouse -``` - -此命令会创建一个名为 `ClickHouse/` 的目录,其中包含源代码、测试以及其他文件。 -你可以在 URL 后指定一个自定义目录用于检出,但务必确保该路径中不包含空格字符,否则后续的构建过程可能会失败。 - -ClickHouse 的 Git 仓库使用子模块来拉取第三方库代码。 -子模块默认不会被检出。 -你可以执行以下任一操作: - -* 使用带有 `--recurse-submodules` 选项的 `git clone` 命令; - -* 如果运行 `git clone` 时未使用 `--recurse-submodules`,则运行 `git submodule update --init --jobs <N>` 来显式检出所有子模块。(例如可以将 `<N>` 设置为 `12` 以并行下载。) - -* 如果运行 `git clone` 时未使用 `--recurse-submodules`,并且你希望使用 [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/) 子模块检出,以省略子模块中不需要的文件和历史、从而节省空间(约 5 GB 而不是约 15 GB),请运行 `./contrib/update-submodules.sh`。这种方式在 CI 中使用,但不推荐用于本地开发,因为它会让使用子模块变得不太方便且更慢。 - -要检查 Git 子模块的状态,请运行 `git submodule status`。 - -如果你收到如下错误信息 - -```bash -权限被拒绝(publickey)。 -致命错误:无法从远程仓库读取。 - -请确保您拥有正确的访问权限, -且该仓库存在。 -``` - -缺少用于连接 GitHub 的 SSH 密钥。 -这些密钥通常位于 `~/.ssh`。 -要使 SSH 密钥生效,你需要在 GitHub 的设置中上传它们。 - -你也可以通过 HTTPS 克隆该仓库: - -```sh -git clone https://github.com/ClickHouse/ClickHouse.git -``` - -然而,这样做并不能让你将更改推送到服务器。 -你仍然可以暂时这样使用,并在之后添加 SSH 密钥,再通过 `git remote` 命令替换仓库的远程地址。 - -你也可以将原始 ClickHouse 仓库地址添加到本地仓库,以便从那里拉取更新: - -```sh -git remote add upstream git@github.com:ClickHouse/ClickHouse.git -``` - -成功运行此命令后,你就可以通过运行 `git pull upstream master` 从 ClickHouse 主仓库拉取更新。 - -:::tip -请不要直接使用 `git push`,你可能会推送到错误的远程仓库和/或错误的分支。 -最好显式指定远程和分支的名称,例如 `git push origin my_branch_name`。 -::: - - -## 编写代码 {#writing-code} - -下面是一些在为 ClickHouse 编写代码时可能有用的快速链接: - -- [ClickHouse 架构](/development/architecture/). -- [代码风格指南](/development/style/). -- [第三方库](/development/contrib#adding-and-maintaining-third-party-libraries) -- [编写测试](/development/tests/) -- [开放的 Issue](https://github.com/ClickHouse/ClickHouse/issues?q=is%3Aopen+is%3Aissue+label%3A%22easy+task%22) - -### IDE {#ide} - -[Visual Studio Code](https://code.visualstudio.com/) 和 [Neovim](https://neovim.io/) 是在开发 ClickHouse 时实践证明很好用的两个选项。如果你使用 VS Code,我们推荐使用 [clangd 扩展](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd) 替代 IntelliSense,因为它的性能要高得多。 - -[CLion](https://www.jetbrains.com/clion/) 是另一个很好的选择。不过,在像 ClickHouse 这样的大型项目上,它可能会比较慢。使用 CLion 时需要注意以下几点: - -- CLion 会自行创建一个 `build` 目录,并自动选择 `debug` 作为构建类型 -- 它使用的是在 CLion 中定义的 CMake 版本,而不是你自己安装的版本 -- CLion 会使用 `make` 来运行构建任务,而不是 `ninja`(这是正常行为) - -你也可以使用其他 IDE,例如 [Sublime Text](https://www.sublimetext.com/)、[Qt Creator](https://www.qt.io/product/development-tools) 或 [Kate](https://kate-editor.org/)。 - - - -## 创建拉取请求 {#create-a-pull-request} - -在 GitHub 的界面中进入你自己的 fork 仓库。 -如果你是在某个分支上开发的,需要先选择该分支。 -页面上会有一个 “Pull request” 按钮。 -本质上,这表示“创建一个请求,将我的更改合并到主仓库中”。 - -即使工作尚未完成,你也可以创建拉取请求。 -在这种情况下,请在标题开头加入 “WIP”(work in progress),之后可以再修改。 -这有助于协作进行评审和讨论更改,也便于运行所有可用的测试。 -请务必提供你所做更改的简要说明,之后会用它来生成发布版本的变更日志。 - -当 ClickHouse 员工为你的 PR 添加 “can be tested” 标签后,测试将开始执行。 -部分初始检查结果(例如代码风格)会在几分钟内完成。 -构建检查结果通常会在半小时内返回。 -主测试集的结果通常会在一小时内完成。 - -系统会为你的拉取请求单独准备 ClickHouse 二进制构建。 -要获取这些构建,请点击检查列表中 “Builds” 条目旁边的 “Details” 链接。 -在那里你会找到已构建的 ClickHouse .deb 软件包的直接链接,你甚至可以将其部署到生产服务器上(如果你不惧风险的话)。 - - - -## 编写文档 {#write-documentation} - -每个添加新功能的 pull request 都必须附带相应文档。 -如果你希望预览文档修改内容,本地构建文档页面的步骤说明可在 README.md 文件中找到,链接在[这里](https://github.com/ClickHouse/clickhouse-docs)。 -在向 ClickHouse 添加新函数时,你可以参考以下模板来编写文档: - - - -````markdown -# newFunctionName - -此处为该函数的简要说明,应简要描述其功能以及一个典型的使用场景。 - -**语法** - -\```sql -newFunctionName(arg1, arg2[, arg3]) -\``` - -**参数** - -- `arg1` — 参数说明。 [DataType](../data-types/float.md) -- `arg2` — 参数说明。 [DataType](../data-types/float.md) -- `arg3` — 可选参数说明(可选)。 [DataType](../data-types/float.md) - -**实现细节** - -如有需要,在此说明实现细节。 - -**返回值** - -- 返回 {在此填写函数返回内容}。 [DataType](../data-types/float.md) - -**示例** - -查询: - -\```sql -SELECT '在此编写示例查询'; -\``` - -响应: - -\```response -┌───────────────────────────────────┐ -│ 查询结果 │ -└───────────────────────────────────┘ -\``` -```` - - -## 使用测试数据 - -在开发 ClickHouse 时,经常需要加载贴近真实场景的数据集。 -这对于性能测试尤为重要。 -我们专门准备了一套经过匿名化处理的 Web 分析数据。 -它额外需要大约 3GB 的可用磁盘空间。 - -```sh - 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 -``` - -在 clickhouse-client 中: - -```sql -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); - -```` - -导入数据: - -```bash -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 -```` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/index.md deleted file mode 100644 index 6d821704281..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/index.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -description: '开发与贡献索引页' -slug: /development/ -title: '开发与贡献' -doc_type: 'landing-page' ---- - -在本节文档中,您将找到以下页面: - -{/* 下面的目录是由如下脚本根据 YAML - front matter 字段:title、description、slug 自动生成的: - - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - - 如果您发现错误或希望改进描述,请直接编辑相应的文件。 - */ } - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| ------------------------------------------------------------------------------------------- | ----------------------------------------------- | -| [Developer Prerequisites](/development/developer-instruction) | ClickHouse 开发的前提条件和环境配置说明 | -| [How to Build ClickHouse on Linux](/development/build) | 在 Linux 系统上从源码构建 ClickHouse 的分步指南 | -| [Build on macOS for macOS](/development/build-osx) | 在 macOS 系统上从源码构建 ClickHouse 的指南 | -| [Build on Linux for macOS](/development/build-cross-osx) | 在 Linux 上为 macOS 系统交叉编译 ClickHouse 的指南 | -| [How to Build ClickHouse on Linux for AARCH64](/development/build-cross-arm) | 在 Linux 上为 AARCH64 架构从源码构建 ClickHouse 的指南 | -| [How to Build ClickHouse on Linux for RISC-V 64](/development/build-cross-riscv) | 在 Linux 上为 RISC-V 64 架构从源码构建 ClickHouse 的指南 | -| [Build on Linux for s390x (zLinux)](/development/build-cross-s390x) | 在 Linux 上为 s390x 架构从源码构建 ClickHouse 的指南 | -| [Build on Linux for E2K](/development/build-e2k) | 在 Linux 上为 E2K 架构从源码构建 ClickHouse 的指南 | -| [Build on Linux for LoongArch64](/development/build-cross-loongarch) | 在 Linux 上为 LoongArch64 架构从源码构建 ClickHouse 的指南 | -| [Testing ClickHouse](/development/tests) | 关于测试 ClickHouse 并运行测试套件的指南 | -| [Architecture Overview](/development/architecture) | 对 ClickHouse 架构及其列式设计的全面概述 | -| [Continuous Integration (CI)](/development/continuous-integration) | ClickHouse 持续集成系统概览 | -| [Third-Party Libraries](/development/contrib) | 介绍 ClickHouse 第三方库使用方式以及如何添加和维护第三方库的页面 | -| [C++ Style Guide](/development/style) | ClickHouse C++ 开发的代码风格规范 | -| [Build Clickhouse with DEFLATE_QPL](/development/building_and_benchmarking_deflate_qpl) | 使用 DEFLATE_QPL 编解码器构建 ClickHouse 并运行基准测试的指南 | -| [Integrating Rust Libraries](/development/integrating_rust_libraries) | 将 Rust 库集成到 ClickHouse 的指南 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md deleted file mode 100644 index 3567871bd97..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/integrating_rust_libraries.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -description: '将 Rust 库集成到 ClickHouse 的指南' -sidebar_label: 'Rust 库' -slug: /development/integrating_rust_libraries -title: '集成 Rust 库' -doc_type: 'guide' ---- - -# Rust 库 - -Rust 库的集成将以集成 BLAKE3 哈希函数为例进行说明。 - -集成的第一步是将该库添加到 /rust 目录下。为此,你需要创建一个空的 Rust 项目,并在 Cargo.toml 中添加所需的库。同时还需要在 Cargo.toml 中添加 `crate-type = ["staticlib"]`,以将新库配置为编译为静态库。 - -接下来,你需要使用 Corrosion 库将该库链接到 CMake。首先,需要在 /rust 目录下的 CMakeLists.txt 中添加该库所在的目录。然后,你应当在该库目录下添加 CMakeLists.txt 文件,并在其中调用 Corrosion 的导入函数。以下这些代码行用于导入 BLAKE3: - -```CMake -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(垫片)方法:将从 C/C++ 接收的数据进行转换、调用库方法,以及对输出数据进行反向转换。例如,我们为 BLAKE3 编写了如下方法: - -```rust -#[no_mangle] -pub unsafe extern "C" fn blake3_apply_shim( - begin: *const c_char, - _size: u32, - out_char_data: *mut u8, -``` - -```rust -#[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 作为构建依赖引入。 - -下面是一个可以自动生成头文件的构建脚本示例: - -```rust - 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 构建。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/development/style.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/style.md deleted file mode 100644 index f14095ad23b..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/style.md +++ /dev/null @@ -1,892 +0,0 @@ ---- -description: 'ClickHouse C++ 代码风格指南' -sidebar_label: 'C++ 风格指南' -sidebar_position: 70 -slug: /development/style -title: 'C++ 风格指南' -doc_type: 'guide' ---- - - - -# C++ 编码风格指南 - - - -## 通用建议 {#general-recommendations} - -以下内容是建议,非强制要求。 -如果你在编辑代码,遵循现有代码的格式通常是更合理的做法。 -代码风格的目的是保持一致性。一致性可以让代码更易阅读,也更便于在代码中搜索。 -许多规则并没有严格的逻辑依据;更多是由既有实践所约定的。 - - - -## 格式 - -**1.** 大部分格式由 `clang-format` 自动完成。 - -**2.** 缩进为 4 个空格。请将你的开发环境配置为按一次 Tab 键插入四个空格。 - -**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 << " 行/秒," - << bytes_read_on_server * 1000.0 / elapsed_ns << " MB/秒)"; -``` - -**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: - /// 用于使用的对象版本。shared_ptr 管理版本的生命周期。 - using Version = std::shared_ptr; - ... -} -``` - -**16.** 如果整个文件使用相同的 `namespace`,且没有其他特殊之处,则在 `namespace` 内不需要再增加缩进层级。 - -**17.** 如果 `if`、`for`、`while` 或其他表达式的代码块只包含单个 `statement`,则花括号是可选的。将该 `statement` 单独放在一行即可。此规则同样适用于嵌套的 `if`、`for`、`while` 等。 - -但如果内部的 `statement` 本身包含花括号或 `else`,则外层代码块应使用花括号书写。 - -```cpp -/// 完成写入操作。 -for (auto & stream : streams) - stream.second->finalize(); -``` - -**18.** 行尾不应包含任何尾随空格。 - -**19.** 源文件采用 UTF-8 编码。 - - -**20.** 字符串字面量中可以使用非 ASCII 字符。 - -```cpp -<< ", " << (timer.elapsed() / chunks_stats.hits) << " μsec/hit."; -``` - -**21.** 不要在同一行写多个表达式。 - -**22.** 将函数内部的代码按区块分组,区块之间最多用一行空行分隔。 - -**23.** 使用一到两行空行分隔函数、类等结构。 - -**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) -``` - - -## 注释 - -**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, /// 数据库、表、数据类型、引擎、函数、聚合函数等 - BlockInputStreamPtr & query_plan, /// 可在此处写入查询执行方式的描述 - QueryProcessingStage::Enum stage = QueryProcessingStage::Complete /// SELECT 查询处理到哪个阶段 - ) -``` - -**4.** 注释应只使用英文编写。 - -**5.** 如果你在编写一个库,请在主头文件中加入详细注释对其进行说明。 - -**6.** 不要添加没有提供额外信息的注释。特别是不要留下如下这样的空注释: - -```cpp -/* -* 过程名称: -* 原始过程名称: -* 作者: -* 创建日期: -* 修改日期: -* 修改作者: -* 原始文件名: -* 用途: -* 意图: -* 说明: -* 使用的类: -* 常量: -* 局部变量: -* 参数: -* 创建日期: -* 用途: -*/ -``` - -该示例借用了资源 [http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/](http://home.tamk.fi/~jaalto/course/coding-style/doc/unmaintainable-code/) 中的内容。 - -**7.** 不要在每个文件开头写无用的注释(作者、创建日期等)。 - -**8.** 单行注释以三个斜杠开头:`///`,多行注释以 `/**` 开头。这些注释被视为“文档”。 - -注意:你可以使用 Doxygen 从这些注释生成文档。但一般不会使用 Doxygen,因为在 IDE 中浏览代码更方便。 - -**9.** 多行注释的开头和结尾处不能有空行(关闭多行注释的那一行除外)。 - -**10.** 注释掉代码时使用普通注释,而不是“文档化”注释。 - -**11.** 在提交之前删除被注释掉的代码片段。 - -**12.** 不要在注释或代码中使用脏话或辱骂性用语。 - -**13.** 不要使用大写字母,也不要使用过多的标点符号。 - -```cpp -/// 这是什么鬼??? -``` - -**14.** 不要使用注释作为分隔符。 - -```cpp -///****************************************************** -``` - -**15.** 不要在评论中发起讨论。 - -```cpp -/// 为什么要执行这些操作? -``` - -**16.** 无需在代码块末尾再写注释来说明该块的作用。 - -```cpp -/// for -``` - - -## 命名 - -**1.** 变量名和类成员名应使用小写字母并以下划线分隔。 - -```cpp -size_t max_block_size; -``` - -**2.** 函数(方法)名使用以小写字母开头的驼峰命名法(camelCase)。 - -```cpp -std::string getName() const override { return "Memory"; } -``` - -**3.** 对于类(struct)的名称,使用首字母大写的 CamelCase。接口前缀只能使用 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` 和全局常量的名称使用全大写加下划线。 - -```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.** 如果缩写广为人知(例如你可以在Wikipedia或搜索引擎中轻松查到其含义),则可以使用缩写。 - -`AST`, `SQL`. - -不要写 `NVDH`(一些随机字母) - -如果截断形式是常用写法,则可以使用不完整的单词。 - -如果在注释中紧挨着给出了全称,你也可以使用缩写。 - -**17.** 包含 C++ 源代码的文件必须使用 `.cpp` 扩展名。头文件必须使用 `.h` 扩展名。 - - -## 如何编写代码 - -**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, "无法关闭文件 {}", file_name); -``` - -你可以使用 `assert` 在代码中检查不变量。 - -**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 核心上获得尽可能好的性能。如有需要,再对代码进行并行化。 - -在服务端应用程序中: - -* 使用线程池来处理请求。目前为止,我们还没有遇到需要在用户态进行上下文切换的任务。 - -不要使用 fork 进行并行化。 - -**8.** 线程同步。 - -很多情况下,可以让不同线程使用不同的内存单元(更好的是使用不同的缓存行),从而无需进行任何线程同步(除了 `joinAll`)。 - -如果需要同步,在大多数情况下,使用配合 `lock_guard` 的互斥量就足够了。 - -在其他情况下使用系统提供的同步原语。不要使用忙等待。 - -原子操作只应在最简单的场景中使用。 - -不要尝试实现无锁数据结构,除非这是你的主要专业领域。 - -**9.** 指针 vs 引用。 - -在大多数情况下,应优先使用引用。 - -**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` 来隐藏符号。 - -此外,可以为 `enum` 使用一个 `namespace`,以防止相应的名称进入外部 `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.** 日志记录。 - -参考代码中的各处示例。 - -在提交之前,删除所有无意义的和调试用的日志记录,以及任何其他类型的调试输出。 - -应尽量避免在循环中记录日志,即使是在 Trace 级别。 - -在任何日志级别下,日志都必须可读。 - -日志记录在大多数情况下只应在应用程序代码中使用。 - -日志消息必须用英语书写。 - -日志最好能让系统管理员容易理解。 - -不要在日志中使用粗话或脏话。 - -在日志中使用 UTF-8 编码。在少数情况下,你可以在日志中使用非 ASCII 字符。 - -**20.** 输入输出。 - -不要在对应用性能至关重要的内部循环中使用 `iostreams`(并且绝不要使用 `stringstream`)。 - -改用 `DB/IO` 库。 - -**21.** 日期和时间。 - -参见 `DateLUT` 库。 - -**22.** include。 - -一律使用 `#pragma once`,而不是头文件保护宏(include guards)。 - -**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++ 特性 - -**1.** 不使用虚继承。 - -**2.** 在现代 C++ 中具有便捷语法糖的构造,例如: - -```cpp -// 不使用语法糖的传统方式 -template ::value, void>> // 通过 std::enable_if 实现 SFINAE,使用 ::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() 创建 pair -} - -// 使用语法糖 (C++14/17/20) -template -requires std::same_v // 通过 C++20 concept 实现 SFINAE,使用 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); // 通过初始化列表或值初始化创建 pair (C++17) -} -``` - - -## 平台 {#platform} - -**1.** 我们为特定平台编写代码。 - -但在其他条件相同的情况下,更推荐编写跨平台或可移植的代码。 - -**2.** 语言:C++20(参见可用的 [C++20 功能列表](https://en.cppreference.com/w/cpp/compiler_support#C.2B.2B20_features))。 - -**3.** 编译器:`clang`。在撰写本文时(2025 年 3 月),代码使用版本 >= 19 的 clang 进行编译。 - -使用的标准库为 `libc++`。 - -**4.** 操作系统:Linux Ubuntu,不早于 Precise 版本。 - -**5.** 代码针对 x86_64 CPU 架构编写。 - -CPU 指令集为我们服务器中支持的最小公共子集,目前为 SSE 4.2。 - -**6.** 使用 `-Wall -Wextra -Werror -Weverything` 编译选项,但有少量例外。 - -**7.** 对除那些难以进行静态链接的库以外的所有库使用静态链接(参见 `ldd` 命令的输出)。 - -**8.** 使用发布(release)配置进行代码开发和调试。 - - - -## 工具 {#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.** 提交到 master 的变更不得导致构建失败。 - -虽然只有选定的修订版本会被视为可用版本。 - -**8.** 尽可能频繁地提交,即使代码只完成了一部分。 - -为此请使用分支。 - -如果你在 `master` 分支上的代码暂时还无法构建,在 `push` 之前将其从构建中排除。你需要在几天内完成它或将其删除。 - -**9.** 对于较为复杂的修改,请使用分支并将其发布到服务器上。 - -**10.** 未使用的代码会从仓库中删除。 - - - -## 库 {#libraries} - -**1.** 使用 C++20 标准库(允许使用 experimental 扩展特性),以及 `boost` 和 `Poco` 框架。 - -**2.** 不允许使用来自操作系统软件包的库,也不允许使用预装的库。所有库都应以源代码形式放在 `contrib` 目录中,并与 ClickHouse 一同构建。详情参见[添加新的第三方库指南](/development/contrib#adding-and-maintaining-third-party-libraries)。 - -**3.** 始终优先使用已经在使用的库。 - - - -## 通用建议 {#general-recommendations-1} - -**1.** 尽可能少写代码。 - -**2.** 优先尝试最简单的解决方案。 - -**3.** 在弄清楚代码将如何工作以及内部循环如何运作之前,不要开始写代码。 - -**4.** 在最简单的情况下,使用 `using` 而不是类或结构体。 - -**5.** 如果可能,不要编写拷贝构造函数、赋值运算符、析构函数(如果类中至少有一个虚函数,则虚析构函数除外)、移动构造函数或移动赋值运算符。换句话说,应保证编译器生成的函数就能正确工作。你可以使用 `default`。 - -**6.** 鼓励简化代码。在可能的情况下尽量减少代码量。 - - - -## 其他补充建议 - -**1.** 对来自 `stddef.h` 的类型显式添加 `std::` - -是不推荐的。换句话说,我们建议写 `size_t` 而不是 `std::size_t`,因为它更简洁。 - -不过,添加 `std::` 也是可以接受的。 - -**2.** 对来自标准 C 库的函数显式添加 `std::` - -是不推荐的。换句话说,请写 `memcpy` 而不是 `std::memcpy`。 - -原因在于存在类似的非标准函数,例如 `memmem`。我们有时会使用这些函数。这些函数并不存在于 `namespace std` 中。 - -如果你在所有地方都写 `std::memcpy` 而不是 `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/i18n/zh/docusaurus-plugin-content-docs/current/development/tests.md b/i18n/zh/docusaurus-plugin-content-docs/current/development/tests.md deleted file mode 100644 index 8c2ee07ad81..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/development/tests.md +++ /dev/null @@ -1,547 +0,0 @@ ---- -description: '测试 ClickHouse 和运行测试套件指南' -sidebar_label: '测试' -sidebar_position: 40 -slug: /development/tests -title: '测试 ClickHouse' -doc_type: 'guide' ---- - - - -# 测试 ClickHouse - - - -## 功能测试 - -功能测试是最简单、最易使用的一类测试。 -ClickHouse 的大部分特性都可以通过功能测试来验证,并且对于每一个可以用这种方式测试的 ClickHouse 代码变更,功能测试都是必需的。 - -每个功能测试都会向正在运行的 ClickHouse 服务器发送一个或多个查询,并将结果与基准结果进行比较。 - -测试位于 `./tests/queries` 目录中。 - -每个测试可以是两种类型之一:`.sql` 和 `.sh`。 - -* `.sql` 测试是通过管道传递给 `clickhouse-client` 的简单 SQL 脚本。 -* `.sh` 测试是一个自行运行的脚本。 - -通常应优先使用 SQL 测试,而不是 `.sh` 测试。 -只有当你必须测试某些无法仅通过纯 SQL 触发的功能时,才应使用 `.sh` 测试,例如通过管道向 `clickhouse-client` 传入一些输入数据,或者测试 `clickhouse-local`。 - -:::note -在测试 `DateTime` 和 `DateTime64` 数据类型时,一个常见错误是误以为服务器会使用某个特定时区(例如 “UTC”)。实际情况并非如此,在 CI 测试运行中,时区是被刻意随机化的。最简单的解决办法是为测试值显式指定时区,例如 `toDateTime64(val, 3, 'Europe/Amsterdam')`。 -::: - -### 在本地运行测试 - -在本地启动 ClickHouse 服务器,并监听默认端口(9000)。 -例如,要运行测试 `01428_hash_set_nan_key`,切换到代码仓库目录并执行以下命令: - -```sh -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` 中)。 - -有关 `clickhouse-test` 的所有选项,请参阅 `tests/clickhouse-test --help`。 -可以运行全部测试,或者通过为测试名称提供过滤字符串来运行部分测试:`./clickhouse-test substring`。 -也可以选择并行运行测试,或以随机顺序运行测试。 - -### 添加新测试 - -要添加新测试,首先在 `queries/0_stateless` 目录中创建一个 `.sql` 或 `.sh` 文件。 -然后使用 `clickhouse-client < 12345_test.sql > 12345_test.reference` 或 `./12345_test.sh > ./12345_test.reference` 生成对应的 `.reference` 文件。 - -测试只能对预先自动创建好的 `test` 数据库中的表执行创建、删除、查询等操作。 -可以使用临时表。 - -要在本地搭建与 CI 中相同的环境,请安装测试配置(这些配置会使用 Zookeeper 的 mock 实现并调整部分设置)。 - -```sh -cd <仓库目录>/tests/config -sudo ./install.sh -``` - -:::note -测试应当 - -* 尽量精简:只创建最少必需的表、列和必要的复杂度, -* 快速:耗时不应超过几秒(最好是亚秒级), -* 正确且具有确定性:当且仅当被测功能不工作时才失败, -* 隔离/无状态:不要依赖环境和时间, -* 全面:覆盖零值、null、空集、异常等边界情况(负向测试请使用语法 `-- { serverError xyz }` 和 `-- { clientError xyz }`), -* 在测试结束时清理表(以防有残留), -* 确保其他测试不会测试相同内容(即先用 grep 检查)。 - ::: - -### 限制测试运行 - -一个测试可以具有零个或多个*标签*,用于指定该测试在 CI 中在哪些上下文中运行。 - -对于 `.sql` 测试,标签以 SQL 注释的形式放在第一行: - -```sql --- Tags: no-fasttest, no-replicated-database --- no-fasttest: <在此处提供该标签的原因> --- no-replicated-database: <在此处提供原因> - -SELECT 1 -``` - -对于 `.sh` 测试,标签写在第二行的注释中: - - -```bash -#!/usr/bin/env bash -# Tags: no-fasttest, no-replicated-database -# - no-fasttest: <请在此处说明使用该标签的原因> -# - no-replicated-database: <请在此处说明原因> -``` - -可用标签列表: - -| Tag name | 功能说明 | 使用示例 | -| --------------------------------- | ---------------------------------------------------------- | --------------------------------------- | -| `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` | 在 [Fast test](continuous-integration.md#fast-test) 中不运行该测试 | 测试使用在 Fast test 中被禁用的 `MySQL` 表引擎 | -| `fasttest-only` | 仅在 [Fast test](continuous-integration.md#fast-test) 中运行该测试 | | -| `no-[asan, tsan, msan, ubsan]` | 在带有 [sanitizers](#sanitizers) 的构建中禁用该测试 | 测试在 QEMU 下运行,而 QEMU 无法与 sanitizers 配合使用 | -| `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` | | | - -除上述设置外,你还可以使用 `system.build_options` 中的 `USE_*` 标志来定义是否使用特定的 ClickHouse 特性。 -例如,如果你的测试使用了 MySQL 表,则应添加标签 `use-mysql`。 - -### 为随机设置指定限制 - -测试可以为在测试运行期间被随机化的设置指定允许的最小值和最大值。 - -对于 `.sh` 测试,限制写为一条注释,放在标签所在行的后面;如果没有指定标签,则放在第二行注释中: - - -```bash -#!/usr/bin/env bash -# Tags: no-fasttest -# 随机设置限制:max_block_size=(1000, 10000); index_granularity=(100, None) -``` - -对于 `.sql` 测试,标签以 SQL 注释的形式写在相邻的一行,或写在第一行: - -```sql --- 标签:no-fasttest --- 随机设置限制:max_block_size=(1000, 10000); index_granularity=(100, None) -SELECT 1 -``` - -如果你只需要指定其中一个限制值,可以将另一个设置为 `None`。 - -### 选择测试名称 - -测试名称以五位数字前缀开头,后面跟一个描述性名称,例如 `00422_hash_function_constexpr.sql`。 -要选择前缀,先在目录中找到已经存在的最大前缀,然后将其加一。 - -```sh -ls tests/queries/0_stateless/[0-9]*.reference | tail -n 1 -``` - -与此同时,可能会添加一些具有相同数字前缀的其他测试,但这没问题,不会导致任何问题,你之后也不需要对其进行修改。 - -### 检查必须出现的错误 - -有时你希望测试,当查询不正确时会出现服务器错误。我们在 SQL 测试中为此提供了特殊注解,形式如下: - -```sql -SELECT x; -- { serverError 49 } -``` - -此测试用于确保服务器返回关于未知列 `x` 的、错误码为 49 的错误。 -如果没有错误,或者错误不同,则测试会失败。 -如果你想确保在客户端一侧触发错误,请使用 `clientError` 注解。 - -不要检查错误消息的具体措辞,因为它将来可能会改变,从而导致测试不必要地失败。 -只检查错误码。 -如果现有的错误码对你的需求不够精确,可以考虑新增一个错误码。 - -### 测试分布式查询 - -如果你想在功能测试中使用分布式查询,可以使用 `remote` 表函数,并使用 `127.0.0.{1..2}` 这些地址让服务器查询自身;或者你也可以在服务器配置文件中使用预定义的测试集群,例如 `test_shard_localhost`。 -记得在测试名称中加入 `shard` 或 `distributed` 这样的关键词,以便在 CI 中在正确的配置下运行该测试,即服务器已配置为支持分布式查询。 - -### 使用临时文件 - -有时在 shell 测试中,你可能需要临时创建一个文件用于操作。 -请注意,某些 CI 检查会并行运行测试,因此如果你在脚本中创建或删除的临时文件没有唯一名称,就可能导致某些 CI 检查(例如 “Flaky”)失败。 -为避免这种情况,你应当使用环境变量 `$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 驱动程序的集成测试。 - - - -## 单元测试 - -当你希望测试的不是整个 ClickHouse,而是某个独立的库或类时,单元测试会非常有用。 -你可以通过 `ENABLE_TESTS` CMake 选项来启用或禁用测试的构建。 -单元测试(以及其他测试程序)位于代码中的 `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`,它只对 stdin 做词法分析,并将着色后的结果写入 stdout。 -你可以将这类工具用作代码示例,也可用于探索和手动测试。 - - - -## 其他测试 {#miscellaneous-tests} - -在 `tests/external_models` 中有针对机器学习模型的测试。 -这些测试目前不再维护,必须迁移为集成测试。 - -有一个单独的测试用于 quorum 插入。 -该测试在独立的服务器上运行 ClickHouse 集群,并模拟各种故障场景:网络分裂、丢包(ClickHouse 节点之间、ClickHouse 与 ZooKeeper 之间、ClickHouse 服务器与客户端之间等)、`kill -9`、`kill -STOP` 和 `kill -CONT`,类似 [Jepsen](https://aphyr.com/tags/Jepsen)。然后该测试检查,所有已确认的插入是否都已写入,以及所有被拒绝的插入是否都未写入。 - -Quorum 测试是在 ClickHouse 开源之前由一个独立团队编写的。 -该团队已不再参与 ClickHouse 的工作。 -该测试当时是意外地用 Java 编写的。 -出于上述原因,需要将 quorum 测试重写并迁移为集成测试。 - - - -## 手动测试 - -在开发新功能时,对其进行手动测试也是合理的。 -你可以按照以下步骤进行: - -构建 ClickHouse。从终端运行 ClickHouse:切换目录到 `programs/clickhouse-server` 并通过 `./clickhouse-server` 运行它。默认情况下,它会使用当前目录中的配置(`config.xml`、`users.xml` 以及 `config.d` 和 `users.d` 目录中的文件)。要连接到 ClickHouse 服务器,运行 `programs/clickhouse-client/clickhouse-client`。 - -请注意,所有 ClickHouse 工具(server、client 等)实际上都只是指向名为 `clickhouse` 的单个二进制文件的符号链接。 -你可以在 `programs/clickhouse` 中找到这个二进制文件。 -所有工具也都可以通过 `clickhouse tool` 的方式调用,而不是 `clickhouse-tool`。 - -另外,你也可以安装 ClickHouse 软件包:可以从 ClickHouse 软件仓库安装稳定版发布,或者在 ClickHouse 源码根目录中通过 `./release` 自行构建软件包。 -然后通过 `sudo clickhouse start` 启动服务器(或使用 `sudo clickhouse 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.xml` 中修改端口号(或在 `config.d` 目录中的文件里覆盖这些端口),指定合适的数据路径,然后运行它。 - -`clickhouse` 二进制可执行文件几乎没有依赖,并且可以在各种 Linux 发行版上运行。 -为了在服务器上快速、临时地测试你的修改,你可以直接通过 `scp` 将新构建好的 `clickhouse` 二进制文件复制到服务器上,然后按上述示例的方式运行它。 - - -## 构建测试 {#build-tests} - -构建测试用于检查在各种替代配置和某些其他系统上,构建是否正常、不出问题。 -这些测试同样是自动化执行的。 - -示例: -- 为 Darwin x86_64(macOS)进行交叉编译 -- 为 FreeBSD x86_64 进行交叉编译 -- 为 Linux AArch64 进行交叉编译 -- 在 Ubuntu 上使用系统软件包中的库进行构建(不推荐) -- 使用共享库链接方式进行构建(不推荐) - -例如,使用系统软件包进行构建是一种不好的实践,因为我们无法保证系统中会有哪些软件包以及它们的确切版本。 -但 Debian 维护者确实需要这样做。 -因此,我们至少必须支持这种构建方式。 -另一个例子:共享库链接是常见的问题来源,但有些爱好者仍然需要它。 - -尽管我们无法在所有构建变体上运行全部测试,但我们至少希望确保各种构建变体本身没有问题。 -为此我们使用构建测试。 - -我们还会测试不存在过长、以至于难以编译或需要过多内存的翻译单元。 - -我们也会测试不存在过大的栈帧。 - - - -## 测试协议兼容性 {#testing-for-protocol-compatibility} - -在对 ClickHouse 网络协议进行扩展时,我们会手动测试旧版本的 clickhouse-client 是否能与新版本的 clickhouse-server 一起工作,以及新版本的 clickhouse-client 是否能与旧版本的 clickhouse-server 一起工作(只需运行相应软件包中的二进制文件)。 - -我们还通过集成测试自动验证部分情况: -- 旧版本 ClickHouse 写入的数据是否可以被新版本成功读取; -- 在包含不同 ClickHouse 版本的集群中,分布式查询是否可以正常工作。 - - - -## 来自编译器的帮助 {#help-from-the-compiler} - -主 ClickHouse 代码(位于 `src` 目录)是在启用 `-Wall -Wextra -Werror` 以及若干额外警告的情况下进行构建的。 -不过,这些选项不会对第三方库启用。 - -Clang 提供了更多有用的警告选项——可以通过 `-Weverything` 查看全部警告,然后选择一部分作为默认构建配置。 - -我们在开发和生产环境中一律使用 clang 来构建 ClickHouse。 -可以在本机以调试模式进行构建(以节省笔记本电脑电量),但请注意,编译器在使用 `-O3` 时,由于具备更好的控制流和过程间分析能力,能够生成更多警告。 -在使用 clang 以调试模式进行构建时,将会使用 `libc++` 的调试版本,从而可以在运行时捕获更多错误。 - - - -## Sanitizer 工具 {#sanitizers} - -:::note -如果在本地运行时进程(ClickHouse 服务器或客户端)在启动时崩溃,可能需要禁用地址空间布局随机化:`sudo sysctl kernel.randomize_va_space=0` -::: - -### Address sanitizer {#address-sanitizer} - -我们会在每次提交时,使用 ASan 运行功能测试、集成测试、压力测试和单元测试。 - -### Thread sanitizer {#thread-sanitizer} - -我们会在每次提交时,使用 TSan 运行功能测试、集成测试、压力测试和单元测试。 - -### Memory sanitizer {#memory-sanitizer} - -我们会在每次提交时,使用 MSan 运行功能测试、集成测试、压力测试和单元测试。 - -### Undefined behaviour sanitizer {#undefined-behaviour-sanitizer} - -我们会在每次提交时,使用 UBSan 运行功能测试、集成测试、压力测试和单元测试。 -某些第三方库的代码未启用 UB Sanitizer。 - -### Valgrind (memcheck) {#valgrind-memcheck} - -我们过去会使用 Valgrind 进行功能测试,并运行一整夜,但现在不再这样做。 -这通常需要耗费数小时。 -当前在 `re2` 库中有一个已知的误报,参见[这篇文章](https://research.swtch.com/sparse)。 - - - -## 模糊测试 {#fuzzing} - -ClickHouse 的模糊测试既通过 [libFuzzer](https://llvm.org/docs/LibFuzzer.html) 实现,也通过随机 SQL 查询实现。 -所有模糊测试都应在启用 Sanitizer(AddressSanitizer 和 UndefinedBehaviorSanitizer)的情况下运行。 - -LibFuzzer 用于对库代码进行隔离的模糊测试。 -模糊器作为测试代码的一部分实现,名称以 `_fuzzer` 作为后缀。 -模糊器示例可在 `src/Parsers/fuzzers/lexer_fuzzer.cpp` 中找到。 -LibFuzzer 专用的配置、字典和语料库存放在 `tests/fuzz` 中。 -我们鼓励你为所有处理用户输入的功能编写模糊测试。 - -模糊器默认不会被构建。 -要构建模糊器,需要同时设置 `-DENABLE_FUZZING=1` 和 `-DENABLE_TESTS=1` 选项。 -我们建议在构建模糊器时禁用 Jemalloc。 -用于将 ClickHouse 模糊测试集成到 Google OSS-Fuzz 的配置可以在 `docker/fuzz` 中找到。 - -我们还使用一个简单的模糊测试来生成随机 SQL 查询,并检查服务器在执行这些查询时不会崩溃。 -你可以在 `00746_sql_fuzzy.pl` 中找到该测试。 -此测试应持续运行(例如通宵及更长时间)。 - -我们还使用一个更为复杂的基于 AST 的查询模糊器,它能够发现大量边界情况。 -它会对查询 AST 进行随机排列和替换。 -它会记住前面测试中的 AST 节点,以便在后续测试中按随机顺序处理这些测试时,用这些节点继续进行模糊测试。 -你可以在[这篇博客文章](https://clickhouse.com/blog/fuzzing-click-house)中进一步了解此模糊器。 - - - -## 压力测试 {#stress-test} - -压力测试是模糊测试的另一种形式。 -它会在单个服务器上,以随机顺序并行运行所有功能性测试。 -不会对测试结果本身进行检查。 - -会检查以下内容: -- 服务器不会崩溃,不会触发任何调试或 sanitizer 断点/陷阱; -- 不会出现死锁; -- 数据库结构保持一致; -- 测试结束后服务器可以正常停止,并且再次启动时不会抛出异常。 - -共有五种构建(Debug、ASan、TSan、MSan、UBSan)。 - - - -## 线程模糊测试器 {#thread-fuzzer} - -线程模糊测试器(请不要与 Thread Sanitizer 混淆)是一种针对线程的模糊测试方式,用于随机化线程的执行顺序。 -它有助于发现更多特殊边界情况。 - - - -## 安全审计 {#security-audit} - -我们的安全团队从安全角度对 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` 对 shell 脚本进行静态分析。 - - - -## 加固 {#hardening} - -在调试构建中,我们使用自定义分配器,对用户态内存分配执行 ASLR 随机化。 - -我们还会手动保护那些在分配后预期应为只读的内存区域。 - -在调试构建中,我们还对 libc 做了定制,以确保不会调用任何“有害的”(过时、不安全、非线程安全的)函数。 - -大量使用调试断言。 - -在调试构建中,如果抛出了带有 “logical error” 代码的异常(意味着存在 Bug),程序会被立即终止。 -这使得在发布构建中可以继续使用异常,而在调试构建中则将其视为断言。 - -在调试构建中使用 jemalloc 的调试版本。 -在调试构建中使用 libc++ 的调试版本。 - - - -## 运行时完整性检查 {#runtime-integrity-checks} - -存储在磁盘上的数据都会进行校验和。 -MergeTree 表中的数据会同时通过三种方式进行校验和*(压缩数据块、未压缩数据块、跨数据块的总校验和)。 -在客户端与服务器之间或服务器之间通过网络传输的数据同样会进行校验和。 -复制机制确保副本上的数据在比特级完全一致。 - -这是为了防范故障硬件(存储介质上的位腐烂 bit rot、服务器 RAM 中的比特翻转、网络控制器 RAM 中的比特翻转、网络交换机 RAM 中的比特翻转、客户端 RAM 中的比特翻转、传输线路上的比特翻转)。 -请注意,比特翻转很常见,即使在使用 ECC RAM 且启用了 TCP 校验和的情况下也很可能发生(如果你运行成千上万台服务器,每天处理 PB 级数据)。 -[观看视频(俄语)](https://www.youtube.com/watch?v=ooBAQIe0KlQ)。 - -ClickHouse 提供诊断功能,帮助运维工程师发现故障硬件。 - -\* 而且这并不会很慢。 - - - -## 代码风格 {#code-style} - -代码风格规则见[此处](style.md)。 - -要检查一些常见的风格违规情况,你可以使用 `utils/check-style` 脚本。 - -要使你的代码自动符合规范的风格,你可以使用 `clang-format`。 -`.clang-format` 文件位于源代码根目录。 -它大体上与我们实际的代码风格相对应。 -但不推荐将 `clang-format` 应用于现有文件,因为这通常会使格式变得更糟。 -你可以使用 `clang-format-diff` 工具,你可以在 clang 源码仓库中找到它。 - -或者,你也可以尝试使用 `uncrustify` 工具来重新格式化你的代码。 -配置文件 `uncrustify.cfg` 位于源代码根目录。 -它的测试不如 `clang-format` 充分。 - -`CLion` 有自带的代码格式化工具,需要根据我们的代码风格进行调整。 - -我们也使用 `codespell` 来查找代码中的拼写错误。 -这也已经实现了自动化。 - - - -## 测试覆盖率 {#test-coverage} - -我们也会统计测试覆盖率,但仅针对 clickhouse-server 的功能测试。 -相关工作会按天执行。 - - - -## 测试的测试 {#tests-for-tests} - -我们有一个用于检测不稳定测试的自动检查机制。 -它会将所有新增的功能测试运行 100 次,或将所有新增的集成测试运行 10 次。 -如果某个测试在这些运行中至少有一次失败,就会被视为不稳定测试。 - - - -## 测试自动化 {#test-automation} - -我们使用 [GitHub Actions](https://github.com/features/actions) 来运行测试。 - -每次提交都会在 Sandbox 中运行构建任务和测试。 -生成的软件包和测试结果会发布到 GitHub,并可通过直接链接下载。 -构建产物会被保留数个月。 -当你在 GitHub 上提交 pull request 时,我们会将其标记为“can be tested”,CI 系统会为你构建 ClickHouse 软件包(release、debug、带 address sanitizer 等)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/dictionary/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/dictionary/index.md index 1b6bdf69811..03d717ad336 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/dictionary/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/dictionary/index.md @@ -1,8 +1,8 @@ --- slug: /dictionary -title: '数据字典' -keywords: ['数据字典', '字典'] -description: '数据字典以键值对形式组织数据,便于快速查找。' +title: '字典' +keywords: ['dictionary', 'dictionaries'] +description: '字典以键值对形式表示数据,以支持快速查找。' doc_type: 'reference' --- @@ -11,36 +11,35 @@ import dictionaryLeftAnyJoin from '@site/static/images/dictionary/dictionary-lef import Image from '@theme/IdealImage'; -# Dictionary +# 字典 {#dictionary} -ClickHouse 中的 Dictionary 提供了一种在内存中以[键值](https://en.wikipedia.org/wiki/Key%E2%80%93value_database)形式表示来自多种[内部和外部数据源](/sql-reference/dictionaries#dictionary-sources)的数据的机制,并针对超低延迟的查找查询进行了优化。 +ClickHouse 中的字典以内存中的 [key-value](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) 形式表示来自各种[内部和外部数据源](/sql-reference/dictionaries#dictionary-sources)的数据,并针对超低延迟的查找查询进行了优化。 -Dictionary 适用于: -- 提升查询性能,特别是在与 `JOIN` 配合使用时 -- 在不减慢摄取过程的情况下,对摄取数据进行实时丰富 +字典可用于: -ClickHouse 中 Dictionary 的使用场景 +- 提高查询性能,尤其是在与 `JOIN` 一起使用时 +- 在不减慢摄取过程的情况下,实时丰富已摄取的数据 +ClickHouse 中字典的使用场景 +## 使用字典加速 JOIN {#speeding-up-joins-using-a-dictionary} -## 使用 Dictionary 加速 JOIN +字典(Dictionary)可以用于加速特定类型的 `JOIN`:即 [`LEFT ANY` 类型](/sql-reference/statements/select/join#supported-types-of-join),其中 JOIN 键需要与底层键值存储的键属性匹配。 -Dictionaries 可用于加速特定类型的 `JOIN`:即 [`LEFT ANY` 类型](/sql-reference/statements/select/join#supported-types-of-join),其中 JOIN 键需要与底层键值存储的键属性匹配。 +Using Dictionary with LEFT ANY JOIN -在 LEFT ANY JOIN 中使用 Dictionary +在这种情况下,ClickHouse 可以利用字典来执行 [Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join)。这是 ClickHouse 中最快的 JOIN 算法,适用于右表的底层[表引擎](/engines/table-engines)支持低延迟键值请求的场景。ClickHouse 为此提供了三种表引擎:[Join](/engines/table-engines/special/join)(本质上是预计算的哈希表)、[EmbeddedRocksDB](/engines/table-engines/integrations/embedded-rocksdb) 和 [Dictionary](/engines/table-engines/special/dictionary)。我们将介绍基于字典的方案,但三种引擎的机制是相同的。 -在这种情况下,ClickHouse 可以利用 Dictionary 执行 [Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join)。这是 ClickHouse 速度最快的 JOIN 算法,适用于右表的底层 [table engine](/engines/table-engines) 支持低延迟键值请求的场景。ClickHouse 提供了三种满足该条件的表引擎:[Join](/engines/table-engines/special/join)(本质上是一个预计算哈希表)、[EmbeddedRocksDB](/engines/table-engines/integrations/embedded-rocksdb) 和 [Dictionary](/engines/table-engines/special/dictionary)。我们将重点介绍基于 Dictionary 的方法,但这三种引擎的机制是相同的。 +Direct Join 算法要求右表由字典驱动,这样来自该表、需要参与 JOIN 的数据就已经以内存中的低延迟键值数据结构形式存在。 -Direct Join 算法要求右表由 Dictionary 提供支持,即该表中需要参与 JOIN 的数据已以内存中的低延迟键值数据结构形式存在。 +### 示例 {#example} -### 示例 +使用 [Stack Overflow 数据集](/getting-started/example-datasets/stackoverflow),来回答这样一个问题: +*在 Hacker News 上,关于 SQL 的帖子中,哪一条是最具争议性的?* -使用 Stack Overflow 数据集,让我们来回答这个问题: -*关于 SQL 的哪条 Hacker News 帖子最具争议性?* +我们将“有争议性”定义为:帖子获得的赞成票和反对票数量相近。我们会计算这两者的绝对差值,数值越接近 0,代表争议越大。我们还假设帖子必须至少有 10 个赞成票和 10 个反对票——几乎没人投票的帖子并不算很有争议。 -我们将“具争议性”定义为:帖子获得的赞成票和反对票数量相近。我们计算两者的绝对差值,值越接近 0 表示争议越大。我们假定帖子至少要有 10 个赞成票和 10 个反对票——没人投票的帖子并不算很有争议。 - -在数据已规范化的前提下,这个查询目前需要在 `posts` 和 `votes` 表之间执行一次 `JOIN`: +在对数据进行规范化之后,这个查询目前需要对 `posts` 表和 `votes` 表执行一次 `JOIN` 操作: ```sql WITH PostIds AS @@ -79,38 +78,38 @@ UpVotes: 13 DownVotes: 13 Controversial_ratio: 0 -返回 1 行。用时:1.283 秒。已处理 4.1844 亿行,7.23 GB(3.2607 亿行/秒,5.63 GB/秒)。 -内存峰值:3.18 GiB。 +结果集包含 1 行。耗时: 1.283 秒。处理了 4.1844 亿行,7.23 GB (每秒 3.2607 亿行,5.63 GB/秒)。 +峰值内存使用: 3.18 GiB。 ``` -> **在 `JOIN` 的右侧使用较小的数据集**:这个查询看起来比必要的更冗长,因为对 `PostId` 的过滤同时发生在外层查询和子查询中。这是一种性能优化,用于确保查询响应时间足够快。为了获得最佳性能,请始终确保 `JOIN` 右侧的数据集较小,并尽可能小。关于如何优化 JOIN 性能以及了解可用算法的更多提示,我们推荐阅读[这一系列博客文章](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)。 +> **在 `JOIN` 的右侧使用较小的数据集**:这个查询看起来比实际需要的更啰嗦一些,因为对 `PostId` 的过滤同时出现在外层查询和子查询中。这是一种性能优化,用于确保查询响应时间足够快。为了获得最佳性能,应始终确保 `JOIN` 右侧的数据集更小,并且尽可能小。关于优化 JOIN 性能以及理解可用算法的建议,我们推荐阅读[这系列博客文章](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)。 -虽然这个查询很快,但它依赖我们谨慎地编写 `JOIN` 才能获得良好的性能。理想情况下,我们只需先将帖子过滤为那些包含 “SQL” 的内容,然后再查看这一子集博客的 `UpVote` 和 `DownVote` 计数来计算我们的指标。 +虽然这个查询很快,但它要求我们在编写 `JOIN` 时格外小心,才能获得良好的性能。理想情况下,我们只需先过滤出包含“SQL”的帖子,然后再查看这部分帖子对应的 `UpVote` 和 `DownVote` 计数来计算我们的指标。 -#### 使用字典 -为了演示这些概念,我们为投票数据使用字典。由于字典通常存放在内存中([ssd_cache](/sql-reference/dictionaries#ssd_cache) 是个例外),用户应当注意数据的大小。先确认一下我们的 `votes` 表的大小: +#### 应用字典 {#applying-a-dictionary} +为了演示这些概念,我们为投票数据使用一个字典。由于字典通常存放在内存中([ssd_cache](/sql-reference/dictionaries#ssd_cache) 是一个例外),用户应当注意数据的大小。先确认一下我们的 `votes` 表的大小: ```sql -SELECT 表, - formatReadableSize(sum(data_compressed_bytes)) AS 压缩后大小, - formatReadableSize(sum(data_uncompressed_bytes)) AS 未压缩大小, - round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS 压缩比 +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 表 IN ('votes') -GROUP BY 表 +WHERE table IN ('votes') +GROUP BY table -┌─表───────────┬─压缩后大小─┬─未压缩大小─┬─压缩比─┐ +┌─table───────────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ │ votes │ 1.25 GiB │ 3.79 GiB │ 3.04 │ └─────────────────┴─────────────────┴───────────────────┴───────┘ ``` -数据将在我们的字典中以未压缩形式存储,因此如果要在字典中存储所有列(实际我们不会这么做),则至少需要 4GB 内存。字典会在集群中的各个节点间进行复制,因此这部分内存需要为*每个节点*预留。 +数据将在我们的字典中以未压缩形式存储,因此如果要将所有列(实际上我们不会这样做)都存入字典,至少需要 4GB 内存。字典会在集群中进行复制,因此这部分内存需要 *按节点* 预留。 -> 在下面的示例中,我们字典的数据来源于一张 ClickHouse 表。虽然这是最常见的字典数据源,但还支持[多种数据源](/sql-reference/dictionaries#dictionary-sources),包括文件、HTTP,以及包含 [Postgres](/sql-reference/dictionaries#postgresql) 在内的各类数据库。正如下文所示,字典可以自动刷新,是确保那些经常变动的小型数据集始终可以用于直接 JOIN 的理想方式。 +> 在下面的示例中,我们字典的数据来源于一个 ClickHouse 表。虽然这是字典最常见的数据源,但还支持[多种数据源](/sql-reference/dictionaries#dictionary-sources),包括文件、HTTP 以及包括 [Postgres](/sql-reference/dictionaries#postgresql) 在内的各类数据库。正如我们将展示的那样,字典可以自动刷新,为小型且经常变更的数据集提供了一种理想方式,使其可用于直接进行 join 操作。 -我们的字典需要一个用于执行查找的主键。在概念上,它与事务型数据库中的主键相同,并且应当是唯一的。上面的查询需要在关联键 `PostId` 上进行查找。字典本身则应填充为来自 `votes` 表的每个 `PostId` 的赞成票和反对票的总数。下面是获取该字典数据的查询: +我们的字典需要一个用于执行查找的主键。这在概念上与事务型数据库中的主键相同,并且必须唯一。上面的查询需要在 join 键 `PostId` 上执行查找。字典应相应地填充为来自 `votes` 表的每个 `PostId` 的赞成票和反对票总数。下面是获取该字典数据的查询: ```sql SELECT PostId, @@ -120,7 +119,7 @@ FROM votes GROUP BY PostId ``` -要创建我们的字典,我们需要执行以下 DDL——请注意其中使用了上面的查询: +要创建我们的字典,需要使用以下 DDL——请注意其中使用了上面的查询: ```sql CREATE DICTIONARY votes_dict @@ -137,9 +136,9 @@ LAYOUT(HASHED()) 0 rows in set. Elapsed: 36.063 sec. ``` -> 在自管理的开源部署中,需要在所有节点上执行上述命令。在 ClickHouse Cloud 中,字典会自动复制到所有节点。上述命令是在一台具有 64GB 内存的 ClickHouse Cloud 节点上执行的,加载耗时 36 秒。 +> 在自管理 OSS 中,需要在所有节点上执行上述命令。在 ClickHouse Cloud 中,字典会自动复制到所有节点。上述操作是在一台具有 64GB 内存的 ClickHouse Cloud 节点上执行的,加载耗时 36 秒。 -要确认我们的字典占用的内存: +要确认我们的字典内存占用情况: ```sql SELECT formatReadableSize(bytes_allocated) AS size @@ -151,7 +150,8 @@ WHERE name = 'votes_dict' └──────────┘ ``` -现在,你可以通过一个简单的 `dictGet` 函数来获取特定 `PostId` 的赞成票和反对票数。下面我们检索帖子 `11227902` 的这些值: +现在,可以通过一个简单的 `dictGet` FUNCTION 来获取特定 `PostId` 的赞成票和反对票。下面我们检索 `PostId` 为 `11227902` 的帖子对应的这些值: + ```sql SELECT dictGet('votes_dict', ('UpVotes', 'DownVotes'), '11227902') AS votes @@ -177,16 +177,16 @@ WHERE (Id IN (PostIds)) AND (UpVotes > 10) AND (DownVotes > 10) ORDER BY Controversial_ratio ASC LIMIT 3 -返回 3 行。耗时:0.551 秒。处理了 1.1964 亿行,3.29 GB(2.1696 亿行/秒,5.97 GB/秒)。 +返回 3 行。耗时:0.551 秒。处理了 1.1964 亿行,3.29 GB(每秒 2.1696 亿行,5.97 GB/秒)。 峰值内存使用量:552.26 MiB。 ``` -这个查询不仅更加简单,而且执行速度也快了两倍多!还可以进一步优化,只将赞成票和反对票合计超过 10 的帖子加载到字典中,并只存储预先计算好的“争议度”数值。 +这个查询不仅简单得多,而且速度也提升了两倍多!还可以通过只将赞成票和反对票之和超过 10 的帖子加载到字典中,并仅存储预先计算好的争议度值来进一步优化。 -## 查询时富化 +## 查询时富化 {#query-time-enrichment} -可以在查询时使用字典来查找值。这些值可以直接在结果中返回,或用于聚合操作。假设我们创建一个字典,用于将用户 ID 映射到其位置: +字典可以用于在查询时查找值。这些值可以在查询结果中返回,或用于聚合运算。假设我们创建一个字典,将用户 ID 映射到其所在地: ```sql CREATE DICTIONARY users_dict @@ -200,7 +200,7 @@ LIFETIME(MIN 600 MAX 900) LAYOUT(HASHED()) ``` -我们可以使用此字典来丰富查询结果: +我们可以使用该字典来丰富 POST 请求的结果: ```sql SELECT @@ -213,18 +213,18 @@ LIMIT 5 FORMAT PrettyCompactMonoBlock ┌───────Id─┬─Title─────────────────────────────────────────────────────────┬─Location──────────────┐ -│ 52296928 │ ClickHouse 中两个字符串的比较 │ Spain │ -│ 52345137 │ 如何使用文件将数据从 MySQL 迁移到 ClickHouse? │ 中国江苏省Nanjing Shi │ -│ 61452077 │ 如何在 ClickHouse 中更改 PARTITION │ Guangzhou, 广东省中国 │ -│ 55608325 │ ClickHouse 在不使用 max() 的情况下选择表中最后一条记录 │ Moscow, Russia │ -│ 55758594 │ ClickHouse 创建临时表 │ Perm', Russia │ +│ 52296928 │ Comparison 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 行。耗时:0.033 秒。处理了 425 万行,82.84 MB(每秒 1.3062 亿行,2.55 GB/秒)。 -峰值内存使用量:249.32 MiB。 +返回 5 行。用时:0.033 秒。处理了 425 万行,82.84 MB(每秒 1.3062 亿行,2.55 GB/秒)。 +内存峰值:249.32 MiB。 ``` -与上面的 JOIN 示例类似,我们可以使用同一个字典高效地确定大多数帖子来自哪里: +与上面的 join 示例类似,我们可以使用同一个字典,高效判断大部分帖子是从哪里发出的: ```sql SELECT @@ -249,13 +249,13 @@ LIMIT 5 ``` -## 索引时富化 +## 索引时富化 {#index-time-enrichment} -在上面的示例中,我们在查询时使用了字典来去掉一次 JOIN。字典也可以在插入时用于对行进行富化。通常当富化值不会变化,并且存在于可用于填充字典的外部数据源中时,这种方式是合适的。在这种情况下,在插入时对行进行富化可以避免在查询时再去查找字典。 +在上面的示例中,我们在查询时使用字典来避免一次 join 操作。字典也可以用于在插入时对行进行富化。如果富化值不会变化,并且存在于可用于填充字典的外部数据源中,这通常是一个合适的做法。在这种情况下,在插入时对行进行富化可以避免在查询时对字典进行查找。 -假设 Stack Overflow 中用户的 `Location` 从不改变(实际上是会变的)——更具体地说是 `users` 表的 `Location` 列。假设我们希望在 `posts` 表上按位置进行分析查询。`posts` 表中包含一个 `UserId`。 +假设 Stack Overflow 中某个用户的 `Location` 永远不变(实际上会变)——具体来说,是 `users` 表中的 `Location` 列。假设我们希望对 `posts` 表按地点进行分析查询。该表包含一个 `UserId`。 -字典提供了一个从用户 id 到位置的映射,并以 `users` 表为后端: +字典提供了从用户 ID 到位置信息的映射,并以 `users` 表为数据源: ```sql CREATE DICTIONARY users_dict @@ -269,9 +269,9 @@ LIFETIME(MIN 600 MAX 900) LAYOUT(HASHED()) ``` -> 我们忽略 `Id < 0` 的用户,以便可以使用 `Hashed` 字典类型。`Id < 0` 的用户是系统用户。 +> 我们排除 `Id < 0` 的用户,这样就可以使用 `Hashed` 字典类型。`Id < 0` 的用户是系统用户。 -要在向 `posts` 表插入数据时利用这个字典,我们需要修改该表的 schema: +为了在向 posts 表插入数据时利用这个字典,我们需要修改表结构(schema): ```sql CREATE TABLE posts_with_location @@ -285,11 +285,11 @@ ENGINE = MergeTree ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) ``` -在上面的示例中,`Location` 被声明为一个 `MATERIALIZED` 列。这意味着该值可以作为 `INSERT` 查询的一部分提供,并且始终会被计算。 +在上面的示例中,`Location` 被声明为 `MATERIALIZED` 列。这意味着其值可以作为 `INSERT` 查询的一部分提供,并且始终会被计算。 -> ClickHouse 也支持 [`DEFAULT` 列](/sql-reference/statements/create/table#default_values)(在这种情况下,值既可以被显式插入,也可以在未提供时自动计算)。 +> ClickHouse 还支持 [`DEFAULT` columns](/sql-reference/statements/create/table#default_values)(在这种情况下,如果未提供值,则可以插入该值或由系统计算)。 -为了向该表填充数据,我们可以像往常一样从 S3 使用 `INSERT INTO SELECT`: +为了填充该表,我们可以像往常一样使用来自 S3 的 `INSERT INTO SELECT`: ```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') @@ -297,7 +297,7 @@ INSERT INTO posts_with_location SELECT Id, PostTypeId::UInt8, AcceptedAnswerId, 返回 0 行。耗时:36.830 秒。处理了 2.3898 亿行,2.64 GB(649 万行/秒,71.79 MB/秒) ``` -现在我们可以找出大多数帖子发布地点的名称: +现在我们可以获取大多数帖子发布地的名称: ```sql SELECT Location, count() AS c @@ -314,29 +314,29 @@ LIMIT 4 │ London, United Kingdom │ 538738 │ └────────────────────────┴────────┘ -4 行结果。耗时:0.142 秒。处理了 59.82 百万行,1.08 GB(420.73 百万行/秒,7.60 GB/秒)。 -峰值内存使用:666.82 MiB。 +返回 4 行。用时:0.142 秒。已处理 5982 万行,1.08 GB(420.73 百万行/秒,7.60 GB/秒)。 +内存峰值:666.82 MiB。 ``` -## 字典进阶主题 {#advanced-dictionary-topics} +## 字典高级主题 {#advanced-dictionary-topics} ### 选择字典 `LAYOUT` {#choosing-the-dictionary-layout} -`LAYOUT` 子句控制字典的内部数据结构。可用的布局类型有多种,其说明文档见[此处](/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory)。关于如何选择合适布局的一些建议可以在[这里](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout)找到。 +`LAYOUT` 子句控制字典的内部数据结构。有多种可用选项,其文档见[此处](/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory)。关于如何选择合适布局的一些建议见[这里](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout)。 ### 刷新字典 {#refreshing-dictionaries} -我们为该字典指定的 `LIFETIME` 为 `MIN 600 MAX 900`。LIFETIME 表示字典的更新间隔,上述配置会使字典在 600 到 900 秒之间的随机时间点进行周期性重新加载。这个随机间隔是必要的,用于在大量服务器更新时分散对字典源的负载。在更新期间,旧版本的字典仍然可以被查询,只有初次加载会阻塞查询。请注意,设置 `(LIFETIME(0))` 将禁止字典更新。 +我们为字典指定了 `LIFETIME MIN 600 MAX 900`。`LIFETIME` 用于控制字典的更新间隔,上述取值会使字典在 600 到 900 秒之间的随机时间间隔内周期性地重新加载。这个随机间隔是必要的,以便在大量服务器进行更新时分散对字典数据源的负载。在更新过程中,旧版本的字典仍然可以被查询,只有初始加载时才会阻塞查询。注意,将 `LIFETIME(0)` 进行设置会禁止字典更新。 可以使用 `SYSTEM RELOAD DICTIONARY` 命令强制重新加载字典。 -对于 ClickHouse 和 Postgres 等数据库源,可以配置查询,让字典仅在数据确实发生变化时才更新(由该查询的响应决定),而不是按固定周期更新。更多细节请参见[此处](/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime)。 +对于 ClickHouse 和 Postgres 等数据库数据源,你可以设置一个查询,仅在字典数据确实发生变化时才更新字典(由该查询的响应来决定),而不是按固定周期更新。更多详细信息请参见[此处](/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime)。 ### 其他字典类型 {#other-dictionary-types} -ClickHouse 还支持[层次字典](/sql-reference/dictionaries#hierarchical-dictionaries)、[多边形字典](/sql-reference/dictionaries#polygon-dictionaries)和[正则表达式字典](/sql-reference/dictionaries#regexp-tree-dictionary)。 +ClickHouse 还支持[层次结构字典](/sql-reference/dictionaries#hierarchical-dictionaries)、[多边形字典](/sql-reference/dictionaries#polygon-dictionaries)和[正则表达式字典](/sql-reference/dictionaries#regexp-tree-dictionary)。 ### 延伸阅读 {#more-reading} - [使用字典加速查询](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) -- [字典的高级配置](/sql-reference/dictionaries) +- [字典的高级配置](/sql-reference/dictionaries) \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md deleted file mode 100644 index 094aee6160d..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/atomic.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -description: '`Atomic` 引擎支持非阻塞的 `DROP TABLE` 和 `RENAME TABLE` 查询,以及原子性的 `EXCHANGE TABLES` 查询。默认数据库引擎为 `Atomic`。' -sidebar_label: 'Atomic' -sidebar_position: 10 -slug: /engines/database-engines/atomic -title: 'Atomic' -doc_type: 'reference' ---- - - - -# Atomic - -`Atomic` 引擎支持非阻塞的 [`DROP TABLE`](#drop-detach-table) 和 [`RENAME TABLE`](#rename-table) 查询,以及原子性的 [`EXCHANGE TABLES`](#exchange-tables) 查询。在开源 ClickHouse 中,默认使用 `Atomic` 数据库引擎。 - -:::note -在 ClickHouse Cloud 中,默认使用 [`Shared` 数据库引擎](/cloud/reference/shared-catalog#shared-database-engine),它同样支持上述操作。 -::: - - - -## 创建数据库 - -```sql -CREATE DATABASE test [ENGINE = Atomic] [SETTINGS disk=...]; -``` - - -## 具体说明和建议 - -### 表 UUID - -`Atomic` 数据库中的每个表都有一个持久的 [UUID](../../sql-reference/data-types/uuid.md),其数据存储在以下目录中: - -```text -/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_table_uuid_in_table_create_query_if_not_nil](../../operations/settings/settings.md#show_table_uuid_in_table_create_query_if_not_nil) 设置,在 `SHOW CREATE` 查询中显示 UUID。 -::: - -### RENAME TABLE - -[`RENAME`](../../sql-reference/statements/rename.md) 查询不会修改 UUID,也不会移动表数据。此类查询会立即执行,并且不会等待正在使用该表的其他查询完成。 - -### 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`](../../sql-reference/statements/exchange.md) 查询会以原子方式交换表或字典。例如,您可以用它替代如下非原子操作: - -```sql title="Non-atomic" -RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table; -``` - -你可以使用一个原子类型: - -```sql title="Atomic" -EXCHANGE TABLES new_table AND old_table; -``` - -### 原子数据库中的 ReplicatedMergeTree - -对于 [`ReplicatedMergeTree`](/engines/table-engines/mergetree-family/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 中的每个表自动生成唯一路径。 - -### 元数据磁盘 - -当在 `SETTINGS` 中指定了 `disk` 时,将使用该磁盘来存储表的元数据文件。 -例如: - -```sql -CREATE TABLE db (n UInt64) ENGINE = Atomic SETTINGS disk=disk(type='local', path='/var/lib/clickhouse-disks/db_disk'); -``` - -若未指定,默认使用在 `database_disk.disk` 中定义的磁盘。 - - -## 另请参阅 {#see-also} - -- [system.databases](../../operations/system-tables/databases.md) 系统表 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md deleted file mode 100644 index 046bbd77c8c..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/backup.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -description: '允许从备份中立即以只读模式挂载表或数据库。' -sidebar_label: '备份' -sidebar_position: 60 -slug: /engines/database-engines/backup -title: '备份' -doc_type: '参考' ---- - - - -# 备份 - -数据库备份允许从[备份](../../operations/backup)中即时附加表或数据库,并以只读模式访问。 - -数据库备份同时支持增量和非增量备份。 - - - -## 创建数据库 - -```sql -CREATE DATABASE backup_database -ENGINE = Backup('database_name_inside_backup', 'backup_destination') -``` - -备份目标可以是任意有效的[备份目的地](../../operations/backup#configure-a-backup-destination),例如 `Disk`、`S3` 或 `File`。 - -使用 `Disk` 作为备份目标时,用于从备份创建数据库的查询如下: - -```sql -CREATE DATABASE backup_database -ENGINE = Backup('database_name_inside_backup', Disk('disk_name', 'backup_name')) -``` - -**引擎参数** - -* `database_name_inside_backup` — 备份中数据库的名称。 -* `backup_destination` — 备份存储位置。 - - -## 使用示例 - -以 `Disk` 作为备份目标为例。首先在 `storage.xml` 中配置备份磁盘: - -```xml - - - - local - /home/ubuntu/ClickHouseWorkDir/backups/ - - - - - backups - /home/ubuntu/ClickHouseWorkDir/backups/ - -``` - -用法示例。先创建测试数据库和表,插入一些数据,然后创建备份: - -```sql -CREATE DATABASE test_database; - -CREATE TABLE test_database.test_table_1 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_1 VALUES (0, 'test_database.test_table_1'); - -CREATE TABLE test_database.test_table_2 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_2 VALUES (0, 'test_database.test_table_2'); - -CREATE TABLE test_database.test_table_3 (id UInt64, value String) ENGINE=MergeTree ORDER BY id; -INSERT INTO test_database.test_table_3 VALUES (0, 'test_database.test_table_3'); - -BACKUP DATABASE test_database TO Disk('backups', 'test_database_backup'); -``` - -现在我们已经有了 `test_database_backup` 备份,接下来创建名为 Backup 的数据库: - -```sql -CREATE DATABASE test_database_backup ENGINE = Backup('test_database', Disk('backups', 'test_database_backup')); -``` - -现在我们可以查询数据库中的任意表: - -```sql -SELECT id, value FROM test_database_backup.test_table_1; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_1 │ -└────┴────────────────────────────┘ - -SELECT id, value FROM test_database_backup.test_table_2; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_2 │ -└────┴────────────────────────────┘ - -SELECT id, value FROM test_database_backup.test_table_3; - -┌─id─┬─value──────────────────────┐ -│ 0 │ test_database.test_table_3 │ -└────┴────────────────────────────┘ -``` - -也可以像操作普通数据库一样使用该数据库备份。例如,对其中的表执行查询: - -```sql -SELECT database, name FROM system.tables WHERE database = 'test_database_backup': - -┌─database─────────────┬─name─────────┐ -│ test_database_backup │ test_table_1 │ -│ test_database_backup │ test_table_2 │ -│ test_database_backup │ test_table_3 │ -└──────────────────────┴──────────────┘ -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md deleted file mode 100644 index 2b60244dd3d..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/datalake.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -description: 'DataLakeCatalog 数据库引擎允许你将 ClickHouse 连接到外部数据目录,并查询开放表格式数据' -sidebar_label: 'DataLakeCatalog' -slug: /engines/database-engines/datalakecatalog -title: 'DataLakeCatalog' -doc_type: 'reference' ---- - - - -# DataLakeCatalog - -`DataLakeCatalog` 数据库引擎使您能够将 ClickHouse 连接到外部数据目录,并在无需复制数据的情况下查询开放表格式数据。 -这使 ClickHouse 成为一个功能强大的查询引擎,能够与您现有的数据湖基础设施无缝协同工作。 - - - -## 支持的目录 {#supported-catalogs} - -`DataLakeCatalog` 引擎支持以下数据目录: - -- **AWS Glue Catalog** - 用于 AWS 环境中的 Iceberg 表 -- **Databricks Unity Catalog** - 用于 Delta Lake 和 Iceberg 表 -- **Hive Metastore** - 传统 Hadoop 生态系统中的目录 -- **REST Catalogs** - 任意支持 Iceberg REST 规范的目录 - - - -## 创建数据库 - -要使用 `DataLakeCatalog` 引擎,需要启用下列相关设置: - -```sql -SET allow_experimental_database_iceberg = 1; -SET allow_experimental_database_unity_catalog = 1; -SET allow_experimental_database_glue_catalog = 1; -SET allow_experimental_database_hms_catalog = 1; -``` - -可以使用以下语法创建使用 `DataLakeCatalog` 引擎的数据库: - -```sql -CREATE DATABASE database_name -ENGINE = DataLakeCatalog(catalog_endpoint[, user, password]) -SETTINGS -catalog_type, -[...] -``` - -支持以下设置: - -| Setting | Description | -| ----------------------- | -------------------------------------------------------------------- | -| `catalog_type` | 目录类型:`glue`、`unity`(Delta)、`rest`(Iceberg)、`hive`、`onelake`(Iceberg) | -| `warehouse` | 在目录中使用的仓库 / 数据库名称。 | -| `catalog_credential` | 目录的认证凭证(例如 API key 或 token) | -| `auth_header` | 用于与目录服务进行认证的自定义 HTTP 请求头 | -| `auth_scope` | 用于认证的 OAuth2 范围(scope)(如果使用 OAuth) | -| `storage_endpoint` | 底层存储的端点 URL | -| `oauth_server_uri` | 用于认证的 OAuth2 授权服务器 URI | -| `vended_credentials` | 布尔值,指示是否使用由服务下发的凭证(vended credentials,AWS 特定) | -| `aws_access_key_id` | 用于访问 S3/Glue 的 AWS access key ID(如果不使用 vended credentials) | -| `aws_secret_access_key` | 用于访问 S3/Glue 的 AWS secret access key(如果不使用 vended credentials) | -| `region` | 服务所在的 AWS 区域(例如 `us-east-1`) | - - -## 示例 - -请参阅以下部分,了解如何使用 `DataLakeCatalog` 引擎的示例: - -* [Unity Catalog](/use-cases/data-lake/unity-catalog) -* [Glue Catalog](/use-cases/data-lake/glue-catalog) -* OneLake Catalog\ - 可以通过启用 `allow_experimental_database_iceberg` 或 `allow_database_iceberg` 来使用。 - -```sql -CREATE DATABASE database_name -ENGINE = DataLakeCatalog(catalog_endpoint) -SETTINGS - catalog_type = 'onelake', - warehouse = warehouse, - onelake_tenant_id = tenant_id, - oauth_server_uri = server_uri, - auth_scope = auth_scope, - onelake_client_id = client_id, - onelake_client_secret = client_secret; -SHOW TABLES IN databse_name; -SELECT count() from database_name.table_name; -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/index.md deleted file mode 100644 index 633141dd6ab..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/index.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -description: '数据库引擎文档' -slug: /engines/database-engines/ -toc_folder_title: '数据库引擎' -toc_priority: 27 -toc_title: '简介' -title: '数据库引擎' -doc_type: 'landing-page' ---- - - - -# 数据库引擎 - -数据库引擎用于操作表。默认情况下,ClickHouse 使用 [Atomic](../../engines/database-engines/atomic.md) 数据库引擎,它提供可配置的[表引擎](../../engines/table-engines/index.md)以及一种 [SQL 方言](../../sql-reference/syntax.md)。 - -下面是可用数据库引擎的完整列表。请通过以下链接了解更多详细信息: - -{/* 本页面的目录由以下脚本自动生成: - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - 基于 YAML front matter 字段:slug、description、title。 - - 如果发现错误,请直接编辑页面本身的 YAML front matter。 - */ } - -{/*AUTOGENERATED_START*/ } - -| 页面 | 描述 | -| --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | -| [Shared](/engines/database-engines/shared) | 介绍 `Shared` 数据库引擎的页面,该引擎在 ClickHouse Cloud 中可用。 | -| [Atomic](/engines/database-engines/atomic) | `Atomic` 引擎支持非阻塞的 `DROP TABLE` 和 `RENAME TABLE` 查询,以及原子性的 `EXCHANGE TABLES` 查询。默认使用 `Atomic` 数据库引擎。 | -| [Lazy](/engines/database-engines/lazy) | 在最后一次访问后的 `expiration_time_in_seconds` 秒内,仅在内存(RAM)中保留这些表。只能用于 Log 类型表。 | -| [Replicated](/engines/database-engines/replicated) | 该引擎基于 Atomic 引擎构建。它通过将 DDL 日志写入 ZooKeeper,并在给定数据库的所有副本上执行,从而支持元数据复制。 | -| [PostgreSQL](/engines/database-engines/postgresql) | 允许连接到远程 PostgreSQL 服务器上的数据库。 | -| [MySQL](/engines/database-engines/mysql) | 允许连接到远程 MySQL 服务器上的数据库,并执行 `INSERT` 和 `SELECT` 查询,以在 ClickHouse 和 MySQL 之间交换数据。 | -| [SQLite](/engines/database-engines/sqlite) | 允许连接到 SQLite 数据库,并执行 `INSERT` 和 `SELECT` 查询,以在 ClickHouse 和 SQLite 之间交换数据。 | -| [MaterializedPostgreSQL](/engines/database-engines/materialized-postgresql) | 基于 PostgreSQL 数据库中的表创建一个 ClickHouse 数据库。 | -| [Backup](/engines/database-engines/backup) | 允许以只读模式从备份中立即挂载表或数据库。 | -| [DataLakeCatalog](/engines/database-engines/datalakecatalog) | DataLakeCatalog 数据库引擎使您能够将 ClickHouse 连接到外部数据目录,并查询开放表格式的数据。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md deleted file mode 100644 index bede945ee4c..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/lazy.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: '使表在最近一次访问后的 `expiration_time_in_seconds` 秒内仅保留在 RAM 中。只能用于 Log 类型表。' -sidebar_label: 'Lazy' -sidebar_position: 20 -slug: /engines/database-engines/lazy -title: 'Lazy' -doc_type: 'reference' ---- - - - -# Lazy - -只会在上次访问后的 `expiration_time_in_seconds` 秒内将表保留在 RAM 中。只能用于 \*Log 表。 - -它针对存储大量小型 \*Log 表进行了优化,这些表的访问之间存在较长的时间间隔。 - - - -## 创建数据库 - -```sql -CREATE DATABASE testlazy -ENGINE = Lazy(expiration_time_in_seconds); -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md deleted file mode 100644 index f2892726e69..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/materialized-postgresql.md +++ /dev/null @@ -1,309 +0,0 @@ ---- -description: '基于 PostgreSQL 数据库中的表创建一个 ClickHouse 数据库。' -sidebar_label: 'MaterializedPostgreSQL' -sidebar_position: 60 -slug: /engines/database-engines/materialized-postgresql -title: 'MaterializedPostgreSQL' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MaterializedPostgreSQL - - - - - -:::note -建议 ClickHouse Cloud 用户使用 [ClickPipes](/integrations/clickpipes) 实现 PostgreSQL 到 ClickHouse 的复制。ClickPipes 原生支持 PostgreSQL 的高性能 CDC(变更数据捕获)。 -::: - -基于 PostgreSQL 数据库中的表创建一个 ClickHouse 数据库。首先,使用 `MaterializedPostgreSQL` 引擎的数据库会创建 PostgreSQL 数据库的快照并加载所需的表。所需的表可以是指定数据库中任意 schema 下的任意表子集。在创建快照的同时,数据库引擎会获取 LSN,并在完成对这些表的初始导出后开始从 WAL 拉取更新。数据库创建完成后,新添加到 PostgreSQL 数据库的表不会自动加入复制,需要通过执行 `ATTACH TABLE db.table` 查询手动添加。 - -复制是通过 PostgreSQL 逻辑复制协议实现的。该协议不支持复制 DDL,但可以检测是否发生了破坏复制的变更(列类型变化、增加/删除列)。一旦检测到此类变更,相应的表将停止接收更新。在这种情况下,您应使用 `ATTACH` / `DETACH PERMANENTLY` 查询来对该表进行完整重载。如果 DDL 不会破坏复制(例如重命名列),该表仍将继续接收更新(插入是按位置完成的)。 - -:::note -此数据库引擎为实验性功能。要使用它,请在配置文件中或通过 `SET` 命令将 `allow_experimental_database_materialized_postgresql` 设置为 1: - -```sql -SET allow_experimental_database_materialized_postgresql=1 -``` - -::: - - -## 创建数据库 - -```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` — 用户密码。 - - -## 使用示例 - -```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; -``` - - -## 动态向复制中添加新表 - -创建 `MaterializedPostgreSQL` 数据库后,它不会自动检测对应 PostgreSQL 数据库中的新表。可以手动添加这类表: - -```sql -ATTACH TABLE postgres_database.new_table; -``` - -:::warning -在 22.1 之前的版本中,将表加入复制后会留下一个不会自动删除的临时复制槽(名称为 `{db_name}_ch_replication_slot_tmp`)。如果在 22.1 之前的 ClickHouse 版本中执行表的 ATTACH 操作,请务必手动删除该复制槽(`SELECT pg_drop_replication_slot('{db_name}_ch_replication_slot_tmp')`),否则磁盘使用量会不断增长。该问题已在 22.1 中修复。 -::: - - -## 动态移除复制中的表 - -可以将特定的表从复制中移除: - -```sql -DETACH TABLE postgres_database.table_to_remove PERMANENTLY; -``` - - -## PostgreSQL 模式 - -从 21.12 版本开始,PostgreSQL 的[模式(schema)](https://www.postgresql.org/docs/9.1/ddl-schemas.html)可以通过 3 种方式进行配置。 - -1. 每个 `MaterializedPostgreSQL` 数据库引擎对应一个模式。需要使用设置项 `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` 数据库引擎,可以使用任意数量的 schema,并为每个 schema 指定一组表。需要设置参数 `materialized_postgresql_tables_list`。每个表都会连同其 schema 一起写入。 - 访问表时需要同时指定 schema 名称和表名称: - -```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` 中的所有表都必须带上其 schema 名称。 -需要设置 `materialized_postgresql_tables_list_with_schema = 1`。 - -警告:在这种情况下,表名中不允许包含点号。 - -3. 对于一个 `MaterializedPostgreSQL` 数据库引擎,可以包含任意数量的 schema,每个 schema 都包含完整的表集合。需要使用设置 `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`; -``` - -警告:在这种情况下,表名中不允许包含点号。 - - -## 要求 - -1. 在 PostgreSQL 配置文件中,必须将 [wal_level](https://www.postgresql.org/docs/current/runtime-config-wal.html) 参数设置为 `logical`,并且将 `max_replication_slots` 参数设置为至少 `2`。 - -2. 每个参与复制的表必须具有以下 [replica identity](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) 值。将会使用该数据类型的默认值。 -::: - - -## 设置 - -### `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` - -默认值:空字符串。(使用默认 schema) - -### `materialized_postgresql_schema_list` - -默认值:空列表。(使用默认 schema) - -### `materialized_postgresql_max_block_size` - -设置在将数据刷新到 PostgreSQL 数据库表之前,先在内存中累积的行数。 - -可选值: - -* 正整数。 - -默认值:`65536`。 - -### `materialized_postgresql_replication_slot` - -由用户创建的 replication slot。必须与 `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` - -使用唯一的复制消费者标识符进行复制。默认值:`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. 一旦确认已成功复制到 ClickHouse 数据库后,结束 PostgreSQL 事务。验证在故障切换后复制是否能够继续进行: - - ```bash - kubectl exec acid-demo-cluster-0 -c postgres -- su postgres -c 'patronictl failover --candidate acid-demo-cluster-1 --force' - ``` - -### 所需权限 {#required-permissions} - -1. [CREATE PUBLICATION](https://postgrespro.ru/docs/postgresql/14/sql-createpublication) —— 执行 CREATE PUBLICATION 语句的权限。 - -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`)。 - -可以不执行命令 `2` 和 `3`,也无需具备相应权限,而是改为使用 `materialized_postgresql_replication_slot` 和 `materialized_postgresql_snapshot` 设置。但必须格外谨慎。 - -对下列表的访问权限: - -1. pg_publication - -2. pg_replication_slots - -3. pg_publication_tables diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md deleted file mode 100644 index ce1316cb981..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/mysql.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -description: '允许连接到远程 MySQL 服务器上的数据库,并执行 - `INSERT` 和 `SELECT` 查询,用于在 ClickHouse 与 MySQL 之间交换数据。' -sidebar_label: 'MySQL' -sidebar_position: 50 -slug: /engines/database-engines/mysql -title: 'MySQL' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MySQL 数据库引擎 - - - -用于连接远程 MySQL 服务器上的数据库,并执行 `INSERT` 和 `SELECT` 查询,在 ClickHouse 和 MySQL 之间交换数据。 - -`MySQL` 数据库引擎会将查询转换后发送到 MySQL 服务器,因此可以执行诸如 `SHOW TABLES` 或 `SHOW CREATE TABLE` 等操作。 - -无法执行以下查询: - -- `RENAME` -- `CREATE TABLE` -- `ALTER` - - - -## 创建数据库 - -```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)。 - - - -## 全局变量支持 - -为提高兼容性,可以使用 MySQL 风格来引用全局变量,即 `@@identifier`。 - -当前支持以下变量: - -* `version` -* `max_allowed_packet` - -:::note -目前这些变量只是占位符,并未实际对应到任何内容。 -::: - -示例: - -```sql -SELECT @@version; -``` - - -## 使用示例 - -在 MySQL 中的表: - -```text -mysql> USE test; -数据库已更改 - -mysql> CREATE TABLE `mysql_table` ( - -> `int_id` INT NOT NULL AUTO_INCREMENT, - -> `float` FLOAT NOT NULL, - -> PRIMARY KEY (`int_id`)); -查询成功,影响了 0 行 (0,09 秒) - -mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2); -查询成功,影响了 1 行 (0,00 秒) - -mysql> select * from mysql_table; -+------+-----+ -| int_id | value | -+------+-----+ -| 1 | 2 | -+------+-----+ -结果集中有 1 行 (0,00 秒) -``` - -位于 ClickHouse 中、与 MySQL 服务器进行数据交换的数据库: - -```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/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md deleted file mode 100644 index 84bec7a06d7..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/postgresql.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -description: '用于连接远程 PostgreSQL 服务器上的数据库。' -sidebar_label: 'PostgreSQL' -sidebar_position: 40 -slug: /engines/database-engines/postgresql -title: 'PostgreSQL' -doc_type: 'guide' ---- - - - -# PostgreSQL - -允许连接到远程 [PostgreSQL](https://www.postgresql.org) 服务器上的数据库。支持读写操作(`SELECT` 和 `INSERT` 查询),用于在 ClickHouse 和 PostgreSQL 之间交换数据。 - -通过 `SHOW TABLES` 和 `DESCRIBE TABLE` 查询,可以实时访问远程 PostgreSQL 的表列表和表结构。 - -支持表结构修改(`ALTER TABLE ... ADD|DROP COLUMN`)。如果将 `use_table_cache` 参数(参见下文的引擎参数)设置为 `1`,则表结构会被缓存且不会检查是否发生了修改,但可以通过 `DETACH` 和 `ATTACH` 查询进行更新。 - - - -## 创建数据库 - -```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 模式(schema)。 -* `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) | - - - -## 使用示例 - -与 PostgreSQL 服务器进行数据交换的 ClickHouse 数据库: - -```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) │ -└────────┴───────────────────┘ -``` - - -## 相关内容 {#related-content} - -- 博客:[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/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md deleted file mode 100644 index 1b15c22a0ce..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/replicated.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -description: '该引擎基于 Atomic 引擎构建。它支持通过写入 ZooKeeper 的 DDL 日志来进行元数据复制,并在指定数据库的所有副本上执行。' -sidebar_label: 'Replicated' -sidebar_position: 30 -slug: /engines/database-engines/replicated -title: 'Replicated' -doc_type: 'reference' ---- - - - -# Replicated - -该引擎基于 [Atomic](../../engines/database-engines/atomic.md) 引擎。它通过将 DDL 日志写入 ZooKeeper,并在给定数据库的所有副本上执行该日志,从而实现元数据复制。 - -单个 ClickHouse 服务器可以同时运行并更新多个 Replicated 数据库。但是,同一 Replicated 数据库不能存在多个副本。 - - - -## 创建数据库 - -```sql -CREATE DATABASE testdb [UUID '...'] ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...] -``` - -**引擎参数** - -* `zoo_path` — ZooKeeper 路径。相同的 ZooKeeper 路径对应同一个数据库。 -* `shard_name` — 分片名称。数据库副本根据 `shard_name` 分组到各个分片中。 -* `replica_name` — 副本名称。对于同一分片,其所有副本的副本名称必须互不相同。 - -这些参数可以省略,此时会使用默认值填充缺失的参数。 - -如果 `zoo_path` 包含宏 `{uuid}`,则必须显式指定 UUID,或者在创建语句中添加 [ON CLUSTER](../../sql-reference/distributed-ddl.md),以确保所有副本对该数据库使用相同的 UUID。 - -对于 [ReplicatedMergeTree](/engines/table-engines/mergetree-family/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) 系统表中包含一个与该 Replicated 数据库同名的集群,由该数据库的所有副本组成。此集群在创建或删除副本时会自动更新,并可用于 [Distributed](/engines/table-engines/special/distributed) 表。 - -在创建数据库的新副本时,该副本会自行创建表。如果副本长时间不可用并且落后于复制日志,它会将本地元数据与 ZooKeeper 中的当前元数据进行比较,将多余的带数据的表移动到一个单独的非 Replicated 数据库中(以免误删多余数据),创建缺失的表,并在表被重命名时更新表名。数据在 `ReplicatedMergeTree` 层面进行复制,也就是说,如果表不是基于 Replicated 表引擎的表,则其数据不会被复制(数据库仅负责元数据)。 - -允许执行 [`ALTER TABLE FREEZE|ATTACH|FETCH|DROP|DROP DETACHED|DETACH PARTITION|PART`](../../sql-reference/statements/alter/partition.md) 查询,但这些查询不会被复制。数据库引擎只会在当前副本上添加 / 拉取 / 删除分区或数据片段。不过,如果表本身使用的是 Replicated 表引擎,那么在使用 `ATTACH` 之后,数据会进行复制。 - -如果您只需要配置集群而不需要维护表复制,请参考 [Cluster Discovery](../../operations/cluster-discovery.md) 功能。 - - - -## 使用示例 - -创建一个由三台主机组成的集群: - -```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}'); -``` - -在使用隐式参数的集群上创建数据库: - -```sql -CREATE DATABASE r ON CLUSTER default ENGINE=Replicated; -``` - -执行 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] │ -└───────┴───────────────┘ -``` - -在另一台主机上添加一个副本: - -```sql -node4 :) CREATE DATABASE r ENGINE=Replicated('some/path/r','other_shard','r2'); -``` - -当在 `zoo_path` 中使用宏 `{uuid}`,并需要在另一台主机上添加副本时: - -```sql -node1 :) SELECT uuid FROM system.databases WHERE database='r'; -node4 :) CREATE DATABASE r UUID '<前一查询的 uuid>' ENGINE=Replicated('some/path/{uuid}','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] │ -└───────┴───────────────┘ -``` - - -## 设置 - -支持以下设置: - -| Setting(设置项) | Default(默认值) | Description(说明) | -| ---------------------------------------------------------------------------- | ------------------------------ | ---------------------------------------------------------------- | -| `max_broken_tables_ratio` | 1 | 当失效或损坏表占所有表的比例大于该值时,不会自动恢复副本 | -| `max_replication_lag_to_enqueue` | 50 | 当副本复制延迟大于该值时,尝试执行查询将抛出异常 | -| `wait_entry_commited_timeout_sec` | 3600 | 如果超时时间超过该值且发起节点尚未执行该查询,副本将尝试取消该查询 | -| `collection_name` | | 在 server 配置中定义的集合名称,其中定义了用于集群认证的所有信息 | -| `check_consistency` | true | 检查本地元数据与 Keeper 中元数据的一致性,如不一致则对副本进行恢复 | -| `max_retries_before_automatic_recovery` | 10 | 在将副本标记为丢失并从快照中恢复之前,尝试执行队列条目的最大次数(0 表示无限) | -| `allow_skipping_old_temporary_tables_ddls_of_refreshable_materialized_views` | false | 如果启用,在处理 Replicated 数据库中的 DDL 时,在可能的情况下会跳过创建和交换可刷新的物化视图的临时表的 DDL | -| `logs_to_keep` | 1000 | 在 ZooKeeper 中为 Replicated 数据库保留的默认日志条目数量。 | -| `default_replica_path` | `/clickhouse/databases/{uuid}` | ZooKeeper 中数据库的路径。在创建数据库且省略相关参数时使用。 | -| `default_replica_shard_name` | `{shard}` | 数据库中该副本所属分片的名称。在创建数据库且省略相关参数时使用。 | -| `default_replica_name` | `{replica}` | 数据库中该副本的名称。在创建数据库且省略相关参数时使用。 | - -默认值可以在配置文件中重写。 - -```xml - - - 0.75 - 100 - 1800 - postgres1 - false - 5 - /clickhouse/databases/{uuid} - {shard} - {replica} - - -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md deleted file mode 100644 index 1c4f99a7156..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/shared.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -description: '本页介绍 `Shared` 数据库引擎,该引擎可在 ClickHouse Cloud 中使用' -sidebar_label: 'Shared' -sidebar_position: 10 -slug: /engines/database-engines/shared -title: 'Shared' -doc_type: 'reference' ---- - -import CloudOnlyBadge from '@theme/badges/CloudOnlyBadge'; - - - - -# Shared 数据库引擎 - -`Shared` 数据库引擎与 Shared Catalog 配合使用,用于管理其表使用无状态表引擎(例如 [`SharedMergeTree`](/cloud/reference/shared-merge-tree))的数据库。 -这些表引擎不会将任何持久化状态写入磁盘,并且与动态计算环境兼容。 - -Cloud 中的 `Shared` 数据库引擎消除了对本地磁盘的依赖。 -它是一个纯内存引擎,只需要 CPU 和内存。 - - - -## 工作原理 {#how-it-works} - -`Shared` 数据库引擎将所有数据库和表定义存储在一个由 Keeper 作为后端的集中式 Shared Catalog 中。它不再写入本地磁盘,而是维护一个在所有计算节点之间共享的、带版本控制的全局状态。 - -每个节点只跟踪最近一次应用的版本,并在启动时获取最新状态,无需本地文件或手动设置。 - - - -## 语法 - -对于最终用户而言,使用 Shared Catalog 和 Shared 数据库引擎无需任何额外配置。数据库的创建方式与以往完全相同: - -```sql -CREATE DATABASE my_database; -``` - -ClickHouse Cloud 会自动将 Shared 数据库引擎分配给数据库。在此类数据库中使用无状态引擎创建的任何表,都将自动受益于 Shared Catalog 提供的复制和协调功能。 - -:::tip -有关 Shared Catalog 及其优势的更多信息,请参阅 Cloud 参考文档中的 ["Shared catalog and shared database engine"](/cloud/reference/shared-catalog)。 -::: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md deleted file mode 100644 index dd89b2699b2..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/database-engines/sqlite.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -description: '用于连接 SQLite 数据库,并通过执行 `INSERT` 和 `SELECT` - 查询在 ClickHouse 和 SQLite 之间交换数据。' -sidebar_label: 'SQLite' -sidebar_position: 55 -slug: /engines/database-engines/sqlite -title: 'SQLite' -doc_type: 'reference' ---- - - - -# SQLite - -用于连接 [SQLite](https://www.sqlite.org/index.html) 数据库,并执行 `INSERT` 和 `SELECT` 查询,以在 ClickHouse 与 SQLite 之间交换数据。 - - - -## 创建数据库 - -```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` 和密码的访问控制。访问控制是通过为数据库文件本身设置文件系统权限来实现的。 - - - -## 使用示例 - -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/i18n/zh/docusaurus-plugin-content-docs/current/engines/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/index.md deleted file mode 100644 index 42ce2601112..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/index.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -description: '引擎目录页面' -slug: /engines -title: '引擎' -doc_type: 'landing-page' ---- - -| 页面 | 描述 | -|----------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Database Engines](../engines/database-engines/index.md) | ClickHouse 中的数据库引擎用于处理表,并决定数据的存储和管理方式。了解 ClickHouse 提供的各种数据库引擎。 | -| [Table Engines](../engines/table-engines/index.md) | ClickHouse 中的表引擎是一个基础概念,用于决定数据如何存储、写入和读取。了解 ClickHouse 提供的各种表引擎。 | \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/index.md deleted file mode 100644 index e2970821e1e..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/index.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -description: '表引擎文档' -slug: /engines/table-engines/ -toc_folder_title: '表引擎' -toc_priority: 26 -toc_title: '简介' -title: '表引擎' -doc_type: 'reference' ---- - - - -# 表引擎 - -表引擎(表的类型)决定: - -- 数据存储在何处以及以何种方式存储、写入到哪里以及从哪里读取。 -- 支持哪些查询,以及具体如何执行这些查询。 -- 并发访问数据的方式。 -- 是否以及如何使用索引(如果存在)。 -- 是否可以进行多线程的请求执行。 -- 数据复制的相关参数。 - - - -## 引擎家族 {#engine-families} - -### MergeTree {#mergetree} - -用于高负载任务的最通用且功能最全面的表引擎。这些引擎的共同特性是支持快速写入数据,并在后台对数据进行后续处理。`MergeTree` 系列引擎支持数据复制(通过引擎的 [Replicated\*](/engines/table-engines/mergetree-family/replication) 版本)、分区、二级数据跳过索引,以及其他在其他引擎中不支持的特性。 - -该家族中的引擎: - -| MergeTree 引擎 | -|-------------------------------------------------------------------------------------------------------------------------------------------| -| [MergeTree](/engines/table-engines/mergetree-family/mergetree) | -| [ReplacingMergeTree](/engines/table-engines/mergetree-family/replacingmergetree) | -| [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree) | -| [AggregatingMergeTree](/engines/table-engines/mergetree-family/aggregatingmergetree) | -| [CollapsingMergeTree](/engines/table-engines/mergetree-family/collapsingmergetree) | -| [VersionedCollapsingMergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) | -| [GraphiteMergeTree](/engines/table-engines/mergetree-family/graphitemergetree) | -| [CoalescingMergeTree](/engines/table-engines/mergetree-family/coalescingmergetree) | - -### Log {#log} - -轻量级的 [引擎](../../engines/table-engines/log-family/index.md),仅提供最基础的功能。当需要快速写入许多小表(最多约 100 万行),并在之后整体读取它们时,这些引擎最为高效。 - -该家族中的引擎: - -| Log 引擎 | -|----------------------------------------------------------------------------| -| [TinyLog](/engines/table-engines/log-family/tinylog) | -| [StripeLog](/engines/table-engines/log-family/stripelog) | -| [Log](/engines/table-engines/log-family/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} - -该家族中的引擎: - - - -| 特殊表引擎 | -|---------------------------------------------------------------| -| [Distributed](/engines/table-engines/special/distributed) | -| [Dictionary](/engines/table-engines/special/dictionary) | -| [Merge](/engines/table-engines/special/merge) | -| [Executable](/engines/table-engines/special/executable) | -| [File](/engines/table-engines/special/file) | -| [Null](/engines/table-engines/special/null) | -| [Set](/engines/table-engines/special/set) | -| [Join](/engines/table-engines/special/join) | -| [URL](/engines/table-engines/special/url) | -| [View](/engines/table-engines/special/view) | -| [Memory](/engines/table-engines/special/memory) | -| [Buffer](/engines/table-engines/special/buffer) | -| [External Data](/engines/table-engines/special/external-data) | -| [GenerateRandom](/engines/table-engines/special/generate) | -| [KeeperMap](/engines/table-engines/special/keeper-map) | -| [FileLog](/engines/table-engines/special/filelog) | - - - -## 虚拟列 {#table_engines-virtual_columns} - -虚拟列是表引擎的内置属性,在引擎的源代码中定义。 - -不应在 `CREATE TABLE` 查询中指定虚拟列,并且在 `SHOW CREATE TABLE` 和 `DESCRIBE TABLE` 的查询结果中也看不到它们。虚拟列是只读的,因此无法向虚拟列中插入数据。 - -要从虚拟列中读取数据,必须在 `SELECT` 查询中显式指定其名称。`SELECT *` 不会返回虚拟列中的值。 - -如果在创建表时定义了一个与该表某个虚拟列同名的列,则该虚拟列将变得不可访问。不推荐这样做。为避免冲突,虚拟列名称通常会以下划线作为前缀。 - -- `_table` — 包含读取数据所在表的名称。类型:[String](../../sql-reference/data-types/string.md)。 - - 无论使用哪种表引擎,每个表都包含一个名为 `_table` 的通用虚拟列。 - - 在使用 Merge 表引擎查询表时,可以在 `WHERE/PREWHERE` 子句中对 `_table` 设置常量条件(例如,`WHERE _table='xyz'`)。在这种情况下,只会对满足 `_table` 条件的这些表执行读取操作,因此 `_table` 列在此处充当索引。 - - 当使用类似 `SELECT ... FROM (... UNION ALL ...)` 格式的查询时,可以通过指定 `_table` 列来确定返回的行来自哪个实际表。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md deleted file mode 100644 index fd8517fa7c3..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ExternalDistributed.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: '`ExternalDistributed` 引擎允许对存储在远程 MySQL 或 PostgreSQL 服务器上的数据执行 `SELECT` 查询。它接受 MySQL 或 PostgreSQL 引擎作为参数,因此支持分片。' -sidebar_label: 'ExternalDistributed' -sidebar_position: 55 -slug: /engines/table-engines/integrations/ExternalDistributed -title: 'ExternalDistributed 表引擎' -doc_type: 'reference' ---- - - - -# ExternalDistributed 表引擎 - -`ExternalDistributed` 引擎允许对存储在远程服务器上 MySQL 或 PostgreSQL 实例中的数据执行 `SELECT` 查询。它接受 [MySQL](../../../engines/table-engines/integrations/mysql.md) 或 [PostgreSQL](../../../engines/table-engines/integrations/postgresql.md) 引擎作为参数,从而支持分片。 - - - -## 创建表 - -```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) 查询中查看该语句的详细说明。 - -表结构可以与原始表结构不同: - -* 列名应与原始表中的列名相同,但你可以只使用其中一部分列,并按任意顺序排列。 -* 列类型可以与原始表中的类型不同。ClickHouse 会尝试将值[转换](/sql-reference/functions/type-conversion-functions#cast)为 ClickHouse 数据类型。 - -**引擎参数** - -* `engine` — 表引擎 `MySQL` 或 `PostgreSQL`。 -* `host:port` — MySQL 或 PostgreSQL 服务器地址。 -* `database` — 远程数据库名称。 -* `table` — 远程表名称。 -* `user` — 用户名。 -* `password` — 用户密码。 - - -## 实现细节 - -支持多个副本,多个副本之间必须使用 `|` 分隔,多个分片之间必须使用 `,` 分隔。例如: - -```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) -* [Distributed 表引擎](../../../engines/table-engines/special/distributed.md) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md deleted file mode 100644 index 3ee86b61dae..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/arrowflight.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -description: '此引擎允许通过 Apache Arrow Flight 查询远程数据集。' -sidebar_label: 'ArrowFlight' -sidebar_position: 186 -slug: /engines/table-engines/integrations/arrowflight -title: 'ArrowFlight 表引擎' -doc_type: 'reference' ---- - - - -# ArrowFlight 表引擎 - -ArrowFlight 表引擎使 ClickHouse 能够通过 [Apache Arrow Flight](https://arrow.apache.org/docs/format/Flight.html) 协议查询远程数据集。 -此集成允许 ClickHouse 高效地从支持 Flight 的外部服务器获取列式 Arrow 格式的数据。 - - - -## 创建表 - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name (name1 [type1], name2 [type2], ...) - ENGINE = ArrowFlight('host:port', 'dataset_name' [, 'username', 'password']); -``` - -**引擎参数** - -* `host:port` — 远程 Arrow Flight 服务器的地址。 -* `dataset_name` — Flight 服务器上数据集的标识符。 -* `username` — 用于 HTTP 基本认证的用户名。 -* `password` — 用于 HTTP 基本认证的密码。 - 如果未指定 `username` 和 `password`,则表示不使用认证 - (仅当 Arrow Flight 服务器允许无认证访问时才可用)。 - - -## 使用示例 - -本示例演示如何创建一个从远程 Arrow Flight 服务器读取数据的表: - -```sql -CREATE TABLE remote_flight_data -( - id UInt32, - name String, - value Float64 -) ENGINE = ArrowFlight('127.0.0.1:9005', 'sample_dataset'); -``` - -像查询本地表一样查询远程数据: - -```sql -SELECT * FROM remote_flight_data ORDER BY id; -``` - -```text -┌─id─┬─name────┬─value─┐ -│ 1 │ foo │ 42.1 │ -│ 2 │ bar │ 13.3 │ -│ 3 │ baz │ 77.0 │ -└────┴─────────┴───────┘ -``` - - -## 注意事项 {#notes} - -* 在 ClickHouse 中定义的 schema 必须与 Flight 服务器返回的 schema 一致。 -* 此引擎适用于联邦查询、数据虚拟化,以及将存储与计算解耦的场景。 - - - -## 另请参阅 {#see-also} - -* [Apache Arrow Flight SQL](https://arrow.apache.org/docs/format/FlightSql.html) -* [ClickHouse 中的 Arrow 格式集成](/interfaces/formats/Arrow) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md deleted file mode 100644 index 803385122f6..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azure-queue.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -description: '该引擎提供与 Azure Blob Storage 生态系统的集成,支持流式数据导入。' -sidebar_label: 'AzureQueue' -sidebar_position: 181 -slug: /engines/table-engines/integrations/azure-queue -title: 'AzureQueue 表引擎' -doc_type: 'reference' ---- - - - -# 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)。 - -与 [AzureBlobStorage](/engines/table-engines/integrations/azureBlobStorage) 表引擎类似,用户可以使用 Azurite 模拟器进行本地 Azure Storage 开发。更多详细信息请参见[此处](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=docker-hub%2Cblob-storage)。 - -**示例** - -```sql -CREATE TABLE azure_queue_engine_table -( - `key` UInt64, - `data` String -) -ENGINE = AzureQueue('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', 'testcontainer', '*', 'CSV') -SETTINGS mode = 'unordered' -``` - - -## 设置 {#settings} - -支持的设置集与 `S3Queue` 表引擎相同,但不带 `s3queue_` 前缀。请参阅[完整设置列表](../../../engines/table-engines/integrations/s3queue.md#settings)。 -要获取表的配置设置列表,请使用 `system.azure_queue_settings` 表。此功能从 `24.10` 版本开始提供。 - - -## Description {#description} - -`SELECT` 对于流式导入并不特别有用(除了调试场景),因为每个文件只能导入一次。更实用的做法是使用[物化视图](../../../sql-reference/statements/create/view.md)创建实时处理流程。操作步骤如下: - -1. 使用该引擎创建一个表,用于从 S3 指定路径消费数据,并将其视为数据流。 -2. 创建一个具有所需结构的目标表。 -3. 创建一个物化视图,将引擎中的数据进行转换并写入之前创建的表中。 - -当 `MATERIALIZED VIEW` 关联到引擎后,它会在后台开始收集数据。 - -示例: - -```sql -CREATE TABLE azure_queue_engine_table (key UInt64, data String) - ENGINE=AzureQueue('', 'CSV', 'gzip') - SETTINGS - mode = 'unordered'; - -CREATE TABLE stats (key UInt64, data String) - ENGINE = MergeTree() ORDER BY key; - -CREATE MATERIALIZED VIEW consumer TO stats - AS SELECT key, data FROM azure_queue_engine_table; - -SELECT * FROM stats ORDER BY key; -``` - - -## 虚拟列 {#virtual-columns} - -- `_path` — 文件的路径。 -- `_file` — 文件的名称。 - -有关虚拟列的更多信息,请参阅[此处](../../../engines/table-engines/index.md#table_engines-virtual_columns)。 - - -## 内省 {#introspection} - -通过表设置 `enable_logging_to_queue_log=1` 为表启用日志记录。 - -内省功能与 [S3Queue 表引擎](/engines/table-engines/integrations/s3queue#introspection) 相同,但存在以下几个明显差异: - -1. 对于服务器版本 >= 25.1,使用 `system.azure_queue` 查看队列的内存状态。对于旧版本,使用 `system.s3queue`(它也包含 `azure` 表的信息)。 -2. 通过 ClickHouse 主配置文件启用 `system.azure_queue_log`,例如: - -```xml - - system - azure_queue_log
-
-``` - -此持久化表包含与 `system.s3queue` 相同的信息,但针对已处理和失败的文件。 - -该表具有以下结构: - -```sql - -CREATE TABLE system.azure_queue_log -( - `hostname` LowCardinality(String) COMMENT '主机名', - `event_date` Date COMMENT '写入此日志行的事件日期', - `event_time` DateTime COMMENT '写入此日志行的事件时间', - `database` String COMMENT '当前 S3Queue 表所在的数据库名称。', - `table` String COMMENT 'S3Queue 表的名称。', - `uuid` String COMMENT 'S3Queue 表的 UUID', - `file_name` String COMMENT '正在处理的文件名', - `rows_processed` UInt64 COMMENT '已处理的行数', - `status` Enum8('Processed' = 0, 'Failed' = 1) COMMENT '文件处理状态', - `processing_start_time` Nullable(DateTime) COMMENT '文件处理开始时间', - `processing_end_time` Nullable(DateTime) COMMENT '文件处理结束时间', - `exception` String COMMENT '发生异常时的异常消息' -) -ENGINE = MergeTree -PARTITION BY toYYYYMM(event_date) -ORDER BY (event_date, event_time) -SETTINGS index_granularity = 8192 -COMMENT '包含 S3Queue 引擎处理文件信息的日志条目。' - -``` - -示例: - -```sql -SELECT * -FROM system.azure_queue_log -LIMIT 1 -FORMAT Vertical - -Row 1: -────── -hostname: clickhouse -event_date: 2024-12-16 -event_time: 2024-12-16 13:42:47 -database: default -table: azure_queue_engine_table -uuid: 1bc52858-00c0-420d-8d03-ac3f189f27c8 -file_name: test_1.csv -rows_processed: 3 -status: Processed -processing_start_time: 2024-12-16 13:42:47 -processing_end_time: 2024-12-16 13:42:47 -exception: - -1 row in set. Elapsed: 0.002 sec. - -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md deleted file mode 100644 index 9c926ad8c47..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/azureBlobStorage.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -description: '此引擎提供与 Azure Blob Storage 生态系统的集成。' -sidebar_label: 'Azure Blob Storage' -sidebar_position: 10 -slug: /engines/table-engines/integrations/azureBlobStorage -title: 'AzureBlobStorage 表引擎' -doc_type: 'reference' ---- - - - -# 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_strategy, partition_columns_in_data_file, extra_credentials(client_id=, tenant_id=)]) - [PARTITION BY expr] - [SETTINGS ...] -``` - -### 引擎参数 - -* `endpoint` — 带有容器和前缀的 Azure Blob Storage 端点 URL。如所用的认证方式需要,还可以选择在其中包含 account_name。(`http://azurite1:{port}/[account_name]{container_name}/{data_prefix}`)或者也可以通过 `storage_account_url`、`account_name` 和 `container` 单独提供这些参数。要指定前缀时,应使用 `endpoint`。 -* `endpoint_contains_account_name` - 此标志用于指定 `endpoint` 是否包含 `account_name`,因为只有某些认证方式才需要它。(默认值:true) -* `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)),或者你也可以在此处提供 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)。 -* `compression` — 支持的值:`none`、`gzip/gz`、`brotli/br`、`xz/LZMA`、`zstd/zst`。默认会通过文件扩展名自动检测压缩类型(等同于设置为 `auto`)。 -* `partition_strategy` – 选项:`WILDCARD` 或 `HIVE`。`WILDCARD` 要求在路径中包含 `{_partition_id}`,该占位符会被分区键替换。`HIVE` 不允许使用通配符,假定路径为表的根路径,并生成 Hive 风格的分区目录,文件名为 Snowflake ID,扩展名为文件格式。默认值为 `WILDCARD`。 -* `partition_columns_in_data_file` - 仅在使用 `HIVE` 分区策略时有效。告知 ClickHouse 是否应在数据文件中写入分区列。默认值为 `false`。 -* `extra_credentials` - 使用 `client_id` 和 `tenant_id` 进行认证。如果提供了 `extra_credentials`,则其优先级高于 `account_name` 和 `account_key`。 - -**示例** - -用户可以使用 Azurite 仿真器进行本地 Azure Storage 开发。详情见[此处](https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=docker-hub%2Cblob-storage)。如果使用本地的 Azurite 实例,用户可能需要在下面的命令中将 `http://azurite1:10000` 替换为 `http://localhost:10000`,其中我们假设 Azurite 可通过主机 `azurite1` 访问。 - -```sql -CREATE TABLE test_table (key UInt64, data String) - ENGINE = AzureBlobStorage('DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite1:10000/devstoreaccount1/;', 'testcontainer', '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` — 文件路径。类型:`LowCardinality(String)`。 -- `_file` — 文件名。类型:`LowCardinality(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 中是否包含 `?` 来识别。示例参见 [azureBlobStorage](/sql-reference/table-functions/azureBlobStorage#using-shared-access-signatures-sas-sas-tokens)。 -* `Workload Identity` - 可以通过提供 `endpoint` 或 `storage_account_url` 进行身份验证。如果在配置中设置了 `use_workload_identity` 参数,则会使用 [workload identity](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#authenticate-azure-hosted-applications) 进行身份验证。 - -### 数据缓存 - -`Azure` 表引擎支持在本地磁盘上进行数据缓存。 -有关文件系统缓存配置选项及用法,请参见本[节](/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/;', 'testcontainer', 'test_table', 'CSV') -SETTINGS filesystem_cache_name = 'cache_for_azure', enable_filesystem_cache = 1; -``` - -1. 在 ClickHouse 配置文件中添加以下节: - -```xml - - - - 缓存目录的路径 - 10Gi - - - -``` - -2. 复用 ClickHouse `storage_configuration` 部分中的缓存配置(以及相应的缓存存储),[见此处](/operations/storing-data.md/#using-local-cache) - -### PARTITION BY - -`PARTITION BY` —— 可选。在大多数情况下不需要分区键;即便需要,一般也不需要比按月更细的分区键。分区不会加速查询(与 ORDER BY 表达式相反)。切勿使用粒度过细的分区。不要按客户端标识符或名称对数据进行分区(相反,应将客户端标识符或名称作为 ORDER BY 表达式中的第一列)。 - -对于按月分区,使用 `toYYYYMM(date_column)` 表达式,其中 `date_column` 是类型为 [Date](/sql-reference/data-types/date.md) 的日期列。这里的分区名称采用 `"YYYYMM"` 格式。 - -#### 分区策略 - -`WILDCARD`(默认):将文件路径中的 `{_partition_id}` 通配符替换为实际的分区键。不支持读取。 - -`HIVE` 为读写实现 Hive 风格的分区。读取通过递归 glob 模式完成。写入生成的文件采用以下格式:`//.`。 - -注意:使用 `HIVE` 分区策略时,`use_hive_partitioning` 设置不起任何作用。 - -`HIVE` 分区策略示例: - -```sql -arthur :) create table azure_table (year UInt16, country String, counter UInt8) ENGINE=AzureBlobStorage(account_name='devstoreaccount1', account_key='Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==', storage_account_url = 'http://localhost:30000/devstoreaccount1', container='cont', blob_path='hive_partitioned', format='Parquet', compression='auto', partition_strategy='hive') PARTITION BY (year, country); - -arthur :) insert into azure_table values (2020, 'Russia', 1), (2021, 'Brazil', 2); - -arthur :) select _path, * from azure_table; -``` - - -┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐ - -1. │ cont/hive_partitioned/year=2020/country=Russia/7351305360873664512.parquet │ 2020 │ Russia │ 1 │ -2. │ cont/hive_partitioned/year=2021/country=Brazil/7351305360894636032.parquet │ 2021 │ Brazil │ 2 │ - └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘ - -``` -``` - - -## 另请参阅 {#see-also} - -[Azure Blob 存储表函数](/sql-reference/table-functions/azureBlobStorage) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md deleted file mode 100644 index 6161fc4d8e3..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/deltalake.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -description: '此引擎为 Amazon S3 中现有的 Delta Lake 表提供只读集成。' -sidebar_label: 'DeltaLake' -sidebar_position: 40 -slug: /engines/table-engines/integrations/deltalake -title: 'DeltaLake 表引擎' -doc_type: 'reference' ---- - - - -# Delta Lake 表引擎 - -此引擎与 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/) 账户用户的长期凭证。可使用这些参数对请求进行身份验证。该参数为可选项。如果未指定凭证,将使用配置文件中的凭证。 - -可以使用[命名集合](/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') -``` - -使用命名集合: - -```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') -``` - -### 数据缓存 - -`Iceberg` 表引擎和表函数支持与 `S3`、`AzureBlobStorage`、`HDFS` 存储相同的数据缓存机制。请参阅[此处](../../../engines/table-engines/integrations/s3.md#data-cache)。 - - -## 另请参阅 {#see-also} - -- [DeltaLake 表函数](../../../sql-reference/table-functions/deltalake.md) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md deleted file mode 100644 index 70404eb6bd6..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/embedded-rocksdb.md +++ /dev/null @@ -1,235 +0,0 @@ ---- -description: '该引擎允许将 ClickHouse 与 RocksDB 集成' -sidebar_label: 'EmbeddedRocksDB' -sidebar_position: 50 -slug: /engines/table-engines/integrations/embedded-rocksdb -title: 'EmbeddedRocksDB 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# EmbeddedRocksDB 表引擎 - - - -该引擎用于将 ClickHouse 与 [RocksDB](http://rocksdb.org/) 集成。 - - - -## 创建数据表 - -```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` - 值的生存时间(time to live),单位为秒。如果 TTL 为 0,则使用常规 RocksDB 实例(无 TTL)。 -* `rocksdb_dir` - 已存在的 RocksDB 目录路径,或新建 RocksDB 的目标路径。使用指定的 `rocksdb_dir` 打开表。 -* `read_only` - 当 `read_only` 设为 true 时,使用只读模式。对于带 TTL 的存储,不会触发压实(无论手动还是自动),因此不会删除过期条目。 -* `primary_key_name` – 列表中的任意列名。 -* 必须指定 `primary key`,且主键只支持单列。主键将以二进制形式序列化为 `rocksdb key`。 -* 除主键外的其他列将按对应顺序,以二进制形式序列化为 `rocksdb` value。 -* 对键使用 `equals` 或 `in` 过滤条件的查询,将被优化为从 `rocksdb` 进行多键查找。 - -引擎设置: - -* `optimize_for_bulk_insert` – 使表针对批量插入进行优化(插入流水线会创建 SST 文件并导入到 RocksDB 数据库,而不是写入 memtables);默认值:`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 - -
-
-
-``` - -默认情况下,“trivial approximate count” 优化是关闭的,这可能会影响 `count()` 查询的性能。要启用此优化,请将 `optimize_trivial_approximate_count_query` 设置为 `1`。此外,该设置还会影响 EmbeddedRocksDB 引擎的 `system.tables`,启用后可以看到 `total_rows` 和 `total_bytes` 的近似值。 - - -## 支持的操作 - -### 插入 - -当向 `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` 联接。 -这种 `direct` 联接避免在内存中构建哈希表,而是直接从 EmbeddedRocksDB 访问数据。 - -在进行大规模联接时,由于不会创建哈希表,使用 `direct` 联接可以显著降低内存占用。 - -要启用 `direct` 联接: - -```sql -SET join_algorithm = 'direct, hash' -``` - -:::tip -当 `join_algorithm` 设置为 `direct, hash` 时,将在可行时优先使用 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); -``` - -##### 创建并填充一个表,以便与 `rdb` 表进行 JOIN - -```sql -CREATE TABLE t2 -( - `k` UInt16 -) -ENGINE = TinyLog -``` - -```sql -INSERT INTO t2 SELECT number AS k -FROM numbers_mt(10) -``` - -##### 将 join 算法设为 `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 的更多信息 - -* [`join_algorithm` 设置](/operations/settings/settings.md#join_algorithm) -* [JOIN 子句](/sql-reference/statements/select/join.md) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md deleted file mode 100644 index 62515dbbc71..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hdfs.md +++ /dev/null @@ -1,266 +0,0 @@ ---- -description: '此引擎通过允许使用 ClickHouse 管理 HDFS 上的数据,为 Apache Hadoop 生态系统提供集成。该引擎类似于 File 和 URL 引擎,但提供了 Hadoop 特有功能。' -sidebar_label: 'HDFS' -sidebar_position: 80 -slug: /engines/table-engines/integrations/hdfs -title: 'HDFS 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# HDFS 表引擎 - - - -该引擎通过允许通过 ClickHouse 管理 [HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) 上的数据,为 [Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop) 生态系统提供集成能力。此引擎类似于 [File](/engines/table-engines/special/file) 和 [URL](/engines/table-engines/special/url) 引擎,但提供了 Hadoop 特有的功能。 - -此功能目前不由 ClickHouse 工程团队官方支持,且已知质量不佳。如遇任何问题,请自行修复并提交 Pull Request。 - - - -## 用法 - -```sql -ENGINE = HDFS(URI, format) -``` - -**引擎参数** - -* `URI` - HDFS 中整个文件的 URI。`URI` 的路径部分可以包含通配符模式。在这种情况下,该表将为只读。 -* `format` - 指定可用文件格式之一。要执行 - `SELECT` 查询,格式必须支持输入;要执行 - `INSERT` 查询,格式必须支持输出。可用格式列在 - [Formats](/sql-reference/formats#formats-overview) 部分。 -* [PARTITION BY expr] - -### PARTITION BY - -`PARTITION BY` — 可选。在大多数情况下不需要分区键,即使需要,一般也不需要比“按月”更细的分区键。分区并不会加速查询(与 ORDER BY 表达式不同)。切勿使用过于细粒度的分区。不要按客户标识符或名称对数据进行分区(相反,应将客户标识符或名称设为 ORDER BY 表达式中的第一列)。 - -对于按月分区,使用 `toYYYYMM(date_column)` 表达式,其中 `date_column` 是类型为 [Date](/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 │ -└──────┴───────┘ -``` - - -## 实现细节 - -* 读写操作可以并行进行。 -* 不支持: - - * `ALTER` 和 `SELECT...SAMPLE` 操作。 - * 索引。 - * [Zero-copy](../../../operations/storing-data.md#zero-copy) 复制是可用的,但不推荐使用。 - - :::note Zero-copy 复制尚未准备好用于生产环境 - 在 ClickHouse 22.8 及更高版本中,默认禁用 Zero-copy 复制。不建议在生产环境中使用此功能。 - ::: - -**路径中的通配符(Globs)** - -多个路径组件可以包含通配符。文件要参与处理,必须实际存在并且与整个路径模式匹配。文件列表在执行 `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. 假设我们在 HDFS 上有几个 TSV 格式的文件,具有以下 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 -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') -``` - -该表由这两个目录中的所有文件构成(所有文件都应符合查询中描述的格式和 schema): - -```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') -``` - -## 配置 - -与 GraphiteMergeTree 类似,HDFS 引擎支持通过 ClickHouse 配置文件进行扩展配置。可以使用两个配置项:全局级(`hdfs`)和用户级(`hdfs_*`)。系统会先应用全局配置,然后再应用用户级配置(如果存在)。 - -```xml - - - /tmp/keytab/clickhouse.keytab - clickuser@TEST.CLICKHOUSE.TECH - kerberos - - - - - root@TEST.CLICKHOUSE.TECH - -``` - -### 配置选项 - -#### 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 配置参考](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 的限制,仅支持传统的旧式方案, -datanode 通信不会通过 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 支持 - -libhdfs3 支持 HDFS Namenode 高可用(HA)。 - -* 将 `hdfs-site.xml` 从任一 HDFS 节点复制到 `/etc/clickhouse-server/`。 -* 在 ClickHouse 配置文件中添加如下片段: - -```xml - - /etc/clickhouse-server/hdfs-site.xml - -``` - -* 然后使用 `hdfs-site.xml` 中 `dfs.nameservices` 配置项的值,作为 HDFS URI 中的 NameNode 地址。例如,将 `hdfs://appadmin@192.168.101.11:8020/abc/` 替换为 `hdfs://appadmin@my_nameservice/abc/`。 - - -## 虚拟列 {#virtual-columns} - -- `_path` — 文件路径。类型:`LowCardinality(String)`。 -- `_file` — 文件名。类型:`LowCardinality(String)`。 -- `_size` — 文件大小(字节)。类型:`Nullable(UInt64)`。如果大小未知,则该值为 `NULL`。 -- `_time` — 文件的最后修改时间。类型:`Nullable(DateTime)`。如果时间未知,则该值为 `NULL`。 - - - -## 存储设置 {#storage-settings} - -- [hdfs_truncate_on_insert](/operations/settings/settings.md#hdfs_truncate_on_insert) - 允许在插入前截断文件。默认禁用。 -- [hdfs_create_new_file_on_insert](/operations/settings/settings.md#hdfs_create_new_file_on_insert) - 如果格式带有后缀,允许在每次插入时创建一个新文件。默认禁用。 -- [hdfs_skip_empty_files](/operations/settings/settings.md#hdfs_skip_empty_files) - 允许在读取时跳过空文件。默认禁用。 - -**另请参阅** - -- [虚拟列](../../../engines/table-engines/index.md#table_engines-virtual_columns) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md deleted file mode 100644 index 16f4c300237..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hive.md +++ /dev/null @@ -1,439 +0,0 @@ ---- -description: 'Hive 引擎允许你在 HDFS 中的 Hive 表上执行 `SELECT` 查询。' -sidebar_label: 'Hive' -sidebar_position: 84 -slug: /engines/table-engines/integrations/hive -title: 'Hive 表引擎' -doc_type: 'guide' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Hive 表引擎 - - - -Hive 引擎允许对 HDFS 中的 Hive 表执行 `SELECT` 查询。目前支持的输入格式如下: - -- Text:仅支持除 `binary` 外的简单标量列类型 - -- ORC:支持除 `char` 外的简单标量列类型;复杂类型仅支持 `array` 等 - -- Parquet:支持所有简单标量列类型;复杂类型仅支持 `array` 等 - - - -## 创建表 - -```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) 查询的详细说明。 - -表结构可以与原始 Hive 表结构不同: - -* 列名应与原始 Hive 表中的列名相同,但可以只使用其中部分列,顺序任意;也可以使用由其他列计算得到的别名列。 -* 列类型必须与原始 Hive 表中的列类型相同。 -* 分区表达式应与原始 Hive 表保持一致,且分区表达式中使用的列必须在表结构中定义。 - -**Engine 参数** - -* `thrift://host:port` — Hive Metastore 地址 - -* `database` — 远程数据库名称。 - -* `table` — 远程表名称。 - - -## 使用示例 - -### 如何在 HDFS 文件系统中使用本地缓存 - -我们强烈建议为远程文件系统启用本地缓存。基准测试结果表明,启用缓存后速度几乎提升 2 倍。 - -在使用缓存之前,请先在 `config.xml` 中添加相应配置 - -```xml - - true - local_cache - 559096952 - 1048576 - -``` - -* enable: 当为 true 时,ClickHouse 在启动后会为远程文件系统(HDFS)维护本地缓存。 -* root_dir: 必需。用于存储远程文件系统本地缓存文件的根目录。 -* limit_size: 必需。本地缓存文件的最大大小(以字节为单位)。 -* bytes_read_before_flush: 控制从远程文件系统下载文件时,在刷新到本地文件系统之前读取的字节数。默认值为 1MB。 - -### 使用 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 中创建表 - - -ClickHouse 中的一个表,用于从上面创建的 Hive 表中读取数据: - -```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 -耗时:36.025 秒 - -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 -耗时:0.766 秒,获取:1 行记录 - -```` - -#### 在 ClickHouse 中创建表 - -在 ClickHouse 中创建表,从上面创建的 Hive 表中获取数据: -```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 - -第 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 行。耗时: 0.357 秒。 -``` - -### 使用 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 中创建表 - -在 ClickHouse 中创建一个表,用于从上述创建的 Hive 表中读取数据: - -```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' - -查询 ID: 55b79d35-56de-45b9-8be6-57282fbf1f44 -``` - - -第 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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md deleted file mode 100644 index db538335be8..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/hudi.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -description: '该引擎为 Amazon S3 中现有的 Apache Hudi 表提供只读集成。' -sidebar_label: 'Hudi' -sidebar_position: 86 -slug: /engines/table-engines/integrations/hudi -title: 'Hudi 表引擎' -doc_type: 'reference' ---- - - - -# Hudi 表引擎 - -该引擎提供与 Amazon S3 中现有 Apache [Hudi](https://hudi.apache.org/) 表的只读方式集成。 - - - -## 创建表 - -请注意,S3 中必须已经存在该 Hudi 表,此命令不支持通过 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](/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') -``` - -使用命名集合: - -```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') -``` - - -## 另请参阅 {#see-also} - -- [Hudi 表函数](/sql-reference/table-functions/hudi.md) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md deleted file mode 100644 index 4be8b5b86c9..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/iceberg.md +++ /dev/null @@ -1,325 +0,0 @@ ---- -description: '此引擎提供与现有 Apache Iceberg 表的只读集成,这些表存储在 Amazon S3、Azure、HDFS 或本地。' -sidebar_label: 'Iceberg' -sidebar_position: 90 -slug: /engines/table-engines/integrations/iceberg -title: 'Iceberg 表引擎' -doc_type: 'reference' ---- - - - -# Iceberg 表引擎 {#iceberg-table-engine} - -:::warning -我们建议在 ClickHouse 中处理 Iceberg 数据时使用 [Iceberg 表函数](/sql-reference/table-functions/iceberg.md)。Iceberg 表函数目前提供了足够的功能,并为 Iceberg 表提供部分只读接口。 - -Iceberg 表引擎是可用的,但可能存在一些限制。ClickHouse 最初并非为支持其模式会在外部发生变化的表而设计,这可能会影响 Iceberg 表引擎的功能。因此,一些对常规表可用的特性在这里可能不可用,或者可能无法正确工作,尤其是在使用旧版分析器时。 - -为了获得最佳兼容性,在我们持续改进对 Iceberg 表引擎的支持期间,建议优先使用 Iceberg 表函数。 -::: - -该引擎提供与现有 Apache [Iceberg](https://iceberg.apache.org/) 表的只读集成,支持位于 Amazon S3、Azure、HDFS 以及本地存储的表。 - - - -## 创建表 - -请注意,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') -``` - -使用命名集合: - -```xml - - - - http://test.s3.amazonaws.com/clickhouse-bucket/ - test - test - - - -``` - -```sql -CREATE TABLE iceberg_table ENGINE=IcebergS3(iceberg_conf, filename = 'test_table') - -``` - - -## 别名 {#aliases} - -表引擎 `Iceberg` 现在是 `IcebergS3` 的别名。 - - - -## 模式演进 {#schema-evolution} -目前,借助 ClickHouse (CH),可以读取随着时间推移发生模式变更的 Iceberg 表。当前支持读取曾经增加或删除列、以及列顺序发生变化的表。也可以将原本要求非空的列修改为允许为 NULL 的列。此外,还支持对简单类型进行允许的类型转换,即:   -* int -> long -* float -> double -* decimal(P, S) -> decimal(P', S),其中 P' > P。 - -目前尚不支持更改嵌套结构,或数组和 map 中元素的类型。 - -要读取一个在创建之后模式发生变更、并使用动态模式推断的表,请在创建该表时将 allow_dynamic_metadata_for_data_lakes 设置为 true。 - - - -## 分区裁剪 {#partition-pruning} - -ClickHouse 在对 Iceberg 表执行 SELECT 查询时支持分区裁剪,通过跳过无关的数据文件来优化查询性能。要启用分区裁剪,请设置 `use_iceberg_partition_pruning = 1`。有关 Iceberg 分区裁剪的更多信息,请参阅 https://iceberg.apache.org/spec/#partitioning 上的文档。 - - - -## 时间旅行 {#time-travel} - -ClickHouse 支持 Iceberg 表的时间旅行功能,允许您在指定的时间戳或快照 ID 下查询历史数据。 - - - -## 处理包含已删除行的表 - -目前,仅支持带有 [position deletes](https://iceberg.apache.org/spec/#position-delete-files) 的 Iceberg 表。 - -以下删除方式**不受支持**: - -* [Equality deletes](https://iceberg.apache.org/spec/#equality-delete-files)(等值删除) -* [Deletion vectors](https://iceberg.apache.org/spec/#deletion-vectors)(在 v3 中引入的删除向量) - -### 基本用法 - -```sql -SELECT * FROM example_table ORDER BY 1 -SETTINGS iceberg_timestamp_ms = 1714636800000 -``` - -```sql -SELECT * FROM example_table ORDER BY 1 -SETTINGS iceberg_snapshot_id = 3547395809148285433 -``` - -注意:你不能在同一个查询中同时指定 `iceberg_timestamp_ms` 和 `iceberg_snapshot_id` 参数。 - -### 重要注意事项 - -* **快照** 通常在以下情况下创建: - * 向表写入新数据时 - * 执行某种数据压缩(compaction)操作时 - -* **模式变更通常不会创建快照** —— 这会在对经过模式演进的表使用 time travel(时间穿梭查询)时产生一些需要注意的重要行为。 - -### 示例场景 - -所有场景都使用 Spark 编写,因为 ClickHouse(CH)目前尚不支持向 Iceberg 表写入数据。 - -#### 场景 1:仅发生模式变更但没有新的快照 - -考虑以下一系列操作: - -```sql --- 创建一个包含两列的表 - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2') - --- 向表中插入数据 - INSERT INTO spark_catalog.db.time_travel_example VALUES - (1, 'Mars') - - ts1 = now() // 一段伪代码 - --- 修改表,添加一个新列 - ALTER TABLE spark_catalog.db.time_travel_example ADD COLUMN (price double) - - ts2 = now() - --- 向表中插入数据 - INSERT INTO spark_catalog.db.time_travel_example VALUES (2, 'Venus', 100) - - ts3 = now() - --- 在各个时间点查询该表 - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts1; - -+------------+------------+ -|order_number|product_code| -+------------+------------+ -| 1| Mars| -+------------+------------+ - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts2; - -+------------+------------+ -|order_number|product_code| -+------------+------------+ -| 1| Mars| -+------------+------------+ - - SELECT * FROM spark_catalog.db.time_travel_example TIMESTAMP AS OF ts3; - -+------------+------------+-----+ -|order_number|product_code|price| -+------------+------------+-----+ -| 1| Mars| NULL| -| 2| Venus|100.0| -+------------+------------+-----+ -``` - -在不同时间点的查询结果: - -* 在 ts1 和 ts2:只显示原来的两列 -* 在 ts3:显示全部三列,且第一行的 price 为 NULL - -#### 场景 2:历史表结构与当前表结构的差异 - -在当前时刻执行的时间旅行查询,可能会显示与当前表不同的表结构: - -```sql --- 创建一个表 - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example_2 ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2') - --- 向表中插入初始数据 - INSERT INTO spark_catalog.db.time_travel_example_2 VALUES (2, 'Venus'); - --- 修改表,添加一个新列 - ALTER TABLE spark_catalog.db.time_travel_example_2 ADD COLUMN (price double); - - ts = now(); - --- 使用时间戳语法在当前时间点查询该表 - - SELECT * FROM spark_catalog.db.time_travel_example_2 TIMESTAMP AS OF ts; - - +------------+------------+ - |order_number|product_code| - +------------+------------+ - | 2| Venus| - +------------+------------+ - --- 在当前时间点查询该表 - SELECT * FROM spark_catalog.db.time_travel_example_2; - +------------+------------+-----+ - |order_number|product_code|price| - +------------+------------+-----+ - | 2| Venus| NULL| - +------------+------------+-----+ -``` - -这是因为 `ALTER TABLE` 不会创建新的快照;对于当前表,Spark 会从最新的元数据文件中读取 `schema_id` 的值,而不是从快照中读取。 - - -#### 场景 3:历史与当前表结构差异 - -第二点是在进行时间旅行时,你无法获取表在尚未写入任何数据之前的状态: - -```sql --- 创建表 - CREATE TABLE IF NOT EXISTS spark_catalog.db.time_travel_example_3 ( - order_number int, - product_code string - ) - USING iceberg - OPTIONS ('format-version'='2'); - - ts = now(); - --- 在指定时间戳查询该表 - SELECT * FROM spark_catalog.db.time_travel_example_3 TIMESTAMP AS OF ts; -- 将报错:找不到早于 ts 的快照。 -``` - -在 ClickHouse 中,其行为与 Spark 保持一致。你可以在概念上将 Spark 的 Select 查询替换为 ClickHouse 的 Select 查询,它们的工作方式是相同的。 - - -## 元数据文件解析 - -在 ClickHouse 中使用 `Iceberg` 表引擎时,系统需要定位描述 Iceberg 表结构的正确 metadata.json 文件。下面是该解析过程的具体流程: - -### 候选文件搜索 - -1. **直接路径指定**: - -* 如果设置了 `iceberg_metadata_file_path`,系统会将该路径与 Iceberg 表目录路径组合使用,得到精确的文件路径。 -* 当提供该设置时,所有其他解析相关设置都会被忽略。 - -2. **表 UUID 匹配**: - -* 如果指定了 `iceberg_metadata_table_uuid`,系统将: - * 只检查 `metadata` 目录中的 `.metadata.json` 文件 - * 过滤出其中 `table-uuid` 字段与所指定 UUID 匹配的文件(不区分大小写) - -3. **默认搜索**: - -* 如果上述设置都未提供,则 `metadata` 目录中的所有 `.metadata.json` 文件都将作为候选。 - -### 选择最新的文件 - -根据上述规则确定候选文件后,系统会判断其中哪个是最新的文件: - -* 如果启用了 `iceberg_recent_metadata_file_by_last_updated_ms_field`: - * 会选择 `last-updated-ms` 值最大的文件 - -* 否则: - * 会选择版本号最高的文件 - * (版本号在文件名中以 `V` 的形式出现,文件名格式如 `V.metadata.json` 或 `V-uuid.metadata.json`) - -**注意**:上述所有设置都是引擎级别设置,必须在创建表时进行指定,如下所示: - -```sql -CREATE TABLE example_table ENGINE = Iceberg( - 's3://bucket/path/to/iceberg_table' -) SETTINGS iceberg_metadata_table_uuid = '6f6f6407-c6a5-465f-a808-ea8900e35a38'; -``` - -**注意**:虽然 Iceberg Catalog 通常负责元数据解析,但 ClickHouse 中的 `Iceberg` 表引擎会直接将存储在 S3 中的文件解析为 Iceberg 表,这也是为什么理解这些解析规则很重要。 - - -## 数据缓存 {#data-cache} - -`Iceberg` 表引擎和表函数支持与 `S3`、`AzureBlobStorage`、`HDFS` 存储类似的数据缓存功能。请参阅[此处](../../../engines/table-engines/integrations/s3.md#data-cache)。 - - - -## 元数据缓存 {#metadata-cache} - -`Iceberg` 表引擎和表函数支持元数据缓存,用于存储清单文件、清单列表以及元数据 JSON 的信息。该缓存存储在内存中。此功能通过设置 `use_iceberg_metadata_files_cache` 进行控制,默认启用。 - - - -## 另请参阅 {#see-also} - -- [iceberg 表函数](/sql-reference/table-functions/iceberg.md) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md deleted file mode 100644 index 616ff87f55e..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/index.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: '用于集成的表引擎文档' -sidebar_label: '集成' -sidebar_position: 40 -slug: /engines/table-engines/integrations/ -title: '用于集成的表引擎' -doc_type: 'reference' ---- - - - -# 用于集成的表引擎 - -ClickHouse 提供多种与外部系统集成的方式,其中包括表引擎。与所有其他表引擎一样,其配置是通过 `CREATE TABLE` 或 `ALTER TABLE` 语句完成的。随后,从用户的角度来看,已配置的集成与普通表无异,但对其发起的查询会被转发到外部系统。这种透明的查询特性是该方案相较于其他集成方法(如字典或表函数,需要在每次使用时采用自定义查询方式)的关键优势之一。 - -{/* 本页的目录由以下脚本自动生成: - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - 该脚本基于 YAML front matter 字段:slug、description、title。 - - 如发现错误,请直接编辑相应页面的 YAML front matter。 - */ } - - -{/*AUTOGENERATED_START*/ } - -| 页面 | 描述 | -| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -| [AzureBlobStorage 表引擎](/engines/table-engines/integrations/azureBlobStorage) | 该引擎支持与 Azure Blob Storage 生态系统集成。 | -| [DeltaLake 表引擎](/engines/table-engines/integrations/deltalake) | 此引擎以只读方式集成位于 Amazon S3 上的现有 Delta Lake 表。 | -| [EmbeddedRocksDB 表引擎](/engines/table-engines/integrations/embedded-rocksdb) | 该引擎允许将 ClickHouse 与 RocksDB 集成 | -| [ExternalDistributed 表引擎](/engines/table-engines/integrations/ExternalDistributed) | `ExternalDistributed` 引擎允许对存储在远程 MySQL 或 PostgreSQL 服务器中的数据执行 `SELECT` 查询。它接收 MySQL 或 PostgreSQL 引擎作为参数,因此可以实现分片。 | -| [TimeSeries 表引擎](/engines/table-engines/special/time_series) | 用于存储时间序列的表引擎,即一组与时间戳和标签(或标记)关联的值。 | -| [HDFS 表引擎](/engines/table-engines/integrations/hdfs) | 该引擎支持通过 ClickHouse 管理 HDFS 上的数据,从而与 Apache Hadoop 生态系统集成。该引擎类似于 File 和 URL 引擎,但提供了 Hadoop 特有的功能。 | -| [Hive 表引擎](/engines/table-engines/integrations/hive) | Hive 引擎允许你对存储在 HDFS 上的 Hive 表执行 `SELECT` 查询。 | -| [Hudi 表引擎](/engines/table-engines/integrations/hudi) | 该引擎为位于 Amazon S3 中的现有 Apache Hudi 表提供只读集成。 | -| [Iceberg 表引擎](/engines/table-engines/integrations/iceberg) | 此引擎为现有的 Apache Iceberg 表提供只读集成,支持存储在 Amazon S3、Azure、HDFS 以及本地存储的表。 | -| [JDBC 表引擎](/engines/table-engines/integrations/jdbc) | 允许 ClickHouse 通过 JDBC 连接到外部数据库。 | -| [Kafka 表引擎](/engines/table-engines/integrations/kafka) | Kafka 表引擎可用于与 Apache Kafka 协同工作,并支持发布或订阅数据流、构建容错存储,以及在数据流可用时对其进行处理。 | -| [MaterializedPostgreSQL 表引擎](/engines/table-engines/integrations/materialized-postgresql) | 根据 PostgreSQL 表的初始数据转储创建一个 ClickHouse 表,并启动复制流程。 | -| [MongoDB 表引擎](/engines/table-engines/integrations/mongodb) | MongoDB 引擎是一种只读表引擎,可用于从远程集合中读取数据。 | -| [MySQL 表引擎](/engines/table-engines/integrations/mysql) | MySQL 表引擎文档 | -| [NATS 表引擎](/engines/table-engines/integrations/nats) | 此引擎可将 ClickHouse 与 NATS 集成,用于发布或订阅消息主题,并在有新消息时对其进行处理。 | -| [ODBC 表引擎](/engines/table-engines/integrations/odbc) | 使 ClickHouse 能够通过 ODBC 连接到外部数据库。 | -| [PostgreSQL 表引擎](/engines/table-engines/integrations/postgresql) | PostgreSQL 引擎允许对存储在远程 PostgreSQL 服务器上的数据进行 `SELECT` 和 `INSERT` 操作。 | -| [RabbitMQ 表引擎](/engines/table-engines/integrations/rabbitmq) | 该引擎支持将 ClickHouse 与 RabbitMQ 集成。 | -| [Redis 表引擎](/engines/table-engines/integrations/redis) | 该引擎允许将 ClickHouse 与 Redis 集成。 | -| [S3 表引擎](/engines/table-engines/integrations/s3) | 此引擎提供与 Amazon S3 生态系统的集成。类似于 HDFS 引擎,但提供 S3 特有的功能。 | -| [S3Queue 表引擎](/engines/table-engines/integrations/s3queue) | 该引擎提供与 Amazon S3 生态系统的集成,并支持流式导入。类似于 Kafka 和 RabbitMQ 引擎,但提供 S3 特有的功能。 | -| [AzureQueue 表引擎](/engines/table-engines/integrations/azure-queue) | 该引擎实现了与 Azure Blob Storage 生态系统的集成,从而支持流式数据导入。 | -| [YTsaurus 表引擎](/engines/table-engines/integrations/ytsaurus) | 一种表引擎,可从 YTsaurus 集群导入数据。 | -| [SQLite 表引擎](/engines/table-engines/integrations/sqlite) | 该引擎支持向 SQLite 导入数据、从 SQLite 导出数据,并支持在 ClickHouse 中直接查询 SQLite 表。 | -| [ArrowFlight 表引擎](/engines/table-engines/integrations/arrowflight) | 该引擎支持通过 Apache Arrow Flight 对远程数据集进行查询。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md deleted file mode 100644 index 2cd604d8d9d..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/jdbc.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -description: '允许 ClickHouse 通过 JDBC 连接到外部数据库。' -sidebar_label: 'JDBC' -sidebar_position: 100 -slug: /engines/table-engines/integrations/jdbc -title: 'JDBC 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# JDBC 表引擎 - - - -:::note -clickhouse-jdbc-bridge 包含实验性代码,且已不再受支持。它可能存在可靠性问题和安全漏洞,请自行承担使用风险。 -ClickHouse 推荐使用 ClickHouse 内置的表函数,作为临时(即席)查询场景(Postgres、MySQL、MongoDB 等)的更佳替代方案。 -::: - -允许 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) 数据类型。 - - - -## 创建数据表 - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name -( - 列列表... -) -ENGINE = JDBC(数据源名称, 外部数据库, 外部表) -``` - -**引擎参数** - -* `datasource` — 外部 DBMS 的 URI 或名称。 - - URI 格式:`jdbc:://:/?user=&password=`。 - MySQL 示例:`jdbc:mysql://localhost:3306/?user=root&password=root`。 - -* `external_database` — 外部 DBMS 中的数据库名称,或一个显式定义的表结构(参见示例)。 - -* `external_table` — 外部数据库中表的名称,或者形如 `select * from table1 where column1=1` 的查询语句。 - -* 这些参数也可以通过 [命名集合](operations/named-collections.md) 传递。 - - -## 使用示例 - -使用 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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md deleted file mode 100644 index 48a538a1114..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/kafka.md +++ /dev/null @@ -1,315 +0,0 @@ ---- -description: 'Kafka 表引擎可与 Apache Kafka 协同工作,使您可以发布或订阅数据流、构建容错存储,并在数据流可用时对其进行处理。' -sidebar_label: 'Kafka' -sidebar_position: 110 -slug: /engines/table-engines/integrations/kafka -title: 'Kafka 表引擎' -keywords: ['Kafka', 'table engine'] -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# Kafka 表引擎 - -:::tip -如果您在使用 ClickHouse Cloud,我们推荐改用 [ClickPipes](/integrations/clickpipes)。ClickPipes 原生支持私有网络连接,可分别扩展摄取层和集群资源,并为将 Kafka 流式数据摄取到 ClickHouse 提供完善的监控能力。 -::: - -- 发布或订阅数据流。 -- 构建具备容错能力的存储。 -- 在数据流到达时进行处理。 - -## 创建表 - -```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_security_protocol = '',] - [kafka_sasl_mechanism = '',] - [kafka_sasl_username = '',] - [kafka_sasl_password = '',] - [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_compression_codec = '',] - [kafka_compression_level = -1]; -``` - -必需参数: - -* `kafka_broker_list` — 以逗号分隔的 broker 列表(例如 `localhost:9092`)。 -* `kafka_topic_list` — Kafka 主题列表。 -* `kafka_group_name` — Kafka 消费者组。每个组的读取偏移量(offset)都会单独跟踪。如果你不希望消息在集群中被重复消费,请在所有地方使用相同的组名。 -* `kafka_format` — 消息格式。使用与 SQL `FORMAT` 函数相同的表示方式,例如 `JSONEachRow`。有关更多信息,请参阅 [Formats](../../../interfaces/formats.md) 部分。 - -可选参数: - - -- `kafka_security_protocol` - 用于与 broker 通信的协议。可选值:`plaintext`、`ssl`、`sasl_plaintext`、`sasl_ssl`。 -- `kafka_sasl_mechanism` - 用于认证的 SASL 机制。可选值:`GSSAPI`、`PLAIN`、`SCRAM-SHA-256`、`SCRAM-SHA-512`、`OAUTHBEARER`。 -- `kafka_sasl_username` - 与 `PLAIN` 和 `SASL-SCRAM-..` 机制一起使用的 SASL 用户名。 -- `kafka_sasl_password` - 与 `PLAIN` 和 `SASL-SCRAM-..` 机制一起使用的 SASL 密码。 -- `kafka_schema` — 当格式需要 schema 定义时必须使用的参数。例如,[Cap'n Proto](https://capnproto.org/) 需要提供 schema 文件的路径以及根 `schema.capnp:Message` 对象的名称。 -- `kafka_schema_registry_skip_bytes` — 在使用带信封头的 schema registry 时,从每条消息开头跳过的字节数(例如,AWS Glue Schema Registry 会包含一个 19 字节的信封)。范围:`[0, 255]`。默认值:`0`。 -- `kafka_num_consumers` — 每个表的 consumer 数量。如果单个 consumer 的吞吐量不足,请增加 consumer 数量。consumer 总数不应超过该 topic 的分区数,因为每个分区只能分配一个 consumer,并且不得大于部署 ClickHouse 的服务器上的物理 CPU 核心数。默认值:`1`。 -- `kafka_max_block_size` — 单次轮询的最大批大小(按消息数计)。默认值:[max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 -- `kafka_skip_broken_messages` — Kafka 消息解析器对每个 block 中与 schema 不兼容消息的容忍度。如果 `kafka_skip_broken_messages = N`,则引擎会跳过 *N* 条无法解析的 Kafka 消息(每条消息等于一行数据)。默认值:`0`。 -- `kafka_commit_every_batch` — 对每个已消费并处理的批次执行提交,而不是在写入整个 block 后仅提交一次。默认值:`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#max_block_size)。 -- `kafka_flush_interval_ms` — 从 Kafka 刷新数据的时间间隔(毫秒)。默认值:[stream_flush_interval_ms](/operations/settings/settings#stream_flush_interval_ms)。 -- `kafka_thread_per_consumer` — 为每个 consumer 提供独立线程。启用后,每个 consumer 会独立、并行地刷新数据(否则来自多个 consumer 的行会被合并为一个 block)。默认值:`0`。 -- `kafka_handle_error_mode` — Kafka 引擎处理错误的方式。可选值:default(如果消息解析失败,将抛出异常)、stream(异常信息和原始消息将保存在虚拟列 `_error` 和 `_raw_message` 中)、dead_letter_queue(与错误相关的数据将保存在 system.dead_letter_queue 中)。 -- `kafka_commit_on_select` — 在执行 select 查询时提交消息。默认值:`false`。 -- `kafka_max_rows_per_message` — 对基于行的格式,每条 kafka 消息中写入的最大行数。默认值:`1`。 -- `kafka_compression_codec` — 用于生成消息的压缩编解码器。支持:空字符串、`none`、`gzip`、`snappy`、`lz4`、`zstd`。如果为空字符串,则该表不设置压缩编解码器,此时将使用配置文件中的值或 `librdkafka` 的默认值。默认值:空字符串。 -- `kafka_compression_level` — 由 `kafka_compression_codec` 选择的算法所使用的压缩级别参数。更高的值意味着更好的压缩率,但会消耗更多 CPU。可用范围依赖于算法:`gzip` 为 `[0-9]`;`lz4` 为 `[0-12]`;`snappy` 仅支持 `0`;`zstd` 为 `[0-12]`;`-1` 表示使用该编解码器的默认压缩级别。默认值:`-1`。 - -Examples: - -```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#default_values)的列。如果您需要带默认值的列,可以在物化视图层添加它们(见下文)。 -::: - - -## 描述 - -已投递的消息会被自动跟踪,因此每个组中的每条消息只会被计数一次。如果你希望获取同一批数据两次,请创建一个使用不同 group 名称的表副本。 - -Group 十分灵活,并且会在集群中同步。例如,如果你在一个集群中有 10 个 topic 和 5 个表副本,那么每个副本会分配到 2 个 topic。如果副本数量发生变化,这些 topic 会在各个副本之间自动重新分配。更多信息请参阅 [http://kafka.apache.org/intro](http://kafka.apache.org/intro)。 - -建议为每个 Kafka topic 配置其专用的 consumer group,确保该 topic 与该 group 之间是一一对应的关系,特别是在会动态创建和删除 topic 的环境中(例如测试或预发布环境)。 - -`SELECT` 并不特别适合用于读取消息(除非用于调试),因为每条消息只能被读取一次。更实用的方式是通过物化视图创建实时处理链。为此,请执行以下步骤: - -1. 使用引擎创建一个 Kafka consumer,并将其视为数据流。 -2. 创建一个具有所需结构的表。 -3. 创建一个物化视图,将引擎中的数据转换后写入之前创建的表中。 - -当 `MATERIALIZED VIEW` 连接到该引擎时,它会在后台开始收集数据。这样你就可以持续地从 Kafka 接收消息,并使用 `SELECT` 将其转换为所需的格式。 -一个 Kafka 表可以拥有任意数量的物化视图,它们并不会直接从该 Kafka 表中读取数据,而是以数据块(blocks)的形式接收新增记录。通过这种方式,你可以将数据写入多张具有不同明细级别(带分组聚合和不带分组聚合)的表中。 - -示例: - -```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#stream_flush_interval_ms) 毫秒内尚未形成该数据块,当前数据将会被刷新写入表中,而不考虑该数据块是否已填满。 - -要停止接收某个 topic 的数据或更改转换逻辑,请分离该物化视图: - -```sql - DETACH TABLE consumer; - ATTACH TABLE consumer; -``` - -如果你想通过 `ALTER` 语句更改目标表,建议先禁用该物化视图,以避免目标表与视图产出的数据之间出现不一致。 - - -## 配置 - -与 GraphiteMergeTree 类似,Kafka 引擎支持通过 ClickHouse 配置文件进行扩展配置。可以使用两个配置键:全局配置(位于 `` 下)和主题级配置(位于 `` 下)。会先应用全局配置,然后再应用主题级配置(如果存在)。 - -```xml - - - cgrp - 3000 - - - logs - 4000 - - - - - smallest - - logs - 100000 - - - - stats - 50000 - - - - - - - logs - 250 - - - - stats - 400 - - - -``` - -有关可用配置选项的列表,请参阅 [librdkafka 配置参考](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md)。在 ClickHouse 配置中,应使用下划线(`_`)而不是点号。例如,`check.crcs=true` 将写作 `true`。 - - -### Kerberos 支持 - -要与支持 Kerberos 的 Kafka 配合使用,请添加值为 `sasl_plaintext` 的 `security_protocol` 子元素。如果操作系统已经获取并缓存了 Kerberos 票据授予票(TGT,ticket-granting ticket),这就足够了。 -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` — 消息的 key。数据类型:`String`。 -- `_offset` — 消息的 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)。 -单个 Kafka 消息中的行数取决于所用格式是行级格式还是块级格式: - -- 对于行级格式,可以通过设置 `kafka_max_rows_per_message` 来控制单个 Kafka 消息中的行数。 -- 对于块级格式,我们无法将一个块再拆分为更小的部分,但可以通过通用设置 [max_block_size](/operations/settings/settings#max_block_size) 来控制单个块中的行数。 - -## 在 ClickHouse Keeper 中存储已提交 offset 的引擎 - - - -如果启用了 `allow_experimental_kafka_offsets_storage_in_keeper`,则可以为 Kafka 表引擎额外指定两个设置: - -* `kafka_keeper_path`:指定该表在 ClickHouse Keeper 中的路径 -* `kafka_replica_name`:指定该表在 ClickHouse Keeper 中的副本名称 - -这两个设置要么同时指定,要么都不指定。当二者都被指定时,将会使用一个新的实验性 Kafka 引擎。这个新引擎不再依赖将已提交的 offset 存储在 Kafka 中,而是将其存储在 ClickHouse Keeper 中。它仍然会尝试将 offset 提交到 Kafka,但只在创建表时依赖这些 offset。在其他情况下(例如表被重启,或在发生错误后进行恢复)时,将使用存储在 ClickHouse Keeper 中的 offset 作为继续消费消息的起始位置。除了已提交的 offset,它还会存储上一个批次中已消费的消息数量,因此如果插入失败,将会再次消费相同数量的消息,从而在需要时实现去重。 - -示例: - -```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; -``` - - -### 已知限制 {#known-limitations} - -由于新引擎仍处于实验阶段,目前尚未准备好用于生产环境。当前实现存在以下一些已知限制: - -- 最大的限制在于该引擎不支持直接读取。通过物化视图从该引擎读取以及向该引擎写入是可行的,但无法直接读取。因此,所有直接的 `SELECT` 查询都会失败。 -- 频繁删除并重新创建表,或者为不同引擎指定相同的 ClickHouse Keeper 路径,可能会导致问题。作为最佳实践,建议在 `kafka_keeper_path` 中使用 `{uuid}` 来避免路径冲突。 -- 为了实现可重复读取,消息不能在单个线程上从多个分区进行消费。另一方面,必须定期轮询 Kafka consumer 以保持其存活。鉴于这两个目标,我们决定仅在启用 `kafka_thread_per_consumer` 时才允许创建多个 consumer;否则,要避免与定期轮询 consumer 相关的问题将过于复杂。 -- 由新存储引擎创建的 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#background_message_broker_schedule_pool_size) -- [system.kafka_consumers](../../../operations/system-tables/kafka_consumers.md) \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md deleted file mode 100644 index b99233a0d7b..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/materialized-postgresql.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -description: '创建一个包含 PostgreSQL 表初始数据转储的 ClickHouse 表,并启动数据复制进程。' -sidebar_label: 'MaterializedPostgreSQL' -sidebar_position: 130 -slug: /engines/table-engines/integrations/materialized-postgresql -title: 'MaterializedPostgreSQL 表引擎' -doc_type: '指南' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MaterializedPostgreSQL 表引擎 - - - - - -:::note -对于 ClickHouse Cloud 用户,推荐使用 [ClickPipes](/integrations/clickpipes) 将 PostgreSQL 数据复制到 ClickHouse。它原生支持高性能的 PostgreSQL CDC(变更数据捕获)。 -::: - -创建一个 ClickHouse 表,对 PostgreSQL 表进行初始数据转储,并启动复制过程,即在后台执行作业,将远程 PostgreSQL 数据库中该 PostgreSQL 表上发生的新变更实时应用到该表中。 - -:::note -此表引擎为实验特性。要使用它,请在配置文件中将 `allow_experimental_materialized_postgresql_table` 设置为 1,或通过 `SET` 命令进行设置: - -```sql -SET allow_experimental_materialized_postgresql_table=1 -``` - -::: - -如果需要使用多个表,强烈建议使用 [MaterializedPostgreSQL](../../../engines/database-engines/materialized-postgresql.md) 数据库引擎而不是表引擎,并通过 `materialized_postgresql_tables_list` 设置来指定要复制的表(后续也可以添加数据库 `schema`)。在 CPU 占用、连接数以及远程 PostgreSQL 数据库中所占用的复制槽数量方面,这种方式都会更优。 - - -## 创建表 - -```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. 由于实现依赖于 PostgreSQL 的 [pg_replication_slot_advance](https://pgpedia.info/p/pg_replication_slot_advance.html) 函数,`MaterializedPostgreSQL` 表引擎仅适用于 PostgreSQL 版本 >= 11。 - - - -## 虚拟列 - -* `_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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md deleted file mode 100644 index 8615cab3803..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mongodb.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -description: 'MongoDB 引擎是一个只读表引擎,支持从远程集合读取数据。' -sidebar_label: 'MongoDB' -sidebar_position: 135 -slug: /engines/table-engines/integrations/mongodb -title: 'MongoDB 表引擎' -doc_type: 'reference' ---- - - - -# MongoDB 表引擎 - -MongoDB 引擎是一种只读表引擎,用于从远程 [MongoDB](https://www.mongodb.com/) 集合中读取数据。 - -仅支持 MongoDB v3.6 及更高版本的服务器。 -尚不支持 [种子列表(`mongodb+srv`)](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-seed-list)。 - - - -## 创建表 - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name -( - name1 [type1], - name2 [type2], - ... -) ENGINE = MongoDB(host:port, database, collection, user, password[, options[, oid_columns]]); -``` - -**引擎参数** - -| 参数 | 描述 | -| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `host:port` | MongoDB 服务器地址。 | -| `database` | 远程数据库名称。 | -| `collection` | 远程集合名称。 | -| `user` | MongoDB 用户。 | -| `password` | 用户密码。 | -| `options` | 可选。以 URL 格式字符串形式提供的 MongoDB 连接字符串[选项](https://www.mongodb.com/docs/manual/reference/connection-string-options/#connection-options),例如:`'authSource=admin&ssl=true'`。 | -| `oid_columns` | 以逗号分隔的列名列表,这些列在 WHERE 子句中将被视为 `oid`。默认值为 `_id`。 | - -:::tip -如果你使用的是 MongoDB Atlas 云服务,可以从 “Atlas SQL” 选项中获取连接 URL。 -种子列表(`mongodb**+srv**`)目前尚不支持,但会在后续版本中加入。 -::: - -或者,你也可以传入一个 URI: - -```sql -ENGINE = MongoDB(uri, collection[, oid_columns]); -``` - -**引擎参数** - -| 参数 | 说明 | -| ------------- | -------------------------------------------------- | -| `uri` | MongoDB 服务器的连接 URI。 | -| `collection` | 远程集合的名称。 | -| `oid_columns` | 以逗号分隔的列名列表,这些列在 WHERE 子句中将被视为 `oid` 类型。默认值为 `_id`。 | - - -## 类型映射 - -| MongoDB | ClickHouse | -| ----------------------- | ---------------------------------------- | -| bool, int32, int64 | *除 Decimal 外的任意数值类型*,Boolean,String | -| double | Float64,String | -| date | Date,Date32,DateTime,DateTime64,String | -| string | String,*如果格式正确,则为除 Decimal 外的任意数值类型* | -| document | String(作为 JSON) | -| array | Array,String(作为 JSON) | -| oid | String | -| binary | 如果在列中则为 String,如果在数组或文档中则为 base64 编码的字符串 | -| uuid (binary subtype 4) | UUID | -| *any other* | String | - -如果在 MongoDB 文档中未找到键(例如列名不匹配),将插入默认值,或者在列可为 `NULL` 的情况下插入 `NULL`。 - -### OID - -如果希望在 WHERE 子句中将某个 `String` 视为 `oid`,只需将该列名作为表引擎的最后一个参数传入。 -在按 `_id` 列查询记录时可能需要这样做,因为在 MongoDB 中 `_id` 列默认具有 `oid` 类型。 -如果表中的 `_id` 字段具有其他类型,例如 `uuid`,则需要将 `oid_columns` 设为空,否则会使用该参数的默认值 `_id`。 - -```javascript -db.sample_oid.insertMany([ - {"another_oid_column": ObjectId()}, -]); - -db.sample_oid.find(); -[ - { - "_id": {"$oid": "67bf6cc44ebc466d33d42fb2"}, - "another_oid_column": {"$oid": "67bf6cc40000000000ea41b1"} - } -] -``` - -默认情况下,只有 `_id` 会被视为 `oid` 列。 - -```sql -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('mongodb://user:pass@host/db', 'sample_oid'); - -SELECT count() FROM sample_oid WHERE _id = '67bf6cc44ebc466d33d42fb2'; --输出结果为 1。 -SELECT count() FROM sample_oid WHERE another_oid_column = '67bf6cc40000000000ea41b1'; --输出结果为 0 -``` - -在这种情况下,输出将是 `0`,因为 ClickHouse 并不知道列 `another_oid_column` 的类型是 `oid`,所以我们来修正一下: - -```sql -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('mongodb://user:pass@host/db', 'sample_oid', '_id,another_oid_column'); - --- 或 - -CREATE TABLE sample_oid -( - _id String, - another_oid_column String -) ENGINE = MongoDB('host', 'db', 'sample_oid', 'user', 'pass', '', '_id,another_oid_column'); - -SELECT count() FROM sample_oid WHERE another_oid_column = '67bf6cc40000000000ea41b1'; -- 现在将输出 1 -``` - - -## 支持的子句 - -仅支持包含简单表达式的查询(例如,`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` 类型。 - - -## 使用示例 - -假设 MongoDB 中已经加载了 [sample_mflix](https://www.mongodb.com/docs/atlas/sample-data/sample-mflix) 数据集 - -在 ClickHouse 中创建一张表,用于从 MongoDB 集合中读取数据: - -```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 的所有《回到未来》系列电影 -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: 一个年轻人意外地被他的朋友埃米特·布朗博士发明的时光旅行DeLorean汽车送回到30年前,他必须确保他高中时期的父母结合,以保证自己的存在。 -genres: ['Adventure','Comedy','Sci-Fi'] -directors: ['Robert Zemeckis'] -released: 1985-07-03 - -Row 2: -────── -title: Back to the Future Part II -plot: 在访问2015年之后,马蒂·麦克弗莱必须再次回到1955年,以防止1985年发生灾难性的变化……同时不能干扰他的第一次旅行。 -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 - ┌─标题───────────────────┬─评分───┐ -1. │ 老无所依 │ 8.1 │ -2. │ 日落有限公司 │ 7.4 │ -3. │ 末日危途 │ 7.3 │ - └────────────────────────┴────────┘ -``` - - -## 故障排查 {#troubleshooting} -您可以在 DEBUG 级别日志中看到生成的 MongoDB 查询。 - -实现细节可以在 [mongocxx](https://github.com/mongodb/mongo-cxx-driver) 和 [mongoc](https://github.com/mongodb/mongo-c-driver) 的文档中找到。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md deleted file mode 100644 index 5cc47e8d14f..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/mysql.md +++ /dev/null @@ -1,207 +0,0 @@ ---- -description: 'MySQL 表引擎文档' -sidebar_label: 'MySQL' -sidebar_position: 138 -slug: /engines/table-engines/integrations/mysql -title: 'MySQL 表引擎' -doc_type: 'reference' ---- - - - -# MySQL 表引擎 - -MySQL 引擎允许对存储在远程 MySQL 服务器上的数据执行 `SELECT` 和 `INSERT` 查询。 - - - -## 创建表 - -```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) 查询的详细说明。 - -表结构可以与原始 MySQL 表结构不同: - -* 列名应与原始 MySQL 表中的列名相同,但可以只使用其中部分列,且顺序可以任意。 -* 列类型可以与原始 MySQL 表中的类型不同。ClickHouse 会尝试将值[转换](../../../engines/database-engines/mysql.md#data_types-support)为 ClickHouse 数据类型。 -* [external_table_functions_use_nulls](/operations/settings/settings#external_table_functions_use_nulls) 设置定义如何处理 Nullable 列。默认值:1。若为 0,则表函数不会创建 Nullable 列,而是插入默认值来代替 null。这同样适用于数组内部的 NULL 值。 - -**引擎参数** - -* `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`。参阅 [MySQL 文档](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html) 了解可以与 `ON DUPLICATE KEY` 子句一起使用哪些 `on_duplicate_clause`。 - 要指定 `on_duplicate_clause`,需要将 `0` 传递给 `replace_query` 参数。如果同时传递 `replace_query = 1` 和 `on_duplicate_clause`,ClickHouse 会产生异常。 - -参数也可以通过 [named collections](/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'); -``` - - -## 使用示例 - -在 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') -``` - -或者使用 [命名集合](/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) -- [将 MySQL 用作字典源](/sql-reference/dictionaries#mysql) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md deleted file mode 100644 index f76f3426384..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/nats.md +++ /dev/null @@ -1,316 +0,0 @@ ---- -description: '此引擎用于将 ClickHouse 与 NATS 集成,可发布或订阅消息主题(subject),并在有新消息时进行处理。' -sidebar_label: 'NATS' -sidebar_position: 140 -slug: /engines/table-engines/integrations/nats -title: 'NATS 表引擎' -doc_type: 'guide' ---- - - - -# NATS 表引擎 {#redisstreams-engine} - -此引擎用于将 ClickHouse 与 [NATS](https://nats.io/) 集成。 - -`NATS` 可以让您: - -- 发布或订阅消息主题。 -- 在有新消息时进行处理。 - - - -## 创建表 - -```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 表要订阅/发布的 subject 列表。支持通配符 subject,例如 `foo.*.bar` 或 `baz.>`。 -* `nats_format` – 消息格式。使用与 SQL `FORMAT` 函数相同的表示法,例如 `JSONEachRow`。有关更多信息,请参阅 [Formats](../../../interfaces/formats.md) 部分。 - -可选参数: - -* `nats_schema` – 当格式需要 schema 定义时必须使用的参数。例如,[Cap'n Proto](https://capnproto.org/) 需要提供 schema 文件路径以及根 `schema.capnp:Message` 对象的名称。 -* `nats_stream` – NATS JetStream 中已存在的 stream 名称。 -* `nats_consumer` – NATS JetStream 中已存在的持久拉取 consumer 名称。 -* `nats_num_consumers` – 每个表的 consumer 数量。默认值:`1`。如果单个 consumer 的吞吐量不足,可为 NATS core 指定更多的 consumers。 -* `nats_queue_group` – NATS 订阅者队列组名称。默认是表名。 -* `nats_max_reconnect` – 已弃用且无效果,重连会始终按照 `nats_reconnect_wait` 超时时间执行。 -* `nats_reconnect_wait` – 每次重连尝试之间休眠的时间(毫秒)。默认值:`5000`。 -* `nats_server_list` - 用于连接的服务器列表。可用于连接到 NATS 集群。 -* `nats_skip_broken_messages` - NATS 消息解析器对每个数据块中与 schema 不兼容消息的容忍数量。默认值:`0`。如果 `nats_skip_broken_messages = N`,则引擎会跳过 *N* 条无法解析的 NATS 消息(每条消息等于一行数据)。 -* `nats_max_block_size` - 为从 NATS 刷写数据而通过轮询收集的行数。默认值:[max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 -* `nats_flush_interval_ms` - 刷写从 NATS 读取数据的超时时间。默认值:[stream_flush_interval_ms](/operations/settings/settings#stream_flush_interval_ms)。 -* `nats_username` - NATS 用户名。 -* `nats_password` - NATS 密码。 -* `nats_token` - NATS 认证 token。 -* `nats_credential_file` - NATS 凭证文件路径。 -* `nats_startup_connect_tries` - 启动时的连接尝试次数。默认值:`5`。 -* `nats_max_rows_per_message` — 基于行的格式时,单条 NATS 消息中写入的最大行数(默认值:`1`)。 -* `nats_handle_error_mode` — NATS 引擎的错误处理方式。可选值:default(解析消息失败则抛出异常),stream(会将异常消息和原始消息保存在虚拟列 `_error` 和 `_raw_message` 中)。 - -SSL 连接: - - -要使用安全连接,请设置 `nats_secure = 1`。 -所用库的默认行为是不检查所创建的 TLS 连接是否足够安全。无论证书是否过期、自签名、缺失或无效,连接都会照样被允许。将来可能会实现对证书更严格的检查。 - -向 NATS 表写入数据: - -如果表只从一个 subject 读取数据,则任何插入都会发布到同一个 subject。 -但是,如果表从多个 subject 读取数据,我们就需要指定要发布到哪个 subject。 -因此,当向具有多个 subject 的表中插入数据时,需要设置 `stream_like_engine_insert_queue`。 -你可以选择该表读取的某一个 subject,并将数据发布到那里。例如: - -```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'; -``` - -可以在 ClickHouse 配置文件中添加 NATS 服务器配置。 -更具体地说,可以为 NATS 引擎添加 Redis 密码: - -```xml - - click - house - clickhouse - -``` - - -## 描述 - -`SELECT` 对于读取消息(除调试用途外)并不是特别有用,因为每条消息只能被读取一次。更实用的方式是使用[物化视图](../../../sql-reference/statements/create/view.md)来创建实时处理流水线。为此,您需要: - -1. 使用该引擎创建一个 NATS consumer,并将其视为数据流。 -2. 创建一个具有所需结构的表。 -3. 创建一个物化视图,将来自引擎的数据转换后写入前面创建的表中。 - -当 `MATERIALIZED VIEW` 连接到该引擎后,它会在后台开始收集数据。这样您就可以持续地从 NATS 接收消息,并使用 `SELECT` 将其转换为所需格式。 -一个 NATS 表可以拥有任意数量的物化视图,它们不会直接从表中读取数据,而是接收新的记录(按块接收)。通过这种方式,您可以同时向多个具有不同明细级别的表写入数据(带分组聚合或不带分组聚合)。 - -示例: - -```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; -``` - -要停止接收流式数据或更改转换逻辑,请分离该物化视图: - -```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)。 -一条 NATS 消息中的行数取决于所使用的格式是基于行还是基于块: - -- 对于基于行的格式,可以通过设置 `nats_max_rows_per_message` 来控制一条 NATS 消息中的行数。 -- 对于基于块的格式,我们无法将一个块拆分为更小的部分,但可以通过全局设置 [max_block_size](/operations/settings/settings#max_block_size) 来控制一个块中的行数。 - - - -## 使用 JetStream - -在将 NATS 引擎与 NATS JetStream 配合使用之前,必须先创建一个 NATS 流(stream)和一个持久拉取型消费者(durable pull consumer)。为此,可以使用 [NATS CLI](https://github.com/nats-io/natscli) 包中的 `nats` 工具,例如: - -
- 创建流(stream) - - ```bash - $ nats stream add - ? Stream Name stream_name - ? Subjects stream_subject - ? Storage file - ? Replication 1 - ? Retention Policy Limits - ? Discard Policy Old - ? Stream Messages Limit -1 - ? Per Subject Messages Limit -1 - ? Total Stream Size -1 - ? Message TTL -1 - ? Max Message Size -1 - ? Duplicate tracking time window 2m0s - ? Allow message Roll-ups No - ? Allow message deletion Yes - ? Allow purging subjects or the entire stream Yes - Stream stream_name was created - - Information for Stream stream_name created 2025-10-03 14:12:51 - - Subjects: stream_subject - Replicas: 1 - Storage: File - - Options: - - Retention: Limits - Acknowledgments: true - Discard Policy: Old - Duplicate Window: 2m0s - Direct Get: true - Allows Msg Delete: true - Allows Purge: true - Allows Per-Message TTL: false - Allows Rollups: false - - Limits: - - Maximum Messages: unlimited - Maximum Per Subject: unlimited - Maximum Bytes: unlimited - Maximum Age: unlimited - Maximum Message Size: unlimited - Maximum Consumers: unlimited - - State: - - Messages: 0 - Bytes: 0 B - First Sequence: 0 - Last Sequence: 0 - Active Consumers: 0 - ``` -
- -
- 创建持久拉取型消费者(durable pull consumer) - - ```bash - $ nats consumer add - ? Select a Stream stream_name - ? Consumer name consumer_name - ? Delivery target (empty for Pull Consumers) - ? Start policy (all, new, last, subject, 1h, msg sequence) all - ? Acknowledgment policy explicit - ? Replay policy instant - ? Filter Stream by subjects (blank for all) - ? Maximum Allowed Deliveries -1 - ? Maximum Acknowledgments Pending 0 - ? Deliver headers only without bodies No - ? Add a Retry Backoff Policy No - Information for Consumer stream_name > consumer_name created 2025-10-03T14:13:51+03:00 - - Configuration: - - Name: consumer_name - Pull Mode: true - Deliver Policy: All - Ack Policy: Explicit - Ack Wait: 30.00s - Replay Policy: Instant - Max Ack Pending: 1,000 - Max Waiting Pulls: 512 - - State: - - Last Delivered Message: Consumer sequence: 0 Stream sequence: 0 - Acknowledgment Floor: Consumer sequence: 0 Stream sequence: 0 - Outstanding Acks: 0 out of maximum 1,000 - Redelivered Messages: 0 - Unprocessed Messages: 0 - Waiting Pulls: 0 of maximum 512 - ``` -
- -创建完流和持久拉取型消费者之后,就可以创建一个使用 NATS 引擎的表。为此,需要初始化:`nats_stream`、`nats_consumer_name` 和 `nats_subjects`: - -```SQL -CREATE TABLE nats_jet_stream ( - key UInt64, - value UInt64 - ) ENGINE NATS - SETTINGS nats_url = 'localhost:4222', - nats_stream = 'stream_name', - nats_consumer_name = 'consumer_name', - nats_subjects = 'stream_subject', - nats_format = 'JSONEachRow'; -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md deleted file mode 100644 index 385aa2c0f6b..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/odbc.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -description: '允许 ClickHouse 通过 ODBC 连接到外部数据库。' -sidebar_label: 'ODBC' -sidebar_position: 150 -slug: /engines/table-engines/integrations/odbc -title: 'ODBC 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# ODBC 表引擎 - - - -允许 ClickHouse 通过 [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity) 连接到外部数据库。 - -为了安全地使用 ODBC 连接,ClickHouse 使用单独的程序 `clickhouse-odbc-bridge`。如果从 `clickhouse-server` 直接加载 ODBC 驱动程序,驱动程序的问题可能会导致 ClickHouse 服务器崩溃。ClickHouse 会在需要时自动启动 `clickhouse-odbc-bridge`。ODBC 桥接程序与 `clickhouse-server` 来自同一个安装包。 - -该引擎支持 [Nullable](../../../sql-reference/data-types/nullable.md) 数据类型。 - - - -## 创建表 - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] -( - name1 [type1], - name2 [type2], - ... -) -ENGINE = ODBC(数据源, external_database, external_table) -``` - -请参阅 [CREATE TABLE](/sql-reference/statements/create/table) 查询的详细说明。 - -表结构可以与源表结构不同: - -* 列名应与源表中的列名相同,但你可以只使用其中的一部分列,且顺序可以任意。 -* 列类型可以与源表中的类型不同。ClickHouse 会尝试将值[转换](/sql-reference/functions/type-conversion-functions#cast)为 ClickHouse 的数据类型。 -* [external_table_functions_use_nulls](/operations/settings/settings#external_table_functions_use_nulls) 设置定义了如何处理 `Nullable` 列。默认值:1。若为 0,则表函数不会创建 `Nullable` 列,而是插入默认值来替代 `NULL`。这同样适用于数组中的 `NULL` 值。 - -**引擎参数** - -* `datasource` — `odbc.ini` 文件中包含连接设置的节名称。 -* `external_database` — 外部 DBMS 中数据库的名称。 -* `external_table` — `external_database` 中表的名称。 - -这些参数也可以通过[命名集合](operations/named-collections.md)传递。 - - -## 使用示例 - -**通过 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 -+-------------------------+ -| 已连接! | -| | -... -``` - -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) -``` - -ClickHouse 中用于从 MySQL 表读取数据的表: - -```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 字典](/sql-reference/dictionaries#mysql) -- [ODBC 表函数](../../../sql-reference/table-functions/odbc.md) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md deleted file mode 100644 index 4db7dc6ad92..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/postgresql.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: 'PostgreSQL 引擎允许对存储在远程 PostgreSQL 服务器上的数据执行 `SELECT` 和 `INSERT` 查询。' -sidebar_label: 'PostgreSQL' -sidebar_position: 160 -slug: /engines/table-engines/integrations/postgresql -title: 'PostgreSQL 表引擎' -doc_type: '指南' ---- - - - -# PostgreSQL 表引擎 - -PostgreSQL 引擎允许对存储在远程 PostgreSQL 服务器上的数据执行 `SELECT` 和 `INSERT` 查询。 - -:::note -当前仅支持 PostgreSQL 12 及以上版本。 -::: - -:::tip -建议 ClickHouse Cloud 用户使用 [ClickPipes](/integrations/clickpipes) 以流式方式将 PostgreSQL 数据导入 ClickHouse。该方式原生支持高性能插入,并通过可分别扩展摄取和集群资源,实现清晰的职责划分。 -::: - - - -## 创建数据表 - -```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) 查询的详细说明。 - -表结构可以与原始 PostgreSQL 表结构不同: - -* 列名应当与原始 PostgreSQL 表中的列名相同,但可以只使用其中部分列,并按任意顺序排列。 -* 列类型可以与原始 PostgreSQL 表中的类型不同。ClickHouse 会尝试将值[转换](../../../engines/database-engines/postgresql.md#data_types-support)为 ClickHouse 的数据类型。 -* [external_table_functions_use_nulls](/operations/settings/settings#external_table_functions_use_nulls) 设置定义了如何处理 Nullable 列。默认值:1。当为 0 时,表函数不会创建 Nullable 列,而是插入默认值来替代 null。这同样适用于数组中的 NULL 值。 - -**引擎参数** - -* `host:port` — PostgreSQL 服务器地址。 -* `database` — 远程数据库名称。 -* `table` — 远程表名称。 -* `user` — PostgreSQL 用户。 -* `password` — 用户密码。 -* `schema` — 非默认表的 schema。可选。 -* `on_conflict` — 冲突解决策略。例如:`ON CONFLICT DO NOTHING`。可选。注意:添加此选项会降低插入效率。 - -[Named collections](/operations/named-collections.md)(自 21.11 版本起可用)推荐在生产环境中使用。示例如下: - -```xml - - - localhost - 5432 - postgres - **** - schema1 - - -``` - -可以通过键值对参数来覆盖某些参数: - -```sql -SELECT * FROM postgresql(postgres_creds, table='table1'); -``` - - -## 实现细节 - -PostgreSQL 端的 `SELECT` 查询在只读 PostgreSQL 事务中以 `COPY (SELECT ...) TO STDOUT` 的形式运行,每个 `SELECT` 查询结束后都会提交事务。 - -诸如 `=`, `!=`, `>`, `>=`, `<`, `<=` 和 `IN` 这类简单的 `WHERE` 子句在 PostgreSQL 服务器上执行。 - -所有连接、聚合、排序、`IN [ array ]` 条件以及 `LIMIT` 采样约束,都会在对 PostgreSQL 的查询完成之后,仅在 ClickHouse 中执行。 - -PostgreSQL 端的 `INSERT` 查询在 PostgreSQL 事务中以 `COPY "table_name" (field1, field2, ... fieldN) FROM STDIN` 的形式运行,并在每条 `INSERT` 语句之后自动提交。 - -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 字典源支持副本优先级。映射中的数字越大,优先级越低。最高优先级为 `0`。 - -在下面的示例中,副本 `example01-1` 具有最高优先级: - -```xml - - 5432 - clickhouse - qwerty - - example01-1 - 1 - - - example01-2 - 2 - - db_name - table_name
- id=10 - SQL_QUERY -
- -``` - - -## 使用示例 - -### 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 表引擎](/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', 'postgres_user', 'postgres_password'); -``` - -### 使用 SELECT 查询将 PostgreSQL 表中的初始数据插入到 ClickHouse 表中 - -[postgresql table function](/sql-reference/table-functions/postgresql.md) 会将数据从 PostgreSQL 复制到 ClickHouse,通常用于在 ClickHouse 而非 PostgreSQL 中执行查询或分析,从而提升数据的查询性能,也可用于将数据从 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', 'postgres_user', 'postgres_password'); -``` - -### 将 PostgreSQL 表中的增量数据插入到 ClickHouse 表中 - -如果在初始插入之后,随后需要在 PostgreSQL 表和 ClickHouse 表之间执行持续同步,可以在 ClickHouse 中使用 WHERE 子句,根据时间戳或唯一序列 ID,仅插入新增到 PostgreSQL 的数据。 - -这需要跟踪之前已插入的最大 ID 或时间戳,例如: - -```sql -SELECT max(`int_id`) AS maxIntID FROM default.postgresql_copy; -``` - -然后从 PostgreSQL 表中插入大于当前最大值的记录 - -```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 用作字典源](/sql-reference/dictionaries#mysql) - - -## 相关内容 {#related-content} - -- 博客:[ClickHouse 和 PostgreSQL——数据界的天作之合(第一部分)](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres) -- 博客:[ClickHouse 和 PostgreSQL——数据界的天作之合(第二部分)](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres-part-2) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md deleted file mode 100644 index e122b83eb69..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/rabbitmq.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -description: '该引擎支持将 ClickHouse 与 RabbitMQ 集成。' -sidebar_label: 'RabbitMQ' -sidebar_position: 170 -slug: /engines/table-engines/integrations/rabbitmq -title: 'RabbitMQ 表引擎' -doc_type: 'guide' ---- - - - -# RabbitMQ 表引擎 - -该引擎用于将 ClickHouse 与 [RabbitMQ](https://www.rabbitmq.com) 集成。 - -`RabbitMQ` 可用于: - -- 发布或订阅数据流。 -- 在数据流可用时对其进行处理。 - - - -## 创建表 - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] -( - name1 [type1], - name2 [type2], - ... -) ENGINE = RabbitMQ SETTINGS - rabbitmq_host_port = 'host:port' [或 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` – 主机和端口,格式为 host:port(例如 `localhost:5672`)。 -* `rabbitmq_exchange_name` – RabbitMQ exchange 名称。 -* `rabbitmq_format` – 消息格式。使用与 SQL `FORMAT` 函数相同的格式说明,例如 `JSONEachRow`。更多信息,请参阅 [Formats](../../../interfaces/formats.md) 章节。 - -可选参数: - - -- `rabbitmq_exchange_type` – RabbitMQ exchange 的类型:`direct`、`fanout`、`topic`、`headers`、`consistent_hash`。默认值:`fanout`。 -- `rabbitmq_routing_key_list` – 以逗号分隔的路由键(routing key)列表。 -- `rabbitmq_schema` – 当格式需要 schema 定义时必须使用的参数。例如, [Cap'n Proto](https://capnproto.org/) 需要提供 schema 文件的路径以及根 `schema.capnp:Message` 对象的名称。 -- `rabbitmq_num_consumers` – 每个表的 consumer 数量。如果单个 consumer 的吞吐量不足,请设置更多的 consumer。默认值:`1`。 -- `rabbitmq_num_queues` – 队列总数。增大该值可以显著提升性能。默认值:`1`。 -- `rabbitmq_queue_base` - 为队列名称提供一个提示(前缀/基名)。此设置的使用场景会在下文中说明。 -- `rabbitmq_deadletter_exchange` - 为 [dead letter exchange](https://www.rabbitmq.com/dlx.html) 指定名称。你可以使用该 exchange 名称创建另一个表,并在消息被重新发布到 dead letter exchange 时收集这些消息。默认情况下不会指定 dead letter exchange。 -- `rabbitmq_persistent` - 如果设置为 1(true),在 insert 查询中,投递模式(delivery mode)会被设置为 2(将消息标记为“persistent”)。默认值:`0`。 -- `rabbitmq_skip_broken_messages` – 每个数据块中 RabbitMQ 消息解析器对与 schema 不兼容消息的容忍数量。如果 `rabbitmq_skip_broken_messages = N`,则引擎会跳过 *N* 条无法解析的 RabbitMQ 消息(每条消息对应一行数据)。默认值:`0`。 -- `rabbitmq_max_block_size` - 在从 RabbitMQ 刷新(flush)数据前累积的行数。默认值:[max_insert_block_size](../../../operations/settings/settings.md#max_insert_block_size)。 -- `rabbitmq_flush_interval_ms` - 从 RabbitMQ 刷新(flush)数据的超时时间。默认值:[stream_flush_interval_ms](/operations/settings/settings#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 初始化操作:声明 exchange、队列或绑定。默认值:`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` 中)、`dead_letter_queue`(与错误相关的数据将保存在 `system.dead_letter_queue` 中)。 - - * [ ] 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'; -``` - -应通过 ClickHouse 配置文件添加 RabbitMQ 服务器的配置。 - -必需配置如下: - -```xml - - root - clickhouse - -``` - -其他配置: - -```xml - - clickhouse - -``` - - -## 描述 - -`SELECT` 对于读取消息并不是特别有用(除非用于调试),因为每条消息只能被读取一次。更实用的方式是使用[物化视图](../../../sql-reference/statements/create/view.md)创建实时处理流程。为此: - -1. 使用该引擎创建一个 RabbitMQ 消费者,并将其视为数据流。 -2. 创建一个具有所需结构的表。 -3. 创建一个物化视图,将来自引擎的数据转换后写入前面创建的表中。 - -当 `MATERIALIZED VIEW` 连接到引擎时,它会在后台开始收集数据。这样就可以持续地从 RabbitMQ 接收消息,并使用 `SELECT` 将其转换为所需格式。 -一个 RabbitMQ 表可以拥有任意数量的物化视图。 - -可以基于 `rabbitmq_exchange_type` 和指定的 `rabbitmq_routing_key_list` 对数据进行路由。 -每个表最多只能有一个 exchange。一个 exchange 可以在多个表之间共享——这使得可以同时路由到多个表中。 - -Exchange 类型说明: - -* `direct` - 基于键的精确匹配进行路由。示例表键列表:`key1,key2,key3,key4,key5`,消息键可以等于其中任意一个。 -* `fanout` - 路由到所有表(exchange 名称相同的表),与键无关。 -* `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` - 数据在所有绑定的表(exchange 名称相同的表)之间均匀分布。注意,此 exchange 类型必须通过 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/settings/settings#max_insert_block_size) 的数据块。如果在 [stream_flush_interval_ms](../../../operations/server-configuration-parameters/settings.md) 毫秒内未能形成完整的数据块,则无论块是否完整,都会将数据刷新到表中。 - -如果在指定 `rabbitmq_exchange_type` 的同时也设置了 `rabbitmq_num_consumers` 和/或 `rabbitmq_num_queues`,则需要满足以下条件: - -* 必须启用 `rabbitmq-consistent-hash-exchange` 插件。 -* 已发布消息的 `message_id` 属性必须被指定(对每条消息/批次唯一)。 - -对于插入查询,每条已发布消息都会附加消息元数据:`messageID` 和 `republished` 标志(如果消息被发布多于一次则为 true)——可以通过消息头访问。 - -不要将同一张表同时用作插入目标和物化视图的目标表。 - -示例: - -```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 交换器(exchange)名称。数据类型:`String`。 -- `_channel_id` - 接收该消息的 consumer 所声明的 ChannelID。数据类型:`String`。 -- `_delivery_tag` - 所接收消息的 DeliveryTag,在每个 channel 内单独计数。数据类型:`UInt64`。 -- `_redelivered` - 消息的 `redelivered` 标志位。数据类型:`UInt8`。 -- `_message_id` - 所接收消息的 messageID;如果在发布消息时设置了该字段则为非空。数据类型:`String`。 -- `_timestamp` - 所接收消息的 timestamp;如果在发布消息时设置了该字段则为非空。数据类型:`UInt64`。 - -当 `rabbitmq_handle_error_mode='stream'` 时的附加虚拟列: - -- `_raw_message` - 无法成功解析的原始消息。数据类型:`Nullable(String)`。 -- `_error` - 解析失败期间产生的异常信息。数据类型:`Nullable(String)`。 - -注意:仅在解析期间发生异常时,`_raw_message` 和 `_error` 虚拟列才会被填充;当消息被成功解析时,它们始终为 `NULL`。 - - - -## 注意事项 {#caveats} - -即使你在表定义中指定了[默认列值表达式](/sql-reference/statements/create/table.md/#default_values)(例如 `DEFAULT`、`MATERIALIZED`、`ALIAS`),这些设置也会被忽略。列将根据各自的数据类型自动填充为默认值。 - - - -## 数据格式支持 {#data-formats-support} - -RabbitMQ 引擎支持 ClickHouse 所支持的所有[格式](../../../interfaces/formats.md)。 -单个 RabbitMQ 消息中的行数取决于使用的是按行还是按块的格式: - -- 对于按行的格式,可以通过设置 `rabbitmq_max_rows_per_message` 来控制单个 RabbitMQ 消息中的行数。 -- 对于按块的格式,我们无法将数据块拆分为更小的部分,但可以通过全局设置 [max_block_size](/operations/settings/settings#max_block_size) 来控制单个数据块中的行数。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md deleted file mode 100644 index 2aa1b175082..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/redis.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -description: '该引擎使 ClickHouse 能与 Redis 集成。' -sidebar_label: 'Redis' -sidebar_position: 175 -slug: /engines/table-engines/integrations/redis -title: 'Redis 表引擎' -doc_type: 'guide' ---- - - - -# Redis 表引擎 - -该引擎允许将 ClickHouse 与 [Redis](https://redis.io/) 集成。由于 Redis 采用键值(KV)模型,我们强烈建议仅执行点查询,例如使用 `where k = xx` 或 `where k in (xx, xx)`。 - - - -## 创建数据表 - -```sql -CREATE TABLE [IF NOT EXISTS] [db.]table_name -( - name1 [type1], - name2 [type2], - ... -) 引擎 = Redis({host:port[, db_index[, password[, pool_size]]] | named_collection[, option=value [,..]] }) -主键(primary_key_name); -``` - -**引擎参数** - -* `host:port` — Redis 服务器地址,可以省略端口,此时将使用 Redis 默认端口 6379。 -* `db_index` — Redis 数据库索引,索引范围为 0 到 15,默认值为 0。 -* `password` — 用户密码,默认是空字符串。 -* `pool_size` — Redis 最大连接池大小,默认值为 16。 -* `primary_key_name` - 列表中的任意一列列名。 - -:::note Serialization -`PRIMARY KEY` 只支持单列。主键会以二进制形式序列化为 Redis key。 -除主键外的列会按对应顺序以二进制形式序列化为 Redis value。 -::: - -参数也可以通过 [named collections](/operations/named-collections.md) 传入。在这种情况下,`host` 和 `port` 应分别指定。生产环境推荐使用这种方式。目前,通过 named collections 传递给 Redis 的所有参数都是必需的。 - -:::note Filtering -带有 `key equals` 或 `in filtering` 的查询将被优化为从 Redis 进行多键查找。对于未按键过滤的查询,将会执行全表扫描,这是一种开销很大的操作。 -::: - - -## 使用示例 - -在 ClickHouse 中使用 `Redis` 引擎和基本参数创建一张表: - -```sql -CREATE TABLE redis_table -( - `key` String, - `v1` UInt32, - `v2` String, - `v3` Float32 -) -ENGINE = Redis('redis1:6379') PRIMARY KEY(key); -``` - -或者使用[命名集合](/operations/named-collections.md): - -```xml - - - 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'; -``` - -Truncate: - -以异步方式清空 Redis 数据库。此外,`Truncate` 也支持 SYNC(同步)模式。 - -```sql -TRUNCATE TABLE redis_table SYNC; -``` - -Join: - -与其他表进行关联(JOIN)。 - -```sql -SELECT * FROM redis_table JOIN merge_tree_table ON merge_tree_table.key=redis_table.key; -``` - - -## 限制 {#limitations} - -Redis 引擎也支持扫描查询,例如 `where k > xx`,但存在一些限制: -1. 在极少数情况下,当正在进行 rehashing 时,扫描查询可能会产生一些重复的键。详情参见 [Redis Scan](https://github.com/redis/redis/blob/e4d183afd33e0b2e6e8d1c79a832f678a04a7886/src/dict.c#L1186-L1269)。 -2. 在扫描过程中,键可能被创建或删除,因此结果数据集无法表示某个时间点上的有效快照。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md deleted file mode 100644 index 18f17438425..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3.md +++ /dev/null @@ -1,452 +0,0 @@ ---- -description: '此引擎用于与 Amazon S3 生态系统集成。类似于 HDFS 引擎,但提供了 S3 特有的功能。' -sidebar_label: 'S3' -sidebar_position: 180 -slug: /engines/table-engines/integrations/s3 -title: 'S3 表引擎' -doc_type: 'reference' ---- - - - -# S3 表引擎 - -该引擎提供与 [Amazon S3](https://aws.amazon.com/s3/) 生态系统的集成能力。此引擎类似于 [HDFS](/engines/table-engines/integrations/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 │ -└──────┴───────┘ -``` - - -## 创建表 - -```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_strategy], [partition_columns_in_data_file]) - [PARTITION BY expr] - [SETTINGS ...] -``` - -### 引擎参数 - -* `path` — 带有文件路径的存储桶 URL。在只读模式下支持以下通配符:`*`、`**`、`?`、`{abc,def}` 和 `{N..M}`,其中 `N`、`M` 为数字,`'abc'`、`'def'` 为字符串。更多信息参见[下文](#wildcards-in-path)。 -* `NOSIGN` - 如果在凭证位置提供此关键字,所有请求都不会被签名。 -* `format` — 文件的[格式](/sql-reference/formats#formats-overview)。 -* `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`。该参数为可选。默认情况下,将根据文件扩展名自动检测压缩类型。 -* `partition_strategy` – 选项:`WILDCARD` 或 `HIVE`。`WILDCARD` 要求路径中包含 `{_partition_id}`,该占位符会被分区键替换。`HIVE` 不允许使用通配符,假定路径为表的根路径,并生成 Hive 风格的分区目录,使用 Snowflake ID 作为文件名,并以文件格式作为扩展名。默认值为 `WILDCARD`。 -* `partition_columns_in_data_file` - 仅在使用 `HIVE` 分区策略时使用。用于指示 ClickHouse 数据文件中是否包含分区列。默认值为 `false`。 -* `storage_class_name` - 选项:`STANDARD` 或 `INTELLIGENT_TIERING`,用于指定 [AWS S3 Intelligent Tiering](https://aws.amazon.com/s3/storage-classes/intelligent-tiering/) 存储类别。 - -### 数据缓存 - -`S3` 表引擎支持在本地磁盘上进行数据缓存。 -有关文件系统缓存配置选项和使用方法,请参见本[节](/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; -``` - -在配置文件中定义缓存有两种方式。 - -1. 在 ClickHouse 配置文件中添加如下配置段: - -```xml - - - - 缓存目录的路径 - 10Gi - - - -``` - -2. 复用 ClickHouse 中 `storage_configuration` 部分的缓存配置(以及相应的缓存存储),[如本节所述](/operations/storing-data.md/#using-local-cache) - -### PARTITION BY - -`PARTITION BY` — 可选。大多数情况下您不需要分区键,即便需要,一般也不需要比“按月”更细粒度的分区键。分区并不会加快查询速度(与 ORDER BY 表达式相反)。绝不要使用粒度过细的分区。不要按客户端标识符或名称对数据进行分区(而应将客户端标识符或名称设置为 ORDER BY 表达式中的第一列)。 - -对于按月分区,使用 `toYYYYMM(date_column)` 表达式,其中 `date_column` 是类型为 [Date](/sql-reference/data-types/date.md) 的日期列。此时的分区名称采用 `"YYYYMM"` 格式。 - -#### 分区策略 - -`WILDCARD`(默认):将文件路径中的 `{_partition_id}` 通配符替换为实际的分区键。不支持读取操作。 - - -`HIVE` 实现了用于读写的 Hive 风格分区。读取通过递归的 glob 模式完成,等价于 `SELECT * FROM s3('table_root/**.parquet')`。 -写入会按如下格式生成文件:`//.`。 - -注意:当使用 `HIVE` 分区策略时,`use_hive_partitioning` 设置不会生效。 - -`HIVE` 分区策略示例: - -```sql -arthur :) CREATE TABLE t_03363_parquet (year UInt16, country String, counter UInt8) -ENGINE = S3(s3_conn, filename = 't_03363_parquet', format = Parquet, partition_strategy='hive') -PARTITION BY (year, country); - -arthur :) INSERT INTO t_03363_parquet VALUES - (2022, 'USA', 1), - (2022, 'Canada', 2), - (2023, 'USA', 3), - (2023, 'Mexico', 4), - (2024, 'France', 5), - (2024, 'Germany', 6), - (2024, 'Germany', 7), - (1999, 'Brazil', 8), - (2100, 'Japan', 9), - (2024, 'CN', 10), - (2025, '', 11); - -arthur :) select _path, * from t_03363_parquet; - - ┌─_path──────────────────────────────────────────────────────────────────────┬─year─┬─country─┬─counter─┐ - 1. │ test/t_03363_parquet/year=2100/country=Japan/7329604473272971264.parquet │ 2100 │ Japan │ 9 │ - 2. │ test/t_03363_parquet/year=2024/country=France/7329604473323302912.parquet │ 2024 │ France │ 5 │ - 3. │ test/t_03363_parquet/year=2022/country=Canada/7329604473314914304.parquet │ 2022 │ Canada │ 2 │ - 4. │ test/t_03363_parquet/year=1999/country=Brazil/7329604473289748480.parquet │ 1999 │ Brazil │ 8 │ - 5. │ test/t_03363_parquet/year=2023/country=Mexico/7329604473293942784.parquet │ 2023 │ Mexico │ 4 │ - 6. │ test/t_03363_parquet/year=2023/country=USA/7329604473319108608.parquet │ 2023 │ USA │ 3 │ - 7. │ test/t_03363_parquet/year=2025/country=/7329604473327497216.parquet │ 2025 │ │ 11 │ - 8. │ test/t_03363_parquet/year=2024/country=CN/7329604473310720000.parquet │ 2024 │ CN │ 10 │ - 9. │ test/t_03363_parquet/year=2022/country=USA/7329604473298137088.parquet │ 2022 │ USA │ 1 │ -10. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │ 6 │ -11. │ test/t_03363_parquet/year=2024/country=Germany/7329604473306525696.parquet │ 2024 │ Germany │ 7 │ - └────────────────────────────────────────────────────────────────────────────┴──────┴─────────┴─────────┘ -``` - -### 查询分区数据 - -本示例使用了集成 ClickHouse 和 MinIO 的 [docker compose 配置示例](https://github.com/ClickHouse/examples/tree/5fdc6ff72f4e5137e23ea075c88d3f44b0202490/docker-compose-recipes/recipes/ch-and-minio-S3)。你只需替换 endpoint 和认证参数即可在 S3 上复现相同的查询。 - -请注意,在 `ENGINE` 配置中,S3 endpoint 将参数占位符 `{_partition_id}` 用作 S3 对象(文件名)的一部分,而 SELECT 查询则是针对这些生成的对象名称进行查询(例如 `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 -服务器返回异常(版本 23.4.1): -代码:48. DB::Exception: 来自 localhost:9000。DB::Exception: 尚未实现从分区 S3 存储读取数据的功能。(NOT_IMPLEMENTED) -``` - - -## 插入数据 {#inserting-data} - -请注意,数据行只能插入到新文件中,不会执行合并周期或文件拆分操作。一旦文件写入完成,后续插入将会失败。为避免这种情况,可以使用 `s3_truncate_on_insert` 和 `s3_create_new_file_on_insert` 设置。更多详情请参见[此处](/integrations/s3#inserting-data)。 - - - -## 虚拟列 {#virtual-columns} - -- `_path` — 文件的路径。类型:`LowCardinality(String)`。 -- `_file` — 文件名。类型:`LowCardinality(String)`。 -- `_size` — 文件大小(字节)。类型:`Nullable(UInt64)`。如果大小未知,则值为 `NULL`。 -- `_time` — 文件的最后修改时间。类型:`Nullable(DateTime)`。如果时间未知,则值为 `NULL`。 -- `_etag` — 文件的 ETag。类型:`LowCardinality(String)`。如果 ETag 未知,则值为 `NULL`。 -- `_tags` — 文件的标签。类型:`Map(String, String)`。如果没有标签,则值为空映射 `{}`。 - -有关虚拟列的更多信息,请参阅[此处](../../../engines/table-engines/index.md#table_engines-virtual_columns){}`. - - - -## 实现细节 {#implementation-details} - -- 读写操作可以并行进行 -- 不支持: - - `ALTER` 和 `SELECT...SAMPLE` 操作。 - - 索引。 - - [零拷贝](../../../operations/storing-data.md#zero-copy) 复制在技术上可行,但目前不受支持。 - - :::note 零拷贝复制尚未准备好用于生产环境 - 在 ClickHouse 22.8 及更高版本中,零拷贝复制默认被禁用。该特性不建议在生产环境中使用。 - ::: - - - -## 路径中的通配符 - -`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) 表函数。 - -:::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** - -假设我们有几个 CSV 格式的文件,其在 S3 上的 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_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_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/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_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_2.csv)' -* '[https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv](https://clickhouse-public-datasets.s3.amazonaws.com/my-bucket/another_folder/some_file_3.csv)' - -有几种方法可以创建一个由这六个文件构成的表: - -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](/operations/settings/settings.md#s3_truncate_on_insert) - 允许在插入前截断文件。默认禁用。 -- [s3_create_new_file_on_insert](/operations/settings/settings.md#s3_create_new_file_on_insert) - 当格式带有后缀时,允许在每次插入操作时创建一个新文件。默认禁用。 -- [s3_skip_empty_files](/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` — 在开始限流前,每秒允许的最大 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`。 -- `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` - 限制对同一对象可以并发执行的 PUT 请求数。该数量应被限制。值为 `0` 表示不限制。默认值为 `20`。每个进行中的分片(in-flight part)都会占用一个缓冲区,对于前 `s3_upload_part_size_multiply_factor` 个分片,缓冲区大小为 `s3_min_upload_part_size`;当文件足够大时,缓冲区会更大,详见 `upload_part_size_multiply_factor`。在默认设置下,对于小于 `8G` 的文件,单个上传文件占用的内存不超过 `320Mb`。对于更大的文件,占用会更高。 - -安全注意事项:如果恶意用户可以指定任意 S3 URL,应将 `s3_max_redirects` 设为 `0` 以避免 [SSRF](https://en.wikipedia.org/wiki/Server-side_request_forgery) 攻击;或者在服务器配置中指定 `remote_host_filter`。 - - - -## 基于 endpoint 的设置 - -可以在配置文件中为指定的 endpoint 设置以下配置(通过 URL 的精确前缀进行匹配): - -* `endpoint` — 指定 endpoint 的前缀。必需项。 -* `access_key_id` 和 `secret_access_key` — 指定用于该 endpoint 的凭证。可选。 -* `use_environment_credentials` — 如果设置为 `true`,S3 客户端将尝试从环境变量和给定 endpoint 的 [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 头添加到对给定 endpoint 的请求中。可选,可以指定多次。 -* `access_header` - 当不存在来自其他来源的凭证时,将指定的 HTTP 头添加到对给定 endpoint 的请求中。 -* `server_side_encryption_customer_key_base64` — 如果指定,将为访问使用 SSE-C 加密的 S3 对象设置所需的 HTTP 头。可选。 -* `server_side_encryption_kms_key_id` - 如果指定,将为访问使用 [SSE-KMS 加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) 的 S3 对象设置所需的 HTTP 头。如果指定为空字符串,则使用 AWS 托管的 S3 密钥。可选。 -* `server_side_encryption_kms_encryption_context` - 如果与 `server_side_encryption_kms_key_id` 一起指定,将设置给定的 SSE-KMS 加密上下文 HTTP 头。可选。 -* `server_side_encryption_kms_bucket_key_enabled` - 如果与 `server_side_encryption_kms_key_id` 一起指定,将设置启用 SSE-KMS S3 bucket key 的 HTTP 头。可选,可以为 `true` 或 `false`,默认不设置(遵循 bucket 级别设置)。 -* `max_single_read_retries` — 单次读取时的最大重试次数。默认值为 `4`。可选。 -* `max_put_rps`、`max_put_burst`、`max_get_rps` 和 `max_get_burst` - 限流设置(参见上文说明),用于特定 endpoint,而不是按查询进行设置。可选。 - -**示例:** - -```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-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-11.csv.zip)' -* '[https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip](https://s3-us-west-1.amazonaws.com/umbrella-static/top-1m-2018-01-12.csv.zip)' - -可以使用 :: 从这些归档文件中提取数据。通配模式(glob)既可以用于 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 支持三种归档格式: -ZIP -TAR -7Z -虽然可以从任意受支持的存储位置访问 ZIP 和 TAR 归档,但 7Z 归档只能从安装了 ClickHouse 的本地文件系统读取。 -::: - - -## 访问公共 bucket - -ClickHouse 会尝试从多种不同类型的来源自动获取凭证。 -有时,在访问某些公共 bucket 时,这可能会导致问题,从而导致客户端返回 `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'); -``` - - -## 性能优化 {#optimizing-performance} - -如需了解如何优化 `s3` 函数的性能,请参阅[我们的详细指南](/integrations/s3/performance)。 - - - -## 另请参阅 {#see-also} - -- [S3 表函数](../../../sql-reference/table-functions/s3.md) -- [将 S3 与 ClickHouse 集成](/integrations/s3) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md deleted file mode 100644 index 569aa8e8a23..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/s3queue.md +++ /dev/null @@ -1,438 +0,0 @@ ---- -description: '此引擎提供与 Amazon S3 生态系统的集成,并支持流式导入。类似于 Kafka 和 RabbitMQ 引擎,但提供 S3 专有功能。' -sidebar_label: 'S3Queue' -sidebar_position: 181 -slug: /engines/table-engines/integrations/s3queue -title: 'S3Queue 表引擎' -doc_type: 'reference' ---- - -import ScalePlanFeatureBadge from '@theme/badges/ScalePlanFeatureBadge' - - -# S3Queue 表引擎 - -该引擎提供与 [Amazon S3](https://aws.amazon.com/s3/) 生态系统的集成能力,并支持流式导入。此引擎类似于 [Kafka](../../../engines/table-engines/integrations/kafka.md)、[RabbitMQ](../../../engines/table-engines/integrations/rabbitmq.md) 等表引擎,但提供了特定于 S3 的功能。 - -需要注意 [S3Queue 实现的原始 PR](https://github.com/ClickHouse/ClickHouse/pull/49086/files#diff-e1106769c9c8fbe48dd84f18310ef1a250f2c248800fde97586b3104e9cd6af8R183) 中的这条说明:当 `MATERIALIZED VIEW` 与该引擎建立关联后,S3Queue 表引擎会在后台开始收集数据。 - - - -## 创建表 {#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], [headers]) - [SETTINGS] - [mode = '',] - [after_processing = 'keep',] - [keeper_path = '',] - [loading_retries = 0,] - [processing_threads_num = 16,] - [parallel_inserts = false,] - [enable_logging_to_queue_log = true,] - [last_processed_path = "",] - [tracked_files_limit = 1000,] - [tracked_file_ttl_sec = 0,] - [polling_min_timeout_ms = 1000,] - [polling_max_timeout_ms = 10000,] - [polling_backoff_ms = 0,] - [cleanup_interval_min_ms = 10000,] - [cleanup_interval_max_ms = 30000,] - [buckets = 0,] - [list_objects_batch_size = 1000,] - [enable_hash_ring_filtering = 0,] - [max_processed_files_before_commit = 100,] - [max_processed_rows_before_commit = 0,] - [max_processed_bytes_before_commit = 0,] - [max_processing_time_sec_before_commit = 0,] -``` - -:::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} - -可能的值: - -- 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` 模式。 - -默认值:CPU 数量或 16。 - -### `s3queue_parallel_inserts` {#parallel_inserts} - -默认情况下,`processing_threads_num` 将产生一个 `INSERT`,因此它只会在多个线程中下载文件和解析。 -但这限制了并行性,因此为了获得更好的吞吐量,请使用 `parallel_inserts=true`,这将允许并行插入数据(但请注意,这将导致 MergeTree 系列生成更多的数据部分)。 - -:::note -`INSERT` 将根据 `max_process*_before_commit` 设置生成。 -::: - -默认值:`false`。 - -### `s3queue_enable_logging_to_s3queue_log` {#enable_logging_to_s3queue_log} - -启用记录到 `system.s3queue_log`。 - -默认值:`0`。 - -### `s3queue_polling_min_timeout_ms` {#polling_min_timeout_ms} - -指定 ClickHouse 在进行下一次轮询尝试之前等待的最短时间(以毫秒为单位)。 - -可能的值: - -- 正整数。 - -默认值:`1000`。 - -### `s3queue_polling_max_timeout_ms` {#polling_max_timeout_ms} - -定义 ClickHouse 在启动下一次轮询尝试之前等待的最长时间(以毫秒为单位)。 - -可能的值: - -- 正整数。 - -默认值:`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} - -在 ZooKeeper 节点中存储已处理文件的最大秒数(默认永久存储),适用于 'unordered' 模式,对 '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 表副本,且每个副本都使用 keeper 中的同一元数据目录,则 `s3queue_buckets` 的值至少需要等于副本数量。如果同时使用了 `s3queue_processing_threads` 设置,则进一步增加 `s3queue_buckets` 设置的值是合理的,因为它定义了 `S3Queue` 处理的实际并行度。 - -### `use_persistent_processing_nodes` {#use_persistent_processing_nodes} - -默认情况下,S3Queue 表始终使用临时处理节点,这可能导致数据重复,即当 zookeeper 会话在 S3Queue 开始处理之后但在 zookeeper 中提交已处理文件之前过期时。此设置强制服务器在 keeper 会话过期的情况下消除数据重复的可能性。 - -### `persistent_processing_nodes_ttl_seconds` {#persistent_processing_nodes_ttl_seconds} - -在服务器非正常终止的情况下,如果启用了 `use_persistent_processing_nodes`,可能会存在未删除的处理节点。此设置定义了可以安全清理这些处理节点的时间周期。 - -默认值:`3600`(1 小时)。 - - -## S3 相关设置 {#s3-settings} - -引擎支持所有 S3 相关设置。有关 S3 设置的更多信息,请参阅[此处](../../../engines/table-engines/integrations/s3.md)。 - - -## S3 基于角色的访问 {#s3-role-based-access} - - - -s3Queue 表引擎支持基于角色的访问。 -有关配置角色以访问存储桶的步骤,请参阅[此处](/cloud/data-sources/secure-s3)的文档。 - -配置角色后,可以通过 `extra_credentials` 参数传递 `roleARN`,如下所示: - -```sql -CREATE TABLE s3_table -( - ts DateTime, - value UInt64 -) -ENGINE = S3Queue( - 'https:///*.csv', - extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/') - ,'CSV') -SETTINGS - ... -``` - - -## S3Queue 有序模式 {#ordered-mode} - -`S3Queue` 处理模式允许在 ZooKeeper 中存储更少的元数据,但存在一个限制:后续添加的文件必须具有按字母数字顺序更大的名称。 - -`S3Queue` 的 `ordered` 模式与 `unordered` 模式一样,支持 `(s3queue_)processing_threads_num` 设置(`s3queue_` 前缀可选),用于控制服务器本地处理 `S3` 文件的线程数量。 -此外,`ordered` 模式还引入了另一个名为 `(s3queue_)buckets` 的设置,表示"逻辑线程"。在分布式场景中,当存在多个具有 `S3Queue` 表副本的服务器时,此设置定义处理单元的数量。例如,每个 `S3Queue` 副本上的每个处理线程都会尝试锁定某个 `bucket` 进行处理,每个 `bucket` 通过文件名的哈希值关联到特定文件。因此,在分布式场景中,强烈建议将 `(s3queue_)buckets` 设置为至少等于副本数量或更大。bucket 数量大于副本数量是允许的。最优配置是将 `(s3queue_)buckets` 设置为 `number_of_replicas` 与 `(s3queue_)processing_threads_num` 的乘积。 -不建议在 `24.6` 版本之前使用 `(s3queue_)processing_threads_num` 设置。 -`(s3queue_)buckets` 设置从 `24.6` 版本开始提供。 - - -## Description {#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` — 文件的名称。 -- `_size` — 文件的大小。 -- `_time` — 文件的创建时间。 - -有关虚拟列的更多信息,请参阅[此处](../../../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 中的同一路径,且在某个服务器成功提交已处理文件之前 Keeper 会话过期,这可能导致另一个服务器接管该文件的处理,而该文件可能已被第一个服务器部分或完全处理;但是,从 25.8 版本开始,如果设置 `use_persistent_processing_nodes = 1`,则不会出现此情况。 - -- 服务器异常终止。 - -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 '包含 S3Queue 元数据的内存状态以及每个文件当前处理的行数。' │ -└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -示例: - -```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`。持久化表。包含与 `system.s3queue` 相同的信息,但仅针对 `processed` 和 `failed` 状态的文件。 - -该表具有以下结构: - -```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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md deleted file mode 100644 index b1ae9767817..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/sqlite.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -description: '该引擎允许向 SQLite 导入数据、从 SQLite 导出数据,并支持在 ClickHouse 中直接查询 SQLite 表。' -sidebar_label: 'SQLite' -sidebar_position: 185 -slug: /engines/table-engines/integrations/sqlite -title: 'SQLite 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# SQLite 表引擎 - - - -该引擎用于向 SQLite 导入数据或从 SQLite 导出数据,并支持在 ClickHouse 中直接查询 SQLite 表。 - - - -## 创建数据表 - -```sql - CREATE TABLE [IF NOT EXISTS] [db.]table_name - ( - name1 [type1], - name2 [type2], ... - ) ENGINE = SQLite('db_path', 'table') -``` - -**引擎参数** - -* `db_path` — SQLite 数据库文件的路径。 -* `table` — SQLite 数据库中表的名称。 - - -## 使用示例 - -示例查询,用于创建 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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md deleted file mode 100644 index 4d215ee4c3e..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/time-series.md +++ /dev/null @@ -1,337 +0,0 @@ ---- -description: '用于存储时间序列的表引擎,即一组与时间戳和标签(或标记)相关联的值。' -sidebar_label: 'TimeSeries' -sidebar_position: 60 -slug: /engines/table-engines/special/time_series -title: 'TimeSeries 表引擎' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# TimeSeries 表引擎 - - - - - -一种用于存储时间序列数据的表引擎,即一组与时间戳和标签(或 label)关联的值: - -```sql -metric_name1[tag1=value1, tag2=value2, ...] = {timestamp1: value1, timestamp2: value2, ...} -metric_name2[...] = ... -``` - -:::info -这是一个实验性功能,将来版本中可能会有向后不兼容的变更。 -通过配置 [allow_experimental_time_series_table](/operations/settings/settings#allow_experimental_time_series_table) 设置来启用 TimeSeries 表引擎。 -输入命令 `set allow_experimental_time_series_table = 1`。 -::: - - -## 语法 - -```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)] -``` - - -## 用法 - -使用全部默认设置开始会更简单(允许在不指定列列表的情况下创建 `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) 的工作方式, -不同之处在于物化视图只有一个目标表, -而 `TimeSeries` 表有三个目标表,分别命名为 [data](#data-table)、[tags](#tags-table) 和 [metrics](#metrics-table)。 - -目标表可以在 `CREATE TABLE` 查询中显式指定, -也可以由 `TimeSeries` 表引擎自动生成内部目标表。 - -目标表如下: - -### Data 表 {#data-table} - -_data_ 表包含与某个标识符关联的时间序列。 - -_data_ 表必须包含以下列: - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `id` | [x] | `UUID` | any | 标识一组度量名称和标签的组合 | -| `timestamp` | [x] | `DateTime64(3)` | `DateTime64(X)` | 时间点 | -| `value` | [x] | `Float64` | `Float32` or `Float64` | 与该 `timestamp` 关联的值 | - -### Tags 表 {#tags-table} - -_tags_ 表包含为每种度量名称与标签组合计算得到的标识符。 - -_tags_ 表必须包含以下列: - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `id` | [x] | `UUID` | any (必须与 [data](#data-table) 表中 `id` 的类型匹配) | `id` 用于标识度量名称与标签的组合。`DEFAULT` 表达式用于指定如何计算该标识符 | -| `metric_name` | [x] | `LowCardinality(String)` | `String` or `LowCardinality(String)` | 度量名称 | -| `` | [ ] | `String` | `String` or `LowCardinality(String)` or `LowCardinality(Nullable(String))` | 某个特定标签的值,该标签的名称以及对应列的名称在 [tags_to_columns](#settings) 设置中指定 | -| `tags` | [x] | `Map(LowCardinality(String), String)` | `Map(String, String)` or `Map(LowCardinality(String), String)` or `Map(LowCardinality(String), LowCardinality(String))` | 标签的 Map,排除包含度量名称的标签 `__name__`,以及名称在 [tags_to_columns](#settings) 设置中列出的标签 | -| `all_tags` | [ ] | `Map(String, String)` | `Map(String, String)` or `Map(LowCardinality(String), String)` or `Map(LowCardinality(String), LowCardinality(String))` | 临时列,每一行是所有标签的 Map,仅排除包含度量名称的标签 `__name__`。该列唯一的用途是用于计算 `id` | -| `min_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` or `Nullable(DateTime64(X))` | 具有该 `id` 的时间序列的最小时间戳。当 [store_min_time_and_max_time](#settings) 为 `true` 时创建该列 | -| `max_time` | [ ] | `Nullable(DateTime64(3))` | `DateTime64(X)` or `Nullable(DateTime64(X))` | 具有该 `id` 的时间序列的最大时间戳。当 [store_min_time_and_max_time](#settings) 为 `true` 时创建该列 | - -### Metrics 表 {#metrics-table} - -_metrics_ 表包含关于已收集度量的一些信息,包括这些度量的类型及其描述。 - -_metrics_ 表必须包含以下列: - - - -| Name | Mandatory? | Default type | Possible types | Description | -|---|---|---|---|---| -| `metric_family_name` | [x] | `String` | `String` or `LowCardinality(String)` | 指标族名称 | -| `type` | [x] | `String` | `String` or `LowCardinality(String)` | 指标族类型,可选值为 "counter"、"gauge"、"summary"、"stateset"、"histogram"、"gaugehistogram" | -| `unit` | [x] | `String` | `String` or `LowCardinality(String)` | 指标使用的单位 | -| `help` | [x] | `String` | `String` or `LowCardinality(String)` | 指标的描述信息 | - -插入到 `TimeSeries` 表中的任何一行实际上都会被写入这三个目标表中。 -`TimeSeries` 表包含来自 [data](#data-table)、[tags](#tags-table)、[metrics](#metrics-table) 三张表的所有列。 - - - -## 创建 - -使用 `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' -``` - -因此,这些列是自动生成的,并且在该语句中还有三个内部 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 -``` - - -## 调整列类型 - -在定义主表时,通过显式指定列类型,可以调整内部目标表中几乎任意列的类型。例如, - -```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` 列包含标识符,每个标识符是根据指标名称与标签的组合计算得到的。 -`id` 列的 DEFAULT 表达式是用于计算这些标识符的表达式。 -可以通过显式指定 `id` 列的类型以及该表达式来进行调整: - -```sql -CREATE TABLE my_table -( - id UInt64 DEFAULT sipHash64(metric_name, all_tags) -) -ENGINE=TimeSeries -``` - - -## `tags` 与 `all_tags` 列 - -有两列包含标签映射——`tags` 和 `all_tags`。在本例中它们含义相同,但在使用 `tags_to_columns` 设置项时,它们可能会不同。该设置项允许指定某个特定标签应存储在单独的列中,而不是作为映射存储在 `tags` 列中: - -```sql -CREATE TABLE my_table -ENGINE = TimeSeries -SETTINGS tags_to_columns = {'instance': 'instance', 'job': 'job'} -``` - -该语句将添加列: - -```sql -`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 tags_to_columns = {'instance': 'instance', 'job': 'job'} -``` - - -## 内部目标表的表引擎 - -默认情况下,内部目标表使用以下表引擎: - -* [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 -``` - - -## 外部目标表 - -可以让 `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 | {} | 映射,用于指定哪些 tag 应该写入到 [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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md deleted file mode 100644 index d0be599a80a..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/integrations/ytsaurus.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -description: '一种支持从 YTsaurus 集群导入数据的表引擎。' -sidebar_label: 'YTsaurus' -sidebar_position: 185 -slug: /engines/table-engines/integrations/ytsaurus -title: 'YTsaurus 表引擎' -keywords: ['YTsaurus', '表引擎'] -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# YTsaurus 表引擎 - - - - -YTsaurus 表引擎用于从 YTsaurus 集群导入数据。 - - - -## 创建数据表 - -```sql - CREATE TABLE [IF NOT EXISTS] [db.]table_name - ( - name1 [type1], - name2 [type2], ... - ) ENGINE = YTsaurus('http_proxy_url', 'cypress_path', 'oauth_token') -``` - -:::info -这是一个实验性功能,将来版本中可能发生不兼容的变更。 -要启用 YTsaurus 表引擎, -请设置 [`allow_experimental_ytsaurus_table_engine`](/operations/settings/settings#allow_experimental_ytsaurus_table_engine)。 - -可以通过以下方式进行设置: - -`SET allow_experimental_ytsaurus_table_engine = 1`。 -::: - -**引擎参数** - -* `http_proxy_url` — YTsaurus HTTP 代理的 URL。 -* `cypress_path` — 指向数据源的 Cypress 路径。 -* `oauth_token` — OAuth 令牌。 - - -## 使用示例 - -以下是一个用于创建 YTsaurus 表的查询: - -```sql title="Query" -SHOW CREATE TABLE yt_saurus; -``` - -```sql title="Response" -CREATE TABLE yt_saurus -( - `a` UInt32, - `b` String -) -ENGINE = YTsaurus('http://localhost:8000', '//tmp/table', 'password') -``` - -要查询表中的数据,请运行: - -```sql title="Query" -SELECT * FROM yt_saurus; -``` - -```response title="Response" - ┌──a─┬─b──┐ - │ 10 │ 20 │ - └────┴────┘ -``` - - -## 数据类型 {#data-types} - -### 基本数据类型 {#primitive-data-types} - -| YTsaurus 数据类型 | ClickHouse 数据类型 | -| ------------------ | ----------------------- | -| `int8` | `Int8` | -| `int16` | `Int16` | -| `int32` | `Int32` | -| `int64` | `Int64` | -| `uint8` | `UInt8` | -| `uint16` | `UInt16` | -| `uint32` | `UInt32` | -| `uint64` | `UInt64` | -| `float` | `Float32` | -| `double` | `Float64` | -| `boolean` | `Bool` | -| `string` | `String` | -| `utf8` | `String` | -| `json` | `JSON` | -| `yson(type_v3)` | `JSON` | -| `uuid` | `UUID` | -| `date32` | `Date`(尚不支持) | -| `datetime64` | `Int64` | -| `timestamp64` | `Int64` | -| `interval64` | `Int64` | -| `date` | `Date`(尚不支持) | -| `datetime` | `DateTime` | -| `timestamp` | `DateTime64(6)` | -| `interval` | `UInt64` | -| `any` | `String` | -| `null` | `Nothing` | -| `void` | `Nothing` | -| `T` 且 `required = False` | `Nullable(T)` | - -### 复合类型 {#composite-data-types} - -| YTsaurus 数据类型 | ClickHouse 数据类型 | -| ------------------ | -------------------- | -| `decimal` | `Decimal` | -| `optional` | `Nullable` | -| `list` | `Array` | -| `struct` | `NamedTuple` | -| `tuple` | `Tuple` | -| `variant` | `Variant` | -| `dict` | `Array(Tuple(...))` | -| `tagged` | `T` | - -**另请参阅** - -- [ytsaurus](../../../sql-reference/table-functions/ytsaurus.md) 表函数 -- [ytsaurus 数据架构](https://ytsaurus.tech/docs/en/user-guide/storage/static-schema) -- [ytsaurus 数据类型](https://ytsaurus.tech/docs/en/user-guide/storage/data-types) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md deleted file mode 100644 index a4f3eb8a9b9..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/index.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -description: 'Log 引擎系列文档' -sidebar_label: 'Log 引擎系列' -sidebar_position: 20 -slug: /engines/table-engines/log-family/ -title: 'Log 引擎系列' -doc_type: 'guide' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Log 表引擎系列 - - - -这些引擎适用于这样一种场景:需要快速写入大量小表(单表最多约 100 万行),并在之后整体读取它们。 - -该系列中的引擎: - -| Log 引擎 | -|---------------------------------------------------------------------| -| [StripeLog](/engines/table-engines/log-family/stripelog.md) | -| [Log](/engines/table-engines/log-family/log.md) | -| [TinyLog](/engines/table-engines/log-family/tinylog.md) | - -`Log` 系列表引擎可以将数据存储到 [HDFS](/engines/table-engines/integrations/hdfs) 或 [S3](/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3) 分布式文件系统中。 - -:::warning 此引擎并非用于日志数据。 -尽管名称如此,*Log 表引擎并非用于存储日志数据。它们应仅用于需要快速写入的小规模数据量。* -::: - - - -## 通用属性 {#common-properties} - -这些引擎: - -- 将数据存储在磁盘上。 - -- 在写入时将数据追加到文件末尾。 - -- 支持用于并发数据访问的锁。 - - 在执行 `INSERT` 查询时,表会被锁定,其他读写数据的查询都会等待表解锁。如果没有数据写入查询在执行,则可以并发执行任意数量的数据读取查询。 - -- 不支持[变更](/sql-reference/statements/alter#mutations)。 - -- 不支持索引。 - - 这意味着针对数据范围的 `SELECT` 查询效率不高。 - -- 不以原子方式写入数据。 - - 如果写入操作被中断(例如服务器异常关闭),则可能会得到一个数据损坏的表。 - - - -## 差异 {#differences} - -`TinyLog` 引擎是该系列中最简单的一个,提供的功能最少、效率也最低。`TinyLog` 引擎不支持在单个查询中由多个线程并行读取数据。与该系列中支持在单个查询中并行读取的其他引擎相比,它读取数据的速度更慢,并且由于将每一列存储在单独的文件中,它使用的文件描述符几乎与 `Log` 引擎一样多。应仅在简单场景中使用它。 - -`Log` 和 `StripeLog` 引擎支持数据的并行读取。在读取数据时,ClickHouse 会使用多个线程。每个线程处理单独的数据块。`Log` 引擎为表的每一列使用单独的文件,而 `StripeLog` 将所有数据存储在一个文件中。因此,`StripeLog` 引擎使用更少的文件描述符,但在读取数据时,`Log` 引擎的效率更高。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md deleted file mode 100644 index f074b96cc1f..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/log.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -description: 'Log 表引擎文档' -slug: /engines/table-engines/log-family/log -toc_priority: 33 -toc_title: 'Log' -title: 'Log 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# Log 表引擎 - - - -该引擎属于 `Log` 引擎系列。关于 `Log` 引擎的通用属性及其差异,请参阅 [Log Engine Family](../../../engines/table-engines/log-family/index.md) 一文。 - -`Log` 与 [TinyLog](../../../engines/table-engines/log-family/tinylog.md) 的不同之处在于,列文件旁还会存放一个较小的“标记(marks)”文件。这些标记会在每个数据块写入,包含偏移量,用于指示在跳过指定行数时应从文件的何处开始读取。由此可以在多个线程中读取表数据。 -对于并发数据访问,多个读操作可以同时执行,而写操作会阻塞读操作以及其他写操作。 -`Log` 引擎不支持索引。同样地,如果向表写入失败,表就会损坏,此时从表中读取会返回错误。`Log` 引擎适用于临时数据、只写一次的表,以及测试或演示用途。 - - - -## 创建表 - -```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 = Log -``` - -请参阅 [CREATE TABLE](/sql-reference/statements/create/table) 查询的详细说明。 - - -## 写入数据 {#table_engines-log-writing-the-data} - -`Log` 引擎通过将每一列写入各自独立的文件来高效存储数据。对于每个表,Log 引擎会在指定的存储路径下写入以下文件: - -- `.bin`:每一列对应的数据文件,包含序列化并压缩后的数据。 -- `__marks.mrk`:标记文件,存储每个插入数据块的偏移量和行数。标记用于在读取时帮助引擎跳过无关的数据块,从而提升查询执行效率。 - -### 写入过程 {#writing-process} - -当数据写入到 `Log` 表时: - -1. 数据会被序列化并压缩成数据块。 -2. 对于每一列,压缩后的数据会追加写入对应的 `.bin` 文件。 -3. 在 `__marks.mrk` 文件中添加相应条目,用于记录新插入数据的偏移量和行数。 - - - -## 读取数据 {#table_engines-log-reading-the-data} - -带有标记的文件使得 ClickHouse 能够并行读取数据。这意味着 `SELECT` 查询会以不可预测的顺序返回行。使用 `ORDER BY` 子句对结果进行排序。 - - - -## 使用示例 - -创建表: - -```sql -CREATE TABLE log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = Log -``` - -写入数据: - -```sql -INSERT INTO log_table VALUES (now(),'REGULAR','第一条普通消息') -INSERT INTO log_table VALUES (now(),'REGULAR','第二条普通消息'),(now(),'WARNING','第一条警告消息') -``` - -我们使用了两个 `INSERT` 查询,在 `.bin` 文件中创建了两个数据块。 - -ClickHouse 在执行查询时会使用多个线程来读取数据。每个线程读取一个独立的数据块,并在完成后各自返回结果行。因此,输出中数据块(及其中行)的顺序可能与输入中相应数据块的顺序不一致。例如: - -```sql -SELECT * FROM log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:27:32 │ REGULAR │ 第二条普通消息 │ -│ 2019-01-18 14:34:53 │ WARNING │ 第一条警告消息 │ -└─────────────────────┴──────────────┴────────────────────────────┘ -┌───────────timestamp─┬─message_type─┬─message───────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ 第一条普通消息 │ -└─────────────────────┴──────────────┴───────────────────────────┘ -``` - -对结果进行排序(默认按升序排列): - -```sql -SELECT * FROM log_table ORDER BY timestamp -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:23:43 │ 普通 │ 第一条普通消息 │ -│ 2019-01-18 14:27:32 │ 普通 │ 第二条普通消息 │ -│ 2019-01-18 14:34:53 │ 警告 │ 第一条警告消息 │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md deleted file mode 100644 index e7c6892c914..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/stripelog.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -description: 'StripeLog 表引擎文档' -slug: /engines/table-engines/log-family/stripelog -toc_priority: 32 -toc_title: 'StripeLog' -title: 'StripeLog 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# StripeLog 表引擎 - - - -此引擎属于 Log 引擎系列。关于 Log 引擎的通用属性及其差异,请参见[Log 引擎系列](../../../engines/table-engines/log-family/index.md)一文。 - -在需要使用大量表且每个表只包含少量数据(少于 100 万行)时,可以使用此引擎。例如,该表可用于存储待转换的传入数据批次,并要求对其进行原子处理。对于单个 ClickHouse 服务器,此类型表最多可支持 10 万个实例。当需要大量表时,应优先选择此表引擎而不是 [Log](./log.md),其代价是读取效率会有所下降。 - - - -## 创建数据表 - -```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) 查询的详细说明。 - - -## 写入数据 {#table_engines-stripelog-writing-the-data} - -`StripeLog` 引擎将所有列存储在同一个文件中。对于每个 `INSERT` 查询,ClickHouse 会将数据块追加到表文件末尾,按列依次写入。 - -对于每个表,ClickHouse 会写入以下文件: - -- `data.bin` — 数据文件。 -- `index.mrk` — 标记文件。标记包含插入的每个数据块中各列的偏移量。 - -`StripeLog` 引擎不支持 `ALTER UPDATE` 和 `ALTER DELETE` 操作。 - - - -## 读取数据 {#table_engines-stripelog-reading-the-data} - -包含标记的文件使 ClickHouse 能够并行读取数据。这意味着 `SELECT` 查询返回的行顺序是不可预测的。使用 `ORDER BY` 子句对行进行排序。 - - - -## 使用示例 - -创建表: - -```sql -CREATE TABLE stripe_log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = StripeLog -``` - -插入数据: - -```sql -INSERT INTO stripe_log_table VALUES (now(),'REGULAR','第一条常规消息') -INSERT INTO stripe_log_table VALUES (now(),'REGULAR','第二条常规消息'),(now(),'WARNING','第一条警告消息') -``` - -我们使用两个 `INSERT` 查询在 `data.bin` 文件中创建了两个数据块。 - -ClickHouse 在执行数据查询时会使用多个线程。每个线程读取一个单独的数据块,并在完成后独立返回对应的结果行。因此,在大多数情况下,输出中各数据块的行顺序与输入中相同数据块的顺序并不一致。例如: - -```sql -SELECT * FROM stripe_log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:27:32 │ REGULAR │ 第二条常规消息 │ -│ 2019-01-18 14:34:53 │ WARNING │ 第一条警告消息 │ -└─────────────────────┴──────────────┴────────────────────────────┘ -┌───────────timestamp─┬─message_type─┬─message───────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ 第一条常规消息 │ -└─────────────────────┴──────────────┴───────────────────────────┘ -``` - -对结果进行排序(默认为升序): - -```sql -SELECT * FROM stripe_log_table ORDER BY timestamp -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2019-01-18 14:23:43 │ REGULAR │ 第一条常规消息 │ -│ 2019-01-18 14:27:32 │ REGULAR │ 第二条常规消息 │ -│ 2019-01-18 14:34:53 │ WARNING │ 第一条警告消息 │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md deleted file mode 100644 index 4f992397be9..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/log-family/tinylog.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -description: 'TinyLog 表引擎文档' -slug: /engines/table-engines/log-family/tinylog -toc_priority: 34 -toc_title: 'TinyLog' -title: 'TinyLog 表引擎' -doc_type: 'reference' ---- - -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# TinyLog 表引擎 - - - -该引擎属于 Log 引擎族。有关 Log 引擎的通用属性及其差异,参见 [Log 引擎族](../../../engines/table-engines/log-family/index.md)。 - -此表引擎通常采用“一次写入、多次读取”的方式使用:数据写入一次后,可根据需要多次读取。例如,可以将 `TinyLog` 类型的表用于以小批量处理的中间数据。请注意,将数据存储在大量小表中效率较低。 - -查询以单一数据流方式执行。换句话说,该引擎适用于相对较小的表(大约不超过 1,000,000 行)。如果存在大量小表,使用此表引擎是一个合理的选择,因为它比 [Log](../../../engines/table-engines/log-family/log.md) 引擎更简单(需要打开的文件更少)。 - - - -## 特性 {#characteristics} - -- **更简单的结构**:与 Log 引擎不同,TinyLog 不使用标记文件(mark files)。这降低了复杂性,但也限制了在大数据集上的性能优化空间。 -- **单流查询**:对 TinyLog 表的查询在单个流中执行,适用于相对较小的表,通常行数不超过约 1,000,000 行。 -- **适用于小表的高效性**:TinyLog 引擎的简单性在管理大量小表时具有优势,因为与 Log 引擎相比,它需要进行的文件操作更少。 - -与 Log 引擎不同,TinyLog 不使用标记文件(mark files)。这降低了复杂性,但也限制了在大型数据集上的性能优化空间。 - - - -## 创建表 - -```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 = TinyLog -``` - -请参阅 [CREATE TABLE](/sql-reference/statements/create/table) 查询的详细说明。 - - -## 写入数据 {#table_engines-tinylog-writing-the-data} - -`TinyLog` 引擎将所有列存储在同一个文件中。每执行一次 `INSERT` 查询,ClickHouse 都会将数据块追加到表文件末尾,并按列依次写入。 - -对于每个表,ClickHouse 会写入以下文件: - -- `.bin`:每一列对应的数据文件,包含序列化并压缩的数据。 - -`TinyLog` 引擎不支持 `ALTER UPDATE` 和 `ALTER DELETE` 操作。 - - - -## 示例用法 - -创建表: - -```sql -CREATE TABLE tiny_log_table -( - timestamp DateTime, - message_type String, - message String -) -ENGINE = TinyLog -``` - -写入数据: - -```sql -INSERT INTO tiny_log_table VALUES (now(),'REGULAR','第一条常规消息') -INSERT INTO tiny_log_table VALUES (now(),'REGULAR','第二条常规消息'),(now(),'WARNING','第一条警告消息') -``` - -我们使用了两个 `INSERT` 查询,在 `.bin` 文件中创建了两个数据块。 - -ClickHouse 使用单一数据流来读取数据。因此,输出中各行块的顺序与输入中相应块的顺序一致。例如: - -```sql -SELECT * FROM tiny_log_table -``` - -```text -┌───────────timestamp─┬─message_type─┬─message────────────────────┐ -│ 2024-12-10 13:11:58 │ REGULAR │ 第一条常规消息 │ -│ 2024-12-10 13:12:12 │ REGULAR │ 第二条常规消息 │ -│ 2024-12-10 13:12:12 │ WARNING │ 第一条警告消息 │ -└─────────────────────┴──────────────┴────────────────────────────┘ -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md deleted file mode 100644 index 2474458e7cb..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/aggregatingmergetree.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -description: '将具有相同主键(更准确地说,具有相同[排序键](../../../engines/table-engines/mergetree-family/mergetree.md))的所有行替换为一行(位于同一个数据片段中),该行存储聚合函数状态的组合。' -sidebar_label: 'AggregatingMergeTree' -sidebar_position: 60 -slug: /engines/table-engines/mergetree-family/aggregatingmergetree -title: 'AggregatingMergeTree 表引擎' -doc_type: 'reference' ---- - - - -# AggregatingMergeTree 表引擎 - -该引擎继承自 [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree),并对数据部分的合并逻辑进行了调整。ClickHouse 会将所有具有相同主键(更准确地说,是具有相同[排序键](../../../engines/table-engines/mergetree-family/mergetree.md))的行在单个数据部分内合并为一行,该行存储了聚合函数状态的组合。 - -可以将 `AggregatingMergeTree` 表用于增量数据聚合,包括聚合型物化视图。 - -你可以在下面的视频中查看如何使用 AggregatingMergeTree 和聚合函数的示例: -
- -
- -该引擎会处理所有具有以下类型的列: - -- [`AggregateFunction`](../../../sql-reference/data-types/aggregatefunction.md) -- [`SimpleAggregateFunction`](../../../sql-reference/data-types/simpleaggregatefunction.md) - -当使用 `AggregatingMergeTree` 能够将行数减少若干个数量级时,就适合采用该引擎。 - - - -## 创建表 - -```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` 表时,所需的[子句](../../../engines/table-engines/mergetree-family/mergetree.md)与创建 `MergeTree` 表时相同。 - -
- 已弃用的建表方法 - - :::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 输出格式中都采用与实现相关的二进制表示形式。例如,如果使用 `SELECT` 查询将数据转储为 `TabSeparated` 格式,则可以通过 `INSERT` 查询将该转储重新加载回去。 - - - -## 聚合物化视图示例 - -以下示例假设已存在名为 `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); -``` - -接下来,您需要一个 `AggregatingMergeTree` 表,用于存储 `AggregationFunction`,以记录访问总次数和唯一用户数量。 - -创建一个使用 `AggregatingMergeTree` 的物化视图,用于监听 `test.visits` 表,并使用 [`AggregateFunction`](/sql-reference/data-types/aggregatefunction) 类型: - -```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` 表中。 - -要获取聚合后的数据,可以对物化视图 `test.visits_mv` 执行类似 `SELECT ... GROUP BY ...` 的查询: - -```sql -SELECT - StartDate, - sumMerge(Visits) AS Visits, - uniqMerge(Users) AS Users -FROM test.visits_mv -GROUP BY StartDate -ORDER BY StartDate; -``` - -```text -┌───────────────StartDate─┬─Visits─┬─Users─┐ -│ 2022-11-03 03:27:11.000 │ 9 │ 2 │ -└─────────────────────────┴────────┴───────┘ -``` - -向 `test.visits` 再添加两条记录,但这次请为其中一条记录使用不同的时间戳: - -```sql -INSERT INTO test.visits (StartDate, CounterID, Sign, UserID) - VALUES (1669446031000, 2, 5, 10), (1667446031000, 3, 7, 5); -``` - -再次运行 `SELECT` 查询,此时会返回如下输出: - -```text -┌───────────────开始日期─┬─访问次数─┬─用户数─┐ -│ 2022-11-03 03:27:11.000 │ 16 │ 3 │ -│ 2022-11-26 07:00:31.000 │ 5 │ 1 │ -└─────────────────────────┴────────┴───────┘ -``` - -在某些情况下,您可能希望在插入时避免对行进行预聚合,而是将聚合的开销从插入阶段转移到合并阶段。通常,为了避免报错,必须在物化视图定义的 `GROUP BY` 子句中包含那些不参与聚合的列。不过,您可以结合使用 [`initializeAggregation`](/sql-reference/functions/other-functions#initializeAggregation) 函数,并将 `optimize_on_insert = 0`(默认值为开启)来实现这一点。在这种情况下,就不再需要使用 `GROUP BY` 了: - -```sql -CREATE MATERIALIZED VIEW test.visits_mv TO test.agg_visits -AS SELECT - StartDate, - CounterID, - initializeAggregation('sumState', Sign) AS Visits, - initializeAggregation('uniqState', UserID) AS Users -FROM test.visits; -``` - - -:::note -在使用 `initializeAggregation` 时,会为每一行单独创建一个聚合状态,而不进行分组。 -每一行源数据会在物化视图中生成一行,实际的聚合操作会在稍后 `AggregatingMergeTree` 合并数据分片(parts)时进行。仅当 `optimize_on_insert = 0` 时才是如此。 -::: - - - -## 相关内容 {#related-content} - -- 博客文章:[在 ClickHouse 中使用聚合组合器](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md deleted file mode 100644 index cb2c3e1082e..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/annindexes.md +++ /dev/null @@ -1,736 +0,0 @@ ---- -description: '精确和近似向量搜索文档' -keywords: ['向量相似搜索', 'ann', 'knn', 'hnsw', '索引(indices)', '索引', '最近邻', '向量搜索'] -sidebar_label: '精确和近似向量搜索' -slug: /engines/table-engines/mergetree-family/annindexes -title: '精确和近似向量搜索' -doc_type: 'guide' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - - -# 精确与近似向量搜索 - -在给定多维(向量)空间中的一个点时,寻找与其距离最近的 N 个点的问题,被称为[最近邻搜索](https://en.wikipedia.org/wiki/Nearest_neighbor_search),简称向量搜索。 -解决向量搜索通常有两种通用方法: - -* 精确向量搜索会计算查询点与向量空间中所有点之间的距离。这可以保证尽可能高的准确性,即返回的点一定是实际的最近邻。由于需要对整个向量空间进行穷举搜索,精确向量搜索在真实场景中往往会过于缓慢。 -* 近似向量搜索指一类技术(例如使用图或随机森林等特殊数据结构),它们比精确向量搜索能更快地计算结果。结果的准确性通常对实际使用来说“足够好”。许多近似技术都提供参数,用于在结果准确性和搜索时间之间进行权衡调优。 - -一次向量搜索(无论精确还是近似)可以用 SQL 表达如下: - -```sql -WITH [...] AS reference_vector -SELECT [...] -FROM table -WHERE [...] -- WHERE 子句为可选项 -ORDER BY (vectors, reference_vector) -LIMIT -``` - -向量空间中的点存储在名为 `vectors` 的数组类型列中,例如 [Array(Float64)](../../../sql-reference/data-types/array.md)、[Array(Float32)](../../../sql-reference/data-types/array.md) 或 [Array(BFloat16)](../../../sql-reference/data-types/array.md)。 -参考向量是一个常量数组,并通过公用表表达式(CTE)提供。 -`<DistanceFunction>` 计算参考点与所有已存储点之间的距离。 -可以使用任意可用的[距离函数](/sql-reference/functions/distance-functions)来实现。 -`<N>` 指定应返回多少个近邻。 - - -## 精确向量搜索 - -可以直接使用上面的 SELECT 查询执行精确向量搜索。 -此类查询的运行时间通常与已存储向量的数量及其维度成正比,即数组元素的数量。 -此外,由于 ClickHouse 会对所有向量进行暴力扫描(brute-force scan),运行时间还取决于查询使用的线程数(参见设置 [max_threads](../../../operations/settings/settings.md#max_threads))。 - -### 示例 - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32)) ENGINE = MergeTree ORDER BY id; - -INSERT INTO tab VALUES (0, [1.0, 0.0]), (1, [1.1, 0.0]), (2, [1.2, 0.0]), (3, [1.3, 0.0]), (4, [1.4, 0.0]), (5, [1.5, 0.0]), (6, [0.0, 2.0]), (7, [0.0, 2.1]), (8, [0.0, 2.2]), (9, [0.0, 2.3]), (10, [0.0, 2.4]), (11, [0.0, 2.5]); - -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -返回 - -```result - ┌─id─┬─vec─────┐ -1. │ 6 │ [0,2] │ -2. │ 7 │ [0,2.1] │ -3. │ 8 │ [0,2.2] │ - └────┴─────────┘ -``` - - -## 近似向量搜索 - -### 向量相似度索引 - -ClickHouse 提供了一种专用的“向量相似度”索引,用于执行近似向量搜索。 - -:::note -向量相似度索引在 ClickHouse 25.8 及更高版本中可用。 -如果遇到问题,请在 [ClickHouse 仓库](https://github.com/clickhouse/clickhouse/issues) 中提交 issue。 -::: - -#### 创建向量相似度索引 - -可以在新表上按如下方式创建向量相似度索引: - -```sql -CREATE TABLE table -( - [...], - vectors Array(Float*), - INDEX vectors TYPE vector_similarity(, , ) [GRANULARITY ] -) -ENGINE = MergeTree -ORDER BY [...] -``` - -或者,要在现有表上添加向量相似索引: - -```sql -ALTER TABLE table ADD INDEX vectors TYPE vector_similarity(, , ) [GRANULARITY ]; -``` - -向量相似度索引是一种特殊的跳过索引(参见[这里](mergetree.md#table_engine-mergetree-data_skipping-indexes)和[这里](../../../optimize/skipping-indexes))。 -因此,上面的 `ALTER TABLE` 语句只会为之后插入到该表中的新数据构建索引。 -要同时为已有数据构建索引,你需要对索引进行物化: - -```sql -ALTER TABLE table MATERIALIZE INDEX SETTINGS mutations_sync = 2; -``` - -函数 `` 必须是 - -* `L2Distance`,[Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance)(欧几里得距离),表示欧几里得空间中两点之间线段的长度,或 -* `cosineDistance`,[cosine distance](https://en.wikipedia.org/wiki/Cosine_similarity#Cosine_distance)(余弦距离),表示两个非零向量之间的夹角。 - -对于已归一化的数据,通常 `L2Distance` 是最佳选择;否则,推荐使用 `cosineDistance` 来补偿尺度差异。 - -`` 指定底层列中数组的基数(元素数量)。 -如果 ClickHouse 在创建索引时发现数组的基数不一致,则会丢弃该索引并返回错误。 - -可选的 GRANULARITY 参数 `` 指的是索引粒度的大小(参见[此处](../../../optimize/skipping-indexes))。 -默认值 1 亿在大多数用例中应该都能有不错的表现,但也可以进行调优。 -我们建议仅由了解其影响的高级用户进行调优(参见[下文](#differences-to-regular-skipping-indexes))。 - -向量相似性索引在通用意义上来说是通用的,即可以适配不同的近似搜索方法。 -实际使用的方法由参数 `` 指定。 -当前唯一可用的近似搜索方法是 HNSW([academic paper](https://arxiv.org/abs/1603.09320)),这是一种基于分层近邻图的流行且最先进的近似向量搜索技术。 -如果将 HNSW 指定为 type,用户还可以选择性地指定更多 HNSW 专用参数: - -```sql -CREATE TABLE table -( - [...], - vectors Array(Float*), - INDEX index_name vectors TYPE vector_similarity('hnsw', , [, , , ]) [GRANULARITY N] -) -ENGINE = MergeTree -ORDER BY [...] -``` - -以下是可用的 HNSW 专用参数: - -* `` 控制邻近图中向量的量化方式。可选值为 `f64`、`f32`、`f16`、`bf16`、`i8` 或 `b1`。默认值为 `bf16`。请注意,此参数不会影响底层列中向量的表示形式。 -* `` 控制每个图节点的邻居数量,也称为 HNSW 超参数 `M`。默认值为 `32`。值为 `0` 表示使用默认值。 -* `` 控制构建 HNSW 图时动态候选列表的大小,也称为 HNSW 超参数 `ef_construction`。默认值为 `128`。值为 `0` 表示使用默认值。 - -所有 HNSW 专用参数的默认值在大多数用例中都有良好表现。 -因此,我们不建议自定义这些 HNSW 专用参数。 - - -适用以下进一步限制: - -* 向量相似度索引只能建立在类型为 [Array(Float32)](../../../sql-reference/data-types/array.md)、[Array(Float64)](../../../sql-reference/data-types/array.md) 或 [Array(BFloat16)](../../../sql-reference/data-types/array.md) 的列上。诸如 `Array(Nullable(Float32))` 和 `Array(LowCardinality(Float32))` 这类可为空或低基数浮点数组不被允许。 -* 向量相似度索引必须建立在单个列上。 -* 向量相似度索引可以建立在计算表达式上(例如 `INDEX index_name arraySort(vectors) TYPE vector_similarity([...])`),但此类索引之后不能用于近似近邻搜索。 -* 向量相似度索引要求底层列中的所有数组都具有 `` 个元素——这一点会在创建索引时进行检查。为了尽早发现对此要求的违规情况,用户可以为向量列添加一个[约束](/sql-reference/statements/create/table.md#constraints),例如:`CONSTRAINT same_length CHECK length(vectors) = 256`。 -* 同样,底层列中的数组值不能为空(`[]`),也不能为默认值(同样是 `[]`)。 - -**估算存储和内存占用** - -为典型 AI 模型(例如大语言模型,[LLMs](https://en.wikipedia.org/wiki/Large_language_model))生成的向量由数百或数千个浮点值组成。 -因此,单个向量值就可能消耗数千字节的内存。 -希望估算表中底层向量列所需存储空间,以及向量相似度索引所需内存的用户,可以使用下面两个公式: - -表中向量列的存储占用(未压缩): - -```text -存储消耗 = 向量数量 × 维度 × 列数据类型大小 -``` - -以 [DBpedia 数据集](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M) 为例: - -```text -存储消耗 = 100 万 × 1536 × 4(Float32 类型)= 6.1 GB -``` - -在执行搜索时,必须将向量相似度索引从磁盘完整加载到内存中。 -同样,向量索引也是先在内存中完全构建,然后再保存到磁盘。 - -加载一个向量索引所需的内存占用: - -```text -索引中向量的内存占用 (mv) = 向量数量 × 维度 × 量化数据类型大小 -内存图的内存占用 (mg) = 向量数量 × hnsw_max_connections_per_layer × 每节点 ID 字节数 (= 4) × 层节点重复因子 (= 2) - -内存消耗总量:mv + mg -``` - -[dbpedia 数据集](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M)的示例: - -```text -索引中向量的内存占用 (mv) = 100 万 × 1536 × 2 (BFloat16 格式) = 3072 MB -内存图的内存占用 (mg) = 100 万 × 64 × 2 × 4 = 512 MB - -总内存消耗 = 3072 + 512 = 3584 MB -``` - -上述公式未将向量相似度索引在分配运行时数据结构(例如预分配缓冲区和缓存)时所需的额外内存考虑在内。 - -#### 使用向量相似度索引 - -:::note -要使用向量相似度索引,[compatibility](../../../operations/settings/settings.md) 设置必须为 `''`(默认值)或不低于 `'25.1'` 的版本。 -::: - -向量相似度索引支持如下形式的 SELECT 查询: - -```sql -WITH [...] AS reference_vector -SELECT [...] -FROM table -WHERE [...] -- WHERE 子句为可选项 -ORDER BY (vectors, reference_vector) -LIMIT -``` - -ClickHouse 的查询优化器会尝试匹配上述查询模板,并利用可用的向量相似索引。 -只有当 SELECT 查询中的距离函数与索引定义中的距离函数相同时,查询才能使用向量相似索引。 - -高级用户可以为设置 [hnsw_candidate_list_size_for_search](../../../operations/settings/settings.md#hnsw_candidate_list_size_for_search) 提供自定义值(也称为 HNSW 超参数 "ef_search"),以在搜索过程中调节候选列表的大小(例如 `SELECT [...] SETTINGS hnsw_candidate_list_size_for_search = `)。 -该设置的默认值为 256,在大多数用例中表现良好。 -更高的取值意味着更高的准确性,但会以性能变慢为代价。 - - -如果查询可以使用向量相似性索引,ClickHouse 会检查在 SELECT 查询中提供的 LIMIT `` 是否处于合理范围内。 -更具体地说,如果 `` 大于设置项 [max_limit_for_vector_search_queries](../../../operations/settings/settings.md#max_limit_for_vector_search_queries) 的值(默认值为 100),则会返回错误。 -过大的 LIMIT 值会减慢搜索速度,并且通常表示用法错误。 - -要检查某个 SELECT 查询是否使用了向量相似性索引,可以在查询前加上前缀 `EXPLAIN indexes = 1`。 - -例如,查询 - -```sql -EXPLAIN indexes = 1 -WITH [0.462, 0.084, ..., -0.110] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 10; -``` - -可能会返回 - -```result - ┌─explain─────────────────────────────────────────────────────────────────────────────────────────┐ - 1. │ Expression (投影名称) │ - 2. │ Limit (初步 LIMIT(不含 OFFSET)) │ - 3. │ Sorting (ORDER BY 排序) │ - 4. │ Expression ((ORDER BY 之前 + (投影 + 将列名更改为列标识符))) │ - 5. │ ReadFromMergeTree (default.tab) │ - 6. │ Indexes: │ - 7. │ PrimaryKey │ - 8. │ Condition: true │ - 9. │ Parts: 1/1 │ -10. │ Granules: 575/575 │ -11. │ Skip │ -12. │ Name: idx │ -13. │ Description: vector_similarity GRANULARITY 100000000 │ -14. │ Parts: 1/1 │ -15. │ Granules: 10/575 │ - └─────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -在这个示例中,[dbpedia dataset](https://huggingface.co/datasets/KShivendu/dbpedia-entities-openai-1M) 中的 100 万个向量(每个向量维度为 1536)被存储在 575 个 granule 中,即每个 granule 约 1.7k 行。 -查询请求 10 个近邻,向量相似度索引在 10 个不同的 granule 中找到了这 10 个近邻。 -在查询执行过程中会读取这 10 个 granule。 - -如果输出中包含 `Skip` 以及向量索引的名称和类型(在示例中为 `idx` 和 `vector_similarity`),则表示使用了向量相似度索引。 -在这种情况下,向量相似度索引丢弃了 4 个 granule 中的 2 个,即丢弃了 50% 的数据。 -能够丢弃的 granule 越多,索引的使用就越高效。 - -:::tip -若要强制使用索引,可以在运行 SELECT 查询时设置 [force_data_skipping_indexes](../../../operations/settings/settings#force_data_skipping_indices)(将索引名称作为该设置的值提供)。 -::: - -**后过滤与预过滤** - -用户可以选择在 SELECT 查询中通过 `WHERE` 子句指定额外的过滤条件。 -ClickHouse 将使用后过滤或预过滤策略来评估这些过滤条件。 -简而言之,这两种策略决定了过滤条件的执行顺序: - -* 后过滤表示首先评估向量相似度索引,然后 ClickHouse 再评估 `WHERE` 子句中指定的额外过滤条件。 -* 预过滤表示过滤条件的评估顺序相反。 - -这两种策略有不同的权衡: - -* 后过滤的一个普遍问题在于,它可能返回少于 `LIMIT ` 子句所请求的行数。当由向量相似度索引返回的一个或多个结果行无法满足附加过滤条件时,就会出现这种情况。 -* 预过滤在总体上仍是一个未解决的问题。某些专用向量数据库提供了预过滤算法,但大多数关系型数据库(包括 ClickHouse)会退回到精确近邻搜索,即不使用索引的暴力扫描。 - -采用何种策略取决于过滤条件。 - -*附加过滤条件是分区键的一部分* - -如果附加过滤条件是分区键的一部分,那么 ClickHouse 将应用分区裁剪。 -例如,某个表按列 `year` 进行范围分区,并运行如下查询: - -```sql -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -WHERE year = 2025 -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -ClickHouse 将裁剪除 2025 分区外的所有分区。 - -*无法使用索引计算的额外过滤条件* - -如果额外过滤条件无法通过索引(主键索引、跳跃索引)进行计算,ClickHouse 将在扫描结果上执行后置过滤。 - - -*可以使用主键索引评估的附加过滤条件* - -如果附加过滤条件可以使用[主键](mergetree.md#primary-key)进行评估(即它们构成主键的前缀),并且 - -* 如果过滤条件在一个 part 内剔除了至少一行,则 ClickHouse 将改为对该 part 内“存活”的范围执行预过滤, -* 如果过滤条件在一个 part 内没有剔除任何行,则 ClickHouse 将对该 part 执行后过滤。 - -在实际使用场景中,后一种情况相对不太常见。 - -*可以使用 skipping index 评估的附加过滤条件* - -如果附加过滤条件可以使用[数据跳过索引(skipping indexes)](mergetree.md#table_engine-mergetree-data_skipping-indexes)(minmax 索引、set 索引等)进行评估,ClickHouse 会执行后过滤。 -在这种情况下,会首先评估向量相似度索引,因为预期它相对于其他 skipping indexes 能剔除最多的行。 - -为了对后过滤与预过滤进行更精细的控制,可以使用两个设置项: - -[vector_search_filter_strategy](../../../operations/settings/settings#vector_search_filter_strategy) 设置(默认值:`auto`,实现了上述启发式策略)可以设为 `prefilter`。 -在附加过滤条件极具选择性时,这对于强制启用预过滤非常有用。 -例如,下面的查询可能会从预过滤中获益: - -```sql -SELECT bookid, author, title -FROM books -WHERE price < 2.00 -ORDER BY cosineDistance(book_vector, getEmbedding('古代亚洲帝国相关书籍')) -LIMIT 10 -``` - -假设只有极少数书籍的价格低于 2 美元,后过滤(post-filtering)可能会返回零行,因为向量索引返回的前 10 个匹配结果的价格可能全部高于 2 美元。 -通过强制使用预过滤(在查询中添加 `SETTINGS vector_search_filter_strategy = 'prefilter'`),ClickHouse 会先找到所有价格低于 2 美元的书籍,然后对这些书籍执行穷举(brute-force)向量搜索。 - -作为解决上述问题的另一种方法,可以将 [vector_search_index_fetch_multiplier](../../../operations/settings/settings#vector_search_index_fetch_multiplier)(默认值:`1.0`,最大值:`1000.0`)配置为大于 `1.0` 的值(例如 `2.0`)。 -从向量索引中获取的最近邻数量会乘以该设置的值,然后再对这些行应用额外过滤条件,以返回满足 LIMIT 的行数。 -例如,我们可以再次进行查询,但将 multiplier 设置为 `3.0`: - -```sql -SELECT bookid, author, title -FROM books -WHERE price < 2.00 -ORDER BY cosineDistance(book_vector, getEmbedding('古代亚洲帝国相关书籍')) -LIMIT 10 -SETTING vector_search_index_fetch_multiplier = 3.0; -``` - -ClickHouse 将在每个 part 中的向量索引中获取 3.0 x 10 = 30 个最近邻,然后再评估额外的过滤条件。 -最终只会返回距离最近的 10 个邻居。 -需要注意的是,通过设置 `vector_search_index_fetch_multiplier` 可以缓解这个问题,但在极端情况下(例如 WHERE 条件选择性很强时),仍然可能出现返回的行数少于请求的 N 行的情况。 - -**重新打分(Rescoring)** - -ClickHouse 中的 skip index 通常在 granule 级别进行过滤,即对 skip index 的一次查找(在内部)会返回一个潜在匹配 granule 的列表,从而减少后续扫描中需要读取的数据量。 -这对一般的 skip index 效果很好,但在向量相似度索引的场景中,会造成一个“粒度不匹配(granularity mismatch)”的问题。 -更具体地说,向量相似度索引会为给定的参考向量确定 N 个最相似向量的行号,但接下来需要将这些行号外推为 granule 编号。 -ClickHouse 随后会从磁盘加载这些 granule,并对这些 granule 中的所有向量重新计算距离。 -这一步称为重新打分(rescoring),虽然从理论上讲它可以提升准确性——请记住,向量相似度索引只返回*近似*结果——但从性能角度看显然并不理想。 - -因此,ClickHouse 提供了一项优化:禁用重新打分,直接从索引中返回最相似的向量及其距离。 -该优化默认启用,参见设置 [vector_search_with_rescoring](../../../operations/settings/settings#vector_search_with_rescoring)。 -在高层级上的工作方式是:ClickHouse 将最相似的向量及其距离作为一个虚拟列 `_distances` 暴露出来。 -要查看这一点,可运行带有 `EXPLAIN header = 1` 的向量搜索查询: - - -```sql -EXPLAIN header = 1 -WITH [0., 2.] AS reference_vec -SELECT id -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3 -SETTINGS vector_search_with_rescoring = 0 -``` - -```result -Query id: a2a9d0c8-a525-45c1-96ca-c5a11fa66f47 - - ┌─explain─────────────────────────────────────────────────────────────────────────────────────────────────┐ - 1. │ Expression (投影列名) │ - 2. │ Header: id Int32 │ - 3. │ Limit (初步 LIMIT(无 OFFSET)) │ - 4. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ - 5. │ __table1.id Int32 │ - 6. │ Sorting (ORDER BY 排序) │ - 7. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ - 8. │ __table1.id Int32 │ - 9. │ Expression ((ORDER BY 之前 + (投影 + 列名转换为列标识符))) │ -10. │ Header: L2Distance(__table1.vec, _CAST([0., 2.]_Array(Float64), 'Array(Float64)'_String)) Float64 │ -11. │ __table1.id Int32 │ -12. │ ReadFromMergeTree (default.tab) │ -13. │ Header: id Int32 │ -14. │ _distance Float32 │ - └─────────────────────────────────────────────────────────────────────────────────────────────────────────┘ -``` - -:::note -在未启用重打分(`vector_search_with_rescoring = 0`)且启用了并行副本的情况下运行的查询,可能会回退为执行重打分。 -::: - -#### 性能调优 - -**压缩调优** - -在几乎所有使用场景中,底层列中的向量都是稠密的,且压缩效果不佳。 -因此,[压缩](/sql-reference/statements/create/table.md#column_compression_codec) 会降低向量列的写入和读取性能。 -因此我们建议禁用压缩。 -为此,请像下面这样为向量列指定 `CODEC(NONE)`: - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32) CODEC(NONE), INDEX idx vec TYPE vector_similarity('hnsw', 'L2Distance', 2)) ENGINE = MergeTree ORDER BY id; -``` - -**调优索引创建** - -向量相似度索引的生命周期与数据分片(part)的生命周期绑定。 -换句话说,每当创建一个定义了向量相似度索引的新分片时,索引也会随之创建。 -这通常发生在数据被[插入](https://clickhouse.com/docs/guides/inserting-data)时或在[合并](https://clickhouse.com/docs/merges)过程中。 -众所周知,HNSW 的索引创建耗时较长,会显著拖慢插入和合并操作。 -向量相似度索引在理想情况下只应用于不可变或很少变更的数据。 - -为了加速索引创建,可以采用以下技术: - -首先,可以并行化索引创建过程。 -索引创建线程的最大数量可以通过服务器设置 [max_build_vector_similarity_index_thread_pool_size](/operations/server-configuration-parameters/settings#max_build_vector_similarity_index_thread_pool_size) 进行配置。 -为获得最佳性能,该设置值应配置为 CPU 核心数。 - -其次,为了加速 INSERT 语句,用户可以通过会话设置 [materialize_skip_indexes_on_insert](../../../operations/settings/settings.md#materialize_skip_indexes_on_insert) 禁用在新插入分片上创建跳过索引(skipping index)。 -对此类分片执行的 SELECT 查询将回退为精确搜索。 -由于插入分片相对于整个表的大小通常较小,因此这种回退带来的性能影响预计可以忽略不计。 - -第三,为了加速合并,用户可以通过会话设置 [materialize_skip_indexes_on_merge](../../../operations/settings/merge-tree-settings.md#materialize_skip_indexes_on_merge) 禁用在合并后的分片上创建跳过索引。 -这与语句 [ALTER TABLE [...] MATERIALIZE INDEX [...]](../../../sql-reference/statements/alter/skipping-index.md#materialize-index) 结合使用,可以对向量相似度索引的生命周期进行显式控制。 -例如,可以将索引创建延后到所有数据都已摄取完成之后,或延后到系统负载较低的时间段(例如周末)。 - -**调优索引用法** - - -为了执行 `SELECT` 查询并使用向量相似度索引,需要先将这些索引加载到主内存中。 -为避免同一个向量相似度索引被反复加载到主内存,ClickHouse 提供了专用的内存缓存来存储此类索引。 -该缓存越大,不必要的加载就越少。 -最大缓存大小可以通过服务器设置 [vector_similarity_index_cache_size](../../../operations/server-configuration-parameters/settings.md#vector_similarity_index_cache_size) 进行配置。 -默认情况下,缓存最大可增长到 5 GB。 - -:::note -向量相似度索引缓存存储的是向量索引的 granule(粒度单元)。 -如果单个向量索引 granule 的大小超过缓存大小,则不会被缓存。 -因此,请务必根据 “Estimating storage and memory consumption” 中的公式或 [system.data_skipping_indices](../../../operations/system-tables/data_skipping_indices) 计算向量索引大小,并据此合理设置缓存大小。 -::: - -当前向量相似度索引缓存的大小可以在 [system.metrics](../../../operations/system-tables/metrics.md) 中查看: - -```sql -SELECT metric, value -FROM system.metrics -WHERE metric = 'VectorSimilarityIndexCacheBytes' -``` - -可以从 [system.query_log](../../../operations/system-tables/query_log.md) 中获取某个查询 ID 对应查询的缓存命中和未命中情况: - -```sql -SYSTEM FLUSH LOGS query_log; - -SELECT ProfileEvents['VectorSimilarityIndexCacheHits'], ProfileEvents['VectorSimilarityIndexCacheMisses'] -FROM system.query_log -WHERE type = 'QueryFinish' AND query_id = '<...>' -ORDER BY event_time_microseconds; -``` - -对于生产环境的使用场景,我们建议将缓存配置得足够大,使所有向量索引始终都能常驻内存。 - -**量化调优** - -[量化](https://huggingface.co/blog/embedding-quantization) 是一种用于减少向量内存占用,以及降低构建和遍历向量索引计算成本的技术。 -ClickHouse 向量索引支持以下量化选项: - -| Quantization | Name | Storage per dimension | -| -------------- | ---------------------------- | --------------------- | -| f32 | Single precision | 4 bytes | -| f16 | Half precision | 2 bytes | -| bf16 (default) | Half precision (brain float) | 2 bytes | -| i8 | Quarter precision | 1 byte | -| b1 | Binary | 1 bit | - -与直接搜索原始全精度浮点值(`f32`)相比,引入量化会降低向量搜索的精度。 -不过,在大多数数据集上,半精度 brain float 量化(`bf16`)带来的精度损失可以忽略不计,因此向量相似度索引默认采用这种量化技术。 -四分之一精度(`i8`)和二进制(`b1`)量化会在向量搜索中引入较为明显的精度损失。 -我们仅在向量相似度索引的大小显著大于可用 DRAM 容量时,才推荐使用这两种量化方式。 -在这种情况下,我们也建议启用重评分([vector_search_index_fetch_multiplier](../../../operations/settings/settings#vector_search_index_fetch_multiplier)、[vector_search_with_rescoring](../../../operations/settings/settings#vector_search_with_rescoring))以提升准确性。 -二进制量化仅在以下两种情况下推荐使用:1)对归一化后的嵌入向量(即向量长度 = 1,OpenAI 模型通常是归一化的),以及 2)使用余弦距离作为距离函数时。 -二进制量化在内部使用 Hamming 距离来构建和搜索近邻图。 -重评分步骤会使用表中存储的原始全精度向量,通过余弦距离来识别最近邻。 - -**数据传输调优** - -向量搜索查询中的参考向量由用户提供,通常是通过调用大型语言模型(LLM)获取。 -在 ClickHouse 中运行向量搜索的典型 Python 代码如下所示: - -```python -search_v = openai_client.embeddings.create(input = "[好书]", model='text-embedding-3-large', dimensions=1536).data[0].embedding - -params = {'search_v': search_v} -result = chclient.query( - "SELECT id FROM items - ORDER BY cosineDistance(vector, %(search_v)s) - LIMIT 10", - parameters = params) -``` - - -嵌入向量(上面代码片段中的 `search_v`)的维度可能非常大。 -例如,OpenAI 提供的模型会生成维度为 1536 甚至 3072 的嵌入向量。 -在上面的代码中,ClickHouse Python 驱动会将嵌入向量替换为一个可读的字符串,然后将整个 SELECT 查询作为字符串发送。 -假设嵌入向量由 1536 个单精度浮点值组成,发送的字符串长度将达到 20 kB。 -这会在分词、解析以及执行数千次字符串到浮点数转换时造成较高的 CPU 使用率。 -此外,ClickHouse 服务器日志文件也需要大量空间,进而导致 `system.query_log` 膨胀。 - -请注意,大多数 LLM 模型返回的嵌入向量是由原生浮点数组成的列表或 NumPy 数组。 -因此,我们建议 Python 应用以二进制形式绑定参考向量参数,使用如下方式: - -```python -search_v = openai_client.embeddings.create(input = "[好书]", model='text-embedding-3-large', dimensions=1536).data[0].embedding - -params = {'$search_v_binary$': np.array(search_v, dtype=np.float32).tobytes()} -result = chclient.query( - "SELECT id FROM items - ORDER BY cosineDistance(vector, (SELECT reinterpret($search_v_binary$, 'Array(Float32)'))) - LIMIT 10" - parameters = params) -``` - -在本示例中,参考向量以原始二进制形式发送到服务器,并在服务器端被重新解释为浮点数数组。 -这可以节省服务器端的 CPU 时间,并避免服务器日志和 `system.query_log` 的膨胀。 - -#### 管理和监控 - -向量相似性索引在磁盘上的大小可以通过 [system.data_skipping_indices](../../../operations/system-tables/data_skipping_indices) 获取: - -```sql -SELECT database, table, name, formatReadableSize(data_compressed_bytes) -FROM system.data_skipping_indices -WHERE type = 'vector_similarity'; -``` - -示例输出: - -```result -┌─database─┬─table─┬─name─┬─formatReadab⋯ssed_bytes)─┐ -│ default │ tab │ idx │ 348.00 MB │ -└──────────┴───────┴──────┴──────────────────────────┘ -``` - -#### 与常规跳过索引的区别 - -与所有常规[跳过索引](/optimize/skipping-indexes)类似,向量相似度索引也是在 granule 之上构建的,每个已建立索引的块由 `GRANULARITY = [N]` 个 granule 组成(对普通跳过索引而言,`[N]` 默认为 1)。 -例如,如果表的主索引粒度为 8192(设置 `index_granularity = 8192`)且 `GRANULARITY = 2`,则每个已建立索引的块将包含 16384 行。 -然而,用于近似最近邻搜索的数据结构和算法在本质上是面向行的。 -它们存储一组行的紧凑表示,并且在向量搜索查询中也会返回行。 -这导致向量相似度索引在行为方式上与普通跳过索引相比存在一些相当不直观的差异。 - -当用户在某列上定义向量相似度索引时,ClickHouse 会在内部为每个索引块创建一个向量相似度“子索引”。 -子索引是“本地”的,这意味着它只涉及其所属索引块中的行。 -延续前面的例子,并假设某列有 65536 行,我们会得到四个索引块(跨越八个 granule),以及每个索引块对应的一个向量相似度子索引。 -理论上,子索引能够直接返回其索引块内距离给定点最近的 N 个点所对应的行。 -然而,由于 ClickHouse 从磁盘加载数据到内存时的粒度是 granule,子索引会将匹配行扩展到 granule 粒度。 -这与常规跳过索引不同,后者是以索引块粒度来跳过数据的。 - - -`GRANULARITY` 参数决定会创建多少个向量相似度子索引。 -更大的 `GRANULARITY` 值意味着子索引更少但更大,极端情况下,一个列(或列的数据分片)只会有单个子索引。 -在这种情况下,该子索引对该列的所有行具有“全局”视图,并且可以直接返回该列(分片)中所有包含相关行的 granule(最多只有 `LIMIT [N]` 个这样的 granule)。 -在第二步中,ClickHouse 会加载这些 granule,并通过对这些 granule 中的所有行执行穷举式距离计算来识别真正最优的行。 -当 `GRANULARITY` 值较小时,每个子索引会返回最多 `LIMIT N` 个 granule。 -结果是需要加载更多 granule 并进行后置过滤。 -请注意,两种情况下的搜索精度同样高,只是处理性能不同。 -通常建议为向量相似度索引使用较大的 `GRANULARITY`,只有在出现例如向量相似度结构内存占用过高等问题时,才改用较小的 `GRANULARITY` 值。 -如果没有为向量相似度索引指定 `GRANULARITY`,则默认值为 1 亿。 - -#### 示例 - -```sql -CREATE TABLE tab(id Int32, vec Array(Float32), INDEX idx vec TYPE vector_similarity('hnsw', 'L2Distance', 2)) ENGINE = MergeTree ORDER BY id; - -INSERT INTO tab VALUES (0, [1.0, 0.0]), (1, [1.1, 0.0]), (2, [1.2, 0.0]), (3, [1.3, 0.0]), (4, [1.4, 0.0]), (5, [1.5, 0.0]), (6, [0.0, 2.0]), (7, [0.0, 2.1]), (8, [0.0, 2.2]), (9, [0.0, 2.3]), (10, [0.0, 2.4]), (11, [0.0, 2.5]); - -WITH [0., 2.] AS reference_vec -SELECT id, vec -FROM tab -ORDER BY L2Distance(vec, reference_vec) ASC -LIMIT 3; -``` - -返回值 - -```result - ┌─id─┬─vec─────┐ -1. │ 6 │ [0,2] │ -2. │ 7 │ [0,2.1] │ -3. │ 8 │ [0,2.2] │ - └────┴─────────┘ -``` - -使用近似向量搜索的更多示例数据集: - -* [LAION-400M](../../../getting-started/example-datasets/laion-400m-dataset) -* [LAION-5B](../../../getting-started/example-datasets/laion-5b-dataset) -* [dbpedia](../../../getting-started/example-datasets/dbpedia-dataset) -* [hackernews](../../../getting-started/example-datasets/hackernews-vector-search-dataset) - -### 量化比特(QBit) - - - -加速精确向量搜索的一种常见方法是使用更低精度的 [浮点数数据类型](../../../sql-reference/data-types/float.md)。 -例如,如果向量存储为 `Array(BFloat16)` 而不是 `Array(Float32)`,数据大小会减半,并且查询运行时间预计会按比例缩短。 -这种方法称为量化。尽管它加快了计算速度,但即便对所有向量进行穷举扫描,结果的准确性也可能会降低。 - -在传统量化中,我们在搜索和存储数据时都会丢失精度。在上述示例中,我们会存储 `BFloat16` 而不是 `Float32`,这意味着即使之后有需求,我们也永远无法执行更高精度的搜索。另一种方法是存储两份数据:量化版本和全精度版本。尽管这种方式可行,但需要冗余存储。设想一种场景,我们的原始数据是 `Float64`,并希望以不同精度(16 位、32 位或完整的 64 位)运行搜索,那么就需要存储三份独立的数据副本。 - -ClickHouse 提供了 Quantized Bit(`QBit`)数据类型,通过以下方式克服这些限制: - -1. 存储原始的全精度数据。 -2. 允许在查询时指定量化精度。 - - -这是通过以按位分组(bit-grouped)格式存储数据实现的(即将所有向量的第 i 位比特存放在一起),从而只在请求的精度级别进行读取。这样,你可以在保留全部原始数据、按需访问的前提下,从量化带来的 I/O 和计算量减少中获得速度优势。当选择最大精度时,搜索结果即为精确匹配。 - -:::note -`QBit` 数据类型及其相关距离函数目前是实验特性。要启用它们,请运行 `SET allow_experimental_qbit_type = 1`。 -如果遇到问题,请在 [ClickHouse 代码仓库](https://github.com/clickhouse/clickhouse/issues) 中提交 issue。 -::: - -要声明一个 `QBit` 类型的列,请使用以下语法: - -```sql -列名 QBit(元素类型, 维度) -``` - -其中: - -* `element_type` – 每个向量元素的类型。支持的类型包括 `BFloat16`、`Float32` 和 `Float64` -* `dimension` – 每个向量中的元素个数 - -#### 创建 `QBit` 表并添加数据 - -```sql -CREATE TABLE fruit_animal ( - word String, - vec QBit(Float64, 5) -) ENGINE = MergeTree -ORDER BY word; - -INSERT INTO fruit_animal VALUES - ('apple', [-0.99105519, 1.28887844, -0.43526649, -0.98520696, 0.66154391]), - ('banana', [-0.69372815, 0.25587061, -0.88226235, -2.54593015, 0.05300475]), - ('orange', [0.93338752, 2.06571317, -0.54612565, -1.51625717, 0.69775337]), - ('dog', [0.72138876, 1.55757105, 2.10953259, -0.33961248, -0.62217325]), - ('cat', [-0.56611276, 0.52267331, 1.27839863, -0.59809804, -1.26721048]), - ('horse', [-0.61435682, 0.48542571, 1.21091247, -0.62530446, -1.33082533]); -``` - -#### 使用 `QBit` 进行向量搜索 - -我们使用 L2 距离查找与表示单词 “lemon” 的向量最接近的邻居向量。距离函数的第三个参数指定精度的位数——值越高,精度越高,但计算量也越大。 - -你可以在[这里](../../../sql-reference/data-types/qbit.md#vector-search-functions)找到 `QBit` 支持的所有距离函数。 - -**全精度搜索(64 位):** - -```sql -SELECT - word, - L2DistanceTransposed(vec, [-0.88693672, 1.31532824, -0.51182908, -0.99652702, 0.59907770], 64) AS distance -FROM fruit_animal -ORDER BY distance; -``` - -```text - ┌─word───┬────────────distance─┐ -1. │ apple │ 0.14639757188169716 │ -2. │ banana │ 1.998961369007679 │ -3. │ orange │ 2.039041552613732 │ -4. │ cat │ 2.752802631487914 │ -5. │ horse │ 2.7555776805484813 │ -6. │ dog │ 3.382295083120104 │ - └────────┴─────────────────────┘ -``` - -**低精度搜索:** - -```sql -SELECT - word, - L2DistanceTransposed(vec, [-0.88693672, 1.31532824, -0.51182908, -0.99652702, 0.59907770], 12) AS distance -FROM fruit_animal -ORDER BY distance; -``` - -```text - ┌─word───┬───────────distance─┐ -1. │ apple │ 0.757668703053566 │ -2. │ orange │ 1.5499475034938677 │ -3. │ banana │ 1.6168396735102937 │ -4. │ cat │ 2.429752230904804 │ -5. │ horse │ 2.524650475528617 │ -6. │ dog │ 3.17766975527459 │ - └────────┴────────────────────┘ -``` - - -请注意,使用 12 位量化时,我们在加快查询执行的同时,依然能够很好地逼近实际距离。相对排序基本保持一致,`apple` 仍然是距离最近的匹配项。 - -:::note -在目前的状态下,加速主要来自减少 I/O,因为我们读取的数据更少。如果原始数据比较“宽”,例如 `Float64`,选择更低的精度时,距离计算依然会在相同宽度的数据上进行——只是精度更低。 -::: - -#### 性能考量 {#qbit-performance} - -`QBit` 的性能收益主要来源于 I/O 操作的减少:在使用较低精度时,需要从存储中读取的数据量更少。此外,当 `QBit` 中包含 `Float32` 数据且精度参数为 16 或更低时,还可以通过减少计算获得额外收益。精度参数直接控制准确性与速度之间的权衡: - -- **更高的精度**(更接近原始数据宽度):结果更准确,查询更慢 -- **更低的精度**:查询更快但结果为近似值,内存占用更低 - -### 参考资料 {#references} - -博客: -- [Vector Search with ClickHouse - Part 1](https://clickhouse.com/blog/vector-search-clickhouse-p1) -- [Vector Search with ClickHouse - Part 2](https://clickhouse.com/blog/vector-search-clickhouse-p2) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md deleted file mode 100644 index 602ad0ed321..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/coalescingmergetree.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -description: 'CoalescingMergeTree 继承自 MergeTree 引擎。其关键特性是在数据部分(part)合并期间,能够自动保留每列最后一个非空(non-null)值。' -sidebar_label: 'CoalescingMergeTree' -sidebar_position: 50 -slug: /engines/table-engines/mergetree-family/coalescingmergetree -title: 'CoalescingMergeTree 表引擎' -keywords: ['CoalescingMergeTree'] -show_related_blogs: true -doc_type: 'reference' ---- - - - -# CoalescingMergeTree 表引擎 - -:::note Available from version 25.6 -此表引擎从 25.6 及更高版本开始在 OSS 和 Cloud 中可用。 -::: - -该引擎继承自 [MergeTree](/engines/table-engines/mergetree-family/mergetree)。关键区别在于数据部分的合并方式:对于 `CoalescingMergeTree` 表,ClickHouse 会将所有具有相同主键(更准确地说,相同的[排序键](../../../engines/table-engines/mergetree-family/mergetree.md))的行合并为一行,该行在每一列上都包含最新的非 NULL 值。 - -这实现了列级别的 upsert(插入或更新),也就是说,您可以只更新特定列,而不是整行。 - -`CoalescingMergeTree` 旨在与非键列中的 Nullable 类型配合使用。如果这些列不是 Nullable,其行为与 [ReplacingMergeTree](/engines/table-engines/mergetree-family/replacingmergetree) 相同。 - - - -## 创建表 - -```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 = CoalescingMergeTree([columns]) -[PARTITION BY expr] -[ORDER BY expr] -[SAMPLE BY expr] -[SETTINGS name=value, ...] -``` - -有关请求参数的说明,请参阅[请求描述](../../../sql-reference/statements/create/table.md)。 - -### CoalescingMergeTree 的参数 - -#### 列 - -`columns` - 一个包含需要合并其值的列名的元组(tuple)。可选参数。 -这些列必须是数值类型,并且不能出现在分区键或排序键中。 - -如果未指定 `columns`,ClickHouse 会合并所有不在排序键中的列的值。 - -### 查询子句 - -在创建 `CoalescingMergeTree` 表时,所需的[子句](../../../engines/table-engines/mergetree-family/mergetree.md)与创建 `MergeTree` 表时相同。 - -
- 已弃用的建表方法 - - :::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 [=] CoalescingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns]) - ``` - - 除 `columns` 之外的所有参数与 `MergeTree` 中的含义相同。 - - * `columns` — 一个包含列名的元组(tuple),这些列的值将被求和。可选参数。相关说明见上文。 -
- - -## 使用示例 - -请看下表: - -```sql -CREATE TABLE test_table -( - key UInt64, - value_int Nullable(UInt32), - value_string Nullable(String), - value_date Nullable(Date) -) -ENGINE = CoalescingMergeTree() -ORDER BY key -``` - -向其中插入数据: - -```sql -INSERT INTO test_table VALUES(1, NULL, NULL, '2025-01-01'), (2, 10, 'test', NULL); -INSERT INTO test_table VALUES(1, 42, 'win', '2025-02-01'); -INSERT INTO test_table(key, value_date) VALUES(2, '2025-02-01'); -``` - -结果将如下: - -```sql -SELECT * FROM test_table ORDER BY key; -``` - -```text -┌─key─┬─value_int─┬─value_string─┬─value_date─┐ -│ 1 │ 42 │ win │ 2025-02-01 │ -│ 1 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-01-01 │ -│ 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ 2025-02-01 │ -│ 2 │ 10 │ test │ ᴺᵁᴸᴸ │ -└─────┴───────────┴──────────────┴────────────┘ -``` - -获取最终正确结果的推荐查询: - -```sql -SELECT * FROM test_table FINAL ORDER BY key; -``` - -```text -┌─key─┬─value_int─┬─value_string─┬─value_date─┐ -│ 1 │ 42 │ win │ 2025-02-01 │ -│ 2 │ 10 │ test │ 2025-02-01 │ -└─────┴───────────┴──────────────┴────────────┘ -``` - -在查询中使用 `FINAL` 修饰符会强制 ClickHouse 在查询阶段应用合并逻辑,确保能够为每一列得到正确、已合并的“最新”值。在从 CoalescingMergeTree 表查询时,这是最安全且最精确的方法。 - -:::note - -如果底层数据分片(parts)尚未完全合并,使用 `GROUP BY` 的方式可能会返回不正确的结果。 - -```sql -SELECT key, last_value(value_int), last_value(value_string), last_value(value_date) FROM test_table GROUP BY key; -- 不建议使用。 -``` - -::: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md deleted file mode 100644 index dc6faddbb44..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/collapsingmergetree.md +++ /dev/null @@ -1,376 +0,0 @@ ---- -description: '继承自 MergeTree,但添加了在合并过程中折叠行的逻辑。' -keywords: ['更新', '折叠'] -sidebar_label: 'CollapsingMergeTree' -sidebar_position: 70 -slug: /engines/table-engines/mergetree-family/collapsingmergetree -title: 'CollapsingMergeTree 表引擎' -doc_type: 'guide' ---- - - - -# CollapsingMergeTree 表引擎 - - - -## 描述 {#description} - -`CollapsingMergeTree` 引擎继承自 [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md), -并在合并过程中增加了对行进行折叠的逻辑。 -`CollapsingMergeTree` 表引擎会异步删除(折叠) -成对的行,如果排序键(`ORDER BY`)中的所有字段都相同,且仅特殊字段 `Sign` 不同, -并且 `Sign` 字段只能取值 `1` 或 `-1`。 -没有与之构成 `Sign` 取值相反配对的行会被保留。 - -更多详细信息,参见本文档的 [Collapsing](#table_engine-collapsingmergetree-collapsing) 部分。 - -:::note -此引擎可以显著减少存储空间占用, -从而提高 `SELECT` 查询的效率。 -::: - - - -## 参数 {#parameters} - -此表引擎的所有参数(`Sign` 参数除外)与 [`MergeTree`](/engines/table-engines/mergetree-family/mergetree) 中的含义相同。 - -- `Sign` — 行类型标记列的名称,其中 `1` 表示“状态”行,`-1` 表示“撤销”行。类型:[Int8](/sql-reference/data-types/int-uint)。 - - - -## 创建表 - -```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, ...] -``` - -
- 已弃用的建表方法 - - :::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` — 分配给某列的名称,该列用于表示行的类型,其中 `1` 表示“state”行,`-1` 表示“cancel”行。[Int8](/sql-reference/data-types/int-uint)。 -
- -* 有关查询参数的说明,请参阅[查询说明](../../../sql-reference/statements/create/table.md)。 -* 创建 `CollapsingMergeTree` 表时,需要与创建 `MergeTree` 表时相同的[查询子句](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-creating-a-table)。 - - -## 折叠 - -### 数据 - -考虑这样一种情况:你需要为某个给定对象保存持续变化的数据。 -看起来为每个对象只保留一行并在有变化时更新它似乎是合乎逻辑的, -然而,更新操作对数据库管理系统(DBMS)来说代价高且缓慢,因为它们需要在存储中重写数据。 -如果我们需要快速写入数据,执行大量更新操作并不是可接受的方法, -但我们始终可以按顺序写入某个对象的变更。 -为此,我们使用特殊列 `Sign`。 - -* 如果 `Sign` = `1`,表示该行是一个“状态(state)”行:*一行包含表示当前有效状态的字段*。 -* 如果 `Sign` = `-1`,表示该行是一个“撤销(cancel)”行:*一行用于撤销具有相同属性的对象状态*。 - -例如,我们希望统计用户在某个网站上查看了多少页面以及访问这些页面的时长。 -在某个给定时间点,我们写入如下记录用户活动状态的一行数据: - -```text -┌──────────────UserID─┬─页面浏览量─┬─持续时长─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -随后,当我们检测到用户活动发生变化时,会使用以下两行将其写入表中: - -```text -┌──────────────用户ID─┬─页面浏览数─┬─时长─┬─符号─┐ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -第一行会取消该对象之前的状态(在本例中表示一个用户)。 -对于该“已取消”行,应复制所有排序键字段,`Sign` 字段除外。 -上面的第二行表示当前状态。 - -由于我们只需要用户活动的最终状态,原始的 “state” 行和我们插入的 “cancel” -行可以像下方所示那样删除,从而折叠对象的无效(旧)状态: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -- 旧的 "state" 行可以删除 -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -- "cancel" 行可以删除 -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -- 新的 "state" 行会保留 -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -`CollapsingMergeTree` 在合并数据分片时,会执行这种*折叠*行为。 - -:::note -关于为什么每次更改需要两行的原因, -将在[算法](#table_engine-collapsingmergetree-collapsing-algorithm)一节中进一步讨论。 -::: - -**这种方法的特点** - -1. 写入数据的程序必须记住对象的状态,才能在需要时将其取消。“cancel” 行应包含与 “state” 行相同的排序键字段副本,以及相反的 `Sign`。这会增加初始存储占用,但可以让我们快速写入数据。 -2. 列中不断增长的长数组会因为写入负载增加而降低引擎效率。数据越简单,效率越高。 -3. `SELECT` 的结果高度依赖于对象变更历史的一致性。在准备要插入的数据时要谨慎。对于不一致的数据,可能会得到不可预测的结果。例如,本应非负的指标(如会话深度)出现负值。 - -### 算法 - -当 ClickHouse 合并数据[分片](/concepts/glossary#parts)时, -每组具有相同排序键(`ORDER BY`)的连续行会被折叠为最多两行, -一行 `Sign` = `1` 的 “state” 行和一行 `Sign` = `-1` 的 “cancel” 行。 -换言之,ClickHouse 会对这些记录进行折叠处理。 - - -对于每个生成的数据部分,ClickHouse 会保存: - -| | | -|--|-------------------------------------------------------------------------------------------------------------------------------------| -|1.| 如果 `"state"` 行和 `"cancel"` 行的数量相同,且最后一行为 `"state"` 行,则保存第一条 `"cancel"` 行和最后一条 `"state"` 行。 | -|2.| 如果 `"state"` 行多于 `"cancel"` 行,则保存最后一条 `"state"` 行。 | -|3.| 如果 `"cancel"` 行多于 `"state"` 行,则保存第一条 `"cancel"` 行。 | -|4.| 在所有其他情况下,不保存任何行。 | - -另外,当 `"state"` 行比 `"cancel"` 行至少多 2 行,或者 `"cancel"` 行比 `"state"` 行至少多 2 行时,合并会继续进行。 -不过,ClickHouse 会将这种情况视为逻辑错误,并将其记录到服务器日志中。 -如果相同的数据被多次插入,就有可能出现此错误。 -因此,折叠不应改变统计结果。 -变更会被逐步折叠,最终几乎只保留每个对象的最后状态。 - -需要 `Sign` 列,是因为合并算法不能保证具有相同排序键的所有行都处于同一个结果数据部分中,甚至不在同一台物理服务器上。 -ClickHouse 使用多个线程处理 `SELECT` 查询,因此无法预测结果中行的顺序。 - -如果需要从 `CollapsingMergeTree` 表中获取完全“折叠”的数据,则需要进行聚合。 -要完成折叠,请编写带有 `GROUP BY` 子句的查询,并使用会考虑 `Sign` 值的聚合函数。 -例如,要计算数量,应使用 `sum(Sign)` 而不是 `count()`。 -要计算某个量的总和,应使用 `sum(Sign * x)` 并配合 `HAVING sum(Sign) > 0`,而不是像下面[示例](#example-of-use)中那样使用 `sum(x)`。 - -聚合函数 `count`、`sum` 和 `avg` 可以用这种方式计算。 -如果对象至少有一个未折叠的状态,则可以计算聚合函数 `uniq`。 -聚合函数 `min` 和 `max` 无法计算, -因为 `CollapsingMergeTree` 不保存已折叠状态的历史。 - -:::note -如果需要在不进行聚合的情况下提取数据 -(例如,检查其最新值满足某些条件的行是否存在), -可以在 `FROM` 子句中使用 [`FINAL`](../../../sql-reference/statements/select/from.md#final-modifier) 修饰符。它会在返回结果之前合并数据。 -对于 CollapsingMergeTree,每个键只返回最新的状态行。 -::: - - - -## 示例 - -### 使用示例 - -给出以下示例数据: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -接下来使用 `CollapsingMergeTree` 创建一张名为 `UAct` 的表: - -```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) -``` - -我们使用两个 `INSERT` 查询来创建两个不同的数据片段。 - -:::note -如果我们使用单个查询插入数据,ClickHouse 只会创建一个数据片段,并且之后不会执行任何合并操作。 -::: - -我们可以使用以下方式来查询数据: - -```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 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -让我们来看一下上面返回的数据,检查是否发生了折叠(collapsing)…… -通过两条 `INSERT` 语句,我们创建了两个数据 part。 -`SELECT` 语句在两个线程中执行,因此得到的行顺序是随机的。 -然而,折叠**并没有发生**,因为这些数据 part 尚未被合并, -而 ClickHouse 会在后台的某个未知时间点合并数据 part,这一点是无法预测的。 - -因此,我们需要进行一次聚合, -可以使用 [`sum`](/sql-reference/aggregate-functions/reference/sum) -聚合函数,并配合 [`HAVING`](/sql-reference/statements/select/having) 子句: - -```sql -SELECT - UserID, - sum(PageViews * Sign) AS PageViews, - sum(Duration * Sign) AS Duration -FROM UAct -GROUP BY UserID -HAVING sum(Sign) > 0 -``` - -```text -┌──────────────UserID─┬─页面浏览量─┬─停留时长─┐ -│ 4324182021466249494 │ 6 │ 185 │ -└─────────────────────┴───────────┴──────────┘ -``` - -如果我们不需要聚合并且想要强制折叠,还可以在 `FROM` 子句中使用 `FINAL` 修饰符。 - -```sql -SELECT * FROM UAct FINAL -``` - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -:::note -这种数据选取方式效率较低,不建议在扫描数据量很大(数百万行)时使用。 -::: - -### 另一种方法示例 - -这种方法的思路是,合并操作只考虑键字段。 -因此,在 "cancel" 行中,我们可以指定负值, -使其在不使用 `Sign` 列进行求和时抵消该行的先前版本。 - -在本示例中,我们将使用下面的示例数据: - - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ -│ 4324182021466249494 │ -5 │ -146 │ -1 │ -│ 4324182021466249494 │ 6 │ 185 │ 1 │ -└─────────────────────┴───────────┴──────────┴──────┘ -``` - -对于这种方法,需要将 `PageViews` 和 `Duration` 的数据类型更改为可以存储负值的类型。 -因此,在使用 `collapsingMergeTree` 创建表 `UAct` 时,我们将这些列的数据类型从 `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; -``` - -```text -┌──────────────UserID─┬─页面浏览次数─┬─持续时间─┬─符号─┐ -│ 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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md deleted file mode 100644 index 21830741a9d..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/custom-partitioning-key.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -description: '了解如何为 MergeTree 表添加自定义分区键。' -sidebar_label: '自定义分区键' -sidebar_position: 30 -slug: /engines/table-engines/mergetree-family/custom-partitioning-key -title: '自定义分区键' -doc_type: 'guide' ---- - - - -# 自定义分区键 - -:::note -在大多数情况下,无需使用分区键;在其他大多数情况下,除非是针对按天分区较为常见的可观测性场景,否则也不需要比“按月”更细粒度的分区键。 - -切勿使用过于细粒度的分区。不要按客户端标识符或名称对数据进行分区,而应将客户端标识符或名称设置为 ORDER BY 表达式中的第一列。 -::: - -[MergeTree 系列表](../../../engines/table-engines/mergetree-family/mergetree.md)支持分区,包括[复制表](../../../engines/table-engines/mergetree-family/replication.md)和[物化视图](/sql-reference/statements/create/view#materialized-view)。 - -分区是按指定条件在表中对记录进行的逻辑归组。可以按任意条件设置分区,例如按月、按日或按事件类型。每个分区单独存储,以简化对这部分数据的操作。访问数据时,ClickHouse 会尽可能只访问最小数量的分区。对于包含分区键的查询,分区可以提升性能,因为 ClickHouse 会在选择分区内的 part 和 granule 之前,先根据分区进行过滤。 - -在[创建表](../../../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)。 - -当向表中插入新数据时,这些数据会作为一个单独的数据部分(part),按主键排序后存储。在插入后的 10–15 分钟内,同一分区中的各个部分会被合并为一个完整的数据部分。 - -:::info -合并仅适用于分区表达式取值相同的数据部分。这意味着**不应创建过于细粒度的分区**(超过大约一千个分区)。否则,由于文件系统中文件数量和打开的文件描述符数量过多,`SELECT` 查询的性能会很差。 -::: - -使用 [system.parts](../../../operations/system-tables/parts.md) 表可以查看表的数据部分和分区。例如,假设我们有一个按月分区的 `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`。可以使用该列的值在 [ALTER ... PARTITION](../../../sql-reference/statements/alter/partition.md) 查询中指定分区名称。 - - -`name` 列包含分区数据 part 的名称。你可以在 [ALTER ATTACH PART](/sql-reference/statements/alter/partition#attach-partitionpart) 查询中使用该列来指定 part 的名称。 - -下面我们来拆解这个 part 名称:`201901_1_9_2_11`: - -* `201901` 是分区名。 -* `1` 是数据块的最小编号。 -* `9` 是数据块的最大编号。 -* `2` 是 chunk 的层级(其在 MergeTree 中形成时所处的深度)。 -* `11` 是 mutation 版本(如果该 part 发生过 mutation)。 - -:::info -旧类型的表的 part 名称格式为:`20190117_20190123_2_2_0`(最小日期 - 最大日期 - 最小块编号 - 最大块编号 - 层级)。 -::: - -`active` 列表示 part 的状态。`1` 表示活跃(active);`0` 表示非活跃(inactive)。例如,合并为更大 part 后保留下来的源 part 是非活跃的 part。损坏的数据 part 也会被标记为非活跃。 - -如示例所示,同一分区可以包含多个相互独立的 part(例如 `201901_1_3_1` 和 `201901_1_9_2`)。这表示这些 part 尚未被合并。ClickHouse 会周期性地合并已插入的数据 part,大约会在插入后 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 │ -└───────────┴──────────────────┴────────┘ -``` - -非活跃的 parts 将在合并后大约 10 分钟内被删除。 - -查看一组 parts 和 partitions 的另一种方法,是进入该表所在的目录:`/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' 等,是各个 part 的目录。每个 part 属于一个分区,并且只包含某一个月的数据(本示例中的表是按月分区的)。 - - -`detached` 目录包含通过 [DETACH](/sql-reference/statements/detach) 查询从表中分离出去的 part。损坏的 part 也会被移动到该目录,而不是直接删除。服务器不会使用 `detached` 目录中的这些 part。你可以在任何时候在该目录中添加、删除或修改数据——在你执行 [ATTACH](/sql-reference/statements/alter/partition#attach-partitionpart) 查询之前,服务器都不会察觉到这些更改。 - -请注意,在正在运行的服务器上,你不能在文件系统中手动更改 part 的集合或其数据,因为服务器不会感知到这些变更。对于非复制表,你可以在服务器停止时进行此操作,但不推荐这样做。对于复制表,在任何情况下都不能更改 part 的集合。 - -ClickHouse 允许你对分区执行操作:删除分区、在表之间复制分区,或者创建备份。所有操作的完整列表请参见 [Manipulations With Partitions and Parts](/sql-reference/statements/alter/partition) 一节。 - - - -## 使用分区键进行 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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md deleted file mode 100644 index 1dcccded6d1..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/graphitemergetree.md +++ /dev/null @@ -1,278 +0,0 @@ ---- -description: '专为对 Graphite 数据进行降采样和聚合/平均(rollup)而设计。' -sidebar_label: 'GraphiteMergeTree' -sidebar_position: 90 -slug: /engines/table-engines/mergetree-family/graphitemergetree -title: 'GraphiteMergeTree 表引擎' -doc_type: 'guide' ---- - - - -# GraphiteMergeTree 表引擎 - -该引擎用于对 [Graphite](http://graphite.readthedocs.io/en/latest/index.html) 数据进行稀疏化和聚合/平均(rollup)处理。它对希望使用 ClickHouse 作为 Graphite 数据存储的开发者非常有用。 - -如果不需要 rollup,可以使用任意 ClickHouse 表引擎来存储 Graphite 数据;但如果需要 rollup,请使用 `GraphiteMergeTree`。该引擎可以减少存储占用并提高针对 Graphite 的查询效率。 - -该引擎继承自 [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md) 的属性。 - - - -## 创建表 - -```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) 查询的详细说明。 - -用于 Graphite 数据的表应包含以下列,对应如下数据: - -* 指标名称(Graphite 指标名)。数据类型:`String`。 - -* 指标的测量时间。数据类型:`DateTime`。 - -* 指标的值。数据类型:`Float64`。 - -* 指标的版本。数据类型:任意数值类型(ClickHouse 会保留具有最高版本号的行,或者在版本号相同时保留最后写入的行。其他行会在数据分片合并时被删除)。 - -这些列的名称应在 rollup 配置中指定。 - -**GraphiteMergeTree 参数** - -* `config_section` — 配置文件中定义 rollup 规则的节名称。 - -**查询子句** - -在创建 `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 规则的节名称。 -
- - -## Rollup 配置 - -Rollup 的配置由服务器配置中的 [graphite_rollup](../../../operations/server-configuration-parameters/settings.md#graphite) 参数定义。该参数的名称可以任意。你可以创建多个配置,并将它们用于不同的表。 - -Rollup 配置结构: - -required-columns -patterns - -### 必需列 - -#### `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`。 - 当对性能没有严苛要求,或者只使用一种指标类型(例如普通指标)时,该字段不是必需的。默认情况下,只创建一套规则。否则,一旦定义了任一特殊类型,就会创建两套不同的规则:一套用于普通指标(root.branch.leaf),一套用于带标签指标(root.branch.leaf;tag1=value1)。\ - 默认规则最终会进入这两套规则中。\ - 合法取值: - * `all`(默认)- 通用规则,在省略 `rule_type` 时使用。 - * `plain` - 用于普通指标的规则。字段 `regexp` 按正则表达式处理。 - * `tagged` - 用于带标签指标的规则(在数据库中以 `someName?tag1=value1&tag2=value2&tag3=value3` 形式存储)。正则表达式中的标签必须按标签名排序,如果存在,第一个标签必须是 `__name__`。字段 `regexp` 按正则表达式处理。 - * `tag_list` - 用于带标签指标的规则,一种用于简化以 Graphite 格式描述指标的简单 DSL,例如 `someName;tag1=value1;tag2=value2`、`someName` 或 `tag1=value1;tag2=value2`。字段 `regexp` 会被转换成一个 `tagged` 规则。标签名排序不是必须的,会自动完成。标签的值(而不是名称)可以是正则表达式,例如 `env=(dev|staging)`。 -* `regexp` – 指标名称的匹配模式(正则或 DSL)。 -* `age` – 数据的最小年龄(秒)。 -* `precision` – 以秒为单位定义数据年龄的精度。应当是 86400(一天的秒数)的约数。 -* `function` – 要应用于其年龄落在 `[age, age + precision]` 区间内数据的聚合函数名称。可用函数:min / max / any / avg。平均值的计算是近似的,即“平均的平均值”。 - -### 没有规则类型的配置示例 - - -```xml - - Version - - click_cost - any - - 0 - 5 - - - 86400 - 60 - - - - max - - 0 - 60 - - - 3600 - 300 - - - 86400 - 3600 - - - -``` - -### 不同规则类型的配置示例 - -```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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md deleted file mode 100644 index 12217788d1f..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/index.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -description: 'MergeTree 引擎系列文档' -sidebar_label: 'MergeTree 引擎系列' -sidebar_position: 10 -slug: /engines/table-engines/mergetree-family/ -title: 'MergeTree 引擎系列' -doc_type: 'reference' ---- - - - -# 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)。 - -{/* 本页面的目录由以下脚本自动生成: - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - 数据来源为 YAML front matter 字段:slug、description、title。 - - 如发现错误,请直接编辑页面本身的 YML front matter。 - */ } - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | -| [MergeTree table engine](/engines/table-engines/mergetree-family/mergetree) | `MergeTree` 系列表引擎专为高数据摄取速率和海量数据量而设计。 | -| [Replicated* table engines](/engines/table-engines/mergetree-family/replication) | 介绍 ClickHouse 中 Replicated* 系列表引擎的数据复制机制概览。 | -| [Custom Partitioning Key](/engines/table-engines/mergetree-family/custom-partitioning-key) | 了解如何为 MergeTree 表添加自定义分区键。 | -| [ReplacingMergeTree table engine](/engines/table-engines/mergetree-family/replacingmergetree) | 与 MergeTree 的区别在于,它会删除具有相同排序键值(`ORDER BY` 表子句,而非 `PRIMARY KEY`)的重复记录。 | -| [CoalescingMergeTree table engine](/engines/table-engines/mergetree-family/coalescingmergetree) | CoalescingMergeTree 继承自 MergeTree 引擎。其核心特性是在数据分片合并期间,能够自动存储每一列的最新非空值。 | -| [SummingMergeTree table engine](/engines/table-engines/mergetree-family/summingmergetree) | SummingMergeTree 继承自 MergeTree 引擎。其核心特性是在数据分片合并期间,能够自动对数值数据求和。 | -| [AggregatingMergeTree table engine](/engines/table-engines/mergetree-family/aggregatingmergetree) | 将所有具有相同主键(更准确地说,是相同[排序键](../../../engines/table-engines/mergetree-family/mergetree.md))的行,替换为单行(在同一数据分片内),该行存储聚合函数状态的组合结果。 | -| [CollapsingMergeTree table engine](/engines/table-engines/mergetree-family/collapsingmergetree) | 继承自 MergeTree,但在合并过程中增加了折叠行的逻辑。 | -| [VersionedCollapsingMergeTree table engine](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) | 适用于对持续变化的对象状态进行快速写入,并在后台删除旧的对象状态。 | -| [GraphiteMergeTree table engine](/engines/table-engines/mergetree-family/graphitemergetree) | 专为对 Graphite 数据进行抽稀和聚合/平均(rollup)而设计。 | -| [Exact and Approximate Vector Search](/engines/table-engines/mergetree-family/annindexes) | 精确和近似向量搜索的文档。 | -| [Full-text Search using Text Indexes](/engines/table-engines/mergetree-family/invertedindexes) | 在文本中快速查找搜索词。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md deleted file mode 100644 index 32b7e5db450..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/invertedindexes.md +++ /dev/null @@ -1,816 +0,0 @@ ---- -description: '快速在文本中查找搜索词。' -keywords: ['全文搜索', '文本索引', '索引', '索引'] -sidebar_label: '使用文本索引实现全文搜索' -slug: /engines/table-engines/mergetree-family/invertedindexes -title: '使用文本索引实现全文搜索' -doc_type: 'reference' ---- - -import PrivatePreviewBadge from '@theme/badges/PrivatePreviewBadge'; - - -# 使用文本索引进行全文搜索 - - - -ClickHouse 中的文本索引(也称为["倒排索引"](https://en.wikipedia.org/wiki/Inverted_index))为字符串数据提供快速的全文检索能力。 -索引会将列中的每个标记(token)映射到包含该标记的行。 -这些标记由称为分词(tokenization)的过程生成。 -例如,ClickHouse 默认会将英文句子 "All cat like mice." 分词为 ["All", "cat", "like", "mice"](注意末尾的句点会被忽略)。 -还可以使用更高级的分词器,例如针对日志数据的分词器。 - - - -## 创建文本索引 - -要创建文本索引,首先启用相应的实验性设置: - -```sql -SET allow_experimental_full_text_index = true; -``` - -可以使用以下语法在 [String](/sql-reference/data-types/string.md)、[FixedString](/sql-reference/data-types/fixedstring.md)、[Array(String)](/sql-reference/data-types/array.md)、[Array(FixedString)](/sql-reference/data-types/array.md) 以及 [Map](/sql-reference/data-types/map.md) 列(通过 [mapKeys](/sql-reference/functions/tuple-map-functions.md/#mapkeys) 和 [mapValues](/sql-reference/functions/tuple-map-functions.md/#mapvalues) 映射函数)上定义文本索引: - -```sql -CREATE TABLE tab -( - `key` UInt64, - `str` String, - INDEX text_idx(str) TYPE text( - -- 必需参数: - tokenizer = splitByNonAlpha - | splitByString[(S)] - | ngrams[(N)] - | sparseGrams[(min_length[, max_length[, min_cutoff_length]])] - | array - -- 可选参数: - [, preprocessor = expression(str)] - -- 可选高级参数: - [, dictionary_block_size = D] - [, dictionary_block_frontcoding_compression = B] - [, max_cardinality_for_embedded_postings = M] - [, bloom_filter_false_positive_rate = R] - ) [GRANULARITY 64] -) -ENGINE = MergeTree -ORDER BY key -``` - -**分词器参数(必需)**。`tokenizer` 参数用于指定分词器: - -* `splitByNonAlpha` 按非字母数字的 ASCII 字符拆分字符串(另见函数 [splitByNonAlpha](/sql-reference/functions/splitting-merging-functions.md/#splitByNonAlpha))。 -* `splitByString(S)` 按用户自定义的分隔字符串 `S` 拆分字符串(另见函数 [splitByString](/sql-reference/functions/splitting-merging-functions.md/#splitByString))。 - 可以通过可选参数指定分隔符,例如:`tokenizer = splitByString([', ', '; ', '\n', '\\'])`。 - 注意,每个分隔字符串可以由多个字符组成(如示例中的 `', '`)。 - 如果未显式指定(例如 `tokenizer = splitByString`),默认的分隔符列表是单个空格 `[' ']`。 -* `ngrams(N)` 将字符串拆分为等长的 `N`-gram(另见函数 [ngrams](/sql-reference/functions/splitting-merging-functions.md/#ngrams))。 - N-gram 的长度可以通过 2 到 8 之间的可选整数参数指定,例如:`tokenizer = ngrams(3)`。 - 如果未显式指定(例如 `tokenizer = ngrams`),默认的 N-gram 大小为 3。 -* `sparseGrams(min_length, max_length, min_cutoff_length)` 将字符串拆分为长度在 `min_length` 到 `max_length`(含)之间的可变长度 N-gram(另见函数 [sparseGrams](/sql-reference/functions/string-functions#sparseGrams))。 - 如果未显式指定,`min_length` 和 `max_length` 的默认值分别为 3 和 100。 - 如果提供参数 `min_cutoff_length`,则索引中仅存储长度大于等于 `min_cutoff_length` 的 N-gram。 - 与 `ngrams(N)` 相比,`sparseGrams` 分词器会生成可变长度的 N-gram,从而对原始文本提供更灵活的表示。 - 例如,`tokenizer = sparseGrams(3, 5, 4)` 在内部会从输入字符串生成长度为 3、4、5 的 N-gram,但索引中仅存储长度为 4 和 5 的 N-gram。 -* `array` 不执行任何分词,即每一行的取值本身就是一个词元(另见函数 [array](/sql-reference/functions/array-functions.md/#array))。 - -:::note -`splitByString` 分词器会按从左到右的顺序应用分隔符。 -这可能会产生歧义。 -例如,分隔字符串 `['%21', '%']` 会将 `%21abc` 分词为 `['abc']`,而将分隔字符串顺序交换为 `['%', '%21']` 时,会输出 `['21abc']`。 -在大多数情况下,应当优先匹配更长的分隔符。 -通常可以通过按分隔字符串长度递减的顺序传入来实现这一点。 -如果分隔字符串碰巧构成一个[前缀码](https://en.wikipedia.org/wiki/Prefix_code),则可以以任意顺序传入。 -::: - - -:::warning -目前不建议在非西方语言文本(例如中文)上构建文本索引。 -当前支持的分词器可能导致索引体积过大和查询时间过长。 -我们计划在未来添加专门的语言特定分词器,以更好地处理这些情况。 -::: - -要测试分词器如何拆分输入字符串,可以使用 ClickHouse 的 [tokens](/sql-reference/functions/splitting-merging-functions.md/#tokens) 函数: - -示例: - -```sql -SELECT tokens('abc def', 'ngrams', 3); -``` - -结果: - -```result -['abc','bc ','c d',' de','def'] -``` - -**预处理器参数(可选)**。`preprocessor` 参数是在分词之前应用于输入字符串的表达式。 - -预处理器参数的典型用例包括 - -1. 转换为小写或大写以启用不区分大小写的匹配,例如 [lower](/sql-reference/functions/string-functions.md/#lower)、[lowerUTF8](/sql-reference/functions/string-functions.md/#lowerUTF8),请参见下面的第一个示例。 -2. UTF-8 规范化,例如 [normalizeUTF8NFC](/sql-reference/functions/string-functions.md/#normalizeUTF8NFC)、[normalizeUTF8NFD](/sql-reference/functions/string-functions.md/#normalizeUTF8NFD)、[normalizeUTF8NFKC](/sql-reference/functions/string-functions.md/#normalizeUTF8NFKC)、[normalizeUTF8NFKD](/sql-reference/functions/string-functions.md/#normalizeUTF8NFKD)、[toValidUTF8](/sql-reference/functions/string-functions.md/#toValidUTF8)。 -3. 删除或转换不需要的字符或子字符串,例如 [extractTextFromHTML](/sql-reference/functions/string-functions.md/#extractTextFromHTML)、[substring](/sql-reference/functions/string-functions.md/#substring)、[idnaEncode](/sql-reference/functions/string-functions.md/#idnaEncode)。 - -预处理器表达式必须将 [String](/sql-reference/data-types/string.md) 或 [FixedString](/sql-reference/data-types/fixedstring.md) 类型的输入值转换为相同类型的值。 - -示例: - -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(col))` -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = substringIndex(col, '\n', 1))` -- `INDEX idx(col) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(extractTextFromHTML(col))` - -此外,预处理器表达式只能引用定义文本索引的列。 -不允许使用非确定性函数。 - -函数 [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken)、[hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) 和 [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) 使用预处理器在分词之前首先转换搜索词。 - -例如, - -```sql -CREATE TABLE tab -( - key UInt64, - str String, - INDEX idx(str) TYPE text(tokenizer = 'splitByNonAlpha', preprocessor = lower(str)) -) -ENGINE = MergeTree -ORDER BY tuple(); - -SELECT count() FROM tab WHERE hasToken(str, 'Foo'); -``` - -等价于: - -```sql -CREATE TABLE tab -( - key UInt64, - str String, - INDEX idx(lower(str)) TYPE text(tokenizer = 'splitByNonAlpha') -) -ENGINE = MergeTree -ORDER BY tuple(); - -SELECT count() FROM tab WHERE hasToken(str, lower('Foo')); -``` - -**其他参数(可选)**。ClickHouse 中的文本索引实现为[二级索引](/engines/table-engines/mergetree-family/mergetree.md/#skip-index-types)。 -但是,与其他跳数索引不同,文本索引的默认索引粒度(GRANULARITY)为 64。 -该值是根据经验选择的,对于大多数用例,它在速度和索引大小之间提供了良好的平衡。 -高级用户可以指定不同的索引粒度(我们不建议这样做)。 - -
- -可选高级参数 - -以下高级参数的默认值几乎在所有情况下都能很好地工作。 -我们不建议更改它们。 - -可选参数 `dictionary_block_size`(默认值:128)指定字典块的行数大小。 - -可选参数 `dictionary_block_frontcoding_compression`(默认值:1)指定字典块是否使用前缀编码作为压缩方式。 - -可选参数 `max_cardinality_for_embedded_postings`(默认值:16)指定基数阈值,低于该阈值时倒排列表应嵌入到字典块中。 - - -可选参数 `bloom_filter_false_positive_rate`(默认值:0.1)用于指定字典布隆过滤器的误报率。 - -
- -表创建后,可以对列添加或删除文本索引: - -```sql -ALTER TABLE tab DROP INDEX text_idx; -ALTER TABLE tab ADD INDEX text_idx(s) TYPE text(tokenizer = splitByNonAlpha); -``` - - -## 使用文本索引 - -在 SELECT 查询中使用文本索引非常简单,常见的字符串搜索函数会自动使用该索引。 -如果不存在索引,下面这些字符串搜索函数将会回退到较慢的暴力扫描。 - -### 支持的函数 - -当在 SELECT 查询的 `WHERE` 子句中使用文本函数时,即可使用文本索引: - -```sql -SELECT [...] -FROM [...] -WHERE string_search_function(column_with_text_index) -``` - -#### `=` 和 `!=` - -`=`([`equals`](/sql-reference/functions/comparison-functions.md/#equals))和 `!=`([`notEquals`](/sql-reference/functions/comparison-functions.md/#notEquals))会匹配给定搜索词的整体。 - -示例: - -```sql -SELECT * from tab WHERE str = 'Hello'; -``` - -文本索引支持 `=` 和 `!=` 运算,但只有在使用 `array` 分词器时,等值和不等值搜索才有意义(它会使索引存储整行的值)。 - -#### `IN` 和 `NOT IN` - -`IN`([in](/sql-reference/functions/in-functions))和 `NOT IN`([notIn](/sql-reference/functions/in-functions))类似于函数 `equals` 和 `notEquals`,但它们分别要求匹配所有搜索词(`IN`)或完全与所有搜索词都不匹配(`NOT IN`)。 - -示例: - -```sql -SELECT * from tab WHERE str IN ('Hello', 'World'); -``` - -适用与 `=` 和 `!=` 相同的限制,也就是说,只有在配合 `array` tokenizer 使用时,`IN` 和 `NOT IN` 才有意义。 - -#### `LIKE`、`NOT LIKE` 和 `match` - -:::note -这些函数目前仅在索引 tokenizer 为 `splitByNonAlpha` 或 `ngrams` 时才会使用文本索引进行过滤。 -::: - -要在文本索引中使用 `LIKE`([like](/sql-reference/functions/string-search-functions.md/#like))、`NOT LIKE`([notLike](/sql-reference/functions/string-search-functions.md/#notLike))以及 [match](/sql-reference/functions/string-search-functions.md/#match) 函数,ClickHouse 必须能够从搜索词中提取完整的 token。 - -示例: - -```sql -SELECT count() FROM tab WHERE comment LIKE 'support%'; -``` - -示例中的 `support` 可以匹配 `support`、`supports`、`supporting` 等。 -这类查询属于子串查询,无法利用文本索引加速。 - -要在 LIKE 查询中使用文本索引,必须按如下方式改写 LIKE 模式: - -```sql -SELECT count() FROM tab WHERE comment LIKE ' support %'; -- 或者 `% support %` -``` - -`support` 左右的空格确保该术语可以被提取为一个 token。 - -#### `startsWith` 和 `endsWith` - -与 `LIKE` 类似,[startsWith](/sql-reference/functions/string-functions.md/#startsWith) 和 [endsWith](/sql-reference/functions/string-functions.md/#endsWith) 函数只有在能从搜索词中提取出完整的 token 时,才能使用文本索引。 - -示例: - -```sql -SELECT count() FROM tab WHERE startsWith(comment, 'ClickHouse 支持'); -``` - -在这个示例中,只有 `clickhouse` 被视为一个词元(token)。 -`support` 不是词元,因为它可以匹配 `support`、`supports`、`supporting` 等。 - -要查找所有以 `clickhouse supports` 开头的行,请在搜索模式的末尾保留一个空格: - -```sql -startsWith(comment, 'clickhouse supports ')` -``` - -同样地,`endsWith` 也应当在前面加上一个空格再使用: - -```sql -SELECT count() FROM tab WHERE endsWith(comment, ' olap 引擎'); -``` - -#### `hasToken` 和 `hasTokenOrNull` - -函数 [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken) 和 [hasTokenOrNull](/sql-reference/functions/string-search-functions.md/#hasTokenOrNull) 用于匹配单个指定的 token。 - -与前面提到的函数不同,它们不会对搜索项进行分词(假定输入本身就是单个 token)。 - -示例: - -```sql -SELECT count() FROM tab WHERE hasToken(comment, 'clickhouse'); -``` - -函数 `hasToken` 和 `hasTokenOrNull` 是在与 `text` 索引配合使用时性能最优的函数。 - -#### `hasAnyTokens` 和 `hasAllTokens` - - -函数 [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) 和 [hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) 分别用于匹配给定 token 中的任意一个或全部。 - -这两个函数接受的搜索 token 可以是一个字符串(将使用与索引列相同的 tokenizer 进行分词),也可以是一个已处理好的 token 数组(在搜索前不会再进行分词)。\ -有关更多信息,请参阅函数文档。 - -示例: - -```sql --- 以字符串参数形式传递搜索词元 -SELECT count() FROM tab WHERE hasAnyTokens(comment, 'clickhouse olap'); -SELECT count() FROM tab WHERE hasAllTokens(comment, 'clickhouse olap'); - --- 以 Array(String) 形式传递搜索词元 -SELECT count() FROM tab WHERE hasAnyTokens(comment, ['clickhouse', 'olap']); -SELECT count() FROM tab WHERE hasAllTokens(comment, ['clickhouse', 'olap']); -``` - -#### `has` - -数组函数 [has](/sql-reference/functions/array-functions#has) 用于判断字符串数组中是否包含某个单独的元素。 - -示例: - -```sql -SELECT count() FROM tab WHERE has(array, 'clickhouse'); -``` - -#### `mapContains` - -函数 [mapContains](/sql-reference/functions/tuple-map-functions#mapcontains)(`mapContainsKey` 的别名)用于在 map 的键中匹配单个 token。 - -示例: - -```sql -SELECT count() FROM tab WHERE mapContainsKey(map, 'clickhouse'); --- OR -SELECT count() FROM tab WHERE mapContains(map, 'clickhouse'); -``` - -#### `operator[]` - -可以将访问运算符 [operator[]](/sql-reference/operators#access-operators) 与文本索引配合使用,以过滤键和值。 - -示例: - -```sql -SELECT count() FROM tab WHERE map['engine'] = 'clickhouse'; -``` - -请参阅以下示例,了解如何配合文本索引使用 `Array(T)` 和 `Map(K, V)` 类型的列。 - -### 带有文本索引的 `Array` 和 `Map` 列示例 - -#### 为 Array(String) 列建立索引 - -想象一个博客平台,作者会使用关键词为他们的博文打标签并进行分类。 -我们希望用户能够通过搜索或点击主题来发现相关内容。 - -考虑如下数据表定义: - -```sql -CREATE TABLE posts ( - post_id UInt64, - title String, - content String, - keywords Array(String) -) -ENGINE = MergeTree -ORDER BY (post_id); -``` - -在没有文本索引的情况下,要查找包含特定关键字(例如 `clickhouse`)的帖子,就需要扫描所有条目: - -```sql -SELECT count() FROM posts WHERE has(keywords, 'clickhouse'); -- 全表扫描速度慢 - 检查每条记录中的所有关键词 -``` - -随着平台规模的扩大,这种查询会变得越来越慢,因为必须检查每一行中的 `keywords` 数组。 -为解决这一性能问题,我们在 `keywords` 列上定义一个文本索引: - -```sql -ALTER TABLE posts ADD INDEX keywords_idx(keywords) TYPE text(tokenizer = splitByNonAlpha); -ALTER TABLE posts MATERIALIZE INDEX keywords_idx; -- 务必为现有数据重建索引 -``` - -#### 为 Map 列建立索引 - -在许多可观测性场景中,日志消息会被拆分为「组件」,并按合适的数据类型存储,例如时间戳使用 DateTime 类型、日志级别使用 Enum 类型等。 -指标字段最好以键值对的形式存储。 -运维团队需要高效地搜索日志,以用于调试、安全事件排查和监控。 - -请看如下日志表: - -```sql -CREATE TABLE logs ( - id UInt64, - timestamp DateTime, - message String, - attributes Map(String, String) -) -ENGINE = MergeTree -ORDER BY (timestamp); -``` - -若没有文本索引,搜索 [Map](/sql-reference/data-types/map.md) 数据时需要进行全表扫描: - -```sql --- 查找所有包含速率限制数据的日志: -SELECT count() FROM logs WHERE has(mapKeys(attributes), 'rate_limit'); -- 全表扫描,性能较慢 - --- 查找来自特定 IP 的所有日志: -SELECT count() FROM logs WHERE has(mapValues(attributes), '192.168.1.1'); -- 全表扫描,性能较慢 -``` - -随着日志量增长,这些查询会变慢。 - -解决方案是为 [Map](/sql-reference/data-types/map.md) 的键和值创建文本索引。 -当需要按字段名或属性类型检索日志时,可以使用 [mapKeys](/sql-reference/functions/tuple-map-functions.md/#mapkeys) 创建文本索引: - - -```sql -ALTER TABLE logs ADD INDEX attributes_keys_idx mapKeys(attributes) TYPE text(tokenizer = array); -ALTER TABLE posts MATERIALIZE INDEX attributes_keys_idx; -``` - -当你需要在属性值的内容中进行搜索时,使用 [mapValues](/sql-reference/functions/tuple-map-functions.md/#mapvalues) 来创建文本索引: - -```sql -ALTER TABLE logs ADD INDEX attributes_vals_idx mapValues(attributes) TYPE text(tokenizer = array); -ALTER TABLE posts MATERIALIZE INDEX attributes_vals_idx; -``` - -查询示例: - -```sql --- 查找所有受速率限制的请求: -SELECT * FROM logs WHERE mapContainsKey(attributes, 'rate_limit'); -- 快速 - --- 查找来自特定 IP 的所有日志: -SELECT * FROM logs WHERE has(mapValues(attributes), '192.168.1.1'); -- 快速 -``` - - -## 性能调优 - -### 直接读取 - -某些类型的文本查询可以通过一种称为“直接读取”(direct read)的优化显著提速。 -更具体地说,当 SELECT 查询中 *没有* 从文本列进行投影时,可以应用此优化。 - -示例: - -```sql -SELECT column_a, column_b, ... -- 注意:不要选择 column_with_text_index -FROM [...] -WHERE string_search_function(column_with_text_index) -``` - -ClickHouse 中的直接读取(direct read)优化仅使用文本索引(即通过文本索引查找)来回答查询,而无需访问底层文本列。 -文本索引查找读取的数据量相对较少,因此比 ClickHouse 中通常的 skip 索引(skip index)要快得多(后者会先进行 skip 索引查找,然后再加载并过滤存活的数据粒度(granule))。 - -直接读取由两个设置控制: - -* 设置 [query_plan_direct_read_from_text_index](../../../operations/settings/settings#query_plan_direct_read_from_text_index),用于指定是否启用直接读取。 -* 设置 [use_skip_indexes_on_data_read](../../../operations/settings/settings#use_skip_indexes_on_data_read),这是启用直接读取的另一个前提条件。注意,在 ClickHouse 数据库上如果 [compatibility](../../../operations/settings/settings#compatibility) < 25.10,则 `use_skip_indexes_on_data_read` 被禁用,因此你要么需要提升 `compatibility` 设置的值,要么显式执行 `SET use_skip_indexes_on_data_read = 1`。 - -此外,要使用直接读取,文本索引必须已完全物化(为此可使用 `ALTER TABLE ... MATERIALIZE INDEX`)。 - -**支持的函数** -直接读取优化支持函数 `hasToken`、`hasAllTokens` 和 `hasAnyTokens`。 -这些函数也可以通过 AND、OR 和 NOT 运算符组合使用。 -WHERE 子句还可以包含额外的非文本搜索函数过滤条件(针对文本列或其他列)——在这种情况下,仍会使用直接读取优化,但效果会较差一些(它只应用于受支持的文本搜索函数)。 - -要判断查询是否使用了直接读取,请使用 `EXPLAIN PLAN actions = 1` 来运行该查询。 -例如,一个禁用直接读取的查询如下所示: - -```sql -EXPLAIN PLAN actions = 1 -SELECT count() -FROM tab -WHERE hasToken(col, 'some_token') -SETTINGS query_plan_direct_read_from_text_index = 0, -- disable direct read - use_skip_indexes_on_data_read = 1; -``` - -返回值 - -```text -[...] -Filter ((WHERE + 将列名替换为列标识符)) -过滤条件列: hasToken(__table1.col, 'some_token'_String) (已移除) -操作: INPUT : 0 -> col String : 0 - COLUMN Const(String) -> 'some_token'_String String : 1 - FUNCTION hasToken(col :: 0, 'some_token'_String :: 1) -> hasToken(__table1.col, 'some_token'_String) UInt8 : 2 -[...] -``` - -而当在将 `query_plan_direct_read_from_text_index` 设置为 `1` 的情况下运行相同的查询时 - -```sql -EXPLAIN PLAN actions = 1 -SELECT count() -FROM tab -WHERE hasToken(col, 'some_token') -SETTINGS query_plan_direct_read_from_text_index = 1, -- 启用直接读取 - use_skip_indexes_on_data_read = 1; -``` - -返回值 - -```text -[...] -Expression (Before GROUP BY) -Positions: - Filter - Filter column: __text_index_idx_hasToken_94cc2a813036b453d84b6fb344a63ad3 (removed) - Actions: INPUT :: 0 -> __text_index_idx_hasToken_94cc2a813036b453d84b6fb344a63ad3 UInt8 : 0 -[...] -``` - -EXPLAIN PLAN 的第二个输出结果中包含一个虚拟列 `__text_index___`。 -如果存在该列,则会使用直接读取。 - -### 缓存 - -可以使用不同的缓存将文本索引的部分内容缓存在内存中(参见[实现细节](#implementation)部分): -目前,对文本索引的反序列化字典块、头信息和倒排列表都提供了缓存,以减少 I/O。 -可以通过以下设置启用这些缓存:[use_text_index_dictionary_cache](/operations/settings/settings#use_text_index_dictionary_cache)、[use_text_index_header_cache](/operations/settings/settings#use_text_index_header_cache) 和 [use_text_index_postings_cache](/operations/settings/settings#use_text_index_postings_cache)。 -默认情况下,所有缓存均为禁用状态。 - -有关配置这些缓存,请参阅以下服务器设置。 - -#### 字典块缓存设置 - - -| Setting | Description | -|----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------| -| [text_index_dictionary_block_cache_policy](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_policy) | 文本索引字典块缓存策略名称。 | -| [text_index_dictionary_block_cache_size](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_size) | 最大缓存大小(字节)。 | -| [text_index_dictionary_block_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_max_entries) | 缓存中反序列化字典块的最大数量。 | -| [text_index_dictionary_block_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_dictionary_block_cache_size_ratio) | 文本索引字典块缓存中受保护队列大小占缓存总大小的比例。 | - -#### Header cache settings {#caching-header} - -| Setting | Description | -|--------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------| -| [text_index_header_cache_policy](/operations/server-configuration-parameters/settings#text_index_header_cache_policy) | 文本索引头部缓存策略名称。 | -| [text_index_header_cache_size](/operations/server-configuration-parameters/settings#text_index_header_cache_size) | 最大缓存大小(字节)。 | -| [text_index_header_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_header_cache_max_entries) | 缓存中反序列化头部的最大数量。 | -| [text_index_header_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_header_cache_size_ratio) | 文本索引头部缓存中受保护队列大小占缓存总大小的比例。 | - -#### Posting lists cache settings {#caching-posting-lists} - -| Setting | Description | -|---------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------| -| [text_index_postings_cache_policy](/operations/server-configuration-parameters/settings#text_index_postings_cache_policy) | 文本索引倒排列表缓存策略名称。 | -| [text_index_postings_cache_size](/operations/server-configuration-parameters/settings#text_index_postings_cache_size) | 最大缓存大小(字节)。 | -| [text_index_postings_cache_max_entries](/operations/server-configuration-parameters/settings#text_index_postings_cache_max_entries) | 缓存中反序列化倒排列表项的最大数量。 | -| [text_index_postings_cache_size_ratio](/operations/server-configuration-parameters/settings#text_index_postings_cache_size_ratio) | 文本索引倒排列表缓存中受保护队列大小占缓存总大小的比例。 | - - - -## 实现细节 {#implementation} - -每个文本索引由两个(抽象)数据结构组成: -- 一个将每个 token 映射到倒排列表(postings list)的字典,和 -- 一组倒排列表,每个倒排列表表示一组行号。 - -由于文本索引是一种跳跃索引(skip index),这些数据结构在逻辑上是按索引粒度(index granule)划分的。 - -在创建索引时,会创建三个文件(每个 part 一个): - -**字典块文件 (.dct)** - -索引粒度中的 token 会被排序,并以每 128 个 token 为一组存储在字典块中(块大小可通过参数 `dictionary_block_size` 配置)。 -字典块文件 (.dct) 由某个 part 中所有索引粒度的全部字典块组成。 - -**索引粒度文件 (.idx)** - -索引粒度文件中,对于每个字典块,存储该块的第一个 token、它在字典块文件中的相对偏移量,以及该块中所有 token 的 Bloom 过滤器。 -这种稀疏索引结构类似于 ClickHouse 的 [稀疏主键索引](https://clickhouse.com/docs/guides/best-practices/sparse-primary-indexes)。 -Bloom 过滤器可以在待查询的 token 不包含在某个字典块中时提前跳过该字典块。 - -**倒排列表文件 (.pst)** - -所有 token 的倒排列表顺序存储在倒排列表文件中。 -为了节省空间,同时仍然支持快速的交集与并集操作,倒排列表被存储为 [roaring bitmaps](https://roaringbitmap.org/)。 -如果某个倒排列表的基数小于 16(可通过参数 `max_cardinality_for_embedded_postings` 配置),则会将其内嵌到字典中。 - - - -## 示例:Hacker News 数据集 - -来看一下在包含大量文本的大型数据集上,使用文本索引带来的性能提升。 -我们将使用来自热门网站 Hacker News 的 2870 万行评论数据。 -下面是未使用文本索引的表: - -```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); -``` - -这 2870 万行数据存储在 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'); -``` - -我们将使用 `ALTER TABLE` 在 comment 列上添加文本索引,然后对其进行物化: - -```sql --- 添加索引 -ALTER TABLE hackernews ADD INDEX comment_idx(comment) TYPE text(tokenizer = splitByNonAlpha); - --- 物化现有数据的索引 -ALTER TABLE hackernews MATERIALIZE INDEX comment_idx SETTINGS mutations_sync = 2; -``` - -现在,让我们使用 `hasToken`、`hasAnyTokens` 和 `hasAllTokens` 函数来运行查询。 -下面的示例将展示标准索引扫描与直接读取优化之间显著的性能差异。 - -### 1. 使用 `hasToken` - -`hasToken` 会检查文本是否包含某个特定的单一 token。 -我们将搜索区分大小写的 token 'ClickHouse'。 - -**禁用直接读取(标准扫描)** -默认情况下,ClickHouse 使用跳过索引(skip index)来过滤 granule,然后读取这些 granule 的列数据。 -我们可以通过禁用直接读取来模拟这种行为。 - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 516 │ -└─────────┘ - -1 行结果。用时:0.362 秒。已处理 2490 万行,9.51 GB -``` - -**已启用直接读取(快速索引读取)** -现在我们在启用直接读取(默认行为)的情况下运行同一个查询。 - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 516 │ -└─────────┘ - -1 行结果。耗时:0.008 秒。已处理 315 万行,3.15 MB -``` - -直接读取的查询速度快了超过 45 倍(0.362s 对比 0.008s),并且仅通过从索引中读取就处理了显著更少的数据量(9.51 GB 对比 3.15 MB)。 - -### 2. 使用 `hasAnyTokens` - -`hasAnyTokens` 会检查文本是否包含至少一个给定的 token。 -我们将搜索包含 “love” 或 “ClickHouse” 的评论。 - -**禁用直接读取(标准扫描)** - -```sql -SELECT count() -FROM hackernews -WHERE hasAnyTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 408426 │ -└─────────┘ - -返回 1 行。用时:1.329 秒。已处理 2874 万行,9.72 GB -``` - -**已启用直接读取(快速索引读取)** - -```sql -SELECT count() -FROM hackernews -WHERE hasAnyTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 408426 │ -└─────────┘ -``` - - -1 行结果。耗时 0.015 秒。已处理 27.99 百万行数据,27.99 MB - -```` -对于这种常见的"OR"搜索,性能提升更为显著。 -通过避免全列扫描,查询速度提升了近89倍(从1.329秒降至0.015秒)。 - -### 3. 使用 `hasAllTokens` - -`hasAllTokens` 用于检查文本是否包含所有给定的词元。 -我们将搜索同时包含 'love' 和 'ClickHouse' 的评论。 - -**禁用直接读取(标准扫描)** -即使禁用直接读取,标准跳数索引仍然有效。 -它将2870万行过滤至仅14.746万行,但仍需从列中读取57.03 MB数据。 - -```sql -SELECT count() -FROM hackernews -WHERE hasAllTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 11 │ -└─────────┘ - -返回1行。耗时:0.184秒。已处理14.746万行,57.03 MB -```` - -**已启用直接读取(快速索引读取)** -直接读取仅在索引数据上执行以响应查询,仅读取 147.46 KB。 - -```sql -SELECT count() -FROM hackernews -WHERE hasAllTokens(comment, 'love ClickHouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 11 │ -└─────────┘ - -返回 1 行。用时:0.007 秒。已处理 147.46 千行,147.46 KB -``` - -对于这个“AND”搜索,直接读取优化相比标准的跳过索引(skip index)扫描快超过 26 倍(0.184 秒 vs 0.007 秒)。 - -### 4. 复合搜索:OR、AND、NOT,… - -直接读取优化同样适用于复合布尔表达式。 -在这里,我们将执行一次不区分大小写的搜索:'ClickHouse' OR 'clickhouse'。 - -**已禁用直接读取(标准扫描)** - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') OR hasToken(comment, 'clickhouse') -SETTINGS query_plan_direct_read_from_text_index = 0, use_skip_indexes_on_data_read = 0; - -┌─count()─┐ -│ 769 │ -└─────────┘ - -返回 1 行。用时:0.450 秒。已处理 2587 万行,9.58 GB -``` - -**直接读取功能已启用(快速索引读取)** - -```sql -SELECT count() -FROM hackernews -WHERE hasToken(comment, 'ClickHouse') OR hasToken(comment, 'clickhouse') -SETTINGS query_plan_direct_read_from_text_index = 1, use_skip_indexes_on_data_read = 1; - -┌─count()─┐ -│ 769 │ -└─────────┘ - -1 row in set. Elapsed: 0.013 sec. Processed 25.87 million rows, 51.73 MB -``` - -通过结合索引查询结果,直接读取的查询速度快了 34 倍(0.450s 对比 0.013s),并且避免读取 9.58 GB 的列数据。 -在这个特定场景下,`hasAnyTokens(comment, ['ClickHouse', 'clickhouse'])` 是首选且更高效的写法。 - - -## 相关内容 {#related-content} - -- 博客:[在 ClickHouse 中引入倒排索引](https://clickhouse.com/blog/clickhouse-search-with-inverted-indices) -- 博客:[ClickHouse 全文搜索内部解析:快速、原生、列式](https://clickhouse.com/blog/clickhouse-full-text-search) -- 视频:[全文索引:设计与实验](https://www.youtube.com/watch?v=O_MnyUkrIq8) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md deleted file mode 100644 index ab6e4bb2f86..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/mergetree.md +++ /dev/null @@ -1,1191 +0,0 @@ ---- -description: '`MergeTree` 系列表引擎专为高写入速率和海量数据规模而设计。' -sidebar_label: 'MergeTree' -sidebar_position: 11 -slug: /engines/table-engines/mergetree-family/mergetree -title: 'MergeTree 表引擎' -doc_type: 'reference' ---- - -import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; -import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; - - -# MergeTree 表引擎 - -`MergeTree` 引擎以及 `MergeTree` 系列表引擎(例如 `ReplacingMergeTree`、`AggregatingMergeTree`)是 ClickHouse 中最常用、最健壮的表引擎。 - -`MergeTree` 系列表引擎专为高数据写入速率和海量数据规模而设计。 -插入操作会创建表数据部分(parts),这些数据部分会由后台进程与其他数据部分进行合并。 - -`MergeTree` 系列表引擎的主要特性如下: - -- 表的主键决定每个数据部分内部的排序顺序(聚簇索引)。主键同样不是引用单独的行,而是引用由 8192 行组成的数据块,这些数据块称为粒度(granule)。这样可以使海量数据集的主键足够小,从而始终保留在内存中,同时仍然能够快速访问磁盘上的数据。 - -- 表可以使用任意分区表达式进行分区。当查询条件允许时,分区裁剪会确保在读取时跳过无关分区。 - -- 数据可以在多个集群节点之间进行复制,以实现高可用、故障切换和零停机升级。参见 [数据复制](/engines/table-engines/mergetree-family/replication.md)。 - -- `MergeTree` 表引擎支持多种统计信息和采样方法,以帮助进行查询优化。 - -:::note -尽管名称相似,[Merge](/engines/table-engines/special/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](/sql-reference/statements/create/table.md) 语句。 - -### 查询子句 {#mergetree-query-clauses} - -#### ENGINE {#engine} - -`ENGINE` — 引擎的名称和参数。`ENGINE = MergeTree()`。`MergeTree` 引擎没有参数。 - -#### ORDER BY {#order_by} - -`ORDER BY` — 排序键。 - -由列名或任意表达式组成的元组。示例:`ORDER BY (CounterID + 1, EventDate)`。 - -如果未定义主键(即未指定 `PRIMARY KEY`),ClickHouse 将使用排序键作为主键。 - -如果不需要排序,可以使用语法 `ORDER BY tuple()`。 -或者,如果启用了设置 `create_table_empty_primary_key_by_default`,则会隐式地将 `ORDER BY ()` 添加到 `CREATE TABLE` 语句中。请参阅[选择主键](#selecting-a-primary-key)。 - -#### PARTITION BY {#partition-by} - -`PARTITION BY` — [分区键](/engines/table-engines/mergetree-family/custom-partitioning-key.md)。可选。在大多数情况下,您不需要分区键,即使需要分区,通常也不需要比按月更细粒度的分区键。分区不会加速查询(与 ORDER BY 表达式相反)。您不应使用过于细粒度的分区。不要按客户端标识符或名称对数据进行分区(而应将客户端标识符或名称作为 ORDER BY 表达式中的第一列)。 - -对于按月分区,使用 `toYYYYMM(date_column)` 表达式,其中 `date_column` 是类型为 [Date](/sql-reference/data-types/date.md) 的日期列。此处的分区名称采用 `"YYYYMM"` 格式。 - -#### PRIMARY KEY {#primary-key} - -`PRIMARY KEY` — 主键,如果它[与排序键不同](#choosing-a-primary-key-that-differs-from-the-sorting-key)。可选。 - -指定排序键(使用 `ORDER BY` 子句)会隐式指定主键。 -通常不需要在排序键之外额外指定主键。 - -#### SAMPLE BY {#sample-by} - -`SAMPLE BY` — 采样表达式。可选。 - -如果指定,它必须包含在主键中。 -采样表达式必须返回无符号整数。 - -示例:`SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))`。 - -#### TTL {#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` 规则。 - -有关更多详细信息,请参阅 [列和表的 TTL](#table_engine-mergetree-ttl) - -#### SETTINGS {#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](/sql-reference/statements/select/sample) 子句,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](/sql-reference/data-types/date.md) 类型列的名称。ClickHouse 会根据此列自动按月创建分区。分区名称采用 `"YYYYMM"` 格式。 -- `sampling_expression` — 采样表达式。 -- `(primary, key)` — 主键。类型:[Tuple()](/sql-reference/data-types/tuple.md) -- `index_granularity` — 索引粒度。索引"标记"之间的数据行数。值 8192 适用于大多数任务。 - -**示例** - -```sql -MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192) -``` - -`MergeTree` 引擎的配置方式与上述主引擎配置方法示例中的方式相同。 - -
- - -## 数据存储 {#mergetree-data-storage} - -表由按主键排序的数据部分(data part)组成。 - -当数据插入表中时,会创建独立的数据部分,每个部分都按主键进行字典序排序。例如,如果主键是 `(CounterID, Date)`,则部分中的数据按 `CounterID` 排序,在每个 `CounterID` 内,再按 `Date` 排序。 - -属于不同分区的数据被分离到不同的部分中。ClickHouse 会在后台合并数据部分以实现更高效的存储。属于不同分区的部分不会被合并。合并机制不保证具有相同主键的所有行都位于同一个数据部分中。 - -数据部分可以以 `Wide` 或 `Compact` 格式存储。在 `Wide` 格式中,每列存储在文件系统中的单独文件中;在 `Compact` 格式中,所有列存储在一个文件中。`Compact` 格式可用于提高小规模频繁插入的性能。 - -数据存储格式由表引擎的 `min_bytes_for_wide_part` 和 `min_rows_for_wide_part` 设置控制。如果数据部分中的字节数或行数小于相应设置的值,则该部分以 `Compact` 格式存储;否则以 `Wide` 格式存储。如果未设置这些参数,则数据部分以 `Wide` 格式存储。 - -每个数据部分在逻辑上被划分为多个颗粒(granule)。颗粒是 ClickHouse 在查询数据时读取的最小不可分割数据集。ClickHouse 不会拆分行或值,因此每个颗粒始终包含整数个行。颗粒的第一行用该行的主键值进行标记。对于每个数据部分,ClickHouse 会创建一个索引文件来存储这些标记(mark)。对于每一列,无论是否在主键中,ClickHouse 也会存储相同的标记。这些标记使您能够直接在列文件中定位数据。 - -颗粒大小受表引擎的 `index_granularity` 和 `index_granularity_bytes` 设置限制。颗粒中的行数位于 `[1, index_granularity]` 范围内,具体取决于行的大小。如果单行的大小大于该设置的值,则颗粒的大小可以超过 `index_granularity_bytes`。在这种情况下,颗粒的大小等于该行的大小。 - - -## 查询中的主键和索引 {#primary-keys-and-indexes-in-queries} - -以 `(CounterID, Date)` 主键为例。在这种情况下,排序和索引可以如下图所示: - -```text -完整数据: [---------------------------------------------] -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 不要求主键唯一。您可以插入具有相同主键的多行数据。 - -您可以在 `PRIMARY KEY` 和 `ORDER BY` 子句中使用 `Nullable` 类型的表达式,但强烈不建议这样做。要启用此功能,请开启 [allow_nullable_key](/operations/settings/merge-tree-settings/#allow_nullable_key) 设置。在 `ORDER BY` 子句中,`NULL` 值遵循 [NULLS_LAST](/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](/engines/table-engines/mergetree-family/collapsingmergetree) 和 [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree.md) 引擎中合并数据部分时提供额外的逻辑。 - - 在这种情况下,指定与主键不同的_排序键_是有意义的。 - -过长的主键会对插入性能和内存消耗产生负面影响,但主键中的额外列不会影响 ClickHouse 在 `SELECT` 查询时的性能。 - -您可以使用 `ORDER BY tuple()` 语法创建没有主键的表。在这种情况下,ClickHouse 按插入顺序存储数据。如果您希望在通过 `INSERT ... SELECT` 查询插入数据时保持数据顺序,请设置 [max_insert_threads = 1](/operations/settings/settings#max_insert_threads)。 - -要按初始顺序选择数据,请使用[单线程](/operations/settings/settings.md/#max_threads) `SELECT` 查询。 - -### 选择与排序键不同的主键 {#choosing-a-primary-key-that-differs-from-the-sorting-key} - - -可以指定与排序键(用于对数据部分中的行进行排序的表达式)不同的主键(其值会写入索引文件中每个标记的表达式)。在这种情况下,主键表达式元组必须是排序键表达式元组的前缀。 - -此功能在使用 [SummingMergeTree](/engines/table-engines/mergetree-family/summingmergetree.md) 和 -[AggregatingMergeTree](/engines/table-engines/mergetree-family/aggregatingmergetree.md) 表引擎时非常有用。在使用这些引擎的常见场景中,表包含两种类型的列:_维度列_ 和 _度量列_。典型的查询会使用任意 `GROUP BY` 对度量列的值进行聚合,并按维度进行过滤。由于 SummingMergeTree 和 AggregatingMergeTree 会聚合具有相同排序键值的行,因此自然会将所有维度添加到排序键中。这样一来,键表达式就由一长串列组成,并且必须频繁更新此列表以包含新添加的维度。 - -在这种情况下,合理的做法是在主键中仅保留少数几列以提供高效的范围扫描,并将其余维度列添加到排序键元组中。 - -排序键的 [ALTER](/sql-reference/statements/alter/index.md) 是一个轻量级操作,因为当新列同时添加到表和排序键时,现有数据部分无需更改。由于旧排序键是新排序键的前缀,并且新添加的列中没有数据,因此在表修改时,数据同时按旧排序键和新排序键排序。 - -### 在查询中使用索引和分区 {#use-of-indexes-and-partitions-in-queries} - -对于 `SELECT` 查询,ClickHouse 会分析是否可以使用索引。如果 `WHERE/PREWHERE` 子句包含表示相等或不等比较操作的表达式(作为合取元素之一或整体),或者在主键或分区键中的列或表达式上包含带固定前缀的 `IN` 或 `LIKE`,或者在这些列的某些部分重复函数上,或者这些表达式的逻辑关系上,则可以使用索引。 - -因此,可以在主键的一个或多个范围上快速运行查询。在此示例中,针对特定跟踪标签、特定标签和日期范围、特定标签和日期、具有日期范围的多个标签等运行查询时,查询速度会很快。 - -让我们看一下如下配置的引擎: - -```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](/operations/settings/settings.md/#force_index_by_date) 和 [force_primary_key](/operations/settings/settings#force_primary_key)。 - -按月分区的键允许仅读取包含适当范围内日期的数据块。在这种情况下,数据块可能包含多个日期的数据(最多整个月)。在块内,数据按主键排序,而主键可能不包含日期作为第一列。因此,使用仅包含日期条件且未指定主键前缀的查询将导致读取的数据多于单个日期所需的数据。 - -### 对部分单调主键使用索引 {#use-of-index-for-partially-monotonic-primary-keys} - - -例如,考虑月份中的日期。它们在一个月内形成[单调序列](https://en.wikipedia.org/wiki/Monotonic_function),但在更长的时间段内则不是单调的。这是一个部分单调序列。如果用户使用部分单调主键创建表,ClickHouse 会像往常一样创建稀疏索引。当用户从这种表中查询数据时,ClickHouse 会分析查询条件。如果用户想要获取索引的两个标记之间的数据,并且这两个标记都在同一个月内,ClickHouse 可以在这种特定情况下使用索引,因为它可以计算查询参数与索引标记之间的距离。 - -如果查询参数范围内的主键值不构成单调序列,ClickHouse 无法使用索引。在这种情况下,ClickHouse 会使用全表扫描方法。 - -ClickHouse 不仅对月份日期序列使用此逻辑,对任何表示部分单调序列的主键都使用此逻辑。 - -### 数据跳过索引 {#table_engine-mergetree-data_skipping-indexes} - -索引声明位于 `CREATE` 查询的列部分。 - -```sql -INDEX index_name expr TYPE type(...) [GRANULARITY granularity_value] -``` - -对于 `*MergeTree` 系列的表,可以指定数据跳过索引。 - -这些索引在由 `granularity_value` 个颗粒组成的块上聚合指定表达式的某些信息(颗粒的大小使用表引擎中的 `index_granularity` 设置指定)。然后在 `SELECT` 查询中使用这些聚合信息,通过跳过 `where` 查询条件无法满足的大数据块来减少从磁盘读取的数据量。 - -`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 -``` - -### 跳过索引类型 {#skip-index-types} - -`MergeTree` 表引擎支持以下类型的跳过索引。 -有关如何使用跳过索引进行性能优化的更多信息, -请参阅["理解 ClickHouse 数据跳过索引"](/optimize/skipping-indexes)。 - -- [`MinMax`](#minmax) 索引 -- [`Set`](#set) 索引 -- [`bloom_filter`](#bloom-filter) 索引 -- [`ngrambf_v1`](#n-gram-bloom-filter) 索引 -- [`tokenbf_v1`](#token-bloom-filter) 索引 - -#### MinMax 跳过索引 {#minmax} - -对于每个索引颗粒,存储表达式的最小值和最大值。 -(如果表达式是 `tuple` 类型,则存储每个元组元素的最小值和最大值。) - -```text title="语法" -minmax -``` - -#### Set 索引 {#set} - -对于每个索引颗粒,最多存储指定表达式的 `max_rows` 个唯一值。 -`max_rows = 0` 表示"存储所有唯一值"。 - -```text title="语法" -set(max_rows) -``` - -#### Bloom filter 索引 {#bloom-filter} - -对于每个索引颗粒,为指定的列存储一个 [bloom filter](https://en.wikipedia.org/wiki/Bloom_filter)。 - -```text title="语法" -bloom_filter([false_positive_rate]) -``` - -`false_positive_rate` 参数可以取 0 到 1 之间的值(默认值:`0.025`),用于指定产生假阳性的概率(这会增加需要读取的数据量)。 - - -支持以下数据类型: - -- `(U)Int*` -- `Float*` -- `Enum` -- `Date` -- `DateTime` -- `String` -- `FixedString` -- `Array` -- `LowCardinality` -- `Nullable` -- `UUID` -- `Map` - -:::note Map 数据类型:使用键或值指定索引创建 -对于 `Map` 数据类型,客户端可以使用 [`mapKeys`](/sql-reference/functions/tuple-map-functions.md/#mapkeys) 或 [`mapValues`](/sql-reference/functions/tuple-map-functions.md/#mapvalues) 函数指定为键或值创建索引。 -::: - -#### N-gram 布隆过滤器 {#n-gram-bloom-filter} - -为每个索引粒度存储指定列的 [n-grams](https://en.wikipedia.org/wiki/N-gram) 的[布隆过滤器](https://en.wikipedia.org/wiki/Bloom_filter)。 - -```text title="语法" -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` | 布隆过滤器哈希函数的随机种子。 | - -此索引仅适用于以下数据类型: - -- [`String`](/sql-reference/data-types/string.md) -- [`FixedString`](/sql-reference/data-types/fixedstring.md) -- [`Map`](/sql-reference/data-types/map.md) - -要估算 `ngrambf_v1` 的参数,可以使用以下[用户定义函数 (UDF)](/sql-reference/statements/create/function.md)。 - -```sql title="ngrambf_v1 的 UDF" -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)))) -``` - -要使用这些函数,需要至少指定两个参数: - -- `total_number_of_all_grams` -- `probability_of_false_positives` - -例如,粒度中有 `4300` 个 ngram,并且期望误报率低于 `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)的布隆过滤器计算器。 - -#### Token 布隆过滤器 {#token-bloom-filter} - -Token 布隆过滤器与 `ngrambf_v1` 相同,但存储的是 token(由非字母数字字符分隔的序列)而不是 ngram。 - -```text title="语法" -tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed) -``` - - -#### 稀疏 gram 布隆过滤器 {#sparse-grams-bloom-filter} - -稀疏 gram 布隆过滤器与 `ngrambf_v1` 类似,但使用[稀疏 gram 标记](/sql-reference/functions/string-functions.md/#sparseGrams)代替 ngram。 - -```text title="语法" -sparse_grams(min_ngram_length, max_ngram_length, min_cutoff_length, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed) -``` - -### 文本索引 {#text} - -支持全文搜索,详情请参阅[此处](invertedindexes.md)。 - -#### 向量相似度 {#vector-similarity} - -支持近似最近邻搜索,详情请参阅[此处](annindexes.md)。 - -### 函数支持 {#functions-support} - -`WHERE` 子句中的条件包含对列进行操作的函数调用。如果列是索引的一部分,ClickHouse 在执行函数时会尝试使用该索引。ClickHouse 针对索引使用支持不同的函数子集。 - -`set` 类型的索引可被所有函数使用。其他索引类型的支持情况如下: - - -| 函数(运算符)/索引 | 主键 | minmax | ngrambf_v1 | tokenbf_v1 | bloom_filter | text | sparse_grams | -| ------------------------------------------------------------------------------------------------------------------------- | -- | ------ | -------------- | -------------- | ---------------- | ---- | ---------------- | -| [等于 (=, ==)](/sql-reference/functions/comparison-functions.md/#equals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [notEquals(!=, <>)](/sql-reference/functions/comparison-functions.md/#notEquals) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [like](/sql-reference/functions/string-search-functions.md/#like) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [notLike](/sql-reference/functions/string-search-functions.md/#notLike) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [match](/sql-reference/functions/string-search-functions.md/#match) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [startsWith](/sql-reference/functions/string-functions.md/#startsWith) | ✔ | ✔ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [endsWith](/sql-reference/functions/string-functions.md/#endsWith) | ✗ | ✗ | ✔ | ✔ | ✗ | ✔ | ✔ | -| [multiSearchAny](/sql-reference/functions/string-search-functions.md/#multiSearchAny) | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | ✗ | -| [in](/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [notIn](/sql-reference/functions/in-functions) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [小于 (`<`)](/sql-reference/functions/comparison-functions.md/#less) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [大于(`>`)](/sql-reference/functions/comparison-functions.md/#greater) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [lessOrEquals(`<=`)](/sql-reference/functions/comparison-functions.md/#lessOrEquals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [greaterOrEquals(`>=`,大于等于)](/sql-reference/functions/comparison-functions.md/#greaterOrEquals) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [empty](/sql-reference/functions/array-functions/#empty) | ✔ | ✔ | ✗ | ✗ | ✗ | ✗ | ✗ | -| [notEmpty](/sql-reference/functions/array-functions/#notEmpty) | ✗ | ✔ | ✗ | ✗ | ✗ | ✗ | ✔ | -| [has](/sql-reference/functions/array-functions#has) | ✗ | ✗ | ✔ | ✔ | ✔ | ✔ | ✔ | -| [hasAny](/sql-reference/functions/array-functions#hasAny) | ✗ | ✗ | ✔ | ✔ | ✔ | ✗ | ✔ | -| [hasAll](/sql-reference/functions/array-functions#hasAll) | ✗ | ✗ | ✔ | ✔ | ✔ | ✗ | ✔ | -| [hasToken](/sql-reference/functions/string-search-functions.md/#hasToken) | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | ✗ | -| [hasTokenOrNull](/sql-reference/functions/string-search-functions.md/#hasTokenOrNull) | ✗ | ✗ | ✗ | ✔ | ✗ | ✔ | ✗ | -| [hasTokenCaseInsensitive (`*`)](/sql-reference/functions/string-search-functions.md/#hasTokenCaseInsensitive) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | -| [hasTokenCaseInsensitiveOrNull (`*`)](/sql-reference/functions/string-search-functions.md/#hasTokenCaseInsensitiveOrNull) | ✗ | ✗ | ✗ | ✔ | ✗ | ✗ | ✗ | -| [hasAnyTokens](/sql-reference/functions/string-search-functions.md/#hasAnyTokens) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | -| [hasAllTokens](/sql-reference/functions/string-search-functions.md/#hasAllTokens) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | -| [mapContains](/sql-reference/functions/tuple-map-functions#mapcontains) | ✗ | ✗ | ✗ | ✗ | ✗ | ✔ | ✗ | - - - -当函数的常量参数小于 ngram 大小时,`ngrambf_v1` 无法用于查询优化。 - -(*) 要使 `hasTokenCaseInsensitive` 和 `hasTokenCaseInsensitiveOrNull` 有效,必须在已转换为小写的数据上创建 `tokenbf_v1` 索引,例如:`INDEX idx (lower(str_col)) TYPE tokenbf_v1(512, 3, 0)`。 - -:::note -Bloom filter 可能产生误报,因此 `ngrambf_v1`、`tokenbf_v1`、`sparse_grams` 和 `bloom_filter` 索引不能用于优化那些期望函数结果为 false 的查询。 - -例如: - -- 可以被优化: - - `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} - -投影类似于[物化视图](/sql-reference/statements/create/view),但在数据分区级别定义。它提供一致性保证,并在查询中自动使用。 - -:::note -在实现投影时,您还应考虑 [force_optimize_projection](/operations/settings/settings#force_optimize_projection) 设置。 -::: - -带有 [FINAL](/sql-reference/statements/select/from#final-modifier) 修饰符的 `SELECT` 语句不支持投影。 - -### 投影查询 {#projection-query} - -投影查询用于定义投影。它隐式地从父表中选择数据。 - -**语法** - -```sql -SELECT [GROUP BY] [ORDER BY] -``` - -可以使用 [ALTER](/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} - -对于并发表访问,ClickHouse 使用多版本控制机制。换句话说,当表被同时读取和更新时,数据从查询时刻的当前数据分片集合中读取。不存在长时间锁定。插入操作不会阻塞读取操作。 - -表的读取操作会自动并行化。 - - -## 列和表的 TTL {#table_engine-mergetree-ttl} - -确定数据值的生存时间。 - -`TTL` 子句可以为整个表和每个单独的列设置。表级 `TTL` 还可以指定在磁盘和卷之间自动移动数据的逻辑,或对所有数据已过期的部分进行重新压缩。 - -表达式的求值结果必须为 [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) 数据类型。 - -**语法** - -为列设置生存时间: - -```sql -TTL time_column -TTL time_column + interval -``` - -要定义 `interval`,请使用[时间间隔](/sql-reference/operators#operators-for-working-with-dates-and-times)运算符,例如: - -```sql -TTL date_time + INTERVAL 1 MONTH -TTL date_time + INTERVAL 15 HOUR -``` - -### 列 TTL {#mergetree-column-ttl} - -当列中的值过期时,ClickHouse 会将它们替换为该列数据类型的默认值。如果数据部分中某列的所有值都过期,ClickHouse 会从文件系统的数据部分中删除该列。 - -`TTL` 子句不能用于键列。 - -**示例** - -#### 创建带有 `TTL` 的表: {#creating-a-table-with-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 {#adding-ttl-to-a-column-of-an-existing-table} - -```sql -ALTER TABLE tab - MODIFY COLUMN - c String TTL d + INTERVAL 1 DAY; -``` - -#### 修改列的 TTL {#altering-ttl-of-the-column} - -```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` 子句中显式设置,则结果行中该列将包含分组行中的任意值(就像对其应用了聚合函数 `any`)。 - -**示例** - -#### 创建带有 `TTL` 的表: {#creating-a-table-with-ttl-1} - -```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`: {#altering-ttl-of-the-table} - -```sql -ALTER TABLE tab - MODIFY TTL d + INTERVAL 1 DAY; -``` - - -创建一个表,其中的行在一个月后过期。日期为星期一的过期行将被删除: - -```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; -``` - -#### 创建一个表,其中过期的行会被重新压缩: {#creating-a-table-where-expired-rows-are-recompressed} - -```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 合并数据部分时,具有过期 `TTL` 的数据会被删除。 - -当 ClickHouse 检测到数据已过期时,它会执行计划外合并。要控制此类合并的频率,可以设置 `merge_with_ttl_timeout`。如果该值设置得过低,将执行大量计划外合并,可能会消耗大量资源。 - -如果在合并之间执行 `SELECT` 查询,可能会获取到过期数据。为避免这种情况,请在 `SELECT` 之前使用 [OPTIMIZE](/sql-reference/statements/optimize.md) 查询。 - -**另请参阅** - -- [ttl_only_drop_parts](/operations/settings/merge-tree-settings#ttl_only_drop_parts) 设置 - - -## 磁盘类型 {#disk-types} - -除本地块设备外,ClickHouse 还支持以下存储类型: - -- [`s3` 用于 S3 和 MinIO](#table_engine-mergetree-s3) -- [`gcs` 用于 GCS](/integrations/data-ingestion/gcs/index.md/#creating-a-disk) -- [`blob_storage_disk` 用于 Azure Blob Storage](/operations/storing-data#azure-blob-storage) -- [`hdfs` 用于 HDFS](/engines/table-engines/integrations/hdfs) -- [`web` 用于 Web 只读访问](/operations/storing-data#web-storage) -- [`cache` 用于本地缓存](/operations/storing-data#using-local-cache) -- [`s3_plain` 用于备份到 S3](/operations/backup#backuprestore-using-an-s3-disk) -- [`s3_plain_rewritable` 用于 S3 中的不可变非复制表](/operations/storing-data.md#s3-plain-rewritable-storage) - - -## 使用多个块设备存储数据 {#table_engine-mergetree-multiple-volumes} - -### 简介 {#introduction} - -`MergeTree` 系列表引擎可以在多个块设备上存储数据。比如,当某个表的数据被隐式划分为“热数据”和“冷数据”时,这一特性就非常有用。最新数据会被频繁访问,但只占用少量空间;相反,长尾的历史数据很少被请求。如果有多块磁盘可用,“热数据”可以放在快速磁盘上(例如 NVMe SSD 或内存中),而“冷数据”则可以放在相对较慢的磁盘上(例如 HDD)。 - -数据部分(data part)是 `MergeTree` 引擎表中最小的可移动单元。属于同一数据部分的数据存储在同一块磁盘上。数据部分既可以根据用户设置在后台在磁盘之间移动,也可以通过 [ALTER](/sql-reference/statements/alter/partition) 查询进行移动。 - -### 术语 {#terms} - -- 磁盘(Disk)— 挂载到文件系统的块设备。 -- 默认磁盘(Default disk)— 存储 [path](/operations/server-configuration-parameters/settings.md/#path) 服务器设置中指定路径的磁盘。 -- 卷(Volume)— 一组同类磁盘的有序集合(类似于 [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures))。 -- 存储策略(Storage policy)— 一组卷及其之间数据迁移规则的组合。 - -上述实体的名称可以在系统表 [system.storage_policies](/operations/system-tables/storage_policies) 和 [system.disks](/operations/system-tables/disks) 中找到。要为某个表应用已配置的存储策略,请使用 `MergeTree` 系列表引擎的 `storage_policy` 设置。 - -### 配置 {#table_engine-mergetree-multiple-volumes_configure} - -磁盘、卷和存储策略应在 `config.d` 目录中的文件里,在 `` 标签内进行声明。 - -:::tip -磁盘也可以在查询的 `SETTINGS` 部分中声明。这对于临时分析(ad-hoc)场景非常有用,比如临时挂载某个通过 URL 提供的磁盘。 -参见 [动态存储](/operations/storing-data#dynamic-configuration) 以了解更多细节。 -::: - -配置结构: - -```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)卷。对于仅包含一个卷的策略,不要使用此设置。 -* `move_factor` — 当可用空间比例低于该因子时,数据会自动开始移动到下一个卷(如果存在)(默认值为 0.1)。ClickHouse 会按大小将已有分片从大到小(降序)排序,并选择总大小足以满足 `move_factor` 条件的分片。如果所有分片的总大小仍不足,则会移动所有分片。 -* `perform_ttl_move_on_insert` — 是否在数据分片 INSERT 时执行 TTL 迁移。默认情况下(启用时),如果插入的数据分片已经满足 TTL 迁移规则而过期,则会立即被写入迁移规则中声明的卷/磁盘。如果目标卷/磁盘较慢(例如 S3),这会显著降低插入速度。如果禁用,则已过期的数据分片会先写入默认卷,然后再立即迁移到 TTL 卷。 -* `load_balancing` - 磁盘负载均衡策略,可选值为 `round_robin` 或 `least_used`。 -* `least_used_ttl_ms` - 配置所有磁盘可用空间信息的更新超时时间(毫秒)(`0` - 始终更新,`-1` - 从不更新,默认值为 `60000`)。注意,如果磁盘仅供 ClickHouse 使用,并且不会进行在线文件系统扩/缩容,则可以使用 `-1`;在其他所有情况下不推荐这样做,因为最终会导致空间分配不正确。 -* `prefer_not_to_merge` — 不应使用此设置。禁用该卷上的数据分片合并(这会有害并导致性能下降)。当启用该设置时(不要这么做),不允许在此卷上合并数据(这很糟糕)。这虽然允许(但你并不需要)控制(如果你想控制什么,那就是在犯错)ClickHouse 如何与慢磁盘交互(但 ClickHouse 更清楚,所以请不要使用此设置)。 -* `volume_priority` — 定义卷被填充的优先级(顺序)。数值越小优先级越高。参数值应为自然数,并整体覆盖从 1 到 N(最低优先级)之间的连续区间,中间不能跳过任何数字。 - * 如果 *所有* 卷都被打了标签,则按照给定顺序设定优先级。 - * 如果只有 *部分* 卷被打了标签,则未打标签的卷具有最低优先级,并按照它们在配置中定义的顺序确定优先级。 - * 如果 *没有* 卷被打标签,则其优先级按照它们在配置文件中的声明顺序确定。 - * 两个卷不能具有相同的优先级值。 - -配置示例: - -```xml - - ... - - - - - disk1 - disk2 - - - - - - - - fast_ssd - 1073741824 - - - disk1 - - - 0.2 - - - - -
- jbod1 -
- - external - -
-
-
- ... -
-``` - - -在给定的示例中,`hdd_in_order` 策略实现了[轮询](https://en.wikipedia.org/wiki/Round-robin_scheduling)方法。因此,该策略仅定义一个卷(`single`),数据部分按循环顺序存储在其所有磁盘上。如果系统挂载了多个相似的磁盘但未配置 RAID,这种策略会非常有用。请注意,每个单独的磁盘驱动器并不可靠,您可能需要使用 3 或更高的副本因子来补偿这一点。 - -如果系统中有不同类型的磁盘可用,则可以使用 `moving_from_ssd_to_hdd` 策略。卷 `hot` 由一个 SSD 磁盘(`fast_ssd`)组成,可以存储在该卷上的数据部分的最大大小为 1GB。所有大于 1GB 的数据部分将直接存储在 `cold` 卷上,该卷包含一个 HDD 磁盘 `disk1`。 -此外,一旦磁盘 `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](/operations/server-configuration-parameters/settings.md/#background_move_pool_size) 设置进行更改。 - -### 详细信息 {#details} - -对于 `MergeTree` 表,数据通过不同方式写入磁盘: - -- 作为插入操作的结果(`INSERT` 查询)。 -- 在后台合并和[变更](/sql-reference/statements/alter#mutations)期间。 -- 从另一个副本下载时。 -- 作为分区冻结的结果 [ALTER TABLE ... FREEZE PARTITION](/sql-reference/statements/alter/partition#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](/operations/system-tables/part_log)(字段 `type = MOVE_PART`)和 [system.parts](/operations/system-tables/parts.md)(字段 `path` 和 `disk`)来监控后台移动。此外,详细信息可以在服务器日志中找到。 - -用户可以使用查询 [ALTER TABLE ... MOVE PART\|PARTITION ... TO VOLUME\|DISK ...](/sql-reference/statements/alter/partition) 强制将数据部分或分区从一个卷移动到另一个卷,所有后台操作的限制都会被考虑在内。该查询会自行启动移动操作,不会等待后台操作完成。如果可用空间不足或不满足任何必需条件,用户将收到错误消息。 - -移动数据不会干扰数据复制。因此,可以为不同副本上的同一张表指定不同的存储策略。 - - -在后台合并和变更操作完成后,旧的数据块只有在经过一定时间(`old_parts_lifetime`)后才会被删除。 -在此期间,它们不会被移动到其他卷或磁盘。因此,在这些数据块被最终删除之前,评估已占用磁盘空间时仍会将其计算在内。 - -用户可以使用 [min_bytes_to_rebalance_partition_over_jbod](/operations/settings/merge-tree-settings.md/#min_bytes_to_rebalance_partition_over_jbod) 设置,将新的大型数据块以均衡的方式分配到 [JBOD](https://en.wikipedia.org/wiki/Non-RAID_drive_architectures) 卷的不同磁盘上。 - - - -## 使用外部存储存储数据 {#table_engine-mergetree-s3} - -[MergeTree](/engines/table-engines/mergetree-family/mergetree.md) 系列表引擎可以通过类型为 `s3`、`azure_blob_storage`、`hdfs` 的磁盘将数据分别存储到 `S3`、`AzureBlobStorage`、`HDFS`。更多详情请参阅[配置外部存储选项](/operations/storing-data.md/#configuring-external-storage)。 - -以下示例展示了如何使用类型为 `s3` 的磁盘将 [S3](https://aws.amazon.com/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 - -
- ... -
-``` - -另请参阅[配置外部存储选项](/operations/storing-data.md/#configuring-external-storage)。 - -:::note 缓存配置 -ClickHouse 版本 22.3 至 22.7 使用不同的缓存配置,如果您使用的是这些版本,请参阅[使用本地缓存](/operations/storing-data.md/#using-local-cache)。 -::: - - -## 虚拟列 {#virtual-columns} - -- `_part` — 数据分片的名称。 -- `_part_index` — 数据分片在查询结果中的顺序索引。 -- `_part_starting_offset` — 数据分片在查询结果中的累计起始行号。 -- `_part_offset` — 数据分片中的行号。 -- `_part_granule_offset` — 数据分片中的颗粒编号。 -- `_partition_id` — 分区的名称。 -- `_part_uuid` — 数据分片的唯一标识符(如果启用了 MergeTree 设置 `assign_part_uuids`)。 -- `_part_data_version` — 数据分片的数据版本(最小块编号或变更版本)。 -- `_partition_value` — `partition by` 表达式的值(元组)。 -- `_sample_factor` — 采样因子(来自查询)。 -- `_block_number` — 插入时为行分配的原始块编号,当启用设置 `enable_block_number_column` 时在合并操作中保留。 -- `_block_offset` — 插入时为行分配的块内原始行号,当启用设置 `enable_block_offset_column` 时在合并操作中保留。 -- `_disk_name` — 用于存储的磁盘名称。 - - -## 列统计信息 {#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` 时,才能将其用于 prewhere 优化。 - -### 可用的列统计信息类型 {#available-types-of-column-statistics} - -- `MinMax` - - 列的最小值和最大值,用于估算数值列上范围过滤器的选择性。 - - 语法:`minmax` - -- `TDigest` - - [TDigest](https://github.com/tdunning/t-digest) 草图,用于计算数值列的近似百分位数(例如第 90 百分位数)。 - - 语法:`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 或 FixedString | -| -------- | --------------------------------------------------- | --------------------- | -| CountMin | ✔ | ✔ | -| MinMax | ✔ | ✗ | -| TDigest | ✔ | ✗ | -| Uniq | ✔ | ✔ | - -### 支持的操作 {#supported-operations} - -| | 等值过滤器 (==) | 范围过滤器 (`>, >=, <, <=`) | -| -------- | --------------------- | ------------------------------ | -| 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](/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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md deleted file mode 100644 index c0316989b98..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replacingmergetree.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -description: '不同于 MergeTree,它会移除具有相同排序键值(表定义中的 `ORDER BY` 部分,而不是 `PRIMARY KEY`)的重复记录。' -sidebar_label: 'ReplacingMergeTree' -sidebar_position: 40 -slug: /engines/table-engines/mergetree-family/replacingmergetree -title: 'ReplacingMergeTree 表引擎' -doc_type: 'reference' ---- - - - -# ReplacingMergeTree 表引擎 - -该引擎与 [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree) 的不同之处在于,它会删除具有相同[排序键](../../../engines/table-engines/mergetree-family/mergetree.md)值的重复记录(指表的 `ORDER BY` 子句,而非 `PRIMARY KEY`)。 - -数据去重仅在合并期间发生。合并在后台于未知时间执行,因此无法提前规划,且部分数据可能长时间保持未处理状态。尽管可以通过 `OPTIMIZE` 查询触发一次临时合并,但不要依赖这种方式,因为 `OPTIMIZE` 查询会读写大量数据。 - -因此,`ReplacingMergeTree` 适用于在后台清理重复数据以节省存储空间,但并不能保证数据中完全不存在重复项。 - -:::note -关于 ReplacingMergeTree 的详细指南(包括最佳实践以及性能优化方法)可在[此处](/guides/replacing-merge-tree)查阅。 -::: - - - -## 创建数据表 - -```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 -行的唯一性是由表的 `ORDER BY` 子句决定的,而不是由 `PRIMARY KEY` 决定。 -::: - - -## ReplacingMergeTree 参数 - -### `ver` - -`ver` — 带有版本号的列。类型为 `UInt*`、`Date`、`DateTime` 或 `DateTime64`。可选参数。 - -在合并时,`ReplacingMergeTree` 会在所有具有相同排序键的行中只保留一行: - -* 如果未设置 `ver`,则保留选集中最后一行。一次选集是指参与该次合并的多个数据 part 中的一组行。最新创建的 part(最后一次插入)会排在选集的最后。因此,去重后,对于每个唯一排序键,将保留最近一次插入中的最后一行。 -* 如果指定了 `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 -只有在使用 `ver` 时才可以启用 `is_deleted`。 - -无论对数据执行何种操作,都应增加版本号。如果插入的两行数据具有相同的版本号,则会保留最后插入的那一行。 - -默认情况下,即使最后一行是删除行,ClickHouse 也会为某个键保留最后一行。这样可以确保将来插入版本号更低的行时,仍然可以安全插入,并且删除行依然会被应用。 - -要永久删除此类删除行,请启用表设置 `allow_experimental_replacing_merge_with_cleanup`,并执行以下任一操作: - -1. 设置表设置项 `enable_replacing_merge_with_cleanup_for_min_age_to_force_merge`、`min_age_to_force_merge_on_partition_only` 和 `min_age_to_force_merge_seconds`。如果某个分区中的所有 part 的存在时间都超过 `min_age_to_force_merge_seconds`,ClickHouse 会将它们全部合并为单个 part 并移除所有删除行。 - -2. 手动运行 `OPTIMIZE TABLE table [PARTITION partition | PARTITION ID 'partition_id'] FINAL CLEANUP`。 - ::: - -示例: - -```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 行记录。耗时:0.003 秒。 - --- 删除带有 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 │ -└─────┴─────────┴─────────────────────┴────────────┘ - -``` -``` - - -## 查询子句 {#query-clauses} - -在创建 `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 行。耗时:19.958 秒。处理了 10 亿行,8.00 GB(每秒 5011 万行,400.84 MB/s)。 -``` - -在不使用 `FINAL` 的情况下进行查询会返回不正确的计数结果(具体数值会因合并情况而异): - -```sql -SELECT count() -FROM rmt_example - -┌─count()─┐ -│ 200 │ -└─────────┘ - -返回 1 行。耗时: 0.002 秒。 -``` - -添加 FINAL 后即可得到正确的结果: - -```sql -SELECT count() -FROM rmt_example -FINAL - -┌─count()─┐ -│ 100 │ -└─────────┘ - -1 行在集合中。耗时: 0.002 秒。 -``` - -若需了解 `FINAL` 的更多细节,包括如何优化 `FINAL` 的性能,建议阅读我们的 [ReplacingMergeTree 详细指南](/guides/replacing-merge-tree)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md deleted file mode 100644 index 23ff93782e9..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/replication.md +++ /dev/null @@ -1,355 +0,0 @@ ---- -description: 'ClickHouse 中 Replicated* 系列表引擎数据复制概览' -sidebar_label: 'Replicated*' -sidebar_position: 20 -slug: /engines/table-engines/mergetree-family/replication -title: 'Replicated* 表引擎' -doc_type: 'reference' ---- - - - -# Replicated* 表引擎 - -:::note -在 ClickHouse Cloud 中,副本由系统自动管理。请在创建表时不要添加参数。例如,在下面的文本中,应将以下内容替换为: - -```sql -ENGINE = ReplicatedMergeTree( - '/clickhouse/tables/{shard}/table_name', - '{replica}' -) -``` - -包含: - -```sql -ENGINE = ReplicatedMergeTree -``` - -::: - -复制仅支持 MergeTree 系列的表引擎: - -* ReplicatedMergeTree -* ReplicatedSummingMergeTree -* ReplicatedReplacingMergeTree -* ReplicatedAggregatingMergeTree -* ReplicatedCollapsingMergeTree -* ReplicatedVersionedCollapsingMergeTree -* ReplicatedGraphiteMergeTree - -复制是在单个表级别进行的,而不是在整个服务器级别。一个服务器可以同时存储已复制的表和未复制的表。 - -复制不依赖于分片。每个分片都有自己独立的复制。 - -针对 `INSERT` 和 `ALTER` 查询的压缩数据会被复制(更多信息,参见 [ALTER](/sql-reference/statements/alter) 文档)。 - -`CREATE`、`DROP`、`ATTACH`、`DETACH` 和 `RENAME` 查询只在单个服务器上执行,并不会被复制: - -* `CREATE TABLE` 查询会在执行该查询的服务器上创建一个新的可复制的表。如果该表在其他服务器上已经存在,则会添加一个新副本。 -* `DROP TABLE` 查询会删除位于执行该查询的服务器上的副本。 -* `RENAME` 查询会在其中一个副本上重命名表。换句话说,复制表在不同副本上可以有不同的名称。 - -ClickHouse 使用 [ClickHouse Keeper](/guides/sre/keeper/index.md) 来存储副本的元信息。也可以使用 3.4.5 或更高版本的 ZooKeeper,但推荐使用 ClickHouse Keeper。 - -要使用复制功能,请在服务器配置的 [zookeeper](/operations/server-configuration-parameters/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,则无法创建复制表,且所有已有的复制表都将是只读的。 - - -ZooKeeper 不用于 `SELECT` 查询,因为复制不会影响 `SELECT` 的性能,查询速度与非复制表一样快。在查询分布式复制表时,ClickHouse 的行为由 [max_replica_delay_for_distributed_queries](/operations/settings/settings.md/#max_replica_delay_for_distributed_queries) 和 [fallback_to_stale_replicas_for_distributed_queries](/operations/settings/settings.md/#fallback_to_stale_replicas_for_distributed_queries) 这两个设置控制。 - -对于每个 `INSERT` 查询,大约会通过若干事务向 ZooKeeper 添加十条记录。(更精确地说,这是针对每个插入的数据块;一个 `INSERT` 查询包含一个数据块,或者每 `max_insert_block_size = 1048576` 行一个数据块。)这会导致与非复制表相比,`INSERT` 的延迟略有增加。但如果按照建议以每秒不超过一次 `INSERT` 的批量方式插入数据,就不会产生任何问题。用于与单个 ZooKeeper 集群协同工作的整个 ClickHouse 集群,总共每秒只有数百个 `INSERT`。数据插入的吞吐量(每秒行数)与非复制数据一样高。 - -对于非常大的集群,可以为不同的分片使用不同的 ZooKeeper 集群。然而,根据我们的经验,在大约 300 台服务器的生产集群中,这并不是必要的。 - -复制是异步且多主的。`INSERT` 查询(以及 `ALTER`)可以发送到任何可用的服务器。数据会先插入到执行查询的服务器上,然后再复制到其他服务器上。由于是异步的,最近插入的数据会在一定延迟后才出现在其他副本上。如果部分副本不可用,则会在它们重新可用时再写入数据。如果某个副本是可用的,延迟就是通过网络传输压缩数据块所需的时间。用于为复制表执行后台任务的线程数可以通过 [background_schedule_pool_size](/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) 设置进行配置。 - -`ReplicatedMergeTree` 引擎为副本抓取(fetch)操作使用了单独的线程池。该线程池的大小由 [background_fetches_pool_size](/operations/server-configuration-parameters/settings#background_fetches_pool_size) 设置限制,并且可以通过重启服务器来调整。 - -默认情况下,`INSERT` 查询只等待来自一个副本的数据写入确认。如果数据仅成功写入一个副本,而该副本所在的服务器随后宕机,存储的数据就会丢失。要启用从多个副本获取数据写入确认,请使用 `insert_quorum` 选项。 - -每个数据块都是原子写入的。`INSERT` 查询会被拆分为最多 `max_insert_block_size = 1048576` 行的数据块。换句话说,如果 `INSERT` 查询少于 1048576 行,则该查询是以原子方式完成写入的。 - -数据块会去重。对于多次写入相同的数据块(大小相同且包含相同行并且顺序相同的数据块),该数据块只会被写入一次。这样做是为了在发生网络故障、客户端应用无法确定数据是否已写入数据库时,可以简单地重复执行 `INSERT` 查询。将相同数据的 `INSERT` 发送到哪个副本并不重要。`INSERTs` 是幂等的。去重参数由 [merge_tree](/operations/server-configuration-parameters/settings.md/#merge_tree) 服务器设置控制。 - -在复制过程中,只有要插入的源数据会通过网络传输。后续的数据转换(合并)会在所有副本上以相同方式协调并执行。这样可以将网络使用量降到最低,这意味着当副本位于不同数据中心时,复制也能良好工作。(注意,在不同数据中心中复制数据是复制的主要目标。) - -你可以为相同的数据配置任意数量的副本。根据我们的经验,一个相对可靠且易于运维的方案是在生产环境中使用双副本复制,并且每台服务器使用 RAID-5 或 RAID-6(某些情况下使用 RAID-10)。 - -系统会监控副本上的数据同步情况,并能够在故障后进行恢复。故障切换可以是自动的(当数据差异较小时),也可以是半自动的(当数据差异过大时,这可能表明存在配置错误)。 - - - -## 创建复制表 - -:::note -在 ClickHouse Cloud 中,副本复制由平台自动处理。 - -创建表时使用不带复制参数的 [`MergeTree`](/engines/table-engines/mergetree-family/mergetree)。系统会在内部将 [`MergeTree`](/engines/table-engines/mergetree-family/mergetree) 重写为 [`SharedMergeTree`](/cloud/reference/shared-merge-tree),以实现复制和数据分发。 - -避免使用 `ReplicatedMergeTree` 或手动指定复制参数,因为复制由平台统一管理。 - -::: - -### Replicated*MergeTree 参数 - -| 参数 | 说明 | -| ------------------ | ----------------------------------------------- | -| `zoo_path` | 在 ClickHouse Keeper 中表的路径。 | -| `replica_name` | 在 ClickHouse Keeper 中副本的名称。 | -| `other_parameters` | 用于创建复制版本的底层引擎参数,例如 `ReplacingMergeTree` 中的版本参数。 | - -示例: - -```sql -CREATE TABLE table_name -( - EventDate DateTime, - CounterID UInt32, - UserID UInt32, - ver UInt16 -ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{layer}-{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](/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`。但这只会删除一个副本——也就是你执行该查询所在服务器上的那个副本。 - - -## 故障后的恢复 - -如果在服务器启动时 ClickHouse Keeper 不可用,复制表会切换到只读模式。系统会定期尝试连接 ClickHouse Keeper。 - -如果在执行 `INSERT` 时 ClickHouse Keeper 不可用,或者在与 ClickHouse Keeper 交互时发生错误,则会抛出异常。 - -连接到 ClickHouse Keeper 之后,系统会检查本地文件系统中的数据集是否与预期的数据集匹配(ClickHouse Keeper 会存储这些信息)。如果存在轻微的不一致,系统会通过与副本同步数据来解决。 - -如果系统检测到损坏的数据分片(文件大小错误)或无法识别的分片(已写入文件系统但未记录到 ClickHouse Keeper 的分片),则会将它们移动到 `detached` 子目录中(不会被删除)。任何缺失的分片都会从副本中复制。 - -请注意,ClickHouse 不会执行任何破坏性操作,例如自动删除大量数据。 - -当服务器启动(或与 ClickHouse Keeper 建立新会话)时,它只检查所有文件的数量和大小。如果文件大小相同但中间某处字节发生了变化,则不会立即检测到,只会在尝试为 `SELECT` 查询读取数据时才会发现。此时查询会抛出关于校验和不匹配或压缩块大小不匹配的异常。在这种情况下,数据分片会被加入到验证队列中,并在必要时从副本中复制。 - -如果本地数据集与预期数据集的差异过大,就会触发安全机制。服务器会将此记录到日志中并拒绝启动。这样设计的原因是,这种情况可能表明配置错误,例如某个分片上的副本被误配置成了另一个分片上的副本。不过,该机制的阈值设置得相当低,因此这种情况也可能在正常的故障恢复过程中发生。在这种情况下,数据通过“按下一个按钮”实现半自动恢复。 - -要开始恢复,在 ClickHouse Keeper 中创建节点 `/path_to_table/replica_name/flags/force_restore_data` 并填入任意内容,或者运行以下命令来恢复所有复制表: - -```bash -sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data -``` - -然后重启服务器。服务器在启动时会删除这些标志位并开始恢复。 - - -## 完全数据丢失后的恢复 {#recovery-after-complete-data-loss} - -如果某个服务器上的所有数据和元数据都丢失了,请按照以下步骤进行恢复: - -1. 在该服务器上安装 ClickHouse。正确配置包含分片标识符和副本信息的配置文件中的 substitution(替换规则)(如果你使用了它们)。 -2. 如果存在未复制的表且需要在服务器上手动恢复,请从其某个副本复制这些表的数据(目录为 `/var/lib/clickhouse/data/db_name/table_name/`)。 -3. 从某个副本复制位于 `/var/lib/clickhouse/metadata/` 中的表定义文件。如果在表定义中显式指定了分片或副本标识符,请将其修改为与当前副本相对应。(或者,启动服务器并执行所有本应位于 `/var/lib/clickhouse/metadata/` 目录下 .sql 文件中的 `ATTACH TABLE` 查询。) -4. 要开始恢复,请在 ClickHouse Keeper 中创建节点 `/path_to_table/replica_name/flags/force_restore_data`(内容任意),或者运行命令以恢复所有复制表:`sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data` - -然后启动服务器(如果已在运行,则重启)。数据会从其他副本中下载。 - -另一种恢复方式是从 ClickHouse Keeper 中删除丢失副本的信息(`/path_to_table/replica_name`),然后按照“[创建复制表](#creating-replicated-tables)”中所述重新创建该副本。 - -恢复过程中对网络带宽没有限制。如果你一次恢复许多副本,请注意这一点。 - - - -## 从 MergeTree 转换为 ReplicatedMergeTree - -我们使用术语 `MergeTree` 来统称 `MergeTree family` 中的所有表引擎,对 `ReplicatedMergeTree` 也是同样的用法。 - -如果您有一个是通过手动方式实现复制的 `MergeTree` 表,可以将它转换为复制表。如果您已经在一个 `MergeTree` 表中收集了大量数据,现在希望启用复制功能,则可能需要执行此操作。 - -[ATTACH TABLE ... AS REPLICATED](/sql-reference/statements/attach.md#attach-mergetree-table-as-replicatedmergetree) 语句可以将已分离的 `MergeTree` 表以 `ReplicatedMergeTree` 的形式附加。 - -如果在表的数据目录中(对于 `Atomic` 数据库,即 `/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/`)设置了 `convert_to_replicated` 标志,则在服务器重启时可以自动将 `MergeTree` 表转换。创建一个空的 `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/`)。 -然后在其中一个副本上运行 `ALTER TABLE ATTACH PARTITION`,将这些数据部件添加到工作集中。 - - -## 从 ReplicatedMergeTree 转换为 MergeTree {#converting-from-replicatedmergetree-to-mergetree} - -使用 [ATTACH TABLE ... AS NOT REPLICATED](/sql-reference/statements/attach.md#attach-mergetree-table-as-replicatedmergetree) 语句,在单个服务器上将已分离(detached)的 `ReplicatedMergeTree` 表作为 `MergeTree` 表附加。 - -另一种方式需要重启服务器。先创建一个名称不同的 MergeTree 表。将 `ReplicatedMergeTree` 表数据目录中的所有数据移动到新表的数据目录。然后删除该 `ReplicatedMergeTree` 表并重启服务器。 - -如果希望在不启动服务器的情况下移除一个 `ReplicatedMergeTree` 表: - -- 删除元数据目录(`/var/lib/clickhouse/metadata/`)中对应的 `.sql` 文件。 -- 删除 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](/operations/server-configuration-parameters/settings.md/#background_schedule_pool_size) -- [background_fetches_pool_size](/operations/server-configuration-parameters/settings.md/#background_fetches_pool_size) -- [execute_merges_on_single_replica_time_threshold](/operations/settings/merge-tree-settings#execute_merges_on_single_replica_time_threshold) -- [max_replicated_fetches_network_bandwidth](/operations/settings/merge-tree-settings.md/#max_replicated_fetches_network_bandwidth) -- [max_replicated_sends_network_bandwidth](/operations/settings/merge-tree-settings.md/#max_replicated_sends_network_bandwidth) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md deleted file mode 100644 index 0dff8da5d6a..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/summingmergetree.md +++ /dev/null @@ -1,202 +0,0 @@ ---- -description: 'SummingMergeTree 继承自 MergeTree 引擎。其关键特性是在数据部分合并时可以自动对数值数据进行求和。' -sidebar_label: 'SummingMergeTree' -sidebar_position: 50 -slug: /engines/table-engines/mergetree-family/summingmergetree -title: 'SummingMergeTree 表引擎' -doc_type: 'reference' ---- - - - -# SummingMergeTree 表引擎 - -该引擎继承自 [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree)。不同之处在于,当对 `SummingMergeTree` 表的数据部分进行合并时,ClickHouse 会将所有具有相同主键(更准确地说,是具有相同[排序键](../../../engines/table-engines/mergetree-family/mergetree.md))的多行,替换为一行,其中数值数据类型列的值为这些行的求和结果。如果排序键的设计使得单个键值对应大量行,这种方式可以显著减少存储体积并加速数据查询。 - -我们建议将此引擎与 `MergeTree` 结合使用。在 `MergeTree` 表中存储完整数据,并使用 `SummingMergeTree` 存储聚合后的数据,例如在生成报表时使用。这样的做法可以避免由于主键设计不当而导致有价值数据的丢失。 - - - -## 创建表 - -```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` — 一个包含需要求和的列名的元组(tuple)。可选参数。 -这些列必须是数值类型,且不能出现在分区键或排序键中。 - -如果未指定 `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` — 一个由其值将被求和的列名组成的元组(tuple)。可选参数。说明见上文。 -
- - -## 使用示例 - -请看下表: - -```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 │ -└─────┴────────────┘ -``` - - -## 数据处理 - -当数据被插入到表中时,会按原样保存。ClickHouse 会定期合并已插入的数据部分,在此过程中,具有相同主键的行会被求和,并在每个合并结果的数据部分中替换为一行。 - -ClickHouse 合并数据部分的方式可能导致:不同的合并结果数据部分中仍然可能包含具有相同主键的行,即求和可能是不完整的。因此,在执行查询时(`SELECT`),应按照上面的示例使用聚合函数 [sum()](/sql-reference/aggregate-functions/reference/sum) 和 `GROUP BY` 子句。 - -### 求和的通用规则 - -数值数据类型列中的值会被求和。参与求和的列集合由参数 `columns` 定义。 - -如果用于求和的所有列的值都为 0,则该行会被删除。 - -如果某列不在主键中且不参与求和,则会从已有值中任意选取一个值。 - -主键列中的值不会被求和。 - -### AggregateFunction 列中的求和 - -对于 [AggregateFunction 类型](../../../sql-reference/data-types/aggregatefunction.md) 的列,ClickHouse 的行为类似于 [AggregatingMergeTree](../../../engines/table-engines/mergetree-family/aggregatingmergetree.md) 引擎,会根据该函数进行聚合。 - -### 嵌套结构 - -表可以包含以特殊方式处理的嵌套数据结构。 - -如果嵌套表的名称以 `Map` 结尾,并且包含至少两个满足以下条件的列: - -* 第一列是数值类型 `(*Int*, Date, DateTime)` 或字符串类型 `(String, FixedString)`,我们称其为 `key`, -* 其他列是算术类型 `(*Int*, Float32/64)`,我们称其为 `(values...)`, - -则此嵌套表会被解释为 `key => (values...)` 的映射,并且在合并其行时,会以 `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) 函数。 - -对于嵌套数据结构,在用于求和的列元组中,无需单独指定其各个字段。 - - - -## 相关内容 {#related-content} - -- 博客文章:[在 ClickHouse 中使用聚合函数组合器](https://clickhouse.com/blog/aggregate-functions-combinators-in-clickhouse-for-arrays-maps-and-states) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md deleted file mode 100644 index 14c2b0668d3..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/mergetree-family/versionedcollapsingmergetree.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -description: '允许对持续变化的对象状态进行快速写入,并在后台删除旧的对象状态。' -sidebar_label: 'VersionedCollapsingMergeTree' -sidebar_position: 80 -slug: /engines/table-engines/mergetree-family/versionedcollapsingmergetree -title: 'VersionedCollapsingMergeTree 表引擎' -doc_type: 'reference' ---- - - - -# VersionedCollapsingMergeTree 表引擎 - -该引擎: - -- 允许快速写入持续变化的对象状态。 -- 在后台删除旧的对象状态,从而显著减少存储占用。 - -详细信息参见 [Collapsing](#table_engines_versionedcollapsingmergetree) 部分。 - -该引擎继承自 [MergeTree](/engines/table-engines/mergetree-family/versionedcollapsingmergetree),并在数据部分合并算法中增加了对行进行折叠的逻辑。`VersionedCollapsingMergeTree` 与 [CollapsingMergeTree](../../../engines/table-engines/mergetree-family/collapsingmergetree.md) 具有相同用途,但使用了不同的折叠算法,允许在多线程环境下以任意顺序插入数据。特别是,`Version` 列有助于在插入顺序不正确时仍能正确折叠行。相比之下,`CollapsingMergeTree` 只允许严格按顺序插入。 - - - -## 创建表 - -```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) -``` - -| Parameter | Description | Type | -| --------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `sign` | 行类型列的列名:`1` 表示“state”行,`-1` 表示“cancel”行。 | [`Int8`](/sql-reference/data-types/int-uint) | -| `version` | 对象状态版本列的列名。 | [`Int*`](/sql-reference/data-types/int-uint), [`UInt*`](/sql-reference/data-types/int-uint), [`Date`](/sql-reference/data-types/date), [`Date32`](/sql-reference/data-types/date32), [`DateTime`](/sql-reference/data-types/datetime) 或 [`DateTime64`](/sql-reference/data-types/datetime64) | - -### 查询子句 - -在创建 `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` 表示“state”行,`-1` 表示“cancel”行。 - - 列数据类型 — `Int8`。 - - * `version` — 对象状态版本列的列名。 - - 列数据类型应为 `UInt*`。 -
- - -## 折叠 - -### 数据 - -考虑这样一种情况:你需要为某个对象保存不断变化的数据。为某个对象仅保留一行记录,并在有变化时更新这一行是合理的。然而,对于 DBMS 来说,执行 `UPDATE` 操作代价高且速度慢,因为这需要在存储中重写数据。如果你需要快速写入数据,则不适合使用 `UPDATE`,但可以按如下方式顺序写入对象的变更。 - -在写入行时使用 `Sign` 列。如果 `Sign = 1`,表示该行为对象的某个状态(我们称其为“state”行)。如果 `Sign = -1`,表示对具有相同属性的对象状态进行取消(我们称其为“cancel”行)。还需要使用 `Version` 列,它应通过不同的数字标识对象的每一个状态。 - -例如,我们希望统计用户在某个网站上访问了多少页面以及停留了多长时间。在某个时间点,我们写入如下记录来表示用户活动的状态: - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -在随后的某个时间点,我们检测到用户活动发生变化,并通过下面这两行将其写入表中。 - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ -│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | -│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -第一行会抵销对象(用户)之前的状态。它应当复制被抵销状态中除 `Sign` 字段以外的所有字段。 - -第二行表示当前状态。 - -因为我们只需要用户活动的最终状态,这些行 - -```text -┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐ -│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 | -│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 | -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -这些行可以被删除,从而折叠该对象无效(旧)的状态。`VersionedCollapsingMergeTree` 在合并数据分片时执行这一操作。 - -要了解为什么每次更改需要两行,请参阅[算法](#table_engines-versionedcollapsingmergetree-algorithm)。 - -**使用注意事项** - -1. 写入数据的程序应当记住对象的状态,以便能够对其进行撤销。“Cancel” 行应包含主键字段的副本、“state” 行的版本以及相反的 `Sign`。这会增加初始存储空间占用,但可以实现快速写入。 -2. 列中持续增长的长数组会因为写入负载而降低引擎效率。数据越简单直接,引擎效率越高。 -3. `SELECT` 结果高度依赖于对象变更历史的一致性。在准备要插入的数据时要非常谨慎。对于不一致的数据,你可能会得到不可预测的结果,例如本应为非负指标(如会话深度)的负值。 - -### 算法 - -当 ClickHouse 合并数据分片时,会删除每一对具有相同主键和版本、但 `Sign` 不同的行。行的顺序无关紧要。 - -当 ClickHouse 插入数据时,会按主键对行进行排序。如果 `Version` 列不在主键中,ClickHouse 会隐式地将其作为最后一个字段加入主键,并使用它进行排序。 - - -## 选择数据 {#selecting-data} - -ClickHouse 不保证具有相同主键的所有行会位于同一个结果数据部件中,甚至不保证在同一台物理服务器上。这对于数据写入以及之后的数据部件合并都成立。此外,ClickHouse 会使用多个线程处理 `SELECT` 查询,因此无法预测结果集中各行的顺序。这意味着,如果需要从 `VersionedCollapsingMergeTree` 表中获取完全“折叠”的数据,就必须进行聚合。 - -要完成折叠,编写带有 `GROUP BY` 子句的查询,并使用能够考虑符号(Sign)的聚合函数。例如,要计算数量,用 `sum(Sign)` 代替 `count()`。要计算某个字段的和,用 `sum(Sign * x)` 代替 `sum(x)`,并添加 `HAVING sum(Sign) > 0`。 - -可以通过这种方式计算的聚合函数包括 `count`、`sum` 和 `avg`。如果对象至少有一个未折叠状态,则可以计算聚合函数 `uniq`。无法计算聚合函数 `min` 和 `max`,因为 `VersionedCollapsingMergeTree` 不保存折叠状态的值历史。 - -如果需要在不进行聚合的情况下以“折叠”的方式提取数据(例如,检查是否存在其最新值满足某些条件的行),可以在 `FROM` 子句中使用 `FINAL` 修饰符。这种方法效率较低,不应在大表上使用。 - - - -## 使用示例 - -示例数据: - -```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) -``` - -我们使用两个 `INSERT` 查询来创建两个不同的数据块。如果我们使用单个查询插入数据,ClickHouse 只会创建一个数据块,并且永远不会执行任何合并。 - -获取数据: - -```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 │ -└─────────────────────┴───────────┴──────────┴──────┴─────────┘ -``` - -我们在这里看到了什么?折叠后的数据去了哪里? -我们通过两条 `INSERT` 查询创建了两个数据 part。`SELECT` 查询在两个线程中执行,因此结果中行的顺序是随机的。 -没有发生折叠,是因为这些数据 part 尚未被合并。ClickHouse 会在一个我们无法预知的时间点合并数据 part。 - -这就是我们需要进行聚合的原因: - -```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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md deleted file mode 100644 index 51bd7bf315c..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/alias.md +++ /dev/null @@ -1,322 +0,0 @@ ---- -description: 'Alias 表引擎会创建到另一张表的透明代理。所有操作都会被转发到目标表,而别名表自身不存储任何数据。' -sidebar_label: 'Alias' -sidebar_position: 5 -slug: /engines/table-engines/special/alias -title: 'Alias 表引擎' -doc_type: 'reference' ---- - - - -# Alias 表引擎 - -`Alias` 引擎会创建一个指向另一张表的代理表。所有读写操作都会转发到目标表,而别名表本身不存储任何数据,只维护对目标表的引用。 - - - -## 创建表 - -```sql -CREATE TABLE [数据库名.]别名表名 -ENGINE = Alias(目标表) -``` - -或者显式地指定数据库名称: - -```sql -CREATE TABLE [db_name.]alias_name -ENGINE = Alias(target_db, target_table) -``` - -:::note -`Alias` 表不支持显式定义列。列会自动从目标表继承,这可以确保别名表始终与目标表的表结构保持一致。 -::: - - -## 引擎参数 {#engine-parameters} - -- **`target_db (optional)`** — 目标表所在数据库的名称。 -- **`target_table`** — 目标表名称。 - - - -## 支持的操作 {#supported-operations} - -`Alias` 表引擎支持所有主要操作。 -### 目标表上的操作 {#operations-on-target} - -这些操作会被转发到目标表: - -| Operation | Support | Description | -|-----------|---------|-------------| -| `SELECT` | ✅ | 从目标表读取数据 | -| `INSERT` | ✅ | 向目标表写入数据 | -| `INSERT SELECT` | ✅ | 向目标表执行批量插入 | -| `ALTER TABLE ADD COLUMN` | ✅ | 向目标表添加列 | -| `ALTER TABLE MODIFY SETTING` | ✅ | 修改目标表设置 | -| `ALTER TABLE PARTITION` | ✅ | 在目标表上执行分区操作(DETACH/ATTACH/DROP) | -| `ALTER TABLE UPDATE` | ✅ | 更新目标表中的行(变更,mutation) | -| `ALTER TABLE DELETE` | ✅ | 从目标表删除行(变更,mutation) | -| `OPTIMIZE TABLE` | ✅ | 优化目标表(合并数据分片) | -| `TRUNCATE TABLE` | ✅ | 截断目标表 | - -### 对别名本身的操作 {#operations-on-alias} - -这些操作只影响别名,**不会**影响目标表: - -| Operation | Support | Description | -|-----------|---------|-------------| -| `DROP TABLE` | ✅ | 仅删除别名,目标表保持不变 | -| `RENAME TABLE` | ✅ | 仅重命名别名,目标表保持不变 | - - - -## 用法示例 - -### 创建基本别名 - -在同一数据库中创建一个简单的别名: - -```sql --- 创建源表 -CREATE TABLE source_data ( - id UInt32, - name String, - value Float64 -) ENGINE = MergeTree -ORDER BY id; - --- 插入数据 -INSERT INTO source_data VALUES (1, 'one', 10.1), (2, 'two', 20.2); - --- 创建别名 -CREATE TABLE data_alias ENGINE = Alias('source_data'); - --- 通过别名查询 -SELECT * FROM data_alias; -``` - -```text -┌─id─┬─name─┬─value─┐ -│ 1 │ one │ 10.1 │ -│ 2 │ two │ 20.2 │ -└────┴──────┴───────┘ -``` - -### 跨数据库别名 - -创建一个指向其他数据库中某张表的别名: - -```sql --- 创建数据库 -CREATE DATABASE db1; -CREATE DATABASE db2; - --- 在 db1 中创建源表 -CREATE TABLE db1.events ( - timestamp DateTime, - event_type String, - user_id UInt32 -) ENGINE = MergeTree -ORDER BY timestamp; - --- 在 db2 中创建指向 db1.events 的别名 -CREATE TABLE db2.events_alias ENGINE = Alias('db1', 'events'); - --- 或使用 database.table 格式 -CREATE TABLE db2.events_alias2 ENGINE = Alias('db1.events'); - --- 两个别名的工作方式相同 -INSERT INTO db2.events_alias VALUES (now(), 'click', 100); -SELECT * FROM db2.events_alias2; -``` - -### 通过别名进行写入操作 - -所有写入操作都会转发到目标表: - -```sql -CREATE TABLE metrics ( - ts DateTime, - metric_name String, - value Float64 -) ENGINE = MergeTree -ORDER BY ts; - -CREATE TABLE metrics_alias ENGINE = Alias('metrics'); - --- 通过别名插入数据 -INSERT INTO metrics_alias VALUES - (now(), 'cpu_usage', 45.2), - (now(), 'memory_usage', 78.5); - --- 使用 SELECT 语句插入数据 -INSERT INTO metrics_alias -SELECT now(), 'disk_usage', number * 10 -FROM system.numbers -LIMIT 5; - --- 验证数据已写入目标表 -SELECT count() FROM metrics; -- 返回 7 -SELECT count() FROM metrics_alias; -- 返回 7 -``` - -### 表结构修改 - -`ALTER` 操作会修改目标表的表结构: - -```sql -CREATE TABLE users ( - id UInt32, - name String -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE users_alias ENGINE = Alias('users'); - --- 通过别名添加列 -ALTER TABLE users_alias ADD COLUMN email String DEFAULT ''; - --- 列被添加到目标表 -DESCRIBE users; -``` - -```text -┌─name──┬─type───┬─default_type─┬─default_expression─┐ -│ id │ UInt32 │ │ │ -│ name │ String │ │ │ -│ email │ String │ DEFAULT │ '' │ -└───────┴────────┴──────────────┴────────────────────┘ -``` - -### 数据变更 - -支持 `UPDATE` 和 `DELETE` 操作: - -```sql -CREATE TABLE products ( - id UInt32, - name String, - price Float64, - status String DEFAULT 'active' -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE products_alias ENGINE = Alias('products'); - -INSERT INTO products_alias VALUES - (1, 'item_one', 100.0, 'active'), - (2, 'item_two', 200.0, 'active'), - (3, 'item_three', 300.0, 'inactive'); - --- 通过别名进行更新 -ALTER TABLE products_alias UPDATE price = price * 1.1 WHERE status = 'active'; - --- 通过别名进行删除 -ALTER TABLE products_alias DELETE WHERE status = 'inactive'; - --- 变更将应用到目标表 -SELECT * FROM products ORDER BY id; -``` - -```text -┌─id─┬─name─────┬─price─┬─status─┐ -│ 1 │ item_one │ 110.0 │ active │ -│ 2 │ item_two │ 220.0 │ active │ -└────┴──────────┴───────┴────────┘ -``` - -### 分区操作 - -对于分区表,分区操作会转发: - - -```sql -CREATE TABLE logs ( - date Date, - level String, - message String -) ENGINE = MergeTree -PARTITION BY toYYYYMM(date) -ORDER BY date; - -CREATE TABLE logs_alias ENGINE = Alias('logs'); - -INSERT INTO logs_alias VALUES - ('2024-01-15', 'INFO', 'message1'), - ('2024-02-15', 'ERROR', 'message2'), - ('2024-03-15', 'INFO', 'message3'); - --- 通过别名分离分区 -ALTER TABLE logs_alias DETACH PARTITION '202402'; - -SELECT count() FROM logs_alias; -- 返回 2(分区 202402 已分离) - --- 重新附加分区 -ALTER TABLE logs_alias ATTACH PARTITION '202402'; - -SELECT count() FROM logs_alias; -- 返回 3 -``` - -### 表优化 - -OPTIMIZE 操作会在目标表中合并数据分片: - -```sql -CREATE TABLE events ( - id UInt32, - data String -) ENGINE = MergeTree -ORDER BY id; - -CREATE TABLE events_alias ENGINE = Alias('events'); - --- 多次插入创建多个数据部分 -INSERT INTO events_alias VALUES (1, 'data1'); -INSERT INTO events_alias VALUES (2, 'data2'); -INSERT INTO events_alias VALUES (3, 'data3'); - --- 检查数据部分数量 -SELECT count() FROM system.parts -WHERE database = currentDatabase() - AND table = 'events' - AND active; - --- 通过别名表优化 -OPTIMIZE TABLE events_alias FINAL; - --- 数据部分在目标表中合并 -SELECT count() FROM system.parts -WHERE database = currentDatabase() - AND table = 'events' - AND active; -- 返回 1 -``` - -### 别名管理 - -可以分别对别名进行重命名或删除: - -```sql -CREATE TABLE important_data ( - id UInt32, - value String -) ENGINE = MergeTree -ORDER BY id; - -INSERT INTO important_data VALUES (1, 'critical'), (2, 'important'); - -CREATE TABLE old_alias ENGINE = Alias('important_data'); - --- 重命名别名(目标表保持不变) -RENAME TABLE old_alias TO new_alias; - --- 为同一张表创建另一个别名 -CREATE TABLE another_alias ENGINE = Alias('important_data'); - --- 删除一个别名(目标表和其他别名保持不变) -DROP TABLE new_alias; - -SELECT * FROM another_alias; -- 仍然有效 -SELECT count() FROM important_data; -- 数据完整,返回 2 -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md deleted file mode 100644 index 531e2a971d4..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/buffer.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -description: '在写入时将数据缓存在 RAM(内存)中,并定期刷新到另一张表。在读操作时,会同时从缓冲表和另一张表中读取数据。' -sidebar_label: 'Buffer' -sidebar_position: 120 -slug: /engines/table-engines/special/buffer -title: 'Buffer 表引擎' -doc_type: 'reference' ---- - - - -# Buffer 表引擎 - -在写入时先将要写入的数据缓存在 RAM 中,并定期刷新到另一张表。读取时会同时从缓冲区和另一张表中读取数据。 - -:::note -相较于使用 Buffer 表引擎,更推荐的替代方案是启用[异步插入](/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`, 和 `max_bytes` - -用于从缓冲区刷新数据的触发条件。 - -### 可选引擎参数 - -#### `flush_time`, `flush_rows`, 和 `flush_bytes` - -在后台从缓冲区刷新数据的触发条件(省略或设为零表示没有 `flush*` 参数)。 - -当全部 `min*` 条件满足或至少一个 `max*` 条件满足时,数据会从缓冲区刷新并写入目标表。 - -另外,如果至少一个 `flush*` 条件满足,就会在后台发起一次刷新操作。这与 `max*` 不同,因为 `flush*` 允许单独配置后台刷新,以避免对写入 Buffer 表的 `INSERT` 查询增加延迟。 - -#### `min_time`, `max_time`, 和 `flush_time` - -从第一次写入缓冲区开始计算的时间(秒)条件。 - -#### `min_rows`, `max_rows`, 和 `flush_rows` - -缓冲区中行数的条件。 - -#### `min_bytes`, `max_bytes`, 和 `flush_bytes` - -缓冲区中字节数的条件。 - -在写入操作期间,数据会被插入到一个或多个随机选择的缓冲区(由 `num_layers` 配置)。或者,如果要插入的数据块足够大(大于 `max_rows` 或 `max_bytes`),则会直接写入目标表,跳过缓冲区。 - -刷新数据的条件会对每个 `num_layers` 缓冲区分别计算。比如,如果 `num_layers = 16` 且 `max_bytes = 100000000`,则最大内存占用为 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`)数据 - -例如,如果只写入了一行数据,那么在 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 表然后重新创建。在尝试对 Buffer 表执行 ALTER 之前,请确认你使用的版本中该错误已被修复。 -::: - -如果服务器异常重启,缓冲区中的数据会丢失。 - -`FINAL` 和 `SAMPLE` 在 Buffer 表上不能正确工作。这些条件会被传递到目标表,但不会用于处理缓冲区中的数据。如果必须使用这些功能,建议只对 Buffer 表执行写入操作,而从目标表进行读取。 - -向 Buffer 表添加数据时,其中一个缓冲区会被加锁。如果此时同时对该表执行读操作,就会产生延迟。 - -插入到 Buffer 表中的数据,可能以不同的顺序、不同的数据块写入从属表。因此,Buffer 表很难被正确用于向 CollapsingMergeTree 写入。为避免问题,你可以将 `num_layers` 设置为 1。 - -如果目标表是复制表(replicated table),在向 Buffer 表写入时,复制表的一些预期特性会丢失。行顺序和数据分片大小的随机变化会导致数据去重失效,这意味着无法对复制表实现可靠的 “exactly once” 写入。 - -由于这些缺点,我们只建议在少数场景中使用 Buffer 表。 - -Buffer 表适用于这样的场景:在单位时间内,从大量服务器接收到的 INSERT 请求过多,并且在插入前无法对数据进行缓冲,从而导致 INSERT 无法以足够快的速度执行。 - -注意,即使对于 Buffer 表,一次只插入一行数据也是没有意义的。这样每秒只能插入几千行,而插入更大的数据块则可以达到每秒超过一百万行。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md deleted file mode 100644 index e3fe4f14967..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/dictionary.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -description: '`Dictionary` 引擎将字典数据展示为 ClickHouse - 表。' -sidebar_label: 'Dictionary' -sidebar_position: 20 -slug: /engines/table-engines/special/dictionary -title: 'Dictionary 表引擎' -doc_type: 'reference' ---- - - - -# Dictionary 表引擎 - -`Dictionary` 引擎将 [dictionary](../../../sql-reference/dictionaries/index.md) 数据显示为 ClickHouse 表。 - - - -## 示例 - -例如,假设有一个名为 `products` 的字典,其配置如下: - -```xml - - - products - - -
products
- DSN=some-db-server - - - - 300 - 360 - - - - - - - product_id - - - title - String - - - - - -``` - -查询字典中的数据: - -```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 │ -└──────────┴──────┴────────┴─────────────────┴─────────────────┴─────────────────┴───────────────┴─────────────────┘ -``` - -你可以使用 [dictGet*](/sql-reference/functions/ext-dict-functions#dictget-dictgetordefault-dictgetornull) 函数以这种格式获取字典数据。 - -当你需要获取原始数据或执行 `JOIN` 操作时,此视图并不太有用。对于这些场景,你可以使用 `Dictionary` 引擎,它会以表格形式展示字典数据。 - -语法: - -```sql -CREATE TABLE %table_name% (%fields%) engine = Dictionary(%dictionary_name%)` -``` - -用法示例: - -```sql -CREATE TABLE products (product_id UInt64, title String) ENGINE = Dictionary(products); -``` - -好的 - -来看一下表里的内容。 - -```sql -SELECT * FROM products LIMIT 1; -``` - -```text -┌────product_id─┬─title───────────┐ -│ 152689 │ 某个商品 │ -└───────────────┴─────────────────┘ -``` - -**另请参阅** - -* [Dictionary 函数](/sql-reference/table-functions/dictionary) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md deleted file mode 100644 index 03b80031c73..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/distributed.md +++ /dev/null @@ -1,251 +0,0 @@ ---- -description: '使用 Distributed 引擎的表自身不存储任何数据,但允许在多台服务器上执行分布式查询处理。查询读取会自动并行化。在读取过程中,如果远程服务器上存在表索引,则会使用这些索引。' -sidebar_label: 'Distributed' -sidebar_position: 10 -slug: /engines/table-engines/special/distributed -title: 'Distributed 表引擎' -doc_type: 'reference' ---- - - - -# 分布式表引擎 - -:::warning 在 Cloud 中使用 Distributed 引擎 -要在 ClickHouse Cloud 中创建分布式表引擎,可以使用 [`remote` 和 `remoteSecure`](../../../sql-reference/table-functions/remote) 表函数。 -在 ClickHouse Cloud 中不能使用 `Distributed(...)` 语法。 -::: - -使用 Distributed 引擎的表本身不存储任何数据,但允许在多个服务器上进行分布式查询处理。 -读操作会自动并行执行。在读取时,如果远程服务器上存在表索引,则会使用这些索引。 - - - -## 创建表 - -```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` 表指向当前服务器上的某个表时,你可以沿用该表的表结构: - -```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, ...] -``` - -### 分布式参数 - -| Parameter | Description | -| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `cluster` | 服务器配置文件中的集群名称 | -| `database` | 远程数据库的名称 | -| `table` | 远程表的名称 | -| `sharding_key` (Optional) | 分片键。
在以下场景中必须指定 `sharding_key`:
  • 对分布式表执行 `INSERT` 时(因为表引擎需要 `sharding_key` 来确定如何拆分数据)。但是,如果启用了 `insert_distributed_one_random_shard` 设置,则 `INSERT` 不需要分片键。
  • 与 `optimize_skip_unused_shards` 配合使用时,因为需要 `sharding_key` 来确定应查询哪些分片
| -| `policy_name` (Optional) | 策略名称,将用于存储后台发送的临时文件 | - -**另请参阅** - -* [distributed_foreground_insert](../../../operations/settings/settings.md#distributed_foreground_insert) 设置 -* [MergeTree](../../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-multiple-volumes) 使用示例 - -### 分布式设置 - - -| Setting | Description | Default value | -| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -| `fsync_after_insert` | 在对 Distributed 执行后台插入后,对文件数据执行 `fsync`。保证操作系统已将本次插入的全部数据刷新到**发起节点**磁盘上的文件中。 | `false` | -| `fsync_directories` | 对目录执行 `fsync`。保证操作系统在执行与 Distributed 表后台插入相关的操作之后(插入之后、将数据发送到分片之后等)刷新了目录元数据。 | `false` | -| `skip_unavailable_shards` | 如果为 true,ClickHouse 会静默跳过不可用的分片。分片在以下情况下会被标记为不可用:1)由于连接失败无法访问该分片。2)无法通过 DNS 解析该分片。3)该分片上不存在目标表。 | `false` | -| `bytes_to_throw_insert` | 如果待后台 `INSERT` 处理的压缩字节数超过该值,将抛出异常。`0` 表示不抛出。 | `0` | -| `bytes_to_delay_insert` | 如果待后台 `INSERT` 处理的压缩字节数超过该值,查询将被延迟。`0` 表示不延迟。 | `0` | -| `max_delay_to_insert` | 当存在大量待后台发送的字节时,将数据插入 Distributed 表的最大延迟时间(秒)。 | `60` | -| `background_insert_batch` | 等同于 [`distributed_background_insert_batch`](../../../operations/settings/settings.md#distributed_background_insert_batch) | `0` | -| `background_insert_split_batch_on_failure` | 等同于 [`distributed_background_insert_split_batch_on_failure`](../../../operations/settings/settings.md#distributed_background_insert_split_batch_on_failure) | `0` | -| `background_insert_sleep_time_ms` | 等同于 [`distributed_background_insert_sleep_time_ms`](../../../operations/settings/settings.md#distributed_background_insert_sleep_time_ms) | `0` | -| `background_insert_max_sleep_time_ms` | 等同于 [`distributed_background_insert_max_sleep_time_ms`](../../../operations/settings/settings.md#distributed_background_insert_max_sleep_time_ms) | `0` | -| `flush_on_detach` | 在执行 `DETACH` / `DROP` / 服务器关闭时,将数据刷新到远程节点。 | `true` | - -:::note -**耐久性设置**(`fsync_...`): - -* 仅影响后台 `INSERT`(即 `distributed_foreground_insert=false`),当数据首先存储在发起节点磁盘上,随后在后台被发送到各分片时生效。 -* 可能显著降低 `INSERT` 性能 -* 影响将存储在 Distributed 表目录中的数据写入到**接收你插入请求的节点**。如果你需要对底层 MergeTree 表的写入提供保证,请参阅 `system.merge_tree_settings` 中的耐久性设置(`...fsync...`) - -关于**插入限制设置**(`..._insert`)另见: - -* [`distributed_foreground_insert`](../../../operations/settings/settings.md#distributed_foreground_insert) 设置 -* [`prefer_localhost_replica`](/operations/settings/settings#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()`。 - - -## 集群 - -集群是在[服务器配置文件](../../../operations/configuration-files.md)中配置的: - -```xml - - - - - - - - - - - 1 - - shard_01 - - false - - - 1 - example01-01-1 - 9000 - - - example01-01-2 - 9000 - - - - 2 - shard_02 - false - - example01-02-1 - 9000 - - - example01-02-2 - 1 - 9440 - - - - -``` - -这里定义了一个名为 `logs` 的集群,它由两个分片组成,其中每个分片包含两个副本。分片指的是包含不同数据部分的服务器(要读取全部数据,必须访问所有分片)。副本是用于数据冗余的复制服务器(要读取全部数据,可以访问任意一个副本上的数据)。 - -集群名称中不能包含句点(.)字符。 - -参数 `host`、`port`,以及可选的 `user`、`password`、`secure`、`compression`、`bind_host` 需要为每台服务器单独指定: - - -| Parameter | Description | Default Value | -|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------| -| `host` | 远程服务器的地址。可以使用域名或 IPv4/IPv6 地址。如果指定域名,服务器在启动时会发起一次 DNS 请求,并在服务器运行期间缓存该结果。如果 DNS 请求失败,服务器将无法启动。如果更改了 DNS 记录,需要重启服务器。 | - | -| `port` | 用于客户端通信的 TCP 端口(配置中的 `tcp_port`,通常设置为 9000)。不要与 `http_port` 混淆。 | - | -| `user` | 用于连接远程服务器的用户名。该用户必须拥有连接到指定服务器的权限。访问控制在 `users.xml` 文件中配置。更多信息,参见 [Access rights](../../../guides/sre/user-management/index.md) 部分。 | `default` | -| `password` | 用于连接远程服务器的密码(不会被掩码)。 | '' | -| `secure` | 是否使用安全的 SSL/TLS 连接。通常还需要显式指定端口(默认安全端口为 `9440`)。服务器应监听 `9440`,并正确配置证书。 | `false` | -| `compression` | 是否使用数据压缩。 | `true` | -| `bind_host` | 从当前节点连接到远程服务器时使用的源地址。仅支持 IPv4 地址。适用于需要为 ClickHouse 分布式查询设置源 IP 地址的高级部署场景。 | - | - -在指定副本时,读取时会为每个分片选择一个可用的副本。可以配置负载均衡算法(优先访问哪一个副本)——参见 [load_balancing](../../../operations/settings/settings.md#load_balancing) 设置。如果无法与服务器建立连接,将以较短的超时时间尝试建立连接。如果连接失败,将选择下一个副本,对所有副本依次尝试。如果对所有副本的连接尝试都失败,则会以相同方式重复多次尝试。这有助于提升系统的可靠性,但不能提供完全的容错能力:远程服务器可能会接受连接,但可能无法正常工作,或工作不佳。 - -可以只指定一个分片(在这种情况下,该查询处理应称为 remote,而不是 distributed),也可以指定任意数量的分片。在每个分片内,可以指定从一个到任意数量的副本。对于每个分片,都可以指定不同数量的副本。 - -可以在配置中指定任意数量的集群。 - -要查看集群,请使用 `system.clusters` 表。 - -`Distributed` 引擎允许像操作本地服务器一样操作集群。但是,集群的配置不能动态指定,必须在服务器配置文件中进行配置。通常,集群中的所有服务器会使用相同的集群配置(但这不是强制要求)。来自配置文件的集群会在运行时被更新,无需重启服务器。 - -如果每次都需要向一组未知的分片和副本发送查询,则不需要创建 `Distributed` 表——改用 `remote` 表函数。参见 [Table functions](../../../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()` 来随机分布数据,或者使用 `UserID` 按用户 ID 取余来分布数据(这样单个用户的数据会位于同一个分片上,便于基于用户执行 `IN` 和 `JOIN`)。如果某个列的分布不够均匀,可以将其包裹在哈希函数中,例如 `intHash64(UserID)`。 - -简单的取余分片方案是一种受限的解决方案,并不总是合适。它适用于中等和大规模数据量(数十台服务器),但不适用于超大规模数据量(数百台服务器或更多)。在后一种情况下,应根据业务领域需求设计分片方案,而不是依赖 `Distributed` 表中的记录。 - -在以下情况中,需要特别关注分片方案: - - - -- 在执行需要按特定键进行数据关联(`IN` 或 `JOIN`)的查询时,如果数据按该键进行了分片,就可以使用本地的 `IN` 或 `JOIN` 来代替 `GLOBAL IN` 或 `GLOBAL JOIN`,这样效率要高得多。 -- 在使用大量服务器(数百台或更多)并伴随大量小查询的场景下,例如针对单个客户(如网站、广告主或合作伙伴)数据的查询,为了避免这些小查询影响整个集群,将单个客户的数据放置在单个分片上是合理的选择。或者,可以设置两级分片:将整个集群划分为多个“层”,每一层可以由多个分片组成。单个客户的数据位于单个层中,但可以按需向该层添加分片,数据在该层内的分片之间随机分布。为每个层创建各自的 `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/server-configuration-parameters/settings#background_distributed_schedule_pool_size) 设置来指定。 - -如果服务器在对 `Distributed` 表执行 `INSERT` 之后宕机或发生了异常重启(例如由于硬件故障),插入的数据可能会丢失。如果在表目录中检测到损坏的数据部分,它会被移动到 `broken` 子目录中并不再使用。 - - - -## 读取数据 {#distributed-reading-data} - -在查询 `Distributed` 表时,`SELECT` 查询会被发送到所有分片,并且无论数据如何分布在这些分片上(可以是完全随机分布),都可以正常工作。添加新分片时,无需将旧数据迁移到其中。相反,你可以通过为该分片指定更大的权重,将新数据写入其中——这样数据分布会略有不均,但查询仍能正确且高效地执行。 - -当启用 `max_parallel_replicas` 选项时,查询处理会在单个分片内的所有副本之间并行化。有关更多信息,请参阅 [max_parallel_replicas](../../../operations/settings/settings.md#max_parallel_replicas) 一节。 - -要了解分布式 `in` 和 `global in` 查询的处理方式,请参阅[此处](/sql-reference/operators/in#distributed-subqueries)的文档。 - - - -## 虚拟列 {#virtual-columns} - -#### _Shard_num {#_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/server-configuration-parameters/settings#background_distributed_schedule_pool_size) 设置 -- [`shardNum()`](../../../sql-reference/functions/other-functions.md#shardNum) 和 [`shardCount()`](../../../sql-reference/functions/other-functions.md#shardCount) 函数 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md deleted file mode 100644 index 7a5c4cf69ce..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/executable.md +++ /dev/null @@ -1,234 +0,0 @@ ---- -description: '`Executable` 和 `ExecutablePool` 表引擎允许你定义一张表,其行由你编写的脚本生成(脚本通过向 **stdout** 写入行)。' -sidebar_label: 'Executable/ExecutablePool' -sidebar_position: 40 -slug: /engines/table-engines/special/executable -title: 'Executable 和 ExecutablePool 表引擎' -doc_type: 'reference' ---- - - - -# Executable 和 ExecutablePool 表引擎 - -`Executable` 和 `ExecutablePool` 表引擎允许你定义一张表,其行由你编写的脚本生成(通过向 **stdout** 写入行)。可执行脚本存储在 `users_scripts` 目录中,并且可以从任意数据源读取数据。 - -- `Executable` 表:每次查询都会运行脚本 -- `ExecutablePool` 表:维护一个持久进程池,并从池中获取进程来执行读取操作 - -你还可以选择性地添加一个或多个输入查询,将其结果以流式方式写入 **stdin**,供脚本读取。 - - - -## 创建 `Executable` 表 - -`Executable` 表引擎需要两个参数:脚本名称和输入数据的格式。你还可以可选地传入一个或多个输入查询: - -```sql -可执行文件(script_name, format, [input_query...]) -``` - -以下是 `Executable` 表的相关设置: - -* `send_chunk_header` - * Description: 在发送要处理的数据块之前,先发送每个数据块中的行数。此设置可以帮助你更高效地编写脚本,从而提前预分配一些资源 - * Default value: false -* `command_termination_timeout` - * Description: 命令终止超时时间(秒) - * Default value: 10 -* `command_read_timeout` - * Description: 从命令 stdout 读取数据的超时时间(毫秒) - * Default value: 10000 -* `command_write_timeout` - * Description: 向命令 stdin 写入数据的超时时间(毫秒) - * Default value: 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='') - - # 将结果刷新到标准输出 - sys.stdout.flush() - -if __name__ == "__main__": - main() -``` - -下面的 `my_executable_table` 是由 `my_script.py` 的输出构建而成的,每次你对 `my_executable_table` 执行一次 `SELECT` 查询时,`my_script.py` 都会生成 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` 可用于判断评论是正面、负面还是中性,并为其打分,分值范围在 -1(极度负面评论)到 1(极度正面评论)之间。我们来创建一个 `Executable` 表,使用 `nltk` 计算 Hacker News 评论的情感。 - -本示例使用了 [此处](/engines/table-engines/mergetree-family/invertedindexes/#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` 中选取两列。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` 格式并包含两列,因此我们的 `print` 函数通过制表符来分隔这两列 - -每次你编写一个从 `sentiment` 表中选取行的查询时,都会执行 `SELECT id, comment FROM hackernews WHERE id > 0 AND comment != '' LIMIT 20` 查询,并将结果传递给 `sentiment.py`。我们来测试一下: - -```sql -SELECT * -FROM sentiment -``` - -响应如下: - - -```response -┌───────id─┬─情感值────┐ -│ 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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md deleted file mode 100644 index 0353a40ee42..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/external-data.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -description: 'ClickHouse 允许在发送 `SELECT` 查询的同时,将处理该查询所需的数据一并发送到服务器。该数据会被放入一张临时表中,并且可以在查询中使用(例如在 `IN` 运算符中)。' -sidebar_label: '用于查询处理的外部数据' -sidebar_position: 130 -slug: /engines/table-engines/special/external-data -title: '用于查询处理的外部数据' -doc_type: 'reference' ---- - -# 用于查询处理的外部数据 - -ClickHouse 允许在发送 `SELECT` 查询时,将查询处理所需的数据一并发送到服务器。此数据会被放入一张临时表(参见“临时表”一节),并且可以在查询中使用(例如用于 `IN` 运算符)。 - -例如,如果你有一个包含重要用户标识符的文本文件,可以在执行按该列表进行过滤的查询时,将该文件一并上传到服务器。 - -如果你需要在包含大量外部数据的场景下运行多条查询,请不要使用此功能。更好的做法是预先将数据导入数据库。 - -外部数据可以通过命令行客户端(非交互模式)上传,或者通过 HTTP 接口上传。 - -在命令行客户端中,你可以按如下格式指定一个参数部分 - -```bash ---external --file=... [--name=...] [--format=...] [--types=...|--structure=...] -``` - -对于要传输的每个表,你可以有像这样的一段配置。 - -**–external** – 标志一个子句的开始。 -**–file** – 包含表转储的文件路径,或者 -,表示使用标准输入(stdin)。 -只能从标准输入中获取单个表。 - -以下参数是可选的:**–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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md deleted file mode 100644 index e916851dad6..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/file.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -description: 'File 表引擎将数据保存在采用受支持的文件格式(`TabSeparated`、`Native` 等)之一的文件中。' -sidebar_label: 'File' -sidebar_position: 40 -slug: /engines/table-engines/special/file -title: 'File 表引擎' -doc_type: 'reference' ---- - - - -# File 表引擎 - -`File` 表引擎将数据保存在一个文件中,文件使用受支持的[文件格式](/interfaces/formats#formats-overview)之一(如 `TabSeparated`、`Native` 等)。 - -使用场景: - -- 将数据从 ClickHouse 导出到文件。 -- 将数据从一种格式转换为另一种格式。 -- 通过编辑磁盘上的文件来更新 ClickHouse 中的数据。 - -:::note -该引擎目前在 ClickHouse Cloud 中不可用,请[改用 S3 表函数](/sql-reference/table-functions/s3.md)。 -::: - - - -## 在 ClickHouse 服务器中的使用 - -```sql -File(Format) -``` - -`Format` 参数指定可用文件格式之一。要执行 `SELECT` 查询,该格式必须支持输入;要执行 `INSERT` 查询,该格式必须支持输出。可用格式列在 [Formats](/interfaces/formats#formats-overview) 部分。 - -ClickHouse 不允许为 `File` 指定文件系统路径。它将使用服务器配置中 [path](../../../operations/server-configuration-parameters/settings.md) 设置所定义的目录。 - -使用 `File(Format)` 创建表时,会在该目录中创建一个空的子目录。将数据写入该表时,数据会被写入该子目录中的 `data.Format` 文件。 - -你可以在服务器文件系统中手动创建这个子目录和文件,然后使用与其名称匹配的表信息对其执行 [ATTACH](../../../sql-reference/statements/attach.md) 操作,这样就可以从该文件中查询数据。 - -:::note -请谨慎使用此功能,因为 ClickHouse 不会跟踪对此类文件的外部修改。通过 ClickHouse 和 ClickHouse 之外同时对其进行写入的结果是未定义的。 -::: - - -## 示例 - -**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 中的用法 - -在 [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 表达式中的第一列)。 - -要按月进行分区,使用 `toYYYYMM(date_column)` 表达式,其中 `date_column` 是一个类型为 [Date](/sql-reference/data-types/date.md) 的日期列。此时分区名称采用 `"YYYYMM"` 格式。 - - - -## 虚拟列 {#virtual-columns} - -- `_path` — 文件路径。类型:`LowCardinality(String)`。 -- `_file` — 文件名。类型:`LowCardinality(String)`。 -- `_size` — 文件大小(以字节为单位)。类型:`Nullable(UInt64)`。如果大小未知,则值为 `NULL`。 -- `_time` — 文件的最后修改时间。类型:`Nullable(DateTime)`。如果时间未知,则值为 `NULL`。 - - - -## 设置 {#settings} - -- [engine_file_empty_if_not_exists](/operations/settings/settings#engine_file_empty_if_not_exists) - 允许在文件不存在时返回空结果。默认禁用。 -- [engine_file_truncate_on_insert](/operations/settings/settings#engine_file_truncate_on_insert) - 允许在插入数据前截断文件。默认禁用。 -- [engine_file_allow_create_multiple_files](/operations/settings/settings.md#engine_file_allow_create_multiple_files) - 如果格式带有后缀,允许在每次插入时创建一个新文件。默认禁用。 -- [engine_file_skip_empty_files](/operations/settings/settings.md#engine_file_skip_empty_files) - 允许在读取时跳过空文件。默认禁用。 -- [storage_file_read_method](/operations/settings/settings#engine_file_empty_if_not_exists) - 从存储文件读取数据的方法,可选值:`read`、`pread`、`mmap`。`mmap` 方法不适用于 clickhouse-server(用于 clickhouse-local)。默认值:clickhouse-server 为 `pread`,clickhouse-local 为 `mmap`。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md deleted file mode 100644 index 34e711e0ae7..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/filelog.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -description: '此引擎允许将应用日志文件以记录流的形式进行处理。' -sidebar_label: 'FileLog' -sidebar_position: 160 -slug: /engines/table-engines/special/filelog -title: 'FileLog 表引擎' -doc_type: 'reference' ---- - - - -# FileLog 表引擎 {#filelog-engine} - -该引擎允许将应用程序日志文件作为一条记录流进行处理。 - -`FileLog` 可以: - -- 订阅日志文件。 -- 在新记录追加到已订阅的日志文件时对其进行处理。 - - - -## 创建表 - -```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#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 引擎的错误处理方式。可选值:`default`(如果解析消息失败则抛出异常)、`stream`(异常信息和原始消息将保存在虚拟列 `_error` 和 `_raw_message` 中)。 - - -## 描述 - -已送达的记录会被自动跟踪,因此日志文件中的每条记录只会被计数一次。 - -`SELECT` 对于读取记录并不是特别有用(除调试外),因为每条记录只能被读取一次。更实用的方式是使用[物化视图](../../../sql-reference/statements/create/view.md)来创建实时处理流水线。要做到这一点: - -1. 使用该引擎创建一个 FileLog 表,并将其视为数据流。 -2. 创建一个具有所需结构的表。 -3. 创建一个物化视图,将来自引擎的数据转换后写入先前创建的表中。 - -当 `MATERIALIZED VIEW` 附加到该引擎时,它会开始在后台收集数据。这使您能够持续地从日志文件中接收记录,并使用 `SELECT` 将其转换为所需的格式。 -一个 FileLog 表可以拥有任意数量的物化视图,它们并不直接从该表读取数据,而是接收新的记录(以数据块的形式接收),这样可以向多个具有不同明细级别(带分组聚合和不带分组聚合)的表中写入数据。 - -示例: - -```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; -``` - -要停止接收流式数据或修改转换逻辑,请分离该物化视图: - -```sql - DETACH TABLE consumer; - ATTACH TABLE consumer; -``` - -如果你想使用 `ALTER` 更改目标表,建议先禁用该物化视图,以避免目标表与视图数据之间出现不一致。 - - -## 虚拟列 {#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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md deleted file mode 100644 index 8b101c88712..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/generate.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -description: 'GenerateRandom 表引擎根据给定的表结构生成随机数据。' -sidebar_label: 'GenerateRandom' -sidebar_position: 140 -slug: /engines/table-engines/special/generate -title: 'GenerateRandom 表引擎' -doc_type: 'reference' ---- - - - -# GenerateRandom 表引擎 - -`GenerateRandom` 表引擎根据给定的表结构生成随机数据。 - -使用示例: - -- 在测试中用于填充可复现的大规模表数据。 -- 为模糊测试(fuzzing)生成随机输入。 - - - -## 在 ClickHouse Server 中的使用 - -```sql -ENGINE = GenerateRandom([random_seed [,max_string_length [,max_array_length]]]) -``` - -`max_array_length` 和 `max_string_length` 参数分别指定在生成的数据中,所有数组或 map 列以及字符串的最大长度。 - -`Generate` 表引擎仅支持 `SELECT` 查询。 - -它支持所有可以存储在表中的 [DataTypes](../../../sql-reference/data-types/index.md),`AggregateFunction` 类型除外。 - - -## 示例 - -**1.** 创建 `generate_engine_table` 表: - -```sql -CREATE TABLE generate_engine_table (name String, value UInt32) ENGINE = GenerateRandom(1, 5, 3) -``` - -**2.** 查询数据: - -```sql -SELECT * FROM generate_engine_table LIMIT 3 -``` - -```text -┌─name─┬──────value─┐ -│ c4xJ │ 1412771199 │ -│ r │ 1791099446 │ -│ 7#$ │ 124312908 │ -└──────┴────────────┘ -``` - - -## 实现细节 {#details-of-implementation} - -- 不支持: - - `ALTER` - - `SELECT ... SAMPLE` - - `INSERT` - - 索引 - - 复制 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md deleted file mode 100644 index 52362661982..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/index.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -description: '特殊表引擎相关文档' -sidebar_label: '特殊' -sidebar_position: 50 -slug: /engines/table-engines/special/ -title: '特殊表引擎' -doc_type: 'reference' ---- - - - -# 特殊表引擎 - -表引擎主要分为三大类: - -* [MergeTree 引擎家族](../../../engines/table-engines/mergetree-family/index.md),用于主要的生产场景。 -* [Log 引擎家族](../../../engines/table-engines/log-family/index.md),用于小规模的临时数据。 -* [用于集成的表引擎](../../../engines/table-engines/integrations/index.md)。 - -其余引擎在用途上各不相同,目前尚未归入某个家族,因此被归类到这个「特殊」类别中。 - -{/* 本页的目录表由以下脚本自动生成: - https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh - 该脚本会根据 YAML front matter 字段:slug、description、title 生成目录。 - - 如果发现错误,请直接编辑对应页面的 YAML front matter。 - */ } - - -{/*AUTOGENERATED_START*/ } - -| Page | Description | -| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -| [Alias table engine](/engines/table-engines/special/alias) | Alias 表引擎创建到另一张表的透明代理。所有操作都会被转发到目标表,而别名本身不存储任何数据。 | -| [Distributed table engine](/engines/table-engines/special/distributed) | 使用 Distributed 引擎的表本身不存储任何数据,但允许在多台服务器上进行分布式查询处理。读取会自动并行化。在读取期间,如果远程服务器上有表索引,则会使用这些索引。 | -| [Dictionary table engine](/engines/table-engines/special/dictionary) | `Dictionary` 引擎将字典数据展示为一张 ClickHouse 表。 | -| [Merge table engine](/engines/table-engines/special/merge) | `Merge` 引擎(不要与 `MergeTree` 混淆)本身不存储数据,但允许同时从任意数量的其他表中读取数据。 | -| [Executable and ExecutablePool table engines](/engines/table-engines/special/executable) | `Executable` 和 `ExecutablePool` 表引擎允许定义一张表,其行由你定义的脚本生成(通过向 **stdout** 写入行)。 | -| [File table engine](/engines/table-engines/special/file) | File 表引擎将数据保存在文件中,文件格式为支持的格式之一(`TabSeparated`、`Native` 等)。 | -| [Null table engine](/engines/table-engines/special/null) | 向 `Null` 表写入时,数据会被忽略。从 `Null` 表读取时,响应为空。 | -| [Set table engine](/engines/table-engines/special/set) | 始终存储在 RAM 中的数据集。它旨在用于 `IN` 运算符的右侧。 | -| [Join table engine](/engines/table-engines/special/join) | 用于 JOIN 操作的可选预构建数据结构。 | -| [URL table engine](/engines/table-engines/special/url) | 从远程 HTTP/HTTPS 服务器读取或写入数据。此引擎类似于 File 引擎。 | -| [View table engine](/engines/table-engines/special/view) | 用于实现视图(更多信息请参见 `CREATE VIEW query`)。它不存储数据,而只存储指定的 `SELECT` 查询。从该表读取时,会运行此查询(并从查询中删除所有不需要的列)。 | -| [Memory table engine](/engines/table-engines/special/memory) | Memory 引擎以未压缩形式将数据存储在 RAM 中。数据以读取时接收到的完全相同形式存储。换句话说,从此表中读取几乎不消耗资源。 | -| [Buffer table engine](/engines/table-engines/special/buffer) | 在 RAM 中对要写入的数据进行缓冲,并定期将其刷新到另一张表中。在读取操作期间,会同时从缓冲区和另一张表中读取数据。 | -| [External data for query processing](/engines/table-engines/special/external-data) | ClickHouse 允许在发送 `SELECT` 查询时,连同查询一起向服务器发送处理该查询所需的数据。此数据会被放入一张临时表中,并可在查询中使用(例如在 `IN` 运算符中)。 | -| [GenerateRandom table engine](/engines/table-engines/special/generate) | GenerateRandom 表引擎根据给定的表结构生成随机数据。 | -| [KeeperMap table engine](/engines/table-engines/special/keeper-map) | 此引擎允许将 Keeper/ZooKeeper 集群用作一致性的键值存储,提供线性化写入和顺序一致的读取。 | -| [FileLog table engine](/engines/table-engines/special/filelog) | 此引擎允许将应用程序日志文件作为记录流进行处理。 | - -{/*AUTOGENERATED_END*/ } diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md deleted file mode 100644 index 4fa163e1f1a..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/join.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -description: '用于 JOIN 操作的可选预构建数据结构。' -sidebar_label: 'Join' -sidebar_position: 70 -slug: /engines/table-engines/special/join -title: 'Join 表引擎' -doc_type: 'reference' ---- - - - -# Join 表引擎 - -用于 [JOIN](/sql-reference/statements/select/join) 操作的可选预构建数据结构。 - -:::note -在 ClickHouse Cloud 中,如果服务创建时使用的版本早于 25.4,则需要通过 `SET compatibility=25.4` 将兼容性级别设置为不低于 25.4。 -::: - - - -## 创建表 - -```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](/sql-reference/statements/create/table) 查询的详细描述。 - - -## 引擎参数 {#engine-parameters} - -### `join_strictness` {#join_strictness} - -`join_strictness` – [JOIN 严格性](/sql-reference/statements/select/join#supported-types-of-join)。 - -### `join_type` {#join_type} - -`join_type` – [JOIN 类型](/sql-reference/statements/select/join#supported-types-of-join)。 - -### 键列 {#key-columns} - -`k1[, k2, ...]` – 来自 `USING` 子句的键列,`JOIN` 操作基于这些列进行。 - -输入 `join_strictness` 和 `join_type` 参数时不要使用引号,例如 `Join(ANY, LEFT, col1)`。它们必须与该表将要使用的 `JOIN` 操作相匹配。如果参数不匹配,ClickHouse 不会抛出异常,并且可能返回错误的数据。 - - - -## 细节与建议 {#specifics-and-recommendations} - -### 数据存储 {#data-storage} - -`Join` 表的数据始终位于内存(RAM)中。向表中插入行时,ClickHouse 会将数据块写入磁盘上的目录,以便在服务器重启时可以进行恢复。 - -如果服务器未正常重启,磁盘上的数据块可能会丢失或损坏。在这种情况下,可能需要手动删除包含损坏数据的文件。 - -### 查询与插入数据 {#selecting-and-inserting-data} - -可以使用 `INSERT` 查询向 `Join` 引擎表中添加数据。如果表在创建时使用了 `ANY` 严格性,则会忽略重复键的数据。在 `ALL` 严格性下,所有行都会被添加。 - -`Join` 引擎表的主要使用场景如下: - -- 将表放在 `JOIN` 子句的右侧。 -- 调用 [joinGet](/sql-reference/functions/other-functions.md/#joinGet) 函数,以与从字典中提取数据相同的方式从表中提取数据。 - -### 删除数据 {#deleting-data} - -针对 `Join` 引擎表的 `ALTER DELETE` 查询是作为[变更(mutation)](/sql-reference/statements/alter/index.md#mutations)实现的。`DELETE` 变更会读取过滤后的数据,并覆盖内存和磁盘中的数据。 - -### 限制与设置 {#join-limitations-and-settings} - -创建表时,会应用以下设置: - -#### `join_use_nulls` {#join_use_nulls} - -[join_use_nulls](/operations/settings/settings.md/#join_use_nulls) - -#### `max_rows_in_join` {#max_rows_in_join} - -[max_rows_in_join](/operations/settings/settings#max_rows_in_join) - -#### `max_bytes_in_join` {#max_bytes_in_join} - -[max_bytes_in_join](/operations/settings/settings#max_bytes_in_join) - -#### `join_overflow_mode` {#join_overflow_mode} - -[join_overflow_mode](/operations/settings/settings#join_overflow_mode) - -#### `join_any_take_last_row` {#join_any_take_last_row} - -[join_any_take_last_row](/operations/settings/settings.md/#join_any_take_last_row) -#### `join_use_nulls` {#join_use_nulls-1} - -#### Persistent {#persistent} - -为 Join 和 [Set](/engines/table-engines/special/set.md) 表引擎禁用持久化。 - -降低 I/O 开销。适用于追求性能但不需要持久化的场景。 - -可能的取值: - -- 1 — 启用。 -- 0 — 禁用。 - -默认值:`1`。 - -`Join` 引擎表不能用于 `GLOBAL JOIN` 操作。 - -`Join` 引擎允许在 `CREATE TABLE` 语句中指定 [join_use_nulls](/operations/settings/settings.md/#join_use_nulls) 设置。[SELECT](/sql-reference/statements/select/index.md) 查询必须使用相同的 `join_use_nulls` 值。 - - - -## 用法示例 - -创建左侧的表: - -```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/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md deleted file mode 100644 index 6c33ab3835a..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/keepermap.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -description: '此引擎允许你将 Keeper/ZooKeeper 集群用作具有线性化写入和顺序一致性读取的一致性键值存储。' -sidebar_label: 'KeeperMap' -sidebar_position: 150 -slug: /engines/table-engines/special/keeper-map -title: 'KeeperMap 表引擎' -doc_type: 'reference' ---- - - - -# KeeperMap 表引擎 - -此引擎允许你将 Keeper/ZooKeeper 集群用作一致性的键值存储,支持线性化写入和顺序一致的读取。 - -要启用 KeeperMap 存储引擎,你需要通过 `` 配置项定义用于存放表的 ZooKeeper 路径。 - -例如: - -```xml - - /keeper_map_tables - -``` - -其中 `path` 可以是任意其他有效的 ZooKeeper 路径。 - - -## 创建数据表 - -```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_name` 是在 `` 配置中定义的 ZooKeeper 集群名称。\ - 默认情况下,使用在 `` 配置中定义的 ZooKeeper 集群。 -* `keys_limit` - 表中允许存在的键数量。\ - 该限制是软限制,在某些极端情况下,表中可能会出现更多的键。 -* `primary_key_name` – 列表中的任意列名。 -* 必须指定 `primary key`,并且主键只支持单列。主键将以二进制形式序列化为 ZooKeeper 中的 `node name`(节点名)。 -* 主键以外的列将按对应顺序序列化为二进制,并作为由序列化键定义的结果节点的值进行存储。 -* 带有 `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`,以达到相同的数据共享效果。 - - -## 支持的操作 - -### 插入 - -当向 `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; -``` - - -## 相关内容 {#related-content} - -- 博客文章:[使用 ClickHouse 和 Hex 构建实时分析应用](https://clickhouse.com/blog/building-real-time-applications-with-clickhouse-and-hex-notebook-keeper-engine) diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md deleted file mode 100644 index 71e37e79d82..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/memory.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -description: 'Memory 引擎以未压缩形式将数据存储在内存(RAM)中。数据的存储形式与写入时接收到的形式完全相同。换句话说,从该表中读取数据没有任何额外开销。' -sidebar_label: 'Memory' -sidebar_position: 110 -slug: /engines/table-engines/special/memory -title: 'Memory 表引擎' -doc_type: 'reference' ---- - - - -# Memory 表引擎 - -:::note -在 ClickHouse Cloud 上使用 Memory 表引擎时,数据出于设计原因不会在所有节点之间复制。若要保证所有查询都被路由到同一节点,并使 Memory 表引擎按预期工作,可以采用以下任一方式: -- 在同一个会话中执行所有操作 -- 使用通过 TCP 或原生接口(支持粘性连接)的客户端,例如 [clickhouse-client](/interfaces/cli) -::: - -Memory 引擎以未压缩形式将数据存储在 RAM 中。数据以与读取时接收到的完全相同的形式存储。换句话说,从该表中读取几乎没有任何开销。 -并发数据访问是同步的。锁的持有时间非常短:读写操作不会互相阻塞。 -不支持索引。读取会被并行化。 - -在简单查询上可以达到最高性能(超过 10 GB/sec),因为没有磁盘读取、解压缩或数据反序列化的开销。(需要指出的是,在很多情况下,MergeTree 引擎的性能几乎同样高。) -当服务器重启时,表中的数据会消失,表将变为空表。 -通常情况下,没有使用该表引擎的充分理由。不过,它可以用于测试,以及在行数相对较少(大约不超过 100,000,000 行)且对极致性能有要求的任务中。 - -Memory 引擎被系统用于带有外部查询数据的临时表(参见“External data for processing a query”一节),以及实现 `GLOBAL IN`(参见“IN operators”一节)。 - -可以指定上限和下限来限制 Memory 引擎表的大小,从而有效地使其充当一个环形缓冲区(参见 [Engine Parameters](#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` -- `compress` - 是否在内存中对数据进行压缩。 - - 默认值:`false` - - - -## 使用说明 - -**初始化配置** - -```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` 所定义的最低限制。 - - -## 示例 - -```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 字节 - 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 行 - -/* 2. 添加不会被删除的数据块 */ -INSERT INTO memory SELECT * FROM numbers(1000, 100); -- 100 行 - -/* 3. 测试最旧的数据块被删除 - 9216 字节 - 1100 */ -INSERT INTO memory SELECT * FROM numbers(9000, 1000); -- 1'000 行 - -/* 4. 验证超大数据块会覆盖所有现有数据 */ -INSERT INTO memory SELECT * FROM numbers(9000, 10000); -- 10'000 行 - -SELECT total_bytes, total_rows FROM system.tables WHERE name = 'memory' AND database = currentDatabase(); -``` - -```text -┌─total_bytes─┬─total_rows─┐ -│ 65536 │ 10000 │ -└─────────────┴────────────┘ -``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md deleted file mode 100644 index 9c836320bcd..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/merge.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -description: '`Merge` 引擎(不要与 `MergeTree` 混淆)本身不存储数据,而是允许同时从任意数量的其他表中读取数据。' -sidebar_label: 'Merge' -sidebar_position: 30 -slug: /engines/table-engines/special/merge -title: 'Merge 表引擎' -doc_type: 'reference' ---- - - - -# Merge 表引擎 - -`Merge` 引擎(不要与 `MergeTree` 混淆)自身不存储数据,而是允许同时从任意数量的其他表中读取数据。 - -读取会自动并行执行。不支持向该表写入数据。读取时,如果被实际读取的表存在索引,则会使用这些索引。 - - - -## 创建表 - -```sql -CREATE TABLE ... 引擎=Merge(db_name, tables_regexp) -``` - - -## 引擎参数 {#engine-parameters} - -### `db_name` {#db_name} - -`db_name` — 可能的取值包括: - - 数据库名称, - - 返回数据库名称字符串的常量表达式,例如 `currentDatabase()`, - - `REGEXP(expression)`,其中 `expression` 是用于匹配数据库名称的正则表达式。 - -### `tables_regexp` {#tables_regexp} - -`tables_regexp` — 用于在指定数据库(单个或多个)中匹配表名的正则表达式。 - -正则表达式引擎 — [re2](https://github.com/google/re2)(支持 PCRE 的子集),区分大小写。 -关于在正则表达式中转义字符的说明,请参见 “match” 部分。 - - - -## 使用方法 {#usage} - -在选择要读取的表时,即使 `Merge` 表名本身匹配正则表达式,也不会被选中。这是为了避免形成循环。 -确实可以创建两个 `Merge` 表,让它们无休止地尝试互相读取数据,但这并不是一个好主意。 - -`Merge` 引擎的典型用法是将大量 `TinyLog` 表当作一张表来处理。 - - - -## 示例 - -**示例 1** - -假设有两个数据库 `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 -ORDER BY (date, UserId, EventType); - -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)。 - - 如果在 `_table` 上进行过滤(例如 `WHERE _table='xyz'`),则只会从满足过滤条件的表中读取数据。 - -- `_database` — 读取数据的数据库名。类型:[String](../../../sql-reference/data-types/string.md)。 - -**另请参阅** - -- [虚拟列](../../../engines/table-engines/index.md#table_engines-virtual_columns) -- [merge](../../../sql-reference/table-functions/merge.md) 表函数 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md deleted file mode 100644 index 5747c28ffc3..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/null.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -description: '向 `Null` 表写入时,数据会被忽略。从 `Null` 表读取时,结果为空。' -sidebar_label: 'Null' -sidebar_position: 50 -slug: /engines/table-engines/special/null -title: 'Null 表引擎' -doc_type: 'reference' ---- - -# Null 表引擎 - -当向 `Null` 表写入数据时,这些数据会被忽略。 -当从 `Null` 表读取数据时,返回结果是空的。 - -`Null` 表引擎适用于在数据转换后不再需要原始数据的场景。 -为此,可以在 `Null` 表上创建一个物化视图。 -写入该表的数据将会被视图消费,但原始数据会被丢弃。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md deleted file mode 100644 index c173222b514..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/set.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -description: '始终保存在 RAM 中的数据集。用于作为 `IN` 运算符右侧的操作数。' -sidebar_label: 'Set' -sidebar_position: 60 -slug: /engines/table-engines/special/set -title: 'Set 表引擎' -doc_type: 'reference' ---- - - - -# Set 表引擎 - -:::note -在 ClickHouse Cloud 中,如果服务创建时使用的版本早于 25.4,则需要使用 `SET compatibility=25.4` 将兼容性设置为至少 25.4。 -::: - -一个始终驻留在 RAM 中的数据集。它用于 `IN` 运算符的右侧(参见 “IN operators” 章节)。 - -你可以使用 `INSERT` 向表中插入数据。新元素将被添加到数据集中,而重复元素会被忽略。 -但是你不能对该表执行 `SELECT`。检索数据的唯一方式是将其用于 `IN` 运算符的右半部分。 - -数据始终位于 RAM 中。对于 `INSERT` 操作,插入的数据块也会被写入磁盘上的表目录。在服务器启动时,这些数据会被加载到 RAM 中。换句话说,重启之后,数据仍会保留。 - -在发生非正常服务器重启时,磁盘上的数据块可能会丢失或损坏。后一种情况下,你可能需要手动删除包含损坏数据的文件。 - -### 限制和设置 {#join-limitations-and-settings} - -创建表时,会应用以下设置: - -#### Persistent {#persistent} - -为 Set 和 [Join](/engines/table-engines/special/join) 表引擎禁用持久化功能。 - -降低 I/O 开销。适用于追求性能且不需要持久化的场景。 - -可能的取值: - -- 1 — 启用。 -- 0 — 禁用。 - -默认值:`1`。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md deleted file mode 100644 index 33ab7358a1c..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/url.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -description: '用于从/向远程 HTTP/HTTPS 服务器读写数据。该引擎类似于 File 引擎。' -sidebar_label: 'URL' -sidebar_position: 80 -slug: /engines/table-engines/special/url -title: 'URL 表引擎' -doc_type: 'reference' ---- - - - -# URL 表引擎 - -对远程 HTTP/HTTPS 服务器进行数据查询和写入。该引擎类似于 [File](../../../engines/table-engines/special/file.md) 引擎。 - -语法:`URL(URL [,Format] [,CompressionMethod])` - -- `URL` 参数必须符合统一资源定位符(URL)的结构。指定的 URL 必须指向一个使用 HTTP 或 HTTPS 的服务器。无需附加请求头即可从服务器获取响应。 - -- `Format` 必须是 ClickHouse 可以在 `SELECT` 查询中使用的格式,并在需要时可用于 `INSERT`。有关支持的完整格式列表,请参见 [Formats](/interfaces/formats#formats-overview)。 - - 如果未指定该参数,ClickHouse 会根据 `URL` 参数的后缀自动检测格式。如果 `URL` 参数的后缀不匹配任何受支持的格式,则表创建失败。例如,对于引擎表达式 `URL('http://localhost/test.json')`,将应用 `JSON` 格式。 - -- `CompressionMethod` 指示是否需要对 HTTP body 进行压缩。如果启用了压缩,由 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` 请求时,远程服务器必须支持 -[分块传输编码(Chunked transfer encoding)](https://en.wikipedia.org/wiki/Chunked_transfer_encoding)。 - -你可以使用 [max_http_get_redirects](/operations/settings/settings#max_http_get_redirects) 设置来限制 HTTP GET 重定向的最大次数。 - - - -## 示例 - -**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─┐ -│ 你好 │ 1 │ -│ 世界 │ 2 │ -└───────┴───────┘ -``` - - -## 实现细节 {#details-of-implementation} - -- 读写可以并行进行 -- 不支持: - - `ALTER` 和 `SELECT...SAMPLE` 操作。 - - 索引。 - - 复制。 - - - -## 虚拟列 {#virtual-columns} - -- `_path` — `URL` 的路径。类型:`LowCardinality(String)`。 -- `_file` — `URL` 的资源名。类型:`LowCardinality(String)`。 -- `_size` — 资源的大小,单位为字节。类型:`Nullable(UInt64)`。如果大小未知,则值为 `NULL`。 -- `_time` — 文件的最后修改时间。类型:`Nullable(DateTime)`。如果时间未知,则值为 `NULL`。 -- `_headers` - HTTP 响应头部。类型:`Map(LowCardinality(String), LowCardinality(String))`。 - - - -## 存储设置 {#storage-settings} - -- [engine_url_skip_empty_files](/operations/settings/settings.md#engine_url_skip_empty_files) - 在读取时跳过空文件。默认禁用。 -- [enable_url_encoding](/operations/settings/settings.md#enable_url_encoding) - 控制是否对 URI 中的路径进行编码/解码。默认启用。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md b/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md deleted file mode 100644 index 8fc437b3f98..00000000000 --- a/i18n/zh/docusaurus-plugin-content-docs/current/engines/table-engines/special/view.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -description: '用于实现视图(更多信息参见 `CREATE VIEW` 查询)。它本身不存储数据,只保存指定的 `SELECT` 查询。从该表读取数据时,会执行此查询(并从查询中移除所有不需要的列)。' -sidebar_label: 'View' -sidebar_position: 90 -slug: /engines/table-engines/special/view -title: 'View 表引擎' -doc_type: 'reference' ---- - -# View 表引擎 - -用于实现视图(更多信息请参见 `CREATE VIEW` 查询)。它本身不存储数据,而只存储指定的 `SELECT` 查询。在从该表读取数据时,会运行此查询(并从查询中删除所有不需要的列)。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/concurrency.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/concurrency.md index f9d25f4415e..b42acc28c7e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/concurrency.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/concurrency.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['并发', 'QPS'] --- -# ClickHouse 是否支持高频并发查询? +# ClickHouse 是否支持高频并发查询? {#does-clickhouse-support-frequent-concurrent-queries} ClickHouse 专为可直接对外服务的实时分析型应用而设计。它可以在 PB 级数据库上,将历史数据与实时写入相结合,以低延迟(小于 10 毫秒)和高并发(每秒超过 10,000 次查询)处理分析查询。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/cost-based.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/cost-based.md index 891f7fb97cd..d17a372243b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/cost-based.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/cost-based.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['CBE', 'optimizer'] --- -# ClickHouse 是否有基于成本的优化器? +# ClickHouse 是否有基于成本的优化器? {#does-clickhouse-have-a-cost-based-optimizer} ClickHouse 具备一些局部的基于成本的优化机制,例如:读取列的顺序由从磁盘读取压缩数据范围的成本来决定。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/datalake.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/datalake.md index 54e906551f7..0daca22a540 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/datalake.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/datalake.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['数据湖', '湖仓'] --- -# ClickHouse 是否支持数据湖? +# ClickHouse 是否支持数据湖? {#does-clickhouse-support-data-lakes} ClickHouse 支持数据湖,包括 Iceberg、Delta Lake、Apache Hudi、Apache Paimon、Hive。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/dependencies.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/dependencies.md index b2bcbedcb98..6ee40440f69 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/dependencies.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/dependencies.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['依赖', '第三方'] --- -# 运行 ClickHouse 需要哪些第三方依赖? +# 运行 ClickHouse 需要哪些第三方依赖? {#what-are-the-3rd-party-dependencies-for-running-clickhouse} ClickHouse 没有任何运行时依赖。它以单个二进制可执行文件的形式发布,完全自包含。该应用程序提供集群的全部功能:处理查询、作为集群中的工作节点、作为提供 Raft 共识算法的协调系统,以及作为客户端或本地查询引擎。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md index 6c151dca2e3..ead08a51735 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/distributed-join.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['分布式', 'JOIN'] --- -# ClickHouse 是否支持分布式 JOIN? +# ClickHouse 是否支持分布式 JOIN? {#does-clickhouse-support-distributed-join} ClickHouse 在集群上支持分布式 JOIN。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/federated.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/federated.md index b979afe7b1e..3f3090a7e26 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/federated.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/federated.md @@ -8,22 +8,22 @@ doc_type: 'reference' keywords: ['federated', 'hybrid', 'postgres', 'mysql', 'sqlite', 'odbc', 'jdbc'] --- -# ClickHouse 是否支持联邦查询? +# ClickHouse 是否支持联邦查询? {#does-clickhouse-support-federated-queries} 在分析型数据库中,ClickHouse 对联邦查询和混合查询执行的支持最为全面。 它支持查询外部数据库: -- PostgreSQL -- MySQL -- MongoDB -- Redis -- 任何 ODBC 数据源 -- 任何 JDBC 数据源 -- 任何 Arrow Flight 数据源 -- 流式数据源,例如 Kafka 和 RabbitMQ -- 数据湖,例如 Iceberg、Delta Lake、Apache Hudi、Apache Paimon -- 位于共享存储上的外部文件,例如 AWS S3、GCS、Minio、Cloudflare R2、Azure Blob Storage、Alicloud OSS、Tencent COS,以及本地存储,支持多种数据格式 +* PostgreSQL +* MySQL +* MongoDB +* Redis +* 任何 ODBC 数据源 +* 任何 JDBC 数据源 +* 任何 Arrow Flight 数据源 +* 流式数据源,例如 Kafka 和 RabbitMQ +* 数据湖,例如 Iceberg、Delta Lake、Apache Hudi、Apache Paimon +* 位于共享存储上的外部文件,例如 AWS S3、GCS、Minio、Cloudflare R2、Azure Blob Storage、Alicloud OSS、Tencent COS,以及本地存储,支持多种数据格式 ClickHouse 可以在单个查询中对多个不同的数据源进行 join。它还提供混合查询执行选项,既利用本地资源,又将部分查询卸载到远程机器上。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/index.md index 2ba3a15c958..461eedccbf5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/index.md @@ -8,18 +8,18 @@ description: '列出关于 ClickHouse 常见问题的索引页面' doc_type: 'landing-page' --- -# 关于 ClickHouse 的常见问题 +# 关于 ClickHouse 的常见问题 {#general-questions-about-clickhouse} -- [什么是 ClickHouse?](../../intro.md) -- [为什么 ClickHouse 如此之快?](../../concepts/why-clickhouse-is-so-fast.mdx) -- [谁在使用 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) +* [什么是 ClickHouse?](../../intro.md) +* [为什么 ClickHouse 如此之快?](../../concepts/why-clickhouse-is-so-fast.mdx) +* [谁在使用 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 没有找到所需内容? 请查阅我们的[知识库](/knowledgebase/),并浏览文档中更多实用的文章。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/sql.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/sql.md index 838674e2e54..bb3c6113bb2 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/sql.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/sql.md @@ -8,46 +8,46 @@ doc_type: 'reference' keywords: ['SQL 语法', 'ANSI SQL'] --- -# ClickHouse 支持哪些 SQL 语法? +# ClickHouse 支持哪些 SQL 语法? {#what-sql-syntax-does-clickhouse-support} ClickHouse 对 SQL 语法提供了完整支持,包括以下特性: -- SQL/JSON 和 JSON 数据类型(SQL-2023) -- 窗口函数(SQL-2003) -- 公用表表达式和递归查询(SQL-1999) -- ROLLUP、CUBE 和 GROUPING SETS(SQL-1999) -- 对 RBAC 的完整支持(SQL-1999) -- 关联子查询(SQL-1992) +* SQL/JSON 和 JSON 数据类型(SQL-2023) +* 窗口函数(SQL-2003) +* 公用表表达式和递归查询(SQL-1999) +* ROLLUP、CUBE 和 GROUPING SETS(SQL-1999) +* 对 RBAC 的完整支持(SQL-1999) +* 关联子查询(SQL-1992) 这一支持已经通过 TPC-H 和 TPC-DS 基准测试以及 SQLTest 得到验证。 ClickHouse 在许多特性被 ISO/IEC 标准化之前就已经引入了它们,例如: -- 条件聚合函数 -- `any` 聚合函数 -- `least` 和 `greatest` -- `GROUP BY ALL` -- 对别名的扩展使用 -- 数字字面量中的下划线 +* 条件聚合函数 +* `any` 聚合函数 +* `least` 和 `greatest` +* `GROUP BY ALL` +* 对别名的扩展使用 +* 数字字面量中的下划线 ClickHouse 通过引入大量提升使用体验的改进来扩展 SQL: -- 不受限制地使用别名 -- WITH 子句中的别名 -- 聚合函数组合器 -- 参数化聚合函数 -- 近似聚合函数 -- 原生大整数数值类型和扩展精度小数类型 -- 用于数组操作的高阶函数 -- ARRAY JOIN 子句和 arrayJoin 函数 -- 数组聚合 -- LIMIT BY 子句 -- GROUP BY WITH TOTALS -- AS OF JOIN -- ANY/ALL JOIN -- 更自然的 JSON 语法 -- 列表中的尾随逗号 -- FROM ... SELECT 子句顺序 -- 类型安全的查询参数和参数化视图 +* 不受限制地使用别名 +* WITH 子句中的别名 +* 聚合函数组合器 +* 参数化聚合函数 +* 近似聚合函数 +* 原生大整数数值类型和扩展精度小数类型 +* 用于数组操作的高阶函数 +* ARRAY JOIN 子句和 arrayJoin 函数 +* 数组聚合 +* LIMIT BY 子句 +* GROUP BY WITH TOTALS +* AS OF JOIN +* ANY/ALL JOIN +* 更自然的 JSON 语法 +* 列表中的尾随逗号 +* FROM ... SELECT 子句顺序 +* 类型安全的查询参数和参数化视图 其中一些特性有机会被纳入即将发布的 SQL 标准,而它们已经可以在 ClickHouse 中使用。 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/updates.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/updates.md index 9653ddd0d42..b25e3c99795 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/updates.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/general/updates.md @@ -8,7 +8,7 @@ doc_type: 'reference' keywords: ['更新', '实时'] --- -# ClickHouse 是否支持实时更新? +# ClickHouse 是否支持实时更新? {#does-clickhouse-support-real-time-updates} ClickHouse 支持 `UPDATE` 语句,并且能够以与执行 `INSERT` 一样快的速度执行实时更新。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/index.md index 047ecfe9ddd..c3b1b40e500 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/index.md @@ -8,15 +8,15 @@ description: '汇总与 ClickHouse 集成到其他系统相关问题的落地页 doc_type: 'landing-page' --- -# 关于将 ClickHouse 与其他系统集成的问题 +# 关于将 ClickHouse 与其他系统集成的问题 {#questions-about-integrating-clickhouse-and-other-systems} -- [如何将 ClickHouse 中的数据导出到文件?](https://clickhouse.com/docs/knowledgebase/file-export) -- [如何将 JSON 导入 ClickHouse?](/integrations/data-ingestion/data-formats/json/intro.md) -- [如何将 Kafka 连接到 ClickHouse?](/integrations/data-ingestion/kafka/index.md) -- [可以将 Java 应用程序连接到 ClickHouse 吗?](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) -- [ClickHouse 可以读取 MySQL 中的表吗?](/integrations/mysql) -- [ClickHouse 可以读取 PostgreSQL 中的表吗?](/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md) -- [通过 ODBC 连接 Oracle 时,如果遇到编码问题该怎么办?](/faq/integration/oracle-odbc.md) +* [如何将 ClickHouse 中的数据导出到文件?](https://clickhouse.com/docs/knowledgebase/file-export) +* [如何将 JSON 导入 ClickHouse?](/integrations/data-ingestion/data-formats/json/intro.md) +* [如何将 Kafka 连接到 ClickHouse?](/integrations/data-ingestion/kafka/index.md) +* [可以将 Java 应用程序连接到 ClickHouse 吗?](/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) +* [ClickHouse 可以读取 MySQL 中的表吗?](/integrations/mysql) +* [ClickHouse 可以读取 PostgreSQL 中的表吗?](/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md) +* [通过 ODBC 连接 Oracle 时,如果遇到编码问题该怎么办?](/faq/integration/oracle-odbc.md) :::info 没有找到所需内容? 请查看我们的[知识库](/knowledgebase/),以及浏览本文档中许多其他有用的文章。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/json-import.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/json-import.md index 94781804f48..2d332231094 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/json-import.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/json-import.md @@ -16,7 +16,7 @@ ClickHouse 支持多种[输入和输出数据格式](/interfaces/formats)。其 -## 示例 +## 示例 {#examples} 使用 [HTTP 接口](../../interfaces/http.md): diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md index f59ca525691..7db7500b5dc 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/integration/oracle-odbc.md @@ -8,9 +8,7 @@ doc_type: 'guide' keywords: ['oracle', 'odbc', '编码', '集成', '外部字典'] --- - - -# 通过 ODBC 使用 Oracle 时如果遇到编码问题怎么办? +# 通过 ODBC 使用 Oracle 时如果遇到编码问题怎么办? {#oracle-odbc-encodings} 如果通过 Oracle ODBC 驱动将 Oracle 用作 ClickHouse 外部字典的数据源,则需要在 `/etc/default/clickhouse` 中为 `NLS_LANG` 环境变量设置正确的值。有关更多信息,请参阅 [Oracle NLS_LANG 常见问题解答](https://www.oracle.com/technetwork/products/globalization/nls-lang-099431.html)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md index 841024fcce6..af2f280d5be 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/delete-old-data.md @@ -30,7 +30,7 @@ TTL 不仅可以用来将数据“移动”到 [/dev/null](https://en.wikipedia. -## DELETE FROM +## DELETE FROM {#delete-from} [DELETE FROM](/sql-reference/statements/delete.md) 允许在 ClickHouse 中运行标准的 DELETE 查询。满足过滤条件的行会被标记为已删除,并且在后续的结果集中不再返回。行的清理是以异步方式执行的。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/index.md index 92deb488e62..cce5432aaff 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/operations/index.md @@ -8,16 +8,16 @@ doc_type: 'landing-page' keywords: ['运维', '管理', '部署', '集群管理', '常见问题'] --- -# 关于运维 ClickHouse 服务器和集群的问题 +# 关于运维 ClickHouse 服务器和集群的问题 {#question-about-operating-clickhouse-servers-and-clusters} -- [在生产环境中应该使用哪个 ClickHouse 版本?](/faq/operations/production.md) -- [是否可以采用存储与计算分离的方式部署 ClickHouse?](/faq/operations/separate_storage.md) -- [是否可以从 ClickHouse 表中删除旧记录?](/faq/operations/delete-old-data.md) -- [如何配置 ClickHouse Keeper?](/guides/sre/keeper/index.md) -- [ClickHouse 能否与 LDAP 集成?](/guides/sre/user-management/configuring-ldap.md) -- [如何在 ClickHouse 中配置用户、角色和权限?](/guides/sre/user-management/index.md) -- [能否在 ClickHouse 中更新或删除行?](/guides/starter_guides/mutations.md) -- [ClickHouse 是否支持多区域复制?](/faq/operations/multi-region-replication.md) +* [在生产环境中应该使用哪个 ClickHouse 版本?](/faq/operations/production.md) +* [是否可以采用存储与计算分离的方式部署 ClickHouse?](/faq/operations/separate_storage.md) +* [是否可以从 ClickHouse 表中删除旧记录?](/faq/operations/delete-old-data.md) +* [如何配置 ClickHouse Keeper?](/guides/sre/keeper/index.md) +* [ClickHouse 能否与 LDAP 集成?](/guides/sre/user-management/configuring-ldap.md) +* [如何在 ClickHouse 中配置用户、角色和权限?](/guides/sre/user-management/index.md) +* [能否在 ClickHouse 中更新或删除行?](/guides/starter_guides/mutations.md) +* [ClickHouse 是否支持多区域复制?](/faq/operations/multi-region-replication.md) :::info 没有找到需要的内容? 请查阅我们的[知识库](/knowledgebase/),并浏览文档中提供的更多实用文章。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/faq/use-cases/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/faq/use-cases/index.md index ed9687016e0..300abb822cd 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/faq/use-cases/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/faq/use-cases/index.md @@ -8,10 +8,10 @@ keywords: ['ClickHouse 使用场景', '时间序列数据库', '键值存储', ' doc_type: 'landing-page' --- -# 关于 ClickHouse 使用场景的常见问题 +# 关于 ClickHouse 使用场景的常见问题 {#questions-about-clickhouse-use-cases} -- [我可以将 ClickHouse 用作时序数据库吗?](/knowledgebase/time-series) -- [我可以将 ClickHouse 用作键值存储吗?](/knowledgebase/key-value) +* [我可以将 ClickHouse 用作时序数据库吗?](/knowledgebase/time-series) +* [我可以将 ClickHouse 用作键值存储吗?](/knowledgebase/key-value) :::info 没有找到您需要的内容? 请查看我们的[知识库](/knowledgebase/),并浏览文档中大量实用的文章。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md index a8dcd9bb096..a18d278f198 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/amazon-reviews.md @@ -11,10 +11,10 @@ keywords: ['Amazon reviews', 'customer reviews dataset', 'e-commerce data', 'exa :::note 下面的查询是在 **Production** 环境的 ClickHouse Cloud 实例上执行的。更多信息请参阅 -["Playground 规格说明"](/getting-started/playground#specifications)。 +["Playground 规格说明"](/getting-started/playground#specifications)。 ::: -## 加载数据集 +## 加载数据集 {#loading-the-dataset} 1. 在不将数据插入 ClickHouse 的情况下,我们可以直接在原处对其进行查询。先取出几行数据,看看它们的样子: @@ -122,7 +122,6 @@ FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_*.snappy.parquet') ``` - :::tip 在 ClickHouse Cloud 中,集群名称为 `default`。请将 `default` 更改为你的集群名称……或者如果你没有集群,可以使用 `s3` 表函数(而不是 `s3Cluster`)。 ::: @@ -152,8 +151,7 @@ ORDER BY size DESC 原始数据约为 70GB,在 ClickHouse 中压缩后仅占约 30GB。 - -## 示例查询 +## 示例查询 {#example-queries} 7. 现在来运行一些查询。下面是数据集中最有帮助的前 10 条评论: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md index d198ae2aec1..210d1671def 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/anon_web_analytics_metrica.md @@ -7,7 +7,7 @@ title: '匿名化网站分析' doc_type: 'guide' --- -# 匿名化的网站分析数据 +# 匿名化的网站分析数据 {#anonymized-web-analytics-data} 此数据集由两个表组成,存储匿名化的网站分析数据:一个为 hits(`hits_v1`),一个为 visits(`visits_v1`)。 @@ -15,17 +15,17 @@ doc_type: 'guide' ## 下载并摄取数据 {#download-and-ingest-the-data} -### 下载 hits TSV 压缩文件 +### 下载 hits TSV 压缩文件 {#download-the-hits-compressed-tsv-file} ```bash curl https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv -# 验证校验和 +# 验证校验和 {#validate-the-checksum} md5sum hits_v1.tsv -# 校验和应为:f3631b6295bf06989c1437491f7592cb +# 校验和应为:f3631b6295bf06989c1437491f7592cb {#checksum-should-be-equal-to-f3631b6295bf06989c1437491f7592cb} ``` -### 创建数据库和表 +### 创建数据库和表 {#create-the-database-and-table} ```bash clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets" @@ -45,7 +45,7 @@ clickhouse-client --query="CREATE TABLE default.hits_100m_obfuscated (WatchID UI ``` -### 导入 hits 表的数据 +### 导入 hits 表的数据 {#import-the-hits-data} ```bash cat hits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.hits_v1 FORMAT TSV" --max_insert_block_size=100000 @@ -62,13 +62,13 @@ clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1" ``` -### 下载压缩的 visits TSV 文件 +### 下载压缩的 visits TSV 文件 {#download-the-visits-compressed-tsv-file} ```bash curl https://datasets.clickhouse.com/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv -# 验证校验和 +# 验证校验和 {#validate-the-checksum} md5sum visits_v1.tsv -# 校验和应为:6dafe1a0f24e59e3fc2d0fed85601de6 +# 校验和应为:6dafe1a0f24e59e3fc2d0fed85601de6 {#checksum-should-be-equal-to-6dafe1a0f24e59e3fc2d0fed85601de6} ``` @@ -78,7 +78,7 @@ md5sum visits_v1.tsv 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" ``` -### 导入访问数据 +### 导入访问数据 {#import-the-visits-data} ```bash cat visits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.visits_v1 FORMAT TSV" --max_insert_block_size=100000 @@ -95,7 +95,7 @@ clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1" ``` -## 一个 JOIN 示例 +## 一个 JOIN 示例 {#an-example-join} hits 和 visits 数据集用于 ClickHouse 的测试例程,这是测试套件中的一个查询。其余测试在本页末尾的 *下一步* 部分中有引用。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md index 738971e5045..2c008e2033e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/brown-benchmark.md @@ -94,8 +94,7 @@ clickhouse-client --query "INSERT INTO mgbench.logs2 FORMAT CSVWithNames" < mgbe clickhouse-client --query "INSERT INTO mgbench.logs3 FORMAT CSVWithNames" < mgbench3.csv ``` - -## 运行基准查询 +## 运行基准查询 {#run-benchmark-queries} ```sql USE mgbench; @@ -209,7 +208,6 @@ ORDER BY machine_name, dt; ``` - ```sql -- Q1.6: 所有文件服务器的每小时网络流量总和是多少? diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md index cce072b914e..c497446382c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/cell-towers.md @@ -7,15 +7,15 @@ keywords: ['蜂窝基站数据', '地理数据', 'OpenCelliD', '地理空间数 doc_type: '指南' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; -import ActionsMenu from '@site/docs/_snippets/_service_actions_menu.md'; -import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; -import SupersetDocker from '@site/docs/_snippets/_add_superset_detail.md'; +import ActionsMenu from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_service_actions_menu.md'; +import SQLConsoleDetail from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_launch_sql_console.md'; +import SupersetDocker from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_add_superset_detail.md'; import cloud_load_data_sample from '@site/static/images/_snippets/cloud-load-data-sample.png'; import cell_towers_1 from '@site/static/images/getting-started/example-datasets/superset-cell-tower-dashboard.png' import add_a_database from '@site/static/images/getting-started/example-datasets/superset-add.png' @@ -29,7 +29,6 @@ import superset_radio_umts from '@site/static/images/getting-started/example-dat import superset_umts_netherlands from '@site/static/images/getting-started/example-datasets/superset-umts-netherlands.png' import superset_cell_tower_dashboard from '@site/static/images/getting-started/example-datasets/superset-cell-tower-dashboard.png' - ## 目标 {#goal} 在本指南中,您将学习如何: @@ -124,7 +123,7 @@ INSERT INTO cell_towers SELECT * FROM s3('https://datasets-documentation.s3.amaz -## 运行一些示例查询 +## 运行一些示例查询 {#examples} 1. 各类型蜂窝基站的数量: @@ -171,7 +170,6 @@ SELECT mcc, count() FROM cell_towers GROUP BY mcc ORDER BY count() DESC LIMIT 10 您可以考虑在 ClickHouse 中创建一个 [Dictionary](../../sql-reference/dictionaries/index.md) 来对这些值进行解码。 - ## 使用场景:集成地理数据 {#use-case} 使用 [`pointInPolygon`](/sql-reference/functions/geo/coordinates.md/#pointinpolygon) 函数。 @@ -266,7 +264,6 @@ WHERE pointInPolygon((lon, lat), (SELECT * FROM moscow)) 返回 1 行。耗时:0.067 秒。处理了 4328 万行,692.42 MB(每秒 6.4583 亿行,10.33 GB/秒)。 ``` - ## 查看模式 {#review-of-the-schema} 在 Superset 中构建可视化之前,请先查看你将要使用的列。此数据集主要提供全球移动蜂窝基站的位置(经度和纬度)以及无线接入技术类型。各列的说明可以在[社区论坛](https://community.opencellid.org/t/documenting-the-columns-in-the-downloadable-cells-database-csv/186)中找到。下面描述将用于构建可视化的列。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md index 49d9f674323..2ea98618f16 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/dbpedia.md @@ -15,7 +15,7 @@ doc_type: 'guide' 该数据集包含位于 [huggingface.co](https://huggingface.co/api/datasets/Qdrant/dbpedia-entities-openai3-text-embedding-3-large-1536-1M/parquet/default/train/) 上的 26 个 `Parquet` 文件。文件名为 `0.parquet`、`1.parquet`、...、`25.parquet`。要查看该数据集的一些示例记录,请访问此 [Hugging Face 页面](https://huggingface.co/datasets/Qdrant/dbpedia-entities-openai3-text-embedding-3-large-1536-1M)。 -## 创建表 +## 创建表 {#create-table} 创建 `dbpedia` 表,用于存储文章 ID、标题、正文和嵌入向量: @@ -31,7 +31,7 @@ CREATE TABLE dbpedia ``` -## 加载表 +## 加载表 {#load-table} 要从所有 Parquet 文件中加载数据集,请运行以下 Shell 命令: @@ -74,7 +74,7 @@ FROM dbpedia _最近邻_ 指的是与用户查询最相关的文档、图像或其他内容。 检索结果是生成式 AI 应用中 RAG(检索增强生成,Retrieval Augmented Generation)的关键输入。 -## 运行暴力向量相似度搜索 +## 运行暴力向量相似度搜索 {#run-a-brute-force-vector-similarity-search} KNN(k 近邻)搜索或暴力搜索是指计算数据集中每个向量与搜索嵌入向量之间的距离,然后对这些距离进行排序以获得最近邻。使用 `dbpedia` 数据集时,一种快速、直观地观察语义搜索效果的方法,是直接使用数据集本身的嵌入向量作为搜索向量。例如: @@ -116,7 +116,7 @@ LIMIT 20 同时分别记录在 OS 文件缓存为冷状态时,以及在将 `max_threads` 设置为 1 时的查询延迟,以识别实际的计算资源占用和存储带宽使用情况(从而可以将结果推算到包含数百万向量的生产数据集!) -## 构建向量相似度索引 +## 构建向量相似度索引 {#build-vector-similarity-index} 运行以下 SQL,在 `vector` 列上定义并构建向量相似度索引: @@ -131,7 +131,7 @@ ALTER TABLE dbpedia MATERIALIZE INDEX vector_index SETTINGS mutations_sync = 2; 根据可用 CPU 核心数量和存储带宽的不同,构建并保存索引可能需要几分钟时间。 -## 执行 ANN 搜索 +## 执行 ANN 搜索 {#perform-ann-search} *Approximate Nearest Neighbours*(近似最近邻,ANN)指一类技术(例如采用图结构、随机森林等特殊数据结构),可以比精确向量搜索更快地计算结果。结果的准确度通常在实际使用中已经“足够好”。许多近似算法提供参数,用于在结果准确度和搜索时间之间进行权衡和调优。 @@ -178,7 +178,7 @@ LIMIT 20 ``` -## 为搜索查询生成嵌入向量 +## 为搜索查询生成嵌入向量 {#generating-embeddings-for-search-query} 目前为止看到的相似度搜索查询,都是使用 `dbpedia` 表中已有的向量之一作为搜索向量。在实际应用中,需要根据用户输入的查询(可能是自然语言)来生成搜索向量。搜索向量应当使用与为数据集生成嵌入向量时相同的 LLM 模型生成。 @@ -220,7 +220,7 @@ while True: ``` -## 问答演示应用 +## 问答演示应用 {#q-and-a-demo-application} 上面的示例演示了使用 ClickHouse 进行语义搜索和文档检索。下面将介绍一个非常简单但具有巨大潜力的生成式 AI 示例应用。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md index 7d7324534c8..6861be2c6d7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/foursquare-os-places.md @@ -24,7 +24,7 @@ import visualization_4 from '@site/static/images/getting-started/example-dataset 关于这些地点的附加元数据,例如类别和社交媒体 信息。 -## 数据探索 +## 数据探索 {#data-exploration} 为了探索这些数据,我们将使用 [`clickhouse-local`](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local),这是一个小型命令行工具, 虽然体积小巧,但提供了完整的 ClickHouse 引擎。当然,也可以使用 @@ -148,7 +148,7 @@ DESCRIBE s3('s3://fsq-os-places-us-east-1/release/dt=2025-04-08/places/parquet/* ``` -## 将数据加载到 ClickHouse 中 +## 将数据加载到 ClickHouse 中 {#loading-the-data} 如果希望将数据持久化到磁盘上,可以使用 `clickhouse-server` 或 ClickHouse Cloud。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md index ffd2cac861e..509ad631dd7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/github.md @@ -29,7 +29,7 @@ import superset_authors_matrix_v2 from '@site/static/images/getting-started/exam * `line_changes` - 2.7G - 7,535,157 行 -## 生成数据 +## 生成数据 {#generating-the-data} 此步骤为可选。我们免费提供这些数据——请参阅[下载并插入数据](#downloading-and-inserting-the-data)。 @@ -73,7 +73,7 @@ CREATE TABLE git.commits * Linux - `~/clickhouse git-import` - 160 分钟 -## 下载和插入数据 +## 下载和插入数据 {#downloading-and-inserting-the-data} 以下数据可用于复现一个可工作的环境。或者,可以在 play.clickhouse.com 中获取该数据集——参见 [Queries](#queries) 获取更多详情。 @@ -220,7 +220,7 @@ FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/clickhou 该数据集可以在 [play.clickhouse.com](https://sql.clickhouse.com?query_id=DCQPNPAIMAQXRLHYURLKVJ) 的 `git_clickhouse` 数据库中获取。我们为所有查询都提供了指向该环境的链接,并在需要时调整数据库名称。请注意,由于数据采集时间不同,play 环境中的查询结果可能与此处展示的结果有所差异。 -### 单个文件的历史记录 +### 单个文件的历史记录 {#history-of-a-single-file} 这是最简单的查询之一。在这里我们查看 `StorageReplicatedMergeTree.cpp` 的所有提交信息。由于这些通常更值得关注,我们按最新的提交优先排序。 @@ -296,7 +296,7 @@ LIMIT 10 请注意,还有一个更复杂的查询版本,它会在考虑重命名的情况下查找文件的[逐行提交历史](#line-by-line-commit-history-of-a-file)。 -### 查找当前有效文件 +### 查找当前有效文件 {#find-the-current-active-files} 这对于后续分析很重要,因为那时我们只想考虑代码仓库中当前存在的文件。我们将这组文件近似定义为那些没有被重命名或删除(然后又被重新添加或重新命名)的文件。 @@ -428,7 +428,7 @@ git ls-files | grep -v -E 'generated\.cpp|^(contrib|docs?|website|libs/(libcityh 这些差异不应对我们的分析产生实质性影响。**欢迎提供该查询的改进版本**。 -### 列出修改最多的文件 +### 列出修改最多的文件 {#list-files-with-most-modifications} 在当前文件范围内,我们将删除和新增的行数相加,作为修改次数。 @@ -484,7 +484,7 @@ LIMIT 10 ``` -### 通常在一周中的哪一天进行代码提交? +### 通常在一周中的哪一天进行代码提交? {#what-day-of-the-week-do-commits-usually-occur} [运行](https://sql.clickhouse.com?query_id=GED2STFSYJDRAA59H8RLIV) @@ -510,7 +510,7 @@ GROUP BY dayOfWeek(time) AS day_of_week 这很合理,周五的工作效率往往会有所下降。很高兴看到大家在周末也继续提交代码!非常感谢所有贡献者! -### 子目录/文件的历史——随时间变化的行数、提交次数和贡献者数量 +### 子目录/文件的历史——随时间变化的行数、提交次数和贡献者数量 {#history-of-subdirectoryfile---number-of-lines-commits-and-contributors-over-time} 如果不进行过滤,查询结果会非常庞大,不便展示或可视化。因此,在下面的示例中,我们支持按文件或子目录进行过滤。这里我们使用 `toStartOfWeek` 函数按周分组——可根据需要进行调整。 @@ -555,7 +555,7 @@ LIMIT 10 For commits and authors -### 列出作者数量最多的文件 +### 列出作者数量最多的文件 {#list-files-with-maximum-number-of-authors} 仅限当前文件。 @@ -611,7 +611,7 @@ LIMIT 10 ``` -### 仓库中最早的代码行 +### 仓库中最早的代码行 {#oldest-lines-of-code-in-the-repository} 仅针对当前文件。 @@ -669,7 +669,7 @@ LIMIT 10 ``` -### 历史最悠久的文件 +### 历史最悠久的文件 {#files-with-longest-history} 仅包含当前仍存在的文件。 @@ -728,7 +728,7 @@ LIMIT 10 我们的核心数据结构 MergeTree 显然也在持续演进,迄今已经历了大量改进! -### 本月在文档和代码方面的贡献分布 +### 本月在文档和代码方面的贡献分布 {#distribution-of-contributors-with-respect-to-docs-and-code-over-the-month} **在数据采集过程中,由于 `docs/` 目录的提交历史非常杂乱,其变更已被过滤掉。因此,本查询结果并不完全准确。** @@ -792,7 +792,7 @@ FROM 在月底时可能会稍微多一点,但整体来看分布比较均匀。需要再次说明的是,由于在数据插入过程中应用了 docs 过滤器进行筛选,因此这些结果并不可靠。 -### 影响最广泛的作者 +### 影响最广泛的作者 {#authors-with-the-most-diverse-impact} 这里我们将多样性定义为某位作者参与贡献过的不同文件数量。 @@ -870,7 +870,7 @@ LIMIT 10 ``` -### 作者的常用文件 +### 作者的常用文件 {#favorite-files-for-an-author} 在这里,我们选择我们的创始人 [Alexey Milovidov](https://github.com/alexey-milovidov),并将分析范围限定为当前的文件。 @@ -957,7 +957,7 @@ LIMIT 10 这可能更能体现他的兴趣领域。 -### 作者最少的大型文件 +### 作者最少的大型文件 {#largest-files-with-lowest-number-of-authors} 为此,我们首先需要找出最大的文件。如果要基于提交历史,为每个文件完整重建所有版本来估算大小,代价会非常高! @@ -1130,7 +1130,7 @@ LIMIT 10 ``` -### 按时间、按星期几、按作者以及按特定子目录统计提交与代码行数分布 +### 按时间、按星期几、按作者以及按特定子目录统计提交与代码行数分布 {#commits-and-lines-of-code-distribution-by-time-by-weekday-by-author-for-specific-subdirectories} 这里的含义是:按一周中每一天统计新增和删除的代码行数。在本示例中,我们聚焦于 [Functions 目录](https://github.com/ClickHouse/ClickHouse/tree/master/src/Functions) @@ -1258,7 +1258,7 @@ FROM ``` -### 用于展示不同作者之间谁更倾向于重写他人代码的矩阵 +### 用于展示不同作者之间谁更倾向于重写他人代码的矩阵 {#matrix-of-authors-that-shows-what-authors-tends-to-rewrite-another-authors-code} `sign = -1` 表示代码删除。我们会排除标点符号以及空行的插入。 @@ -1313,7 +1313,7 @@ Alexey 显然很喜欢删除别人的代码。我们把他排除在外,以获 Superset 作者矩阵 v2 -### 按一周中的每一天来看,谁是贡献占比最高的提交者? +### 按一周中的每一天来看,谁是贡献占比最高的提交者? {#who-is-the-highest-percentage-contributor-per-day-of-week} 如果我们只按提交次数来考虑: @@ -1514,7 +1514,7 @@ LIMIT 5 BY root ``` -### 某位作者的代码中,有多少百分比被其他作者删除? +### 某位作者的代码中,有多少百分比被其他作者删除? {#what-percentage-of-code-for-an-author-has-been-removed-by-other-authors} 对于这个问题,我们需要将某位作者编写的代码行数,除以该作者被其他贡献者删除的代码总行数。 @@ -1565,7 +1565,7 @@ LIMIT 10 ``` -### 列出被重写次数最多的文件 +### 列出被重写次数最多的文件 {#list-files-that-were-rewritten-most-number-of-times} 对于这个问题,最简单的方法可能是按文件路径统计行修改次数(仅限当前仍存在的文件),例如: @@ -1708,7 +1708,7 @@ LIMIT 10 ``` -### 在一周中的哪一天,代码留存在代码库中的概率最高? +### 在一周中的哪一天,代码留存在代码库中的概率最高? {#what-weekday-does-the-code-have-the-highest-chance-to-stay-in-the-repository} 为此,我们需要对每一行代码进行唯一标识。由于同一行可能在一个文件中出现多次,我们通过文件路径和该行的内容来进行估算。 @@ -1771,7 +1771,7 @@ GROUP BY dayOfWeek(added_day) AS day_of_week_added ``` -### 按平均代码年龄排序的文件 +### 按平均代码年龄排序的文件 {#files-sorted-by-average-code-age} 此查询使用与[代码在仓库中保留概率最高的是一周中的哪一天](#what-weekday-does-the-code-have-the-highest-chance-to-stay-in-the-repository)相同的原理——通过路径和行内容来唯一标识一行代码。 这使我们能够识别一行代码从被添加到被删除之间的时间。我们仅筛选当前仍存在的文件和代码,并对每个文件内所有代码行的时间进行平均。 @@ -1862,7 +1862,7 @@ LIMIT 10 ``` -### 谁更倾向于编写更多的测试 / CPP 代码 / 注释? +### 谁更倾向于编写更多的测试 / CPP 代码 / 注释? {#who-tends-to-write-more-tests--cpp-code--comments} 我们可以用几种方式来回答这个问题。若聚焦于代码与测试的比例,这个查询相对简单——统计对包含 `tests` 的文件夹的贡献次数,并计算其占总贡献次数的比例。 @@ -1996,7 +1996,7 @@ LIMIT 10 请注意,我们是按代码贡献排序的。对于所有主要贡献者来说,这个比例都出奇地高,这也是我们代码之所以如此易读的原因之一。 -### 不同作者的提交中代码/注释比例随时间如何变化? +### 不同作者的提交中代码/注释比例随时间如何变化? {#how-does-an-authors-commits-change-over-time-with-respect-to-codecomments-percentage} 按作者维度计算这个指标非常简单, @@ -2114,7 +2114,7 @@ LIMIT 20 令人鼓舞的是,我们的评论比例相当稳定,并不会随着作者贡献时间的增加而下降。 -### 代码在被重写之前的平均时间是多少?中位数(代码衰减的“半衰期”)又是多少? +### 代码在被重写之前的平均时间是多少?中位数(代码衰减的“半衰期”)又是多少? {#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-times)相同的原则来识别重写行为,但这次针对所有文件。使用窗口函数计算每个文件两次重写之间的时间间隔,在此基础上,我们可以计算所有文件整体的平均值和中位数。 @@ -2175,7 +2175,7 @@ FROM rewrites ``` -### 从代码最有可能被重写的角度来看,什么时候写代码是最“糟糕”的? +### 从代码最有可能被重写的角度来看,什么时候写代码是最“糟糕”的? {#what-is-the-worst-time-to-write-code-in-sense-that-the-code-has-highest-chance-to-be-re-written} 类似于 [What is the average time before code will be rewritten and the median (half-life of code 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](#list-files-that-were-rewritten-most-number-of-times),只是这里我们按一周中的星期几进行聚合。可按需要进行调整,例如按一年中的月份。 @@ -2240,7 +2240,7 @@ GROUP BY dayOfWeek ``` -### 哪位作者的代码「黏性」最高? +### 哪位作者的代码「黏性」最高? {#which-authors-code-is-the-most-sticky} 我们将「黏性」定义为:一位作者的代码在被重写之前能保留多长时间。类似于前一个问题 [代码在被重写前的平均时间是多少?以及中位数(代码衰减的半衰期)?](#what-is-the-average-time-before-code-will-be-rewritten-and-the-median-half-life-of-code-decay) —— 使用相同的重写度量方式,即文件中有 50% 的内容为新增、50% 为删除。我们按作者计算平均重写时间,并且只考虑在超过两个文件上有贡献的作者。 @@ -2318,7 +2318,7 @@ LIMIT 10 ``` -### 作者连续提交天数最多 +### 作者连续提交天数最多 {#most-consecutive-days-of-commits-by-an-author} 此查询首先需要计算每位作者在哪些日期进行了提交。使用按作者分区的窗口函数,我们可以计算各次提交之间相隔的天数。对于每次提交,如果距离上一次提交相隔 1 天,则将其标记为连续(1),否则为 0,并将这一结果存入 `consecutive_day`。 @@ -2374,7 +2374,7 @@ LIMIT 10 ``` -### 文件的逐行提交历史 +### 文件的逐行提交历史 {#line-by-line-commit-history-of-a-file} 文件可能会被重命名。发生这种情况时,我们会产生一个重命名事件,其中 `path` 列会被设置为文件的新路径,而 `old_path` 则表示之前的位置,例如: @@ -2455,7 +2455,7 @@ FORMAT PrettyCompactMonoBlock ## 未解决的问题 {#unsolved-questions} -### Git blame +### Git blame {#git-blame} 由于目前无法在数组函数中保持状态,因此在实践中很难得到精确的结果。使用 `arrayFold` 或 `arrayReduce` 之后就可以做到,因为它们允许在每次迭代时保存状态。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md index b578cde5ded..27c0ef870bf 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/hacker-news.md @@ -7,7 +7,7 @@ doc_type: 'guide' keywords: ['示例数据集', 'Hacker News', '样本数据', '文本分析', '向量搜索'] --- -# Hacker News 数据集 +# Hacker News 数据集 {#hacker-news-dataset} > 在本教程中,你将把 2800 万行 Hacker News 数据(来自 CSV 和 Parquet 两种格式)插入到一个 ClickHouse 表中,并运行一些简单的查询来探索这些数据。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md index 984d1a75820..1d6c3ddcb14 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/laion.md @@ -11,7 +11,7 @@ keywords: ['示例数据集', 'laion', '图像嵌入', '示例数据', '机器 该数据集包含图像 URL、图像及其说明文字各自的嵌入向量、图像与图像说明文字之间的相似度评分,以及元数据,例如图像宽度/高度、许可证类型和 NSFW 标志。我们可以使用该数据集来演示 ClickHouse 中的[近似最近邻搜索](../../engines/table-engines/mergetree-family/annindexes.md)。 -## 数据准备 +## 数据准备 {#data-preparation} 在原始数据中,embedding 向量和元数据存储在不同的文件中。数据准备步骤会下载数据、合并这些文件, 将它们转换为 CSV 格式并导入 ClickHouse。可以使用下面的 `download.sh` 脚本来完成这一操作: @@ -40,28 +40,28 @@ npy_file = "img_emb_" + str_i + '.npy' metadata_file = "metadata_" + str_i + '.parquet' text_npy = "text_emb_" + str_i + '.npy' -# 加载所有文件 +# 加载所有文件 {#load-all-files} im_emb = np.load(npy_file) text_emb = np.load(text_npy) data = pd.read_parquet(metadata_file) -# 合并文件 +# 合并文件 {#combine-files} data = pd.concat([data, pd.DataFrame({"image_embedding" : [*im_emb]}), pd.DataFrame({"text_embedding" : [*text_emb]})], axis=1, copy=False) -# 待导入 ClickHouse 的列 +# 待导入 ClickHouse 的列 {#columns-to-be-imported-into-clickhouse} data = data[['url', 'caption', 'NSFW', 'similarity', "image_embedding", "text_embedding"]] -# 将 np.arrays 转换为列表 +# 将 np.arrays 转换为列表 {#transform-nparrays-to-lists} data['image_embedding'] = data['image_embedding'].apply(lambda x: x.tolist()) data['text_embedding'] = data['text_embedding'].apply(lambda x: x.tolist()) -# 此处需要使用这个小技巧,因为 caption 有时会包含各种引号 +# 此处需要使用这个小技巧,因为 caption 有时会包含各种引号 {#this-small-hack-is-needed-because-caption-sometimes-contains-all-kind-of-quotes} data['caption'] = data['caption'].apply(lambda x: x.replace("'", " ").replace('"', " ")) -# 导出数据为 CSV 文件 +# 导出数据为 CSV 文件 {#export-data-as-csv-file} data.to_csv(str_i + '.csv', header=False) -# 删除原始数据文件 +# 删除原始数据文件 {#removed-raw-data-files} os.system(f"rm {npy_file} {metadata_file} {text_npy}") ``` @@ -76,7 +76,7 @@ seq 0 409 | xargs -P1 -I{} bash -c './download.sh {}' (上面的 Python 脚本非常慢(每个文件大约需要 2–10 分钟),占用大量内存(每个文件 41 GB),且生成的 CSV 文件也很大(每个 10 GB),使用时请谨慎。如果你的 RAM 足够多,可以增大 `-P1` 的数值以提高并行度。如果这仍然太慢,可以考虑设计更好的摄取流程——例如先将 .npy 文件转换为 Parquet,然后使用 ClickHouse 完成其余处理。) -## 创建表 +## 创建表 {#create-table} 要先创建一个不带索引的表,运行: @@ -105,7 +105,7 @@ INSERT INTO laion FROM INFILE '{path_to_csv_files}/*.csv' 请注意,`id` 列仅用于示例说明,脚本会向其中写入非唯一值。 -## 运行基于暴力算法的向量相似度搜索 +## 运行基于暴力算法的向量相似度搜索 {#run-a-brute-force-vector-similarity-search} 要运行一次基于暴力算法的近似向量搜索,请执行: @@ -137,7 +137,7 @@ SELECT url, caption FROM laion ORDER BY cosineDistance(image_embedding, {target: ``` -## 使用向量相似性索引执行近似向量相似性搜索 +## 使用向量相似性索引执行近似向量相似性搜索 {#run-an-approximate-vector-similarity-search-with-a-vector-similarity-index} 现在我们在该表上定义两个向量相似性索引。 @@ -194,7 +194,7 @@ SELECT url, caption FROM laion ORDER BY cosineDistance(image_embedding, {target: 通常我们希望为新的图像或新的图像描述创建嵌入向量,并在数据中搜索相似的图像/图像描述对。我们可以使用 [UDF](/sql-reference/functions/udf) 直接在客户端中创建 `target` 向量。务必使用同一模型来生成原始数据和搜索时用的新嵌入向量。下面的脚本使用的是 `ViT-B/32` 模型,该模型也是此数据集所基于的模型。 -### 文本嵌入 +### 文本嵌入 {#text-embeddings} 首先,将以下 Python 脚本保存到 ClickHouse 数据路径下的 `user_scripts/` 目录中,并将其设为可执行文件(`chmod +x encode_text.py`)。 @@ -256,7 +256,7 @@ LIMIT 10 请注意,`encode_text()` UDF 本身的计算可能需要几秒钟才能生成嵌入向量。 -### 图像嵌入 +### 图像嵌入 {#image-embeddings} 图像嵌入的创建方式类似,我们提供了一个 Python 脚本,可为以本地图像文件形式存储的图像生成嵌入向量。 @@ -304,7 +304,7 @@ if __name__ == '__main__': 获取示例图片进行搜索: ```shell -# 获取乐高套装的随机图片 +# 获取乐高套装的随机图片 {#get-a-random-image-of-a-lego-set} $ wget http://cdn.firstcry.com/brainbees/images/products/thumb/191325a.jpg ``` diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md index 000c71bd970..26aa0c85cae 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/menus.md @@ -15,22 +15,22 @@ keywords: ['example dataset', 'menus', 'historical data', 'sample data', 'nypl'] 这些数据来自图书馆馆藏档案,可能不完整,也不一定适合严格的统计分析。不过它也非常有趣且“美味”。 数据规模仅为关于菜单菜品的 130 万条记录——对 ClickHouse 来说,这个数据量非常小,但仍然是一个很好的示例。 -## 下载数据集 +## 下载数据集 {#download-dataset} 运行以下命令: ```bash wget https://s3.amazonaws.com/menusdata.nypl.org/gzips/2021_08_01_07_01_17_data.tgz -# 可选:验证校验和 +# 可选:验证校验和 {#option-validate-the-checksum} md5sum 2021_08_01_07_01_17_data.tgz -# 校验和应为:db6126724de939a5481e3160a2d67d15 +# 校验和应为:db6126724de939a5481e3160a2d67d15 {#checksum-should-be-equal-to-db6126724de939a5481e3160a2d67d15} ``` 如有需要,请将链接替换为来自 [http://menus.nypl.org/data](http://menus.nypl.org/data) 的最新更新链接。 下载大小约为 35 MB。 -## 解压数据集 +## 解压数据集 {#unpack-dataset} ```bash tar xvf 2021_08_01_07_01_17_data.tgz @@ -46,7 +46,7 @@ tar xvf 2021_08_01_07_01_17_data.tgz * `MenuItem` — 菜单中的一项。某个菜单页面上的一道菜及其价格,并包含指向菜品和菜单页面的链接。 -## 创建表 +## 创建表 {#create-tables} 我们使用 [Decimal](../../sql-reference/data-types/decimal.md) 数据类型存储价格。 @@ -114,7 +114,7 @@ CREATE TABLE menu_item ``` -## 导入数据 +## 导入数据 {#import-data} 将数据上传到 ClickHouse,请运行: @@ -134,7 +134,7 @@ clickhouse-client --format_csv_allow_single_quotes 0 --input_format_null_as_defa 设置 [date_time_input_format best_effort](/operations/settings/formats#date_time_input_format) 允许以多种格式解析 [DateTime](../../sql-reference/data-types/datetime.md) 字段。例如,不带秒的 ISO-8601 时间(如 `2000-01-01 01:02`)也会被识别。如果不启用此设置,则只允许固定格式的 DateTime。 -## 数据反规范化 +## 数据反规范化 {#denormalize-data} 数据以[规范化形式](https://en.wikipedia.org/wiki/Database_normalization#Normal_forms)分布在多个表中。这意味着,如果你想查询例如菜单项对应的菜品名称,就必须执行 [JOIN](/sql-reference/statements/select/join)。 对于典型的分析任务,预先对数据进行 JOIN 合并,以避免每次查询都执行 `JOIN`,要高效得多。这被称为“反规范化”数据。 @@ -187,7 +187,7 @@ FROM menu_item ``` -## 验证数据 +## 验证数据 {#validate-data} 查询: @@ -206,7 +206,7 @@ SELECT count() FROM menu_item_denorm; ## 执行一些查询 {#run-queries} -### 菜品历史价格平均值 +### 菜品历史价格平均值 {#query-averaged-historical-prices} 查询: @@ -249,7 +249,7 @@ ORDER BY d ASC; 请谨慎看待,仅供参考。 -### 汉堡价格 +### 汉堡价格 {#query-burger-prices} 查询: @@ -287,7 +287,7 @@ ORDER BY d ASC; ``` -### 伏特加 +### 伏特加 {#query-vodka} 查询: @@ -322,7 +322,7 @@ ORDER BY d ASC; 为了查到 vodka,我们就得写 `ILIKE '%vodka%'`,本身就很能说明问题。 -### 鱼子酱 +### 鱼子酱 {#query-caviar} 我们来打印鱼子酱的价格,同时打印任意一道包含鱼子酱的菜肴名称。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md index 38618a5ca35..22545e4e922 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/noaa.md @@ -28,7 +28,7 @@ keywords: ['示例数据集', 'noaa', '天气数据', '样本数据', '气候'] - 一个适用于 ClickHouse 的[预先准备好的版本](#pre-prepared-data)数据,已完成清洗、重组和富化。该数据覆盖 1900 年至 2022 年。 - [下载原始数据](#original-data)并转换为 ClickHouse 所需的格式。希望添加自定义列的用户可以考虑采用这种方式。 -### 预先准备的数据 +### 预先准备的数据 {#pre-prepared-data} 更具体地说,已经移除了所有在 NOAA 的质量检查中未出现任何失败的行。数据也从“每行一个观测值”重构为“每个测站 ID 与日期对应一行”,即: @@ -55,7 +55,7 @@ wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enriche 下面将说明下载并转换原始数据,以便将其加载到 ClickHouse 的步骤。 -#### 下载 +#### 下载 {#download} 下载原始数据: @@ -64,7 +64,7 @@ for i in {1900..2023}; do wget https://noaa-ghcn-pds.s3.amazonaws.com/csv.gz/${i ``` -#### 数据采样 +#### 数据采样 {#sampling-the-data} ```bash $ clickhouse-local --query "SELECT * FROM '2021.csv.gz' LIMIT 10" --format PrettyCompact @@ -108,7 +108,7 @@ $ clickhouse-local --query "SELECT * FROM '2021.csv.gz' LIMIT 10" --format Prett 每行一个测量值会在 ClickHouse 中产生稀疏的表结构。我们应当转换为每个时间点和测站一行的形式,将各测量项作为列。首先,我们将数据集限制为没有问题的行,即 `qFlag` 等于空字符串的记录。 -#### 清洗数据 +#### 清洗数据 {#clean-the-data} 使用 [ClickHouse local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local),我们可以筛选出代表感兴趣测量数据并满足质量要求的行: @@ -122,7 +122,7 @@ FROM file('*.csv.gz', CSV, 'station_id String, date String, measurement String, 由于数据量超过 26 亿行,这个查询执行得并不快,因为需要解析所有文件。在我们的 8 核机器上,这大约需要 160 秒。 -### 透视数据 +### 透视数据 {#pivot-data} 虽然“每行一条测量记录”的结构也可以在 ClickHouse 中使用,但会让后续查询不必要地变得复杂。理想情况下,我们希望每个站点 ID 和日期对应一行,其中每种测量类型及其对应的数值都是单独的一列,即: @@ -161,7 +161,7 @@ done 此查询会生成一个 50GB 的单个文件 `noaa.csv`。 -### 丰富数据 +### 丰富数据 {#enriching-the-data} 这些数据除了包含前缀为国家代码的站点 ID 外,不包含任何其他位置信息。理想情况下,每个站点都应关联有纬度和经度。为此,NOAA 贴心地将每个站点的详细信息单独提供在一个 [ghcnd-stations.txt](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn#format-of-ghcnd-stationstxt-file) 文件中。该文件包含[多列数据](https://github.com/awslabs/open-data-docs/tree/main/docs/noaa/noaa-ghcn#format-of-ghcnd-stationstxt-file),其中有五列对后续分析很有用:id、latitude、longitude、elevation 和 name。 @@ -194,7 +194,7 @@ FROM file('noaa.csv', CSV, 此查询运行需要几分钟时间,并生成一个大小为 6.4 GB 的文件 `noaa_enriched.parquet`。 -## 创建表 +## 创建表 {#create-table} 使用 ClickHouse 客户端在 ClickHouse 中创建一个 MergeTree 表。 @@ -223,7 +223,7 @@ CREATE TABLE noaa ## 向 ClickHouse 写入数据 {#inserting-into-clickhouse} -### 从本地文件插入 +### 从本地文件插入 {#inserting-from-local-file} 在 ClickHouse 客户端中,可以按如下方式从本地文件插入数据: @@ -236,7 +236,7 @@ INSERT INTO noaa FROM INFILE '<路径>/noaa_enriched.parquet' 有关如何加快加载速度,请参见[此处](https://clickhouse.com/blog/real-world-data-noaa-climate-data#load-the-data)。 -### 从 S3 中导入数据 +### 从 S3 中导入数据 {#inserting-from-s3} ```sql INSERT INTO noaa SELECT * @@ -249,7 +249,7 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/noaa/noaa_enr ## 查询示例 {#sample-queries} -### 有史以来的最高气温 +### 有史以来的最高气温 {#highest-temperature-ever} ```sql SELECT @@ -278,7 +278,7 @@ LIMIT 5 令人放心的是,其与截至 2023 年 [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) 的[官方记录](https://en.wikipedia.org/wiki/List_of_weather_records#Highest_temperatures_ever_recorded)高度一致。 -### 最佳滑雪胜地 +### 最佳滑雪胜地 {#best-ski-resorts} 使用这份[美国滑雪胜地列表](https://gist.githubusercontent.com/gingerwizard/dd022f754fd128fdaf270e58fa052e35/raw/622e03c37460f17ef72907afe554cb1c07f91f23/ski_resort_stats.csv)及其各自位置,将其与过去 5 年中任意单月降雪量最高的前 1000 个气象站进行关联。按 [geoDistance](/sql-reference/functions/geo/coordinates/#geodistance) 对关联结果排序,并将距离限制在 20 公里以内,从中为每个滑雪胜地选取距离最近的一条记录,然后按总降雪量排序。注意,我们还将滑雪胜地限制在海拔 1800 米以上,将其作为良好滑雪条件的一个粗略指标。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md index 4c0df670537..d17faeeb76b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nyc-taxi.md @@ -24,7 +24,7 @@ import TabItem from '@theme/TabItem'; ::: -## 创建 `trips` 表 +## 创建 `trips` 表 {#create-the-table-trips} 首先为出租车行程创建一张表: @@ -125,7 +125,7 @@ FROM gcs( -## 示例查询 +## 示例查询 {#sample-queries} 下面的查询是在上文所述的示例数据上执行的。用户可以在 [sql.clickhouse.com](https://sql.clickhouse.com/?query=U0VMRUNUIGNvdW50KCkgRlJPTSBueWNfdGF4aS50cmlwcw\&chart=eyJ0eXBlIjoibGluZSIsImNvbmZpZyI6eyJ0aXRsZSI6IlRlbXBlcmF0dXJlIGJ5IGNvdW50cnkgYW5kIHllYXIiLCJ4YXhpcyI6InllYXIiLCJ5YXhpcyI6ImNvdW50KCkiLCJzZXJpZXMiOiJDQVNUKHBhc3Nlbmdlcl9jb3VudCwgJ1N0cmluZycpIn19) 上针对完整数据集运行这些示例查询,只需将下面的查询修改为使用表 `nyc_taxi.trips`。 @@ -182,7 +182,7 @@ ORDER BY passenger_count ASC ``` -## 下载预先生成的分区 +## 下载预先生成的分区 {#download-of-prepared-partitions} :::note 以下步骤介绍原始数据集的信息,以及将预先生成的分区加载到自行管理的 ClickHouse 服务器环境中的方法。 @@ -195,9 +195,9 @@ ORDER BY passenger_count ASC ```bash $ curl -O https://datasets.clickhouse.com/trips_mergetree/partitions/trips_mergetree.tar -# 验证校验和 +# 验证校验和 {#validate-the-checksum} $ md5sum trips_mergetree.tar -# 校验和应为:f3b8d469b41d9a82da064ded7245d12c +# 校验和应为:f3b8d469b41d9a82da064ded7245d12c {#checksum-should-be-equal-to-f3b8d469b41d9a82da064ded7245d12c} $ tar xvf trips_mergetree.tar -C /var/lib/clickhouse # ClickHouse 数据目录的路径 $ # 检查解压数据的权限,必要时进行修复 $ sudo service clickhouse-server restart @@ -209,7 +209,7 @@ $ clickhouse-client --query "select count(*) from datasets.trips_mergetree" ::: -## 单机环境下的结果 +## 单机环境下的结果 {#results-on-single-server} 问题 1: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md index 7f261114132..d66f75a12f1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/nypd_complaint_data.md @@ -42,7 +42,7 @@ keywords: ['示例数据集', 'nypd', '犯罪数据', '样本数据', '公共数 在开始使用 ClickHouse 数据库之前,请先熟悉一下该 TSV 文件中的数据。 -### 查看源 TSV 文件中的字段 +### 查看源 TSV 文件中的字段 {#look-at-the-fields-in-the-source-tsv-file} 这是一个查询 TSV 文件的示例命令,但先不要运行它。 @@ -119,7 +119,7 @@ New Georeferenced Column Nullable(String) 此时,应检查 TSV 文件中的列是否与[数据集网页](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243)中 **Columns in this Dataset** 部分指定的列名和类型一致。该数据集中的数据类型定义并不十分具体,所有数值型字段都被设置为 `Nullable(Float64)`,而其他所有字段则为 `Nullable(String)`。在创建用于存储这些数据的 ClickHouse 表时,可以指定更合适、性能更佳的数据类型。 -### 确定合适的表结构 +### 确定合适的表结构 {#determine-the-proper-schema} 要确定字段应使用哪些数据类型,必须先了解数据的实际形态。例如,字段 `JURISDICTION_CODE` 是一个数值类型:它应该是 `UInt8`,还是 `Enum`,或者使用 `Float64` 更为合适? @@ -210,7 +210,7 @@ clickhouse-local --input_format_max_rows_to_read_for_schema_inference=2000 \ 在撰写本文时使用的数据集中,`PARK_NM` 列中只有几百个不同的公园和游乐场名称。根据 [LowCardinality](/sql-reference/data-types/lowcardinality#description) 的建议,`LowCardinality(String)` 字段中的不同字符串数量应控制在 10,000 个以下,因此这个数量相对较小。 -### DateTime 字段 +### DateTime 字段 {#datetime-fields} 根据该[数据集网页](https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Current-Year-To-Date-/5uac-w243)中的 **Columns in this Dataset** 部分,可以看到为报告事件的开始和结束分别提供了日期和时间字段。查看 `CMPLNT_FR_DT` 和 `CMPLT_TO_DT` 的最小值和最大值,可以帮助判断这些字段是否始终有值: @@ -297,7 +297,7 @@ FORMAT PrettyCompact" 还需要对更多字段类型进行修改,这些都可以通过遵循相同的分析步骤来确定。查看字段中不同字符串取值的数量、数值字段的最小值和最大值,然后做出你的决策。本指南后面给出的表结构中包含了许多低基数的字符串字段和无符号整数字段,而浮点数值字段则很少。 ::: -## 连接日期和时间字段 +## 连接日期和时间字段 {#concatenate-the-date-and-time-fields} 要将日期和时间字段 `CMPLNT_FR_DT` 和 `CMPLNT_FR_TM` 拼接为一个可以转换为 `DateTime` 的 `String`,请选择这两个字段,并使用连接运算符进行拼接:`CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM`。`CMPLNT_TO_DT` 和 `CMPLNT_TO_TM` 字段的处理方式相同。 @@ -328,7 +328,7 @@ FORMAT PrettyCompact" ``` -## 将日期和时间字符串转换为 DateTime64 类型 +## 将日期和时间字符串转换为 DateTime64 类型 {#convert-the-date-and-time-string-to-a-datetime64-type} 在本指南的前面部分中,我们发现 TSV 文件中存在早于 1970 年 1 月 1 日的日期,这意味着这些日期需要使用 64 位的 DateTime 类型。同时,还需要将日期格式从 `MM/DD/YYYY` 转换为 `YYYY/MM/DD`。这两项操作都可以通过 [`parseDateTime64BestEffort()`](../../sql-reference/functions/type-conversion-functions.md#parsedatetime64besteffort) 来完成。 @@ -389,7 +389,7 @@ FORMAT PrettyCompact" 上文中针对各列所选用的数据类型会体现在下面的表结构中。我们还需要确定表所使用的 `ORDER BY` 和 `PRIMARY KEY`。必须至少指定 `ORDER BY` 或 `PRIMARY KEY` 其中之一。下面是关于如何决定在 `ORDER BY` 中包含哪些列的一些指导原则,更多信息请参见本文档末尾的 *后续步骤* 部分。 -### `ORDER BY` 和 `PRIMARY KEY` 子句 +### `ORDER BY` 和 `PRIMARY KEY` 子句 {#order-by-and-primary-key-clauses} * `ORDER BY` 元组应包含在查询过滤条件中使用的字段 * 为了最大化磁盘压缩率,`ORDER BY` 元组中的字段应按基数从低到高排序 @@ -483,7 +483,7 @@ CREATE TABLE NYPD_Complaint ( ``` -### 查找表的主键 +### 查找表的主键 {#finding-the-primary-key-of-a-table} ClickHouse 的 `system` 数据库,特别是 `system.table`,存储了你刚刚创建的表的所有信息。下面的查询会显示 `ORDER BY`(排序键)和 `PRIMARY KEY`: @@ -518,7 +518,7 @@ Query id: 6a5b10bf-9333-4090-b36e-c7f08b1d9e01 我们将使用 `clickhouse-local` 工具对数据进行预处理,并使用 `clickhouse-client` 将其上传。 -### 使用的 `clickhouse-local` 参数 +### 使用的 `clickhouse-local` 参数 {#clickhouse-local-arguments-used} :::tip `table='input'` 出现在下面传给 clickhouse-local 的参数中。clickhouse-local 会获取提供的输入(`cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv`),并将该输入插入到一张表中。默认情况下,这张表被命名为 `table`。在本指南中,将这张表的名称设置为 `input`,以使数据流更加清晰。传给 clickhouse-local 的最后一个参数是一个从该表查询的语句(`FROM input`),随后通过管道传给 `clickhouse-client`,用于向表 `NYPD_Complaint` 写入数据。 @@ -569,7 +569,7 @@ cat ${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv \ ``` -## 验证数据 +## 验证数据 {#validate-data} :::note 数据集每年会变动一到多次,因此你得到的计数结果可能与本文档中的示例不完全一致。 @@ -613,7 +613,7 @@ WHERE name = 'NYPD_Complaint' ## 执行一些查询 {#run-queries} -### 查询 1:按月对比投诉数量 +### 查询 1:按月对比投诉数量 {#query-1-compare-the-number-of-complaints-by-month} 查询: @@ -651,7 +651,7 @@ Query id: 7fbd4244-b32a-4acf-b1f3-c3aa198e74d9 ``` -### 查询 2:按行政区对比投诉总数 +### 查询 2:按行政区对比投诉总数 {#query-2-compare-total-number-of-complaints-by-borough} 查询: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md index 249ee95a712..c4b5f58e370 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/ontime.md @@ -127,7 +127,7 @@ CREATE TABLE `ontime` ORDER BY (Year, Quarter, Month, DayofMonth, FlightDate, IATA_CODE_Reporting_Airline); ``` -## 从原始数据导入 +## 从原始数据导入 {#import-from-raw-data} 下载数据: @@ -144,7 +144,7 @@ ls -1 *.zip | xargs -I{} -P $(nproc) bash -c "echo {}; unzip -cq {} '*.csv' | se (如果你的服务器出现内存不足或其他问题,请删除 `-P $(nproc)` 这一部分) -## 从已保存的副本导入 +## 从已保存的副本导入 {#import-from-a-saved-copy} 你也可以通过以下查询,从已保存的副本中导入数据: @@ -155,7 +155,7 @@ INSERT INTO ontime SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazo 该快照创建于 2022-05-29。 -## 查询 +## 查询 {#queries} Q0. diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md index 2831d7e3671..32ec8b4f04f 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/stackoverflow.md @@ -22,7 +22,7 @@ import stackoverflow from '@site/static/images/getting-started/example-datasets/ 该数据集的模式说明可在[此处](https://meta.stackexchange.com/questions/2677/database-schema-documentation-for-the-public-data-dump-and-sede)找到。 -## 预置数据 +## 预置数据 {#pre-prepared-data} 我们提供了一份 Parquet 格式的数据副本,内容更新至 2024 年 4 月。虽然从行数规模来看(6,000 万条帖子),这个数据集对 ClickHouse 来说并不算大,但其中包含了大量文本以及体积较大的 String 类型列。 @@ -33,7 +33,7 @@ CREATE DATABASE stackoverflow 以下时间测试结果基于一个位于 `eu-west-2`、具有 96 GiB 内存和 24 个 vCPU 的 ClickHouse Cloud 集群。数据集位于 `eu-west-3`。 -### 文章 +### 文章 {#posts} ```sql CREATE TABLE stackoverflow.posts @@ -73,7 +73,7 @@ INSERT INTO stackoverflow.posts SELECT * FROM s3('https://datasets-documentation Posts 数据集也可以按年份获取,例如 [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 @@ -96,7 +96,7 @@ INSERT INTO stackoverflow.votes SELECT * FROM s3('https://datasets-documentation 投票数据也可以按年份获取,例如:[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 @@ -120,7 +120,7 @@ INSERT INTO stackoverflow.comments SELECT * FROM s3('https://datasets-documentat 评论数据也可以按年份获取,例如:[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 @@ -147,7 +147,7 @@ INSERT INTO stackoverflow.users SELECT * FROM s3('https://datasets-documentation ``` -### 徽章 +### 徽章 {#badges} ```sql CREATE TABLE stackoverflow.badges @@ -168,7 +168,7 @@ INSERT INTO stackoverflow.badges SELECT * FROM s3('https://datasets-documentatio ``` -### 文章链接 +### 文章链接 {#postlinks} ```sql CREATE TABLE stackoverflow.postlinks @@ -188,7 +188,7 @@ INSERT INTO stackoverflow.postlinks SELECT * FROM s3('https://datasets-documenta ``` -### PostHistory +### PostHistory {#posthistory} ```sql CREATE TABLE stackoverflow.posthistory @@ -217,7 +217,7 @@ INSERT INTO stackoverflow.posthistory SELECT * FROM s3('https://datasets-documen 原始数据集以压缩的 7-Zip XML 格式提供,可从 [https://archive.org/download/stackexchange](https://archive.org/download/stackexchange) 获取,文件前缀为 `stackoverflow.com*`。 -### 下载 +### 下载 {#download} ```bash wget https://archive.org/download/stackexchange/stackoverflow.com-Badges.7z @@ -232,7 +232,7 @@ wget https://archive.org/download/stackexchange/stackoverflow.com-Votes.7z 这些文件大小可达 35GB,具体下载时间取决于网络状况,大约需要 30 分钟——下载服务器的限速约为 20 MB/秒。 -### 转换为 JSON +### 转换为 JSON {#convert-to-json} 在撰写本文时,ClickHouse 暂不原生支持将 XML 作为输入格式。要将数据加载到 ClickHouse,我们首先将其转换为 NDJSON。 @@ -260,7 +260,7 @@ p7zip -d stackoverflow.com-Posts.7z ```bash mkdir posts cd posts -# 以下命令将输入的 XML 文件拆分为每个 10000 行的子文件 +# 以下命令将输入的 XML 文件拆分为每个 10000 行的子文件 {#the-following-splits-the-input-xml-file-into-sub-files-of-10000-rows} tail +3 ../Posts.xml | head -n -1 | split -l 10000 --filter='{ printf "\n"; cat - ; printf "\n"; } > $FILE' - ``` @@ -283,7 +283,7 @@ clickhouse local --query "SELECT * FROM file('posts.json', JSONEachRow, 'Id Int3 下面是一些简单的查询示例,帮助你开始使用。 -### Stack Overflow 上最常用的标签 +### Stack Overflow 上最常用的标签 {#most-popular-tags-on-stack-overflow} ```sql @@ -313,7 +313,7 @@ LIMIT 10 ``` -### 回答数最多的用户(活跃账户) +### 回答数最多的用户(活跃账户) {#user-with-the-most-answers-active-accounts} 账户必须包含 `UserId`。 @@ -340,7 +340,7 @@ LIMIT 5 ``` -### 阅读量最高的 ClickHouse 相关文章 +### 阅读量最高的 ClickHouse 相关文章 {#clickhouse-related-posts-with-the-most-views} ```sql SELECT @@ -371,7 +371,7 @@ LIMIT 10 ``` -### 最具争议的帖子 +### 最具争议的帖子 {#most-controversial-posts} ```sql SELECT diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md index 4344f035678..3df93f349fa 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tpch.md @@ -13,12 +13,12 @@ keywords: ['示例数据集', 'tpch', '基准测试', '示例数据', '性能测 **参考文献** -- [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 等,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 等,2013) -- [Quantifying TPC-H Choke Points and Their Optimizations](https://doi.org/10.14778/3389133.3389138)(Dresseler 等,2020) +* [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 等,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 等,2013) +* [Quantifying TPC-H Choke Points and Their Optimizations](https://doi.org/10.14778/3389133.3389138)(Dresseler 等,2020) -## 数据生成与导入 +## 数据生成与导入 {#data-generation-and-import} 首先,检出 TPC-H 仓库代码并编译数据生成器: @@ -61,7 +61,6 @@ make (例如 `Identifier`、`Variable text, size N`)。这仅带来更好的可读性,由 `dbgen` 生成的 SQL-92 数据类型 (例如 `INTEGER`、`VARCHAR(40)`) 在 ClickHouse 中同样可以正常工作。 - ```sql CREATE TABLE nation ( n_nationkey Int32, @@ -169,7 +168,6 @@ clickhouse-client --format_csv_delimiter '|' --query "INSERT INTO lineitem FORMA :::note 你也可以选择从公共 S3 存储桶中导入数据,而不是使用 tpch-kit 自行生成这些表。请确保先使用上面的 `CREATE` 语句创建空表。 - ```sql -- 扩展因子 1 INSERT INTO nation SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws.com/h/1/nation.tbl', NOSIGN, CSV) SETTINGS format_csv_delimiter = '|', input_format_defaults_for_omitted_fields = 1, input_format_csv_empty_as_default = 1; @@ -194,8 +192,7 @@ INSERT INTO lineitem SELECT * FROM s3('https://clickhouse-datasets.s3.amazonaws. ::: - -## 查询 +## 查询 {#queries} :::note 应启用 [`join_use_nulls`](../../operations/settings/settings.md#join_use_nulls) 设置,以获得符合 SQL 标准的正确结果。 @@ -348,7 +345,6 @@ ORDER BY **问题 5** - ```sql SELECT n_name, @@ -496,7 +492,6 @@ ORDER BY **Q9** - ```sql SELECT nation, @@ -850,7 +845,6 @@ WHERE **Q20** - ```sql SELECT s_name, diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md index 3feb9f29161..c20b0876e96 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/tw-weather.md @@ -26,7 +26,7 @@ keywords: ['示例数据集', 'weather', 'taiwan', '示例数据', '气候数据 - 为 ClickHouse 准备的[预处理数据版本](#pre-processed-data),已经过清洗、重构和富化。该数据集覆盖 1896 年至 2023 年。 - [下载原始数据](#original-raw-data)并转换为 ClickHouse 所需的格式。希望添加自定义列的用户可以在此基础上探索或完善自己的方案。 -### 预处理数据 +### 预处理数据 {#pre-processed-data} 该数据集也已经从“每行一条测量记录”的结构重组为“每个气象站 ID 与测量日期对应一行”的结构,即: @@ -47,16 +47,16 @@ C0X100,2016-01-01 04:00:00,1021.2,15.8,74,1.7,8.0,,,,,,,,,,,,,,,,,,,,,,, ```bash wget https://storage.googleapis.com/taiwan-weather-observaiton-datasets/preprocessed_weather_daily_1896_2023.tar.gz -# 可选:验证校验和 +# 可选:验证校验和 {#option-validate-the-checksum} md5sum preprocessed_weather_daily_1896_2023.tar.gz -# 校验和应为:11b484f5bd9ddafec5cfb131eb2dd008 +# 校验和应为:11b484f5bd9ddafec5cfb131eb2dd008 {#checksum-should-be-equal-to-11b484f5bd9ddafec5cfb131eb2dd008} tar -xzvf preprocessed_weather_daily_1896_2023.tar.gz daily_weather_preprocessed_1896_2023.csv -# 可选:验证校验和 +# 可选:验证校验和 {#option-validate-the-checksum} md5sum daily_weather_preprocessed_1896_2023.csv -# 校验和应为:1132248c78195c43d93f843753881754 +# 校验和应为:1132248c78195c43d93f843753881754 {#checksum-should-be-equal-to-1132248c78195c43d93f843753881754} ``` @@ -64,7 +64,7 @@ md5sum daily_weather_preprocessed_1896_2023.csv 以下内容介绍如何下载原始数据,以便按需进行转换和处理。 -#### 下载 +#### 下载 {#download} 要下载原始数据: @@ -73,9 +73,9 @@ 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 -# 可选:验证校验和 +# 可选:验证校验和 {#option-validate-the-checksum} md5sum raw_data_weather_daily_1896_2023.tar.gz -# 校验和应为:b66b9f137217454d655e3004d7d1b51a +# 校验和应为:b66b9f137217454d655e3004d7d1b51a {#checksum-should-be-equal-to-b66b9f137217454d655e3004d7d1b51a} tar -xzvf raw_data_weather_daily_1896_2023.tar.gz 466920_1928.csv @@ -84,23 +84,23 @@ tar -xzvf raw_data_weather_daily_1896_2023.tar.gz 466920_1931.csv ... -# 可选:验证校验和 +# 可选:验证校验和 {#option-validate-the-checksum} cat *.csv | md5sum -# 校验和应为:b26db404bf84d4063fac42e576464ce1 +# 校验和应为:b26db404bf84d4063fac42e576464ce1 {#checksum-should-be-equal-to-b26db404bf84d4063fac42e576464ce1} ``` -#### 获取台湾地区气象站列表 +#### 获取台湾地区气象站列表 {#retrieve-the-taiwan-weather-stations} ```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 编码 +# 可选:将 UTF-8-BOM 转换为 UTF-8 编码 {#option-convert-the-utf-8-bom-to-utf-8-encoding} sed -i '1s/^\xEF\xBB\xBF//' weather_sta_list.csv ``` -## 创建表结构 +## 创建表结构 {#create-table-schema} 使用 ClickHouse 客户端在 ClickHouse 中创建 MergeTree 表。 @@ -144,7 +144,7 @@ ORDER BY (MeasuredDate); ## 向 ClickHouse 插入数据 {#inserting-into-clickhouse} -### 从本地文件插入 +### 从本地文件插入 {#inserting-from-local-file} 可以在 ClickHouse 客户端中通过以下方式从本地文件插入数据: @@ -165,7 +165,7 @@ INSERT INTO tw_weather_data FROM INFILE '/path/to/daily_weather_preprocessed_189 ``` -### 从 URL 插入数据 +### 从 URL 插入数据 {#inserting-from-url} ```sql INSERT INTO tw_weather_data SELECT * @@ -176,7 +176,7 @@ FROM url('https://storage.googleapis.com/taiwan-weather-observaiton-datasets/dai 如需了解如何加快这一过程,请参阅我们关于[优化大规模数据加载](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part2)的博文。 -## 检查数据行和大小 +## 检查数据行和大小 {#check-data-rows-and-sizes} 1. 先查看已插入了多少行: @@ -210,7 +210,7 @@ WHERE (`table` = 'tw_weather_data') AND active ## 查询示例 {#sample-queries} -### Q1: 查询指定年份中每个气象站的最高露点温度 +### Q1: 查询指定年份中每个气象站的最高露点温度 {#q1-retrieve-the-highest-dew-point-temperature-for-each-weather-station-in-the-specific-year} ```sql SELECT @@ -257,7 +257,7 @@ GROUP BY StationId ``` -### Q2: 在特定时间范围内按字段和气象站获取原始数据 +### Q2: 在特定时间范围内按字段和气象站获取原始数据 {#q2-raw-data-fetching-with-the-specific-duration-time-range-fields-and-weather-station} ```sql SELECT diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md index af1ced26910..7a2796ae642 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/uk-price-paid.md @@ -13,7 +13,7 @@ keywords: ['示例数据集', '英国房产', '示例数据', '房地产', '入 - 字段说明: https://www.gov.uk/guidance/about-the-price-paid-data - 包含 HM Land Registry 数据 © Crown copyright and database right 2021。本数据依据 Open Government Licence v3.0 授权许可使用。 -## 创建数据表 +## 创建数据表 {#create-table} ```sql CREATE DATABASE uk; @@ -40,7 +40,7 @@ ORDER BY (postcode1, postcode2, addr1, addr2); ``` -## 预处理并插入数据 +## 预处理并插入数据 {#preprocess-import-data} 我们将使用 `url` 函数将数据流式写入 ClickHouse。首先需要对部分传入数据进行预处理,包括: @@ -95,7 +95,7 @@ FROM url( 等待数据插入完成;根据网络速度,这可能需要一到两分钟。 -## 验证数据 +## 验证数据 {#validate-data} 通过查看插入了多少行来验证是否生效: @@ -119,7 +119,7 @@ WHERE name = 'uk_price_paid' 我们来运行一些查询来分析数据: -### 查询 1:各年份的平均价格 +### 查询 1:各年份的平均价格 {#average-price} ```sql runnable SELECT @@ -133,7 +133,7 @@ ORDER BY year ``` -### 查询 2:伦敦每年的平均价格 +### 查询 2:伦敦每年的平均价格 {#average-price-london} ```sql runnable SELECT @@ -150,7 +150,7 @@ ORDER BY year 2020 年房价发生了点变化!不过这大概不算什么意外…… -### 查询 3:最昂贵的街区 +### 查询 3:最昂贵的街区 {#most-expensive-neighborhoods} ```sql runnable SELECT diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md index 29eb820262b..90beb9a30ed 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/example-datasets/youtube-dislikes.md @@ -241,7 +241,7 @@ keywords: ['示例数据集', 'youtube', '示例数据', '视频分析', '点踩 ## 常见问题 {#questions} -### 如果视频关闭了评论功能,会不会降低观众点点赞或点踩的可能性? +### 如果视频关闭了评论功能,会不会降低观众点点赞或点踩的可能性? {#create-the-table} 当评论被关闭时,观众是否更倾向于通过点赞或点踩来表达他们对视频的看法? @@ -297,7 +297,7 @@ ORDER BY 启用评论似乎与更高的参与度有关。 -### 视频数量随时间如何变化——有哪些值得关注的事件? +### 视频数量随时间如何变化——有哪些值得关注的事件? {#insert-data} ```sql SELECT @@ -336,7 +336,7 @@ ORDER BY month ASC; 可以明显看出,在新冠疫情前后,上传者数量出现了激增([相关现象可见此处](https://www.theverge.com/2020/3/27/21197642/youtube-with-me-style-videos-views-coronavirus-cook-workout-study-home-beauty))。 -### 字幕数量随时间的变化及其出现时间 +### 字幕数量随时间的变化及其出现时间 {#count-row-numbers} 随着语音识别技术的进步,为视频创建字幕比以往任何时候都更容易。YouTube 在 2009 年底推出自动字幕功能——转折点就是那时吗? @@ -374,7 +374,7 @@ ORDER BY month ASC; 这引发了一场非常成功的活动,号召创作者为他们的视频添加字幕,以方便听力障碍和失聪的观众。 -### 各时间段上传量最高的用户 +### 各时间段上传量最高的用户 {#explore-the-data} ```sql WITH uploaders AS @@ -467,7 +467,7 @@ ORDER BY ``` -### 视图是如何分布的? +### 视图是如何分布的? {#if-someone-disables-comments-does-it-lower-the-chance-someone-will-actually-click-like-or-dislike} ```sql SELECT diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/index.md index fbc2cdfe715..75f01c972c0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/index.md @@ -9,9 +9,7 @@ title: '教程和示例数据集' doc_type: 'landing-page' --- - - -# 教程和示例数据集 +# 教程和示例数据集 {#tutorials-and-example-datasets} 我们提供了大量资源,帮助你上手并了解 ClickHouse 的工作原理: @@ -24,7 +22,6 @@ doc_type: 'landing-page' {/* 下表在构建时由脚本 https://github.com/ClickHouse/clickhouse-docs/blob/main/scripts/autogenerate-table-of-contents.sh 自动生成 */ } - {/*AUTOGENERATED_START*/ } | 页面 | 描述 | diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md index 397f2b6f8d9..5f8e1c50406 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_deb_install.md @@ -17,20 +17,30 @@ import TabItem from '@theme/TabItem'; ```bash -# 安装先决条件软件包 +# 安装先决条件软件包 {#install-prerequisite-packages} sudo apt-get install -y apt-transport-https ca-certificates curl gnupg +``` + -# 下载 ClickHouse 的 GPG 密钥并将其存储到密钥环中 +# 下载 ClickHouse 的 GPG 密钥并将其存储到密钥环中 {#download-the-clickhouse-gpg-key-and-store-it-in-the-keyring} curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' | sudo gpg --dearmor -o /usr/share/keyrings/clickhouse-keyring.gpg -# 获取系统架构 + + +# 获取系统架构 {#get-the-system-architecture} ARCH=$(dpkg --print-architecture) -# 将 ClickHouse 仓库添加到 APT 软件源列表 + + +# 将 ClickHouse 仓库添加到 APT 软件源列表 {#add-the-clickhouse-repository-to-apt-sources} echo "deb [signed-by=/usr/share/keyrings/clickhouse-keyring.gpg arch=${ARCH}] https://packages.clickhouse.com/deb stable main" | sudo tee /etc/apt/sources.list.d/clickhouse.list -# 更新 apt 软件包列表 + + +# 更新 apt 软件包列表 {#update-apt-package-lists} + sudo apt-get update + ``` - 您可以将 `stable` 替换为 `lts`,以根据需要使用不同的[发布通道](/knowledgebase/production)。 @@ -38,42 +48,59 @@ sudo apt-get update
用于安装 deb 软件包的旧分发方式 +``` + ```bash -# 安装前置依赖包 +# 安装前置依赖包 {#install-prerequisite-packages} sudo apt-get install apt-transport-https ca-certificates dirmngr +``` -# 添加 ClickHouse GPG 密钥用于验证软件包 + +# 添加 ClickHouse GPG 密钥用于验证软件包 {#add-the-clickhouse-gpg-key-to-authenticate-packages} sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754 -# 将 ClickHouse 软件仓库添加到 apt 源列表 + + +# 将 ClickHouse 软件仓库添加到 apt 源列表 {#add-the-clickhouse-repository-to-apt-sources} echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \ /etc/apt/sources.list.d/clickhouse.list + + -# 更新 apt 软件包列表 +# 更新 apt 软件包列表 {#update-apt-package-lists} sudo apt-get update -# 安装 ClickHouse 服务端和客户端软件包 + + +# 安装 ClickHouse 服务端和客户端软件包 {#install-clickhouse-server-and-client-packages} sudo apt-get install -y clickhouse-server clickhouse-client -# 启动 ClickHouse 服务 + + +# 启动 ClickHouse 服务 {#start-the-clickhouse-server-service} sudo service clickhouse-server start -# 启动 ClickHouse 命令行客户端 + + +# 启动 ClickHouse 命令行客户端 {#launch-the-clickhouse-command-line-client} + clickhouse-client # 如果已设置密码,请使用 "clickhouse-client --password"。 + ```
+``` -## 安装 ClickHouse 服务端和客户端 +## 安装 ClickHouse 服务端和客户端 {#install-clickhouse-server-and-client} ```bash sudo apt-get install -y clickhouse-server clickhouse-client ``` -## 启动 ClickHouse +## 启动 ClickHouse {#start-clickhouse-server} 要启动 ClickHouse 服务器,请运行: @@ -94,7 +121,7 @@ clickhouse-client --password ``` -## 安装独立的 ClickHouse Keeper +## 安装独立的 ClickHouse Keeper {#install-standalone-clickhouse-keeper} :::tip 在生产环境中,我们强烈建议在专用节点上运行 ClickHouse Keeper。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md index 6553cdc7ef6..9ac903655ae 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_docker.md @@ -1,4 +1,4 @@ -# 使用 Docker 安装 ClickHouse +# 使用 Docker 安装 ClickHouse {#install-clickhouse-using-docker} 为方便起见,下面转载了 [Docker Hub](https://hub.docker.com/r/clickhouse/clickhouse-server/) 上的指南。可用的 Docker 镜像使用的是官方提供的 ClickHouse deb 软件包。 @@ -31,9 +31,9 @@ docker pull clickhouse/clickhouse-server -## 如何使用该镜像 +## 如何使用该镜像 {#how-to-use-image} -### 启动服务器实例 +### 启动服务器实例 {#start-server-instance} ```bash docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server @@ -43,18 +43,18 @@ docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickh 默认情况下,上面启动的服务器实例将以无密码的 `default` 用户身份运行。 -### 从原生客户端连接到它 +### 从原生客户端连接到它 {#connect-to-it-from-native-client} ```bash docker run -it --rm --network=container:some-clickhouse-server --entrypoint clickhouse-client clickhouse/clickhouse-server -# 或者 +# 或者 {#or} docker exec -it some-clickhouse-server clickhouse-client ``` 有关 ClickHouse 客户端的更多信息,请参阅[ClickHouse 客户端](/interfaces/cli)。 -### 使用 curl 进行连接 +### 使用 curl 进行连接 {#connect-to-it-using-curl} ```bash echo "SELECT 'Hello, ClickHouse!'" | docker run -i --rm --network=container:some-clickhouse-server buildpack-deps:curl curl 'http://localhost:8123/?query=' -s --data-binary @- @@ -62,14 +62,14 @@ echo "SELECT 'Hello, ClickHouse!'" | docker run -i --rm --network=container:some 有关 HTTP 接口的更多信息,请参阅 [ClickHouse HTTP 接口](/interfaces/http)。 -### 停止/移除容器 +### 停止/移除容器 {#stopping-removing-container} ```bash docker stop some-clickhouse-server docker rm some-clickhouse-server ``` -### 网络 +### 网络 {#networking} :::note 预定义用户 `default` 在未设置密码之前不具备网络访问权限, @@ -95,7 +95,7 @@ echo 'SELECT version()' | curl 'http://localhost:8123/' --data-binary @- 上面示例中的用户默认配置仅适用于本机(localhost)请求 ::: -### 卷(Volumes) +### 卷(Volumes) {#volumes} 通常,为了实现持久化,你可能需要在容器内挂载以下目录: @@ -116,7 +116,7 @@ docker run -d \ * `/docker-entrypoint-initdb.d/` - 包含数据库初始化脚本的文件夹(见下文)。 -## Linux 能力 +## Linux 能力 {#linear-capabilities} ClickHouse 提供了一些高级功能,这些功能需要启用若干 [Linux 能力(capabilities)](https://man7.org/linux/man-pages/man7/capabilities.7.html)。 @@ -131,29 +131,29 @@ docker run -d \ 如需了解更多信息,请参阅 ["在 Docker 中配置 CAP_IPC_LOCK 和 CAP_SYS_NICE 权限"](/knowledgebase/configure_cap_ipc_lock_and_cap_sys_nice_in_docker) -## 配置 +## 配置 {#configuration} 该容器对外暴露 8123 端口用于 [HTTP 接口](https://clickhouse.com/docs/interfaces/http_interface/),以及 9000 端口用于 [原生客户端](https://clickhouse.com/docs/interfaces/tcp/)。 ClickHouse 的配置由名为 “config.xml” 的文件进行定义([文档](https://clickhouse.com/docs/operations/configuration_files/))。 -### 使用自定义配置启动服务器实例 +### 使用自定义配置启动服务器实例 {#start-server-instance-with-custom-config} ```bash docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 -v /path/to/your/config.xml:/etc/clickhouse-server/config.xml clickhouse/clickhouse-server ``` -### 以自定义用户身份启动服务器 +### 以自定义用户身份启动服务器 {#start-server-custom-user} ```bash -# $PWD/data/clickhouse 目录应存在且归当前用户所有 +# $PWD/data/clickhouse 目录应存在且归当前用户所有 {#pwddataclickhouse-should-exist-and-be-owned-by-current-user} docker run --rm --user "${UID}:${GID}" --name some-clickhouse-server --ulimit nofile=262144:262144 -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server ``` 当你使用挂载本地目录的镜像时,通常需要指定用户以保持正确的文件所有权。使用 `--user` 参数,并在容器内挂载 `/var/lib/clickhouse` 和 `/var/log/clickhouse-server`。否则,镜像会报错,容器将无法启动。 -### 以 root 启动服务器 +### 以 root 启动服务器 {#start-server-from-root} 在启用了用户命名空间的场景下,以 root 用户身份启动服务器会很有用。 要这样做,请运行: @@ -162,7 +162,7 @@ docker run --rm --user "${UID}:${GID}" --name some-clickhouse-server --ulimit no docker run --rm -e CLICKHOUSE_RUN_AS_ROOT=1 --name clickhouse-server-userns -v "$PWD/logs/clickhouse:/var/log/clickhouse-server" -v "$PWD/data/clickhouse:/var/lib/clickhouse" clickhouse/clickhouse-server ``` -### 如何在启动时创建默认数据库和用户 +### 如何在启动时创建默认数据库和用户 {#how-to-create-default-db-and-user} 有时你可能希望在容器启动时创建一个用户(系统默认使用名为 `default` 的用户)和一个数据库。你可以通过环境变量 `CLICKHOUSE_DB`、`CLICKHOUSE_USER`、`CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT` 和 `CLICKHOUSE_PASSWORD` 来实现: @@ -170,7 +170,7 @@ docker run --rm -e CLICKHOUSE_RUN_AS_ROOT=1 --name clickhouse-server-userns -v " docker run --rm -e CLICKHOUSE_DB=my_database -e CLICKHOUSE_USER=username -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=password -p 9000:9000/tcp clickhouse/clickhouse-server ``` -#### 管理 `default` 用户 +#### 管理 `default` 用户 {#managing-default-user} 当未设置 `CLICKHOUSE_USER`、`CLICKHOUSE_PASSWORD` 或 `CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT` 中任意一个时,`default` 用户默认禁用网络访问。 @@ -181,7 +181,7 @@ docker run --rm -e CLICKHOUSE_SKIP_USER_SETUP=1 -p 9000:9000/tcp clickhouse/clic ``` -## 如何扩展此镜像 +## 如何扩展此镜像 {#how-to-extend-image} 要在基于本镜像的自定义镜像中执行额外的初始化操作,请在 `/docker-entrypoint-initdb.d` 目录下添加一个或多个 `*.sql`、`*.sql.gz` 或 `*.sh` 脚本。入口点脚本调用 `initdb` 之后,会运行所有 `*.sql` 文件、执行所有可执行的 `*.sh` 脚本,并对该目录中所有不可执行的 `*.sh` 脚本执行 `source` 引入操作,以在启动服务前完成进一步初始化。\ 另外,你也可以提供环境变量 `CLICKHOUSE_USER` 和 `CLICKHOUSE_PASSWORD`,它们会在初始化期间被 clickhouse-client 使用。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md index 231282dc539..d0b37f7109c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_linux_tar_install.md @@ -1,4 +1,4 @@ -# 使用 tgz 归档文件安装 ClickHouse +# 使用 tgz 归档文件安装 ClickHouse {#install-clickhouse-using-tgz-archives} > 对于无法安装 `deb` 或 `rpm` 软件包的 Linux 发行版,建议使用官方预编译的 `tgz` 归档文件。 @@ -20,7 +20,7 @@ -## 获取最新的 ClickHouse 版本 +## 获取最新的 ClickHouse 版本 {#get-latest-version} 从 GitHub 获取最新的 ClickHouse 版本,并将其保存到 `LATEST_VERSION` 变量中。 @@ -31,7 +31,7 @@ export LATEST_VERSION ``` -## 检测系统架构 +## 检测系统架构 {#detect-system-architecture} 检测系统架构,并相应设置 ARCH 变量: @@ -44,7 +44,7 @@ esac ``` -## 为每个 ClickHouse 组件下载 tar 包 +## 为每个 ClickHouse 组件下载 tar 包 {#download-tarballs} 为每个 ClickHouse 组件下载 tar 包。该循环会优先尝试特定架构的 软件包,如果不存在则退回到通用软件包。 @@ -66,7 +66,7 @@ done ```bash -# 解压并安装 clickhouse-common-static 软件包 +# 解压并安装 clickhouse-common-static 软件包 {#extract-and-install-clickhouse-common-static-package} 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" @@ -76,7 +76,7 @@ sudo "clickhouse-common-static-$LATEST_VERSION/install/doinst.sh" ```bash -# 提取并安装调试符号包 +# 提取并安装调试符号包 {#extract-and-install-debug-symbols-package} 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" @@ -86,7 +86,7 @@ sudo "clickhouse-common-static-dbg-$LATEST_VERSION/install/doinst.sh" ```bash -# 解压并安装服务器软件包及配置 +# 解压并安装服务器软件包及配置 {#extract-and-install-server-package-with-configuration} tar -xzvf "clickhouse-server-$LATEST_VERSION-${ARCH}.tgz" \ || tar -xzvf "clickhouse-server-$LATEST_VERSION.tgz" sudo "clickhouse-server-$LATEST_VERSION/install/doinst.sh" configure @@ -97,7 +97,7 @@ sudo /etc/init.d/clickhouse-server start # 启动服务器 ```bash -# 提取并安装客户端软件包 +# 提取并安装客户端软件包 {#extract-and-install-client-package} tar -xzvf "clickhouse-client-$LATEST_VERSION-${ARCH}.tgz" \ || tar -xzvf "clickhouse-client-$LATEST_VERSION.tgz" sudo "clickhouse-client-$LATEST_VERSION/install/doinst.sh" diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md index b8c0c09030c..e79c70711d2 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_macos.md @@ -5,12 +5,12 @@ import privacy_allow from "@site/static/images/knowledgebase/fix-the-developer-v -# 使用 Homebrew 安装 ClickHouse +# 使用 Homebrew 安装 ClickHouse {#install-clickhouse-using-homebrew} -## 使用社区 Homebrew 配方进行安装 +## 使用社区 Homebrew 配方进行安装 {#install-using-community-homebrew-formula} 要在 macOS 上使用 [Homebrew](https://brew.sh/) 安装 ClickHouse,可以使用 ClickHouse 社区提供的 [Homebrew 配方](https://formulae.brew.sh/cask/clickhouse)。 @@ -19,7 +19,7 @@ brew install --cask clickhouse ``` -## 在 macOS 中修复开发者验证错误 +## 在 macOS 中修复开发者验证错误 {#fix-developer-verification-error-macos} 如果你使用 `brew` 安装 ClickHouse,可能会遇到来自 macOS 的错误提示。 默认情况下,macOS 不会运行由无法验证身份的开发者创建的应用程序或工具。 @@ -30,7 +30,7 @@ brew install --cask clickhouse 要绕过此验证错误,你需要将该应用从 macOS 的隔离区中移除,可以通过以下任一方式完成:在系统设置窗口中找到相应设置、使用终端,或者重新安装 ClickHouse。 -### 系统设置流程 +### 系统设置流程 {#system-settings-process} 将 `clickhouse` 可执行文件从隔离区移除的最简单方式是: @@ -50,7 +50,7 @@ brew install --cask clickhouse 现在你应该可以在终端中运行 `clickhouse` 命令了。 -### 终端流程 +### 终端流程 {#terminal-process} 有时点击 `Allow Anyway` 按钮并不能解决该问题,在这种情况下,你也可以通过命令行来完成这一流程。 或者你可能只是更喜欢使用命令行! diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md index 49e53e4f083..1528b065cce 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_quick_install.md @@ -1,11 +1,11 @@ -# 使用 curl 脚本安装 ClickHouse +# 使用 curl 脚本安装 ClickHouse {#install-clickhouse-via-script-using-curl} 如果无需在生产环境中安装 ClickHouse,最快的安装方式是使用 curl 运行安装脚本。该脚本会自动为您的操作系统选择合适的二进制文件。 -## 使用 curl 安装 ClickHouse +## 使用 curl 安装 ClickHouse {#install-clickhouse-using-curl} 运行以下命令,为你的操作系统下载一个独立的二进制可执行文件。 @@ -18,7 +18,7 @@ Mac 用户:如果你遇到提示无法验证二进制文件开发者的错误 ::: -## 启动 clickhouse-local +## 启动 clickhouse-local {#start-clickhouse-local} `clickhouse-local` 允许使用 ClickHouse 强大的 SQL 语法,在无需任何配置的情况下处理本地和远程文件。表数据会存储在临时位置,这意味着在重启 `clickhouse-local` 之后,先前创建的表将不再可用。 @@ -29,7 +29,7 @@ Mac 用户:如果你遇到提示无法验证二进制文件开发者的错误 ``` -## 启动 clickhouse-server +## 启动 clickhouse-server {#start-clickhouse-server} 如果您希望持久化存储数据,需要运行 `clickhouse-server`。您可以使用以下命令启动 ClickHouse 服务器: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md index 56bedaaca51..1a637e0d893 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_rpm_install.md @@ -5,7 +5,7 @@ -## 配置 RPM 软件源 +## 配置 RPM 软件源 {#setup-the-rpm-repository} 运行以下命令添加官方软件源: @@ -24,7 +24,7 @@ sudo zypper --gpg-auto-import-keys refresh clickhouse-stable 在以下步骤中,您可以根据所使用的包管理器,将 `yum install` 替换为 `zypper install`。 -## 安装 ClickHouse 服务端和客户端 +## 安装 ClickHouse 服务端和客户端 {#install-clickhouse-server-and-client-1} 要安装 ClickHouse,请运行以下命令: @@ -41,7 +41,7 @@ sudo yum install clickhouse-server-22.8.7.34 ``` -## 启动 ClickHouse 服务器 +## 启动 ClickHouse 服务器 {#start-clickhouse-server-1} 要启动 ClickHouse 服务器,运行以下命令: @@ -64,7 +64,7 @@ clickhouse-client --password ``` -## 安装独立的 ClickHouse Keeper +## 安装独立的 ClickHouse Keeper {#install-standalone-clickhouse-keeper-1} :::tip 在生产环境中,我们强烈建议在独立节点上运行 ClickHouse Keeper。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md index db56ce4aee4..94e749b7ee7 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/_snippets/_windows_install.md @@ -1,4 +1,4 @@ -# 在 Windows 上通过 WSL 安装 ClickHouse +# 在 Windows 上通过 WSL 安装 ClickHouse {#install-clickhouse-on-windows-with-wsl} @@ -11,7 +11,7 @@ -## 安装 WSL +## 安装 WSL {#install-wsl} 以管理员身份打开 Windows PowerShell,并运行以下命令: @@ -26,7 +26,7 @@ wsl --install ``` -## 使用 curl 脚本安装 ClickHouse +## 使用 curl 脚本安装 ClickHouse {#install-clickhouse-via-script-using-curl} 运行以下命令,通过 curl 脚本安装 ClickHouse: @@ -42,7 +42,7 @@ curl https://clickhouse.com/ | sh ``` -## 启动 clickhouse-local +## 启动 clickhouse-local {#start-clickhouse-local} `clickhouse-local` 可用于在无需任何配置的情况下,借助 ClickHouse 强大的 SQL 语法处理本地和远程文件。表数据会存储在临时位置,这意味着在重启 `clickhouse-local` 后,此前创建的表将不再可用。 @@ -53,7 +53,7 @@ curl https://clickhouse.com/ | sh ``` -## 启动 clickhouse-server +## 启动 clickhouse-server {#start-clickhouse-server} 若要持久化数据,应运行 `clickhouse-server`。可以使用以下命令启动 ClickHouse 服务器: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md index 2421e3bf855..526cdb70b90 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/advanced.md @@ -10,7 +10,7 @@ doc_type: 'guide' -## 从源码编译 +## 从源码编译 {#compile-from-source} 要手动编译 ClickHouse,请按照 [Linux](/development/build.md) 或 [macOS](/development/build-osx.md) 的说明进行操作。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md index 9f5e1f73f24..073feaeb65a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/debian_ubuntu.md @@ -10,4 +10,4 @@ doc_type: 'guide' import DebianProd from './_snippets/_deb_install.md' - + diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx index d808bfce012..e9148c3f012 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/install/install.mdx @@ -18,33 +18,24 @@ import Docker from './_snippets/_docker.md' import {CardPrimary} from '@clickhouse/click-ui/bundled'; import {galaxyOnClick} from '@site/src/lib/galaxy/galaxy' - -# 安装指南 +# 安装指南 \{#installation-instructions\} -
+
或者,在下方选择平台、发行版和安装方式,以查看适用于开源 ClickHouse 的安装指南: -} - quickinstall={} - debian_prod={} - rpm_prod={} - tar_prod={} - macos_prod={} - docker={} -/> \ No newline at end of file +} quickinstall={} debian_prod={} rpm_prod={} tar_prod={} macos_prod={} docker={} /> \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/playground.md b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/playground.md index 6134f5bfb2e..5d5a2bf4928 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/playground.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/playground.md @@ -9,7 +9,7 @@ doc_type: '指南' -# ClickHouse Playground +# ClickHouse Playground {#clickhouse-playground} [ClickHouse Playground](https://sql.clickhouse.com) 允许用户无需自行搭建服务器或集群,即可通过即时运行查询来试用和探索 ClickHouse。 Playground 中提供了若干示例数据集。 @@ -40,7 +40,7 @@ Playground 中提供了若干示例数据集。 -## 示例 +## 示例 {#examples} 使用 `curl` 访问 HTTPS 端点的示例: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx index b58df2ad326..86f37009e0c 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/cloud.mdx @@ -20,15 +20,14 @@ import data_sources from '@site/static/images/_snippets/data_sources.png'; import select_data_source from '@site/static/images/_snippets/select_data_source.png'; import client_details from '@site/static/images/_snippets/client_details.png'; import new_rows_from_csv from '@site/static/images/_snippets/new_rows_from_csv.png'; -import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; +import SQLConsoleDetail from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_launch_sql_console.md'; - -# ClickHouse Cloud 快速开始 +# ClickHouse Cloud 快速开始 \{#clickhouse-cloud-quick-start\} > 使用 ClickHouse 的最快、最简便方式,是在 [ClickHouse Cloud](https://console.clickhouse.cloud) 中创建一个新服务。在本快速入门指南中,我们将通过三个简单步骤帮助您完成设置。 - ## 创建 ClickHouse 服务 + ## 创建 ClickHouse 服务 \{#1-create-a-clickhouse-service\} 要在 [ClickHouse Cloud](https://console.clickhouse.cloud) 中创建免费的 ClickHouse 服务,只需按照以下步骤完成注册: @@ -57,7 +56,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; 恭喜!您的 ClickHouse Cloud 服务已启动并运行,初始配置已完成。请继续阅读,了解如何开始摄取和查询数据。 - ## 连接到 ClickHouse + ## 连接到 ClickHouse \{#2-connect-to-clickhouse\} 连接到 ClickHouse 有两种方式: @@ -66,7 +65,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md';
- ### 使用 SQL 控制台连接 + ### 使用 SQL 控制台连接 \{#connect-using-sql-console\} 为便于快速上手,ClickHouse 提供了基于 Web 的 SQL 控制台,完成初始配置后将自动跳转至该控制台。 @@ -86,7 +85,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; 完成了 - 您现在可以开始使用新的 ClickHouse 服务了! - ### 连接您的应用 + ### 连接您的应用 \{#connect-with-your-app\} 从导航菜单中点击连接按钮。将弹出一个对话框,显示您的服务凭据,并提供使用界面或语言客户端进行连接的操作说明。 @@ -96,7 +95,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; 如果您找不到所需的语言客户端,请查看我们的[集成列表](/integrations)。 - ## 添加数据 + ## 添加数据 \{#3-add-data\} ClickHouse 需要数据才能发挥最佳性能!添加数据有多种方式,大部分可通过导航菜单中的数据源页面访问。 @@ -112,7 +111,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; * 上传文件 - 接受的格式包括 JSON、CSV 和 TSV * 通过文件 URL 导入数据 - ### ClickPipes + ### ClickPipes \{#clickpipes\} [ClickPipes](http://clickhouse.com/docs/integrations/clickpipes) 是一个托管集成平台,只需点击几下即可轻松完成从各种数据源摄取数据。ClickPipes 专为最苛刻的工作负载而设计,其强大且可扩展的架构确保了一致的性能和可靠性。ClickPipes 既可用于长期流式传输需求,也可用于一次性数据加载作业。 @@ -120,7 +119,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md';
- ### 使用 SQL 控制台添加数据 + ### 使用 SQL 控制台添加数据 \{#add-data-using-the-sql-console\} 与大多数数据库管理系统一样,ClickHouse 在逻辑上将表组织到**数据库**中。使用 [`CREATE DATABASE`](../../sql-reference/statements/create/database.md) 命令在 ClickHouse 中创建新数据库: @@ -161,7 +160,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; 有多种表引擎可供选择,但对于单节点 ClickHouse 服务器上的简单表,建议使用 [`MergeTree`](/engines/table-engines/mergetree-family/mergetree.md)。 ::: - #### 主键简介 + #### 主键简介 \{#a-brief-intro-to-primary-keys\} 在继续操作之前,务必了解 ClickHouse 中主键的工作原理(主键的实现方式可能会出乎意料!): @@ -176,7 +175,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; 如需深入了解 ClickHouse 核心概念,请参阅["核心概念"](../../managing-data/core-concepts/index.md)。 - #### 向表中插入数据 + #### 向表中插入数据 \{#insert-data-into-your-table\} 您可以使用熟悉的 [`INSERT INTO TABLE`](../../sql-reference/statements/insert-into.md) 命令向 ClickHouse 插入数据,但需要注意的是,每次向 [`MergeTree`](/engines/table-engines/mergetree-family/mergetree.md) 表执行插入操作都会在存储中创建一个**数据部分**(part)。 @@ -206,7 +205,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; SELECT * FROM helloworld.my_first_table ``` - ### 使用 ClickHouse 客户端添加数据 + ### 使用 ClickHouse 客户端添加数据 \{#add-data-using-the-clickhouse-client\} 您还可以使用名为 [**clickhouse client**](/interfaces/cli) 的命令行工具连接到 ClickHouse Cloud 服务。点击左侧菜单中的 `Connect` 访问相关详细信息。在弹出的对话框中,从下拉菜单选择 `Native`: @@ -286,7 +285,7 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; exit ``` - ### 上传文件 + ### 上传文件 \{#upload-a-file\} 开始使用数据库时的一项常见任务是插入已有文件中的数据。我们提供了一些在线示例数据供您插入,这些数据代表点击流数据,包括用户 ID、访问的 URL 以及事件时间戳。 @@ -321,9 +320,9 @@ import SQLConsoleDetail from '@site/docs/_snippets/_launch_sql_console.md'; ## 接下来? \{#whats-next\} -- 在 [教程](/tutorial.md) 中,您将向一张表插入 200 万行数据,并编写一些分析查询 -- 我们提供了一份[示例数据集](/getting-started/index.md)列表,并附有插入这些数据集的详细说明 -- 查看我们时长 25 分钟的 [ClickHouse 入门](https://clickhouse.com/company/events/getting-started-with-clickhouse/) 视频 -- 如果您的数据来自外部来源,请查看我们的[集成指南合集](/integrations/index.mdx),了解如何连接消息队列、数据库、数据管道等 -- 如果您在使用 UI/BI 可视化工具,请查看[将 UI 连接到 ClickHouse 的用户指南](/integrations/data-visualization) -- [主键](/guides/best-practices/sparse-primary-indexes.md)用户指南涵盖了您需要了解的所有主键信息及其定义方式 \ No newline at end of file +* 在 [教程](/tutorial.md) 中,您将向一张表插入 200 万行数据,并编写一些分析查询 +* 我们提供了一份[示例数据集](/getting-started/index.md)列表,并附有插入这些数据集的详细说明 +* 查看我们时长 25 分钟的 [ClickHouse 入门](https://clickhouse.com/company/events/getting-started-with-clickhouse/) 视频 +* 如果您的数据来自外部来源,请查看我们的[集成指南合集](/integrations/index.mdx),了解如何连接消息队列、数据库、数据管道等 +* 如果您在使用 UI/BI 可视化工具,请查看[将 UI 连接到 ClickHouse 的用户指南](/integrations/data-visualization) +* [主键](/guides/best-practices/sparse-primary-indexes.md)用户指南涵盖了您需要了解的所有主键信息及其定义方式 \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx index 6c64699fd32..2b3969577e8 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx +++ b/i18n/zh/docusaurus-plugin-content-docs/current/getting-started/quick-start/oss.mdx @@ -14,13 +14,12 @@ import TabItem from '@theme/TabItem'; import CodeBlock from '@theme/CodeBlock'; import {VerticalStepper} from '@clickhouse/click-ui/bundled'; - -# ClickHouse OSS 快速入门 +# ClickHouse OSS 快速入门 \{#clickhouse-oss-quick-start\} > 在本快速入门教程中,我们将通过 8 个简单步骤帮助你完成 OSS ClickHouse 的设置。你将下载适用于你操作系统的二进制文件,学习如何运行 ClickHouse server,并使用 ClickHouse client 创建一张表,然后向其中插入数据并运行查询来选取这些数据。 - ## 下载 ClickHouse + ## 下载 ClickHouse \{#download-the-binary\} ClickHouse 原生支持 Linux、FreeBSD 和 macOS,并可通过 [WSL](https://learn.microsoft.com/en-us/windows/wsl/about) 在 Windows 上运行。 在本地下载 ClickHouse 最简单的方式是运行以下 `curl` 命令。 该命令将检测您的操作系统是否受支持,然后下载从 master 分支构建的相应 ClickHouse 二进制文件。 @@ -51,7 +50,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; Mac 用户注意:如果您遇到无法验证二进制文件开发者的错误,请参阅["修复 macOS 中的开发者验证错误"](https://clickhouse.com/docs/knowledgebase/fix-developer-verification-error-in-macos)。 ::: - ## 启动服务器 + ## 启动服务器 \{#start-the-server\} 运行以下命令启动 ClickHouse 服务器: @@ -63,7 +62,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; [默认日志级别](https://clickhouse.com/docs/knowledgebase/why_default_logging_verbose) 设置为 `trace` 而非 `warning`。 - ## 启动客户端 + ## 启动客户端 \{#start-the-client\} 使用 `clickhouse-client` 连接到您的 ClickHouse 服务。打开新终端,切换到 `clickhouse` 二进制文件所在的目录,然后运行以下命令: @@ -77,7 +76,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; my-host :) ``` - ## 创建表 + ## 创建表 \{#create-a-table\} 使用 `CREATE TABLE` 定义新表。常规 SQL DDL 命令在 ClickHouse 中均可使用,但需注意一点——ClickHouse 中的表必须指定 `ENGINE` 子句。使用 [`MergeTree`](/engines/table-engines/mergetree-family/mergetree) 引擎可充分发挥 ClickHouse 的性能优势: @@ -93,7 +92,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; PRIMARY KEY (user_id, timestamp) ``` - ## 插入数据 + ## 插入数据 \{#insert-data\} 您可以使用熟悉的 `INSERT INTO TABLE` 命令操作 ClickHouse,但需要理解的是,每次向 `MergeTree` 表插入数据都会在存储中创建我们所称的 **part**(数据部分)。这些 ^^part^^ 随后会由 ClickHouse 在后台进行合并。 @@ -109,7 +108,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; (101, 'Granule 是数据读取的最小单元', now() + 5, 3.14159 ) ``` - ## 查询您的新表 + ## 查询您的新表 \{#query-your-new-table\} 您可以像在任何 SQL 数据库中一样编写 `SELECT` 查询: @@ -132,7 +131,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; 返回 4 行。耗时:0.008 秒。 ``` - ## 插入您自己的数据 + ## 插入您自己的数据 \{#insert-your-own-data\} 下一步是将您自己的数据导入 ClickHouse。我们提供了大量的[表函数](/sql-reference/table-functions/index.md)和[集成](/integrations)用于摄取数据。您可以参考下方选项卡中的示例,或访问我们的[集成](/integrations)页面查看与 ClickHouse 集成的完整技术列表。 @@ -344,7 +343,7 @@ import {VerticalStepper} from '@clickhouse/click-ui/bundled'; - ## 探索 + ## 探索 \{#explore\} * 查看我们的[核心概念](/managing-data/core-concepts)章节,了解一些 ClickHouse 底层工作原理的基础概念。 * 请查看 [进阶教程](tutorial.md),该教程将更深入地探讨 ClickHouse 的核心概念和功能。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/index.md index ea6c16c91e2..46b317a5a16 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/index.md @@ -7,13 +7,12 @@ keywords: ['性能优化', '最佳实践', '优化指南', 'ClickHouse 性能', doc_type: 'reference' --- -import TableOfContents from '@site/docs/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; +import TableOfContents from '@site/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/_snippets/_performance_optimizations_table_of_contents.md'; - -# 性能与优化 +# 性能与优化 {#performance-and-optimizations} 本节提供有关提升 ClickHouse 性能的建议和最佳实践。 建议读者在阅读本节之前先查阅[核心概念](/parts), 其中介绍了改进性能所需掌握的主要概念。 - \ No newline at end of file + \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md index d2de24829ef..bfce716c5ba 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/prewhere.md @@ -17,7 +17,7 @@ import visual05 from '@site/static/images/guides/best-practices/prewhere_05.gif' import Image from '@theme/IdealImage'; -# PREWHERE 优化是如何工作的? +# PREWHERE 优化是如何工作的? {#how-does-the-prewhere-optimization-work} [PREWHERE 子句](/sql-reference/statements/select/prewhere) 是 ClickHouse 中的一种查询执行优化机制。它通过避免不必要的数据读取、在从磁盘读取非过滤列之前先过滤掉无关数据,从而减少 I/O 并提升查询速度。 @@ -109,7 +109,7 @@ ClickHouse 首先通过 ① 从 `town` 列读取选定的 granule,并检查哪 -## 如何衡量 PREWHERE 的影响 +## 如何衡量 PREWHERE 的影响 {#how-to-measure-prewhere-impact} 要验证 PREWHERE 是否提升了查询性能,可以对比在启用和禁用 `optimize_move_to_prewhere` 设置时的查询表现。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md index 882f245d645..42199ebc2f0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-optimization.md @@ -11,7 +11,7 @@ import queryOptimizationDiagram1 from '@site/static/images/guides/best-practices import Image from '@theme/IdealImage'; -# 查询优化简明指南 +# 查询优化简明指南 {#a-simple-guide-for-query-optimization} 本节通过常见场景示例说明如何使用不同的性能优化技术,例如 [analyzer](/operations/analyzer)、[query profiling](/operations/optimizing-performance/sampling-query-profiler) 或 [avoid nullable Columns](/optimize/avoid-nullable-columns),从而提升 ClickHouse 查询性能。 @@ -61,7 +61,7 @@ ClickHouse 提供了一套丰富的工具,帮助你了解查询是如何执行 -## 数据集 +## 数据集 {#dataset} 我们将使用一个真实示例来说明我们是如何处理查询性能的。 @@ -112,9 +112,9 @@ ORDER BY tuple() ``` -## 找出慢查询 +## 找出慢查询 {#spot-the-slow-queries} -### 查询日志 +### 查询日志 {#query-logs} 默认情况下,ClickHouse 会在 [查询日志](/operations/system-tables/query_log) 中收集并记录每条已执行查询的信息。这些数据存储在表 `system.query_log` 中。  @@ -431,7 +431,7 @@ _最后,要留意离群值;某条查询偶尔运行缓慢是很常见的情 -## 基础优化 +## 基础优化 {#basic-optimization} 既然我们已经搭好了用于测试的框架,就可以开始进行优化了。 @@ -439,7 +439,7 @@ _最后,要留意离群值;某条查询偶尔运行缓慢是很常见的情 根据你摄取数据的方式,你可能利用了 ClickHouse 的[功能](/interfaces/schema-inference),基于摄取的数据推断表结构。虽然这在入门阶段非常实用,但如果你希望优化查询性能,就需要重新审视数据表结构,使其尽可能贴合你的具体用例。 -### Nullable +### Nullable {#nullable} 如[最佳实践文档](/best-practices/select-data-types#avoid-nullable-columns)中所述,应尽可能避免使用 Nullable 列。经常使用它们很有诱惑力,因为它们可以让数据摄取机制更加灵活,但每次都需要处理一个额外的列,会对性能产生负面影响。 @@ -485,7 +485,7 @@ dropoff_location_id_nulls: 0 我们只有两列存在 null 值:`mta_tax` 和 `payment_type`。其余字段不应该使用 `Nullable` 列类型。 -### 低基数(Low cardinality) +### 低基数(Low cardinality) {#low-cardinality} 对于 String 类型列,一个简单易行的优化是充分利用 LowCardinality 数据类型。正如低基数[文档](/sql-reference/data-types/lowcardinality)中所述,ClickHouse 会对 LowCardinality 列应用字典编码,从而显著提升查询性能。 @@ -515,7 +515,7 @@ uniq(vendor_id): 3 在基数较低的情况下,这四列 `ratecode_id`、`pickup_location_id`、`dropoff_location_id` 和 `vendor_id` 非常适合使用 LowCardinality 类型。 -### 优化数据类型 +### 优化数据类型 {#optimize-data-type} ClickHouse 支持大量数据类型。请务必在满足用例需求的前提下选择尽可能小的数据类型,以优化性能并减少磁盘上的数据存储空间。  @@ -538,7 +538,7 @@ Query id: 4306a8e1-2a9c-4b06-97b4-4d902d2233eb 对于日期,你应选择既符合数据集特性、又最适合支持你计划执行查询的精度。 -### 应用这些优化 +### 应用这些优化 {#apply-the-optimizations} 让我们创建一个新表来使用优化后的 schema,并重新摄取这些数据。 @@ -604,7 +604,7 @@ ORDER BY size DESC 新表相比之前的表小了很多。可以看到,该表的磁盘空间占用减少了约 34%(从 7.38 GiB 降至 4.89 GiB)。 -## 主键的重要性 +## 主键的重要性 {#the-importance-of-primary-keys} ClickHouse 中的主键与大多数传统数据库系统中的工作方式不同。在那些系统中,主键用于保证唯一性和数据完整性。任何插入重复主键值的尝试都会被拒绝,并且通常会创建基于 B-tree 或哈希的索引用于快速查找。  @@ -616,7 +616,7 @@ ClickHouse 中的主键与大多数传统数据库系统中的工作方式不同 ClickHouse 支持的其他选项,例如 Projection(投影)或物化视图,可以让你在相同数据上使用不同的主键集合。本系列博客的第二部分将更详细地讨论这一点。  -### 选择主键 +### 选择主键 {#choose-primary-keys} 选择正确的主键集合是一个复杂的话题,可能需要权衡和试验,才能找到最佳组合。  diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md index 7f8f25d5b12..2c217926c12 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/query-parallelism.md @@ -17,7 +17,7 @@ import visual05 from '@site/static/images/guides/best-practices/query-parallelis import Image from '@theme/IdealImage'; -# ClickHouse 如何并行执行查询 +# ClickHouse 如何并行执行查询 {#how-clickhouse-executes-a-query-in-parallel} ClickHouse [为速度而生](/concepts/why-clickhouse-is-so-fast)。它以高度并行的方式执行查询,利用所有可用的 CPU 核心,将数据分布到各个处理通道,并且经常将硬件推至其性能极限。 @@ -66,7 +66,7 @@ ClickHouse [为速度而生](/concepts/why-clickhouse-is-so-fast)。它以高度 -## 监控查询并行度 +## 监控查询并行度 {#monitoring-query-parallelism} 使用这些工具来验证你的查询是否充分利用了可用的 CPU 资源,并在没有充分利用时进行诊断。 @@ -126,12 +126,12 @@ ClickHouse 的[内嵌 Web UI](/interfaces/http)(在 `/play` 端点可用)可 注意:请从左到右阅读该可视化。每一行代表一条并行处理通道,它以数据块为单位进行流式处理,并应用过滤、聚合以及最终处理阶段等转换。在本例中,你可以看到与 `max_threads = 4` 设置对应的四条并行通道。 -### 在处理通道之间进行负载均衡 +### 在处理通道之间进行负载均衡 {#load-balancing-across-processing-lanes} 请注意,物理计划中的 `Resize` 算子会[重新分区并重新分发](/academic_overview#4-2-multi-core-parallelization)数据块流到各个处理通道,以保持它们的利用率均衡。当不同数据范围中满足查询谓词的行数相差较大时,这种再平衡尤为重要,否则某些通道可能会过载,而其他通道则处于空闲状态。通过重新分配工作量,较快的通道可以有效帮助较慢的通道,从而优化整体查询执行时间。 -## 为什么 max_threads 并不总是被严格遵守 +## 为什么 max_threads 并不总是被严格遵守 {#why-max-threads-isnt-always-respected} 如上所述,`n` 条并行处理通道的数量由 `max_threads` 参数控制,其默认值等于 ClickHouse 在该服务器上可用的 CPU 内核数量: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md index 55eebac9fd9..63a6c24cd75 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes-examples.md @@ -10,7 +10,7 @@ keywords: ['跳过索引', '数据跳过', '性能', '索引', '最佳实践'] -# 数据跳过索引示例 +# 数据跳过索引示例 {#data-skipping-index-examples} 本文汇总了 ClickHouse 中数据跳过索引的示例,展示如何定义每种类型、在什么场景下使用它们,以及如何验证它们是否已生效。所有功能都适用于 [MergeTree-family 表](/engines/table-engines/mergetree-family/mergetree)。 @@ -33,7 +33,7 @@ ClickHouse 支持五种跳过索引类型: 每一节都会通过示例数据展示用法,并演示如何在查询执行中验证索引是否被使用。 -## MinMax 索引 +## MinMax 索引 {#minmax-index} `minmax` 索引最适合在松散排序的数据上执行范围条件,或用于与 `ORDER BY` 相关联的列。 @@ -64,7 +64,7 @@ SELECT count() FROM events WHERE ts >= now() - 3600; 请参阅一个包含 `EXPLAIN` 和剪枝的[示例](/best-practices/use-data-skipping-indices-where-appropriate#example)。 -## Set 索引 +## Set 索引 {#set-index} 当本地(按块)基数较低时使用 `set` 索引;如果每个数据块中包含许多不同的值,则效果不明显。 @@ -81,7 +81,7 @@ SELECT * FROM events WHERE user_id IN (101, 202); 在[基本操作指南](/optimize/skipping-indexes#basic-operation)中展示了创建/物化流程以及应用前后的效果。 -## 通用 Bloom 过滤器(标量) +## 通用 Bloom 过滤器(标量) {#generic-bloom-filter-scalar} `bloom_filter` 索引非常适合用于“在干草堆里找针”式的等值/`IN` 成员匹配查询。它接受一个可选参数,用于指定假阳性(误报)率(默认值为 0.025)。 @@ -96,7 +96,7 @@ SELECT * FROM events WHERE value IN (7, 42, 99); ``` -## 用于子串搜索的 N-gram Bloom 过滤器(ngrambf_v1) +## 用于子串搜索的 N-gram Bloom 过滤器(ngrambf_v1) {#n-gram-bloom-filter-ngrambf-v1-for-substring-search} `ngrambf_v1` 索引将字符串划分为 n-gram。它非常适用于 `LIKE '%...%'` 查询。它支持 String/FixedString/Map(通过 mapKeys/mapValues),并且可以调节大小、哈希次数和种子。有关更多详细信息,请参阅 [N-gram Bloom 过滤器](/engines/table-engines/mergetree-family/mergetree#n-gram-bloom-filter) 的文档。 @@ -133,7 +133,7 @@ SELECT bfEstimateFunctions(4300, bfEstimateBmSize(4300, 0.0001)) AS k; -- 约 13 有关完整的调优指导,请参阅[参数文档](/engines/table-engines/mergetree-family/mergetree#n-gram-bloom-filter)。 -## 用于基于单词搜索的 Token Bloom 过滤器(tokenbf_v1) +## 用于基于单词搜索的 Token Bloom 过滤器(tokenbf_v1) {#token-bloom-filter-tokenbf-v1-for-word-based-search} `tokenbf_v1` 会为由非字母数字字符分隔的 token 建立索引。你应将其与 [`hasToken`](/sql-reference/functions/string-search-functions#hasToken)、`LIKE` 单词模式或 `=` / `IN` 一起使用。它支持 `String` / `FixedString` / `Map` 类型。 @@ -153,7 +153,7 @@ SELECT count() FROM logs WHERE hasToken(lower(msg), 'exception'); 可在[此处](/use-cases/observability/schema-design#bloom-filters-for-text-search)查看可观测性示例,以及关于 token 与 ngram 的使用指导。 -## 在 CREATE TABLE 时添加索引(多个示例) +## 在 CREATE TABLE 时添加索引(多个示例) {#add-indexes-during-create-table-multiple-examples} 跳过索引也支持组合表达式以及 `Map`/`Tuple`/`Nested` 类型。下面的示例对此进行了演示: @@ -175,7 +175,7 @@ ORDER BY u64; ``` -## 在现有数据上物化并验证 +## 在现有数据上物化并验证 {#materializing-on-existing-data-and-verifying} 你可以使用 `MATERIALIZE` 为现有的数据部分添加索引,并通过 `EXPLAIN` 或跟踪日志来检查裁剪效果,如下所示: @@ -211,7 +211,7 @@ SET send_logs_level = 'trace'; -## 临时忽略或强制使用索引 +## 临时忽略或强制使用索引 {#temporarily-ignore-or-force-indexes} 在测试和故障排查期间,可以针对单个查询按名称禁用特定索引。也可以通过相关设置在需要时强制使用索引。参见 [`ignore_data_skipping_indices`](/operations/settings/settings#ignore_data_skipping_indices)。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md index 5cb47d94066..f90c3848937 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/skipping-indexes.md @@ -13,7 +13,7 @@ import bad_skip from '@site/static/images/guides/best-practices/bad_skip.png'; import Image from '@theme/IdealImage'; -# 深入了解 ClickHouse 数据跳过索引 +# 深入了解 ClickHouse 数据跳过索引 {#understanding-clickhouse-data-skipping-indexes} @@ -29,7 +29,7 @@ import Image from '@theme/IdealImage'; -## 基本操作 +## 基本操作 {#basic-operation} 用户只能在 MergeTree 系列的表上使用数据跳过索引(Data Skipping Indexes)。每个数据跳过索引有四个主要参数: @@ -121,11 +121,11 @@ SET send_logs_level='trace'; default.skip_table (933d4b2c-8cea-4bf9-8c93-c56e900eefd1) (SelectExecutor): 索引 `vix` 已丢弃 6102/6104 个颗粒。 ``` -## 跳过索引类型 +## 跳过索引类型 {#skip-index-types} {/* vale off */ } -### minmax +### minmax {#minmax} {/* vale on */ } @@ -135,7 +135,7 @@ SET send_logs_level='trace'; {/* vale off */ } -### set +### set {#set} {/* vale on */ } @@ -143,7 +143,7 @@ SET send_logs_level='trace'; 此索引的成本、性能和有效性取决于数据块内部的基数。如果每个数据块包含大量唯一值,要么针对一个很大的索引集合评估查询条件会非常昂贵,要么由于超过 `max_size` 导致索引为空而无法应用索引。 -### Bloom filter 类型 +### Bloom filter 类型 {#bloom-filter-types} *Bloom filter*(布隆过滤器)是一种数据结构,它以极高的空间效率实现集合成员测试,但代价是存在一定概率的误报。对于跳过索引而言,误报并不是一个重要问题,因为唯一的劣势是会多读取一些不必要的数据块。然而,存在误报的可能性也意味着被索引的表达式通常应当为 true,否则可能会跳过有效数据。 @@ -184,7 +184,7 @@ SET send_logs_level='trace'; -## Skip 索引最佳实践 +## Skip 索引最佳实践 {#skip-best-practices} Skip 索引并不直观,尤其是对于那些习惯于关系型数据库(RDBMS)中的行式二级索引,或文档存储中的倒排索引的用户而言。要真正获益,在应用 ClickHouse 数据跳过索引时,必须跳过足够多的 granule 读取,以抵消计算索引本身的开销。关键在于,如果某个值在一个已建立索引的数据块(block)中哪怕只出现一次,就意味着整个 block 都必须被读入内存并进行评估,而索引的计算成本在这种情况下就成了多余的开销。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md index 68abe1691cc..fd832422cb6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/best-practices/sparse-primary-indexes.md @@ -36,7 +36,7 @@ import sparsePrimaryIndexes15b from '@site/static/images/guides/best-practices/s import Image from '@theme/IdealImage'; -# ClickHouse 主索引实用入门指南 +# ClickHouse 主索引实用入门指南 {#a-practical-introduction-to-primary-indexes-in-clickhouse} ## 介绍 {#introduction} @@ -73,7 +73,7 @@ import Image from '@theme/IdealImage'; 本文中给出的所有运行时数据均基于在一台配备 Apple M1 Pro 芯片和 16GB 内存的 MacBook Pro 上本地运行 ClickHouse 22.2.1 所得。 -### 全表扫描 +### 全表扫描 {#a-full-table-scan} 为了了解在没有主键的数据集上查询是如何执行的,我们通过执行以下 SQL DDL 语句来创建一张使用 MergeTree 表引擎的表: @@ -150,7 +150,7 @@ LIMIT 10; └────────────────────────────────┴───────┘ 返回了 10 行。耗时:0.022 秒。 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 处理了 887 万行, 70.45 MB (398.53 million rows/s., 3.17 GB/s.) ``` @@ -172,7 +172,7 @@ ClickHouse 客户端的结果输出表明,ClickHouse 执行了一次全表扫 下面将详细说明 ClickHouse 如何构建和使用其稀疏主索引。在本文后续部分,我们还将讨论在构建索引(主键列)时,关于选择、移除和排序相关表列的一些最佳实践。 -### 带主键的表 +### 带主键的表 {#a-table-with-a-primary-key} 创建一个具有复合主键的表,主键列为 UserID 和 URL: @@ -494,7 +494,7 @@ SELECT UserID, URL FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID 我们将在后面更详细地讨论这对查询执行性能的影响。 -### 主索引用于选择索引颗粒 +### 主索引用于选择索引颗粒 {#the-primary-index-is-used-for-selecting-granules} 现在我们可以在主索引的支持下执行查询。 @@ -526,7 +526,7 @@ LIMIT 10; └────────────────────────────────┴───────┘ 10 rows in set. Elapsed: 0.005 sec. -# highlight-next-line +# highlight-next-line {#highlight-next-line} 已处理 8.19 千行, 740.18 KB (153 万行/秒,138.59 MB/秒) ``` @@ -537,13 +537,13 @@ LIMIT 10; ```response ...Executor): 键条件:(列 0 在 [749927693, 749927693] 范围内) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): 对数据分片 all_1_9_2 的索引范围执行二分查找(1083 个标记) ...Executor): 找到左边界标记:176 ...Executor): 找到右边界标记:177 ...Executor): 经过 19 步找到连续范围 ...Executor): 通过分区键选择了 1/1 个分片,通过主键选择了 1 个分片, -# highlight-next-line +# highlight-next-line {#highlight-next-line} 通过主键选择了 1/1083 个标记,需从 1 个范围读取 1 个标记 ...Reading ...从 1441792 开始读取约 8192 行数据 ``` @@ -592,7 +592,7 @@ LIMIT 10; │ UserID │ │ Condition: (UserID in [749927693, 749927693]) │ │ Parts: 1/1 │ -# highlight-next-line +# highlight-next-line {#highlight-next-line} │ Granules: 1/1083 │ └───────────────────────────────────────────────────────────────────────────────────────┘ @@ -711,7 +711,7 @@ ClickHouse 现在使用索引中选中的标记号(176),在 UserID.mrk 标 -### 次级键列可能(不)高效 +### 次级键列可能(不)高效 {#secondary-key-columns-can-not-be-inefficient} 当查询在一个复合键中、且作为首个键列的列上进行过滤时,[ClickHouse 会在该键列的索引标记上运行二分查找算法](#the-primary-index-is-used-for-selecting-granules)。 @@ -757,7 +757,7 @@ LIMIT 10; └────────────┴───────┘ 10 行结果。耗时:0.086 秒。 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 已处理 881 万行, 799.69 MB(1.0211 亿行/秒,9.27 GB/秒) ``` @@ -769,11 +769,11 @@ LIMIT 10; ```response ...Executor): Key condition: (column 1 in ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#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 +# highlight-next-line {#highlight-next-line} 1076/1083 marks by primary key, 1076 marks to read from 5 ranges ...Executor): Reading approx. 8814592 rows with 10 streams ``` @@ -842,7 +842,7 @@ LIMIT 10; 在我们的示例数据集中,两个键列(UserID、URL)都具有类似的高基数。如前所述,当位于 URL 列之前的键列具有较高或相近的基数时,通用排除搜索算法的效果并不理想。 -### 关于 data skipping index 的说明 +### 关于 data skipping index 的说明 {#note-about-data-skipping-index} 由于 UserID 和 URL 都具有类似的高基数,我们在 URL 上的[查询过滤](/guides/best-practices/sparse-primary-indexes#secondary-key-columns-can-not-be-inefficient),即使在来自我们[复合主键表 (UserID, URL)](#a-table-with-a-primary-key)的 URL 列上创建一个[辅助 data skipping index](./skipping-indexes.md),收益也不会太大。 @@ -906,7 +906,7 @@ ClickHouse 现在创建了一个额外的索引,该索引针对每组 4 个连 -### 选项 1:辅助表 +### 选项 1:辅助表 {#option-1-secondary-tables} @@ -986,7 +986,7 @@ LIMIT 10; └────────────┴───────┘ 10 行数据。耗时: 0.017 秒。 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 处理了 319.49 千行数据, 11.38 MB (18.41 百万行/秒, 655.75 MB/秒) ``` @@ -1002,13 +1002,13 @@ ClickHouse 服务器日志文件中的相应 trace 日志也印证了这一点 ```response ...Executor): 键条件:(列 0 在 ['http://public_search', 'http://public_search'] 中) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): 对数据分片 all_1_9_2 的索引范围执行二分查找(1083 个标记) ...Executor): 找到(左)边界标记:644 ...Executor): 找到(右)边界标记:683 ...Executor): 经过 19 步找到连续范围 ...Executor): 通过分区键选择了 1/1 个分片,通过主键选择了 1 个分片, -# highlight-next-line +# highlight-next-line {#highlight-next-line} 通过主键选择了 39/1083 个标记,需从 1 个范围读取 39 个标记 ...Executor): 使用 2 个流读取约 319488 行数据 ``` @@ -1143,7 +1143,7 @@ LIMIT 10; └────────────┴───────┘ 返回 10 行。耗时:0.026 秒。 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 已处理 33.587 万行, 13.54 MB(1291 万行/秒,520.38 MB/秒)。 ``` @@ -1156,7 +1156,7 @@ ClickHouse 服务器日志文件中的对应跟踪日志确认,ClickHouse 正 ```response ...Executor): Key condition: (column 0 in ['http://public_search', 'http://public_search']) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): Running binary search on index range ... ... ...Executor): Selected 4/4 parts by partition key, 4 parts by primary key, @@ -1233,7 +1233,7 @@ LIMIT 10; └────────────┴───────┘ 返回了 10 行。耗时:0.029 秒。 -# highlight-next-line +# highlight-next-line {#highlight-next-line} 处理了 319.49 千行,1.38 MB(11.05 百万行/秒,393.58 MB/秒) ``` @@ -1245,14 +1245,14 @@ ClickHouse 服务器日志文件中的相应 trace 日志证实 ClickHouse 正 ```response ...Executor): 键条件:(列 0 在 ['http://public_search', 'http://public_search'] 中) -# highlight-next-line +# highlight-next-line {#highlight-next-line} ...Executor): 对数据分片 prj_url_userid 的索引范围执行二分查找(1083 个标记) ...Executor): ... # highlight-next-line ...Executor): 选择完整的普通投影 prj_url_userid ...Executor): 投影所需列:URL、UserID ...Executor): 按分区键选中 1/1 个分片,按主键选中 1 个分片, -# highlight-next-line +# highlight-next-line {#highlight-next-line} 按主键选中 39/1083 个标记,将从 1 个范围读取 39 个标记 ...Executor): 使用 2 个数据流读取约 319488 行 ``` @@ -1444,7 +1444,7 @@ WHERE UserID = 112304 其原因在于,当通过某个次级键列来选择 [granules](#the-primary-index-is-used-for-selecting-granules),且其前一个键列具有更低的基数时,[generic exclusion search algorithm](https://github.com/ClickHouse/ClickHouse/blob/22.3/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp#L1444) 的效果最佳。我们已经在本指南的[前一节](#generic-exclusion-search-algorithm)中对这一点进行了详细说明。 -### 数据文件的最佳压缩率 +### 数据文件的最佳压缩率 {#efficient-filtering-on-secondary-key-columns} 此查询比较了我们在上面创建的两个表中 `UserID` 列的压缩率: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md index 9f2f1556c63..a8cc676f9eb 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/alternative-query-languages.md @@ -19,8 +19,7 @@ import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; 具体使用哪种查询语言由 `dialect` 设置项控制。 - -## 标准 SQL +## 标准 SQL {#standard-sql} 标准 SQL 是 ClickHouse 的默认查询语言。 @@ -28,8 +27,7 @@ import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; SET dialect = 'clickhouse' ``` - -## 管道式关系查询语言(PRQL) +## 管道式关系查询语言(PRQL) {#pipelined-relational-query-language-prql} @@ -52,8 +50,7 @@ aggregate { 在底层,ClickHouse 会先将 PRQL 转译为 SQL,然后再执行 PRQL 查询。 - -## Kusto 查询语言 (KQL) +## Kusto 查询语言 (KQL) {#kusto-query-language-kql} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md b/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md index 64ee7988d64..f26b1fb63bd 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/guides/developer/cascading-materialized-views.md @@ -6,13 +6,11 @@ keywords: ['物化视图', '聚合'] doc_type: 'guide' --- - - -# 级联物化视图 +# 级联物化视图 {#cascading-materialized-views} 本示例演示如何创建一个物化视图,然后在其基础上再级联创建第二个物化视图。在本页中,你将看到具体操作步骤、多种可能的使用方式以及相应的限制。针对不同用例,可以通过创建一个以另一个物化视图作为数据源的物化视图来实现。 - + + + + allowfullscreen +/> -
+
ClickHouse 提供了多种处理 JSON 的方法,每种方法都有各自的优缺点和适用场景。本指南将介绍如何加载 JSON,并以最优方式设计 JSON schema。本文包括以下部分: -- [加载 JSON](/integrations/data-formats/json/loading) - 在 ClickHouse 中使用简单 schema 加载和查询结构化与半结构化 JSON。 -- [JSON schema 推断](/integrations/data-formats/json/inference) - 使用 JSON schema 推断来查询 JSON 并创建表的 schema。 -- [设计 JSON schema](/integrations/data-formats/json/schema) - 设计和优化 JSON schema 的步骤。 -- [导出 JSON](/integrations/data-formats/json/exporting) - 如何导出 JSON。 -- [处理其他 JSON 格式](/integrations/data-formats/json/other-formats) - 关于处理非换行分隔(NDJSON)的其他 JSON 格式的一些建议。 -- [建模 JSON 的其他方法](/integrations/data-formats/json/other-approaches) - 旧版 JSON 建模方法。**不推荐使用。** \ No newline at end of file +* [加载 JSON](/integrations/data-formats/json/loading) - 在 ClickHouse 中使用简单 schema 加载和查询结构化与半结构化 JSON。 +* [JSON schema 推断](/integrations/data-formats/json/inference) - 使用 JSON schema 推断来查询 JSON 并创建表的 schema。 +* [设计 JSON schema](/integrations/data-formats/json/schema) - 设计和优化 JSON schema 的步骤。 +* [导出 JSON](/integrations/data-formats/json/exporting) - 如何导出 JSON。 +* [处理其他 JSON 格式](/integrations/data-formats/json/other-formats) - 关于处理非换行分隔(NDJSON)的其他 JSON 格式的一些建议。 +* [建模 JSON 的其他方法](/integrations/data-formats/json/other-approaches) - 旧版 JSON 建模方法。**不推荐使用。** \ No newline at end of file diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md index ca59fc8ce47..e74b561b2e4 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/loading.md @@ -17,7 +17,7 @@ doc_type: 'guide' -## 加载结构化 JSON +## 加载结构化 JSON {#loading-structured-json} 在本节中,我们假定 JSON 数据为 [`NDJSON`](https://github.com/ndjson/ndjson-spec)(以换行分隔的 JSON)格式,在 ClickHouse 中称为 [`JSONEachRow`](/interfaces/formats/JSONEachRow),且结构规范,即列名和类型是固定的。由于 `NDJSON` 简洁且空间利用率高,是加载 JSON 数据的首选格式,但 ClickHouse 也支持其他格式用于[输入和输出](/interfaces/formats/JSON)。 @@ -124,7 +124,7 @@ FORMAT JSONEachRow 这些示例假定使用 `JSONEachRow` 格式。系统同样支持其他常见的 JSON 格式,加载这些格式的示例请参见[此处](/integrations/data-formats/json/other-formats)。 -## 加载半结构化 JSON +## 加载半结构化 JSON {#loading-semi-structured-json} 前面的示例加载的是结构固定、键名和类型都已知的 JSON。现实中往往并非如此——可以新增键,或者键的类型会发生变化。这在可观测性数据等场景中非常常见。 @@ -200,7 +200,7 @@ LIMIT 2 请注意此处在加载数据时的性能差异。`JSON` 列在插入时需要进行类型推断,并且如果某些列中存在多种类型的值,还需要额外的存储空间。尽管可以通过配置 `JSON` 类型(参见 [Designing JSON schema](/integrations/data-formats/json/schema))来获得与显式声明列相当的性能,但它在开箱即用时被刻意设计为更加灵活。不过,这种灵活性也会带来一定的代价。 -### 何时使用 JSON 类型 +### 何时使用 JSON 类型 {#when-to-use-the-json-type} 在以下情况下使用 `JSON` 类型: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md index 95ff9ffb030..a87cad357fb 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/other.md @@ -6,9 +6,7 @@ keywords: ['json', 'formats'] doc_type: 'reference' --- - - -# 对 JSON 建模的其他方法 +# 对 JSON 建模的其他方法 {#other-approaches-to-modeling-json} **以下是在 ClickHouse 中对 JSON 建模的替代方法。这些方法为了文档完整性而被记录下来,主要适用于 JSON 类型尚未出现之前的阶段,因此在大多数用例中通常不推荐使用或不再适用。** @@ -16,9 +14,7 @@ doc_type: 'reference' 在同一个 schema 中,可以对不同对象采用不同的技术。例如,一些对象最适合使用 `String` 类型,另一些则适合使用 `Map` 类型。请注意,一旦使用了 `String` 类型,就不再需要做进一步的 schema 决策。相反,我们也可以在 `Map` 的某个 key 下嵌套子对象——包括用 `String` 表示的 JSON——如下所示: ::: - - -## 使用 String 类型 +## 使用 String 类型 {#using-string} 如果对象高度动态、没有可预测的结构并且包含任意嵌套对象,建议使用 `String` 类型。可以在查询时使用 JSON 函数提取值,如下所示。 @@ -95,7 +91,6 @@ FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.j 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.) ``` - 假设我们希望按年份统计论文发表数量。对比如下两条查询语句:一条仅使用字符串,另一条使用该模式的[结构化版本](/integrations/data-formats/json/inference#creating-tables): ```sql @@ -156,7 +151,7 @@ LIMIT 10 这种方法的灵活性带来了显著的性能和语法开销,只应在模式中对象高度动态的情况下使用。 -### 简单 JSON 函数 +### 简单 JSON 函数 {#simple-json-functions} 上面的示例使用了 JSON* 函数族。这些函数使用基于 [simdjson](https://github.com/simdjson/simdjson) 的完整 JSON 解析器,解析严格,并且会区分位于不同嵌套层级的同名字段。这些函数能够处理语法正确但格式不佳的 JSON,例如键之间存在双空格。 @@ -174,7 +169,6 @@ LIMIT 10 而下面的示例将会被正确解析: - ````json {"@timestamp":893964617,"clientip":"40.135.0.0","request":{"method":"GET", "path":"/images/hm_bg.jpg","version":"HTTP/1.0"},"status":200,"size":24736} @@ -209,8 +203,7 @@ LIMIT 10 上述查询使用 `simpleJSONExtractString` 来提取 `created` 键,利用了我们在发布日期上只需要第一个值这一点。在这种情况下,为了获得性能提升,可以接受 `simpleJSON*` 函数带来的局限性。 - -## 使用 Map 类型 +## 使用 Map 类型 {#using-map} 如果对象用于存储任意键,并且这些键大多为同一类型,可以考虑使用 `Map` 类型。理想情况下,唯一键的数量不应超过数百个。对于包含子对象的对象,在这些子对象的类型足够统一的前提下,也可以考虑使用 `Map` 类型。一般来说,我们推荐使用 `Map` 类型来存储标签和标记(labels / tags),例如日志数据中的 Kubernetes pod(容器组)标签。 @@ -224,7 +217,7 @@ LIMIT 10 在将对象建模为 `Map` 时,使用 `String` 键来存储 JSON 键名。因此 map 始终是 `Map(String, T)`,其中 `T` 取决于数据。 ::: -#### 原始类型值 +#### 原始类型值 {#primitive-values} `Map` 最简单的用法是对象将同一种原始类型作为值。在大多数情况下,这意味着对值 `T` 使用 `String` 类型。 @@ -281,13 +274,12 @@ SELECT company.labels['type'] AS type FROM people 完整的 `Map` 函数集可用于对其进行查询,相关说明见[此处](/sql-reference/functions/tuple-map-functions.md)。如果你的数据类型不一致,可以使用相应函数执行[必要的类型强制转换](/sql-reference/functions/type-conversion-functions)。 -#### 对象值 +#### 对象值 {#object-values} 对于具有子对象的对象,只要其子对象的类型保持一致,也可以考虑使用 `Map` 类型。 假设我们的 `persons` 对象中的 `tags` 键需要一个结构一致的子对象,其中每个 `tag` 的子对象都包含 `name` 和 `time` 列。此类 JSON 文档的简化示例如下所示: - ```json { "id": 1, @@ -360,8 +352,7 @@ FORMAT JSONEachRow } ``` - -## 使用 Nested 类型 +## 使用 Nested 类型 {#using-nested} [Nested 类型](/sql-reference/data-types/nested-data-structures/nested) 可用于表示很少发生变化的静态对象,可作为 `Tuple` 和 `Array(Tuple)` 的一种替代方案。我们通常建议避免在处理 JSON 时使用此类型,因为它的行为往往令人困惑。`Nested` 的主要优势在于其子列可以用于排序键。 @@ -396,11 +387,11 @@ CREATE table http ) ENGINE = MergeTree() ORDER BY (status, timestamp); ``` -### flatten_nested +### flatten_nested {#flatten_nested} `flatten_nested` 设置用于控制 `Nested` 类型的行为。 -#### flatten_nested=1 +#### flatten_nested=1 {#flatten_nested1} 当值为 `1`(默认)时,不支持任意深度的嵌套。在该设置下,最简单的理解方式是:将嵌套数据结构视为多个长度相同的 [Array](/sql-reference/data-types/array) 列。字段 `method`、`path` 和 `version` 实际上分别是独立的 `Array(Type)` 列,但有一个关键约束:**`method`、`path` 和 `version` 字段的长度必须相同。** 如果使用 `SHOW CREATE TABLE`,就可以看到这一点: @@ -471,10 +462,9 @@ SELECT clientip, status, size, `request.method` FROM http WHERE has(request.meth 结果集包含 1 行。执行耗时:0.002 秒。 ``` - 请注意,对子列使用 `Array` 意味着可以充分利用完整的 [Array 函数](/sql-reference/functions/array-functions) 功能集,包括 [`ARRAY JOIN`](/sql-reference/statements/select/array-join) 子句——在列中包含多个值时非常有用。 -#### flatten_nested=0 +#### flatten_nested=0 {#flatten_nested0} 这允许任意级别的嵌套,并意味着嵌套列会保持为一个由 `Tuple` 组成的单个数组——实质上它们与 `Array(Tuple)` 相同。 @@ -546,7 +536,7 @@ SELECT clientip, status, size, `request.method` FROM http WHERE has(request.meth 结果集包含 1 行。执行耗时:0.002 秒。 ``` -### 示例 +### 示例 {#example} 上述数据的更大规模示例可在 S3 的公共存储桶中获取,路径为:`s3://datasets-documentation/http/`。 @@ -584,7 +574,6 @@ size FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/doc 要查询这些数据,我们需要以数组形式访问请求字段。下面,我们将在固定时间段内汇总错误和 HTTP 方法。 - ```sql SELECT status, request.method[1] AS method, count() AS c FROM http @@ -604,7 +593,7 @@ ORDER BY c DESC LIMIT 5; 5 rows in set. Elapsed: 0.007 sec. ``` -### 使用成对数组 +### 使用成对数组 {#using-pairwise-arrays} 成对数组在将 JSON 表示为 `String` 的灵活性与更结构化方案的性能之间提供了一种折中。该模式比较灵活,因为可以在根级别添加任意新的字段。不过,这也需要明显更复杂的查询语法,并且与嵌套结构不兼容。 @@ -668,7 +657,6 @@ GROUP BY method, status ORDER BY c DESC LIMIT 5; └────────┴────────┴───────┘ ``` - 5 行结果。耗时:0.383 秒。已处理 8.22 百万行,1.97 GB(21.45 百万行/秒,5.15 GB/秒)。 峰值内存占用:51.35 MiB。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md index 1e388a17bc4..97a7609eb0e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/json/schema.md @@ -13,11 +13,11 @@ import json_offsets from '@site/static/images/integrations/data-ingestion/data-f import shared_json_column from '@site/static/images/integrations/data-ingestion/data-formats/json_shared_column.png'; -# 设计你的 schema +# 设计你的 schema {#designing-your-schema} 虽然可以使用 [schema 推断](/integrations/data-formats/json/inference) 为 JSON 数据建立初始 schema,并直接查询存储在 S3 等位置的 JSON 数据文件,但用户仍应以为其数据建立经过优化的版本化 schema 为目标。下面我们将讨论对 JSON 结构建模的推荐方法。 -## 静态 JSON 与动态 JSON +## 静态 JSON 与动态 JSON {#static-vs-dynamic-json} 为 JSON 定义模式的首要任务是确定每个键的合适值类型。我们建议用户在 JSON 层级结构中的每一个键上递归应用以下规则,以确定每个键的合适类型。 @@ -92,7 +92,7 @@ import shared_json_column from '@site/static/images/integrations/data-ingestion/ 包含数百或数千个静态键的结构也可以视为动态结构,因为在实际场景中很少会为这些键静态声明所有列。不过,在可能的情况下,应[跳过不需要的路径](#using-type-hints-and-skipping-paths),以同时节省存储和推断开销。 ::: -## 处理静态结构 +## 处理静态结构 {#handling-static-structures} 我们建议使用具名元组(即 `Tuple`)来处理静态结构。对象数组可以使用元组数组(即 `Array(Tuple)`)来存储。在元组内部,列及其对应的类型也应按照相同的规则进行定义。这样就可以通过嵌套的 Tuple 来表示嵌套对象,如下所示。 @@ -203,7 +203,7 @@ ORDER BY company.name ``` -### 处理默认值 +### 处理默认值 {#handling-default-values} 即使 JSON 对象是结构化的,它们通常也比较稀疏,只提供部分已知键。好在,`Tuple` 类型并不要求 JSON 载荷中必须包含所有列;如果某些列未提供,将使用默认值。 @@ -282,7 +282,7 @@ FORMAT PrettyJSONEachRow ::: -### 处理新列 +### 处理新列 {#handling-new-columns} 当 JSON 键是固定的时,使用结构化方法是最简单的。但即使可以事先规划模式变更(即预先知道会新增哪些键,并且可以相应修改模式),这种方法仍然适用。 @@ -360,7 +360,7 @@ SELECT id, nickname FROM people ``` -## 处理半结构化/动态结构 +## 处理半结构化/动态结构 {#handling-semi-structured-dynamic-structures} 如果 JSON 数据是半结构化的,其中的键可以动态增加和/或具有多种类型,则推荐使用 [`JSON`](/sql-reference/data-types/newjson) 类型。 @@ -491,7 +491,7 @@ SELECT id, nickname FROM people - **避免列爆炸风险** - 尽管 JSON 类型可以扩展到潜在的数千个列(其中子列作为独立列存储),但这可能导致列文件数量爆炸,产生过多的列文件,从而影响性能。为缓解这一问题,JSON 所使用的底层 [Dynamic type](/sql-reference/data-types/dynamic) 提供了 [`max_dynamic_paths`](/sql-reference/data-types/newjson#reading-json-paths-as-sub-columns) 参数,用于限制以独立列文件形式存储的唯一路径数量。一旦达到阈值,额外的路径将存储在一个共享的列文件中,并使用紧凑的编码格式,从而在支持灵活数据摄取的同时保持性能和存储效率。但需要注意的是,访问这个共享列文件的性能会略低一些。另请注意,JSON 列可以结合使用[类型提示](#using-type-hints-and-skipping-paths)。带有“提示”的列在性能上将与独立列相当。 - **更简单的路径和类型自省** - 虽然 JSON 类型支持用于确定已推断类型和路径的[自省函数](/sql-reference/data-types/newjson#introspection-functions),但静态结构在探索时(例如使用 `DESCRIBE`)可能更为简单。 -### 单一 JSON 列 +### 单一 JSON 列 {#single-json-column} 此方法适用于原型开发和数据工程任务。对于生产环境,建议仅在确有需要的动态子结构中使用 `JSON`。 @@ -667,7 +667,7 @@ FROM people ``` -### 专用 JSON 列 +### 专用 JSON 列 {#targeted-json-column} 尽管在原型设计和数据工程场景中很有用,但在生产环境中我们建议在可能的情况下使用显式的 schema(模式)定义。 @@ -767,7 +767,7 @@ FORMAT PrettyJsonEachRow ``` -### 使用类型提示和跳过路径 +### 使用类型提示和跳过路径 {#using-type-hints-and-skipping-paths} 类型提示允许我们为某个路径及其子列显式指定类型,从而避免不必要的类型推断。来看下面这个示例,我们为 JSON 列 `company.labels` 中的 JSON 键 `dissolved`、`employees` 和 `founded` 指定了类型。 @@ -934,7 +934,7 @@ FORMAT PrettyJSONEachRow 因此,对于大体结构一致、但仍希望保留 JSON 灵活性的数据集,类型提示提供了一种便利方式,从而在无需重构 schema 或摄取流水线的前提下,保持良好的性能表现。 -### 配置动态路径 +### 配置动态路径 {#configuring-dynamic-paths} ClickHouse 将每个 JSON 路径作为一个子列存储在真正的列式存储布局中,从而能够享受到与传统列相同的性能优势——例如压缩、SIMD 加速处理以及最小化磁盘 I/O。JSON 数据中每个唯一的路径与类型组合都可以在磁盘上对应到自己的列文件。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md index f0a71427883..002182988ca 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/parquet.md @@ -10,7 +10,7 @@ keywords: ['parquet', '列式格式', '数据格式', '压缩', 'Apache Parquet' -# 在 ClickHouse 中使用 Parquet +# 在 ClickHouse 中使用 Parquet {#working-with-parquet-in-clickhouse} Parquet 是一种高效的文件格式,用于以列式方式存储数据。 ClickHouse 支持读取和写入 Parquet 文件。 @@ -24,7 +24,7 @@ ClickHouse 支持读取和写入 Parquet 文件。 -## 从 Parquet 导入 +## 从 Parquet 导入 {#importing-from-parquet} 在加载数据之前,我们可以使用 [file()](/sql-reference/functions/files.md/#file) 函数来查看[示例 Parquet 文件](assets/data.parquet)的结构: @@ -64,7 +64,7 @@ LIMIT 3; ::: -## 导入到现有表 +## 导入到现有表 {#importing-to-an-existing-table} 我们先创建一个用于导入 Parquet 数据的表: @@ -103,7 +103,7 @@ LIMIT 5; 请注意 ClickHouse 如何自动将 Parquet 字符串(`date` 列中的值)转换为 `Date` 类型。这是因为 ClickHouse 会根据目标表中的列类型自动进行类型转换。 -## 将本地文件插入到远程服务器 +## 将本地文件插入到远程服务器 {#inserting-a-local-file-to-remote-server} 如果您想将本地 Parquet 文件插入到远程 ClickHouse 服务器,可以像下面这样通过管道将文件内容传递给 `clickhouse-client`: @@ -112,7 +112,7 @@ clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet ``` -## 基于 Parquet 文件创建新表 +## 基于 Parquet 文件创建新表 {#creating-new-tables-from-parquet-files} 由于 ClickHouse 能读取 Parquet 文件的 schema,我们可以动态创建表: @@ -141,7 +141,7 @@ DESCRIBE TABLE imported_from_parquet; 默认情况下,ClickHouse 对列名、类型和值要求非常严格。但在某些情况下,我们可以在导入时跳过不存在的列或不支持的值。可以通过 [Parquet 设置](/interfaces/formats/Parquet#format-settings) 来控制这一行为。 -## 导出为 Parquet 格式 +## 导出为 Parquet 格式 {#exporting-to-parquet-format} :::tip 在 ClickHouse Cloud 中使用 `INTO OUTFILE` 时,需要在将要写入该文件的那台机器上,通过 `clickhouse client` 来运行这些命令。 @@ -159,7 +159,7 @@ FORMAT Parquet 这将在当前工作目录中创建 `export.parquet` 文件。 -## ClickHouse 与 Parquet 数据类型 +## ClickHouse 与 Parquet 数据类型 {#clickhouse-and-parquet-data-types} ClickHouse 与 Parquet 的数据类型在大多数情况下是相同的,但仍然[存在一些差异](/interfaces/formats/Parquet#data-types-matching-parquet)。例如,ClickHouse 会将 `DateTime` 类型导出为 Parquet 的 `int64`。如果我们随后再将该数据导入回 ClickHouse,看到的将是一串数字([time.parquet 文件](assets/time.parquet)): diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md index b4030b84c1c..c841be3c06a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/sql.md @@ -9,13 +9,13 @@ keywords: ['SQL 格式', '数据导出', '数据导入', '备份', 'SQL 转储'] -# 在 ClickHouse 中插入和导出 SQL 数据 +# 在 ClickHouse 中插入和导出 SQL 数据 {#inserting-and-dumping-sql-data-in-clickhouse} ClickHouse 可以通过多种方式轻松集成到 OLTP 数据库基础架构中。其中一种方式是使用 SQL 转储文件在其他数据库与 ClickHouse 之间传输数据。 -## 创建 SQL 转储 +## 创建 SQL 转储 {#creating-sql-dumps} 可以使用 [SQLInsert](/interfaces/formats/SQLInsert) 以 SQL 格式导出数据。ClickHouse 会以 `INSERT INTO VALUES(...` 的形式输出数据,并使用 [`output_format_sql_insert_table_name`](/operations/settings/settings-formats.md/#output_format_sql_insert_table_name) 设置项作为表名: @@ -46,7 +46,7 @@ mysql some_db < dump.sql SET output_format_sql_insert_max_batch_size = 1000; ``` -### 导出一组值 +### 导出一组值 {#exporting-a-set-of-values} ClickHouse 提供了一种 [Values](/interfaces/formats/Values) 格式,类似于 SQL INSERT,但会省略 `INSERT INTO table VALUES` 部分,仅返回一组值: @@ -59,7 +59,7 @@ SELECT * FROM some_data LIMIT 3 FORMAT Values ``` -## 从 SQL 转储中插入数据 +## 从 SQL 转储中插入数据 {#inserting-data-from-sql-dumps} 要读取 SQL 转储文件,使用 [MySQLDump](/interfaces/formats/MySQLDump): diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md index 6bb64f7a4e3..7be91425d62 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-formats/templates-regex.md @@ -10,13 +10,13 @@ keywords: ['数据格式', '模板', '正则表达式', '自定义格式', '解 -# 在 ClickHouse 中使用 Templates 和 Regex 导入与导出自定义文本数据 +# 在 ClickHouse 中使用 Templates 和 Regex 导入与导出自定义文本数据 {#importing-and-exporting-custom-text-data-using-templates-and-regex-in-clickhouse} 我们经常需要处理自定义文本格式的数据,这些数据可能是非标准格式、无效的 JSON,或损坏的 CSV。在这些情况下,使用 CSV 或 JSON 等标准解析器并不总是可行。好在 ClickHouse 提供了功能强大的 Template 和 Regex 格式,可以很好地应对这些场景。 -## 基于模板导入 +## 基于模板导入 {#importing-based-on-a-template} 假设我们要从以下[日志文件](assets/error.log)中导入数据: @@ -88,7 +88,7 @@ GROUP BY request └──────────────────────────────────────────────────┴─────────┘ ``` -### 跳过空白字符 +### 跳过空白字符 {#skipping-whitespaces} 建议使用 [TemplateIgnoreSpaces](/interfaces/formats/TemplateIgnoreSpaces),它可以忽略模板中分隔符之间的空白字符: @@ -98,7 +98,7 @@ TemplateIgnoreSpaces --> "p1:${p1:CSV}, p2:${p2:CSV}" ``` -## 使用模板导出数据 +## 使用模板导出数据 {#exporting-data-using-templates} 我们也可以使用模板将数据导出为任何文本格式。在这种情况下,我们需要创建两个文件: @@ -142,7 +142,7 @@ FORMAT Template SETTINGS format_template_resultset = 'output.results', --- 已读取 1000 行,用时 0.001380604 秒 --- ``` -### 导出为 HTML 文件 +### 导出为 HTML 文件 {#exporting-to-html-files} 基于模板的结果也可以使用 [`INTO OUTFILE`](/sql-reference/statements/select/into-outfile.md) 子句导出到文件。我们来基于给定的 [结果集](assets/html.results) 和 [行](assets/html.row) 格式生成 HTML 文件: @@ -157,7 +157,7 @@ SETTINGS format_template_resultset = 'html.results', format_template_row = 'html.row' ``` -### 导出为 XML +### 导出为 XML {#exporting-to-xml} 模板格式可用于生成几乎所有可以想象的文本格式文件,包括 XML。只需准备相应的模板并执行导出即可。 @@ -203,7 +203,7 @@ FORMAT XML ``` -## 基于正则表达式导入数据 +## 基于正则表达式导入数据 {#importing-data-based-on-regular-expressions} [Regexp](/interfaces/formats/Regexp) 格式适用于需要以更复杂方式解析输入数据的场景。我们再次解析 [error.log](assets/error.log) 示例文件,不过这次要提取文件名和协议,并将它们保存到单独的列中。首先,为此准备一张新表: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md index 7f4be496488..6d9f3a41102 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-ingestion-index.md @@ -6,7 +6,7 @@ description: '数据摄取部分的概览页' doc_type: 'landing-page' --- -# 数据摄取 +# 数据摄取 {#data-ingestion} ClickHouse 集成了多种用于数据集成和转换的解决方案。 如需更多信息,请参阅以下页面: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md index 584f01f48e8..2e87aaa4323 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/data-sources-index.md @@ -6,7 +6,7 @@ title: '数据源' doc_type: 'landing-page' --- -# 数据源 +# 数据源 {#data-sources} ClickHouse 允许你轻松地从多种数据源将数据摄取到数据库中。 有关更多信息,请参阅下列页面: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md index 72a9df5f46f..f3f334d2f6d 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/dynamodb/index.md @@ -17,7 +17,7 @@ import dynamodb_map_columns from '@site/static/images/integrations/data-ingestio import Image from '@theme/IdealImage'; -# 从 DynamoDB 到 ClickHouse 的 CDC +# 从 DynamoDB 到 ClickHouse 的 CDC {#cdc-from-dynamodb-to-clickhouse} @@ -50,9 +50,9 @@ import Image from '@theme/IdealImage'; -## 3. 将快照加载到 ClickHouse 中 +## 3. 将快照加载到 ClickHouse 中 {#3-load-the-snapshot-into-clickhouse} -### 创建必要的表 +### 创建必要的表 {#create-necessary-tables} 来自 DynamoDB 的快照数据大致如下所示: @@ -115,7 +115,7 @@ ORDER BY id; * 表应使用分区键作为排序键(通过 `ORDER BY` 指定) * 具有相同排序键的行会基于 `version` 列进行去重。 -### 创建快照 ClickPipe +### 创建快照 ClickPipe {#create-the-snapshot-clickpipe} 现在可以创建一个 ClickPipe,将来自 S3 的快照数据加载到 ClickHouse 中。请按照 S3 ClickPipe 指南[此处](/integrations/clickpipes/object-storage)的说明进行操作,但使用以下设置: @@ -146,7 +146,7 @@ https://{bucket}.s3.amazonaws.com/{prefix}/AWSDynamoDB/{export-id}/data/* -## 5. 清理(可选) +## 5. 清理(可选) {#5-cleanup-optional} 当快照 ClickPipe 运行完成后,可以删除快照表和物化视图。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md index 78a19ef372b..c55d0e6bc8b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md @@ -16,7 +16,7 @@ import Jdbc02 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-02 import Jdbc03 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-03.png'; -# 使用 JDBC 将 ClickHouse 连接到外部数据源 +# 使用 JDBC 将 ClickHouse 连接到外部数据源 {#connecting-clickhouse-to-external-data-sources-with-jdbc} :::note 使用 JDBC 需要 ClickHouse JDBC Bridge,因此您需要在本地机器上使用 `clickhouse-local`,将数据库中的数据以流式方式传输到 ClickHouse Cloud。请访问文档 **Migrate** 部分中的 [**Using clickhouse-local**](/cloud/migration/clickhouse-local#example-2-migrating-from-mysql-to-clickhouse-cloud-with-the-jdbc-bridge) 页面了解详细信息。 @@ -44,7 +44,7 @@ import Jdbc03 from '@site/static/images/integrations/data-ingestion/dbms/jdbc-03 -## 在本地安装 ClickHouse JDBC Bridge +## 在本地安装 ClickHouse JDBC Bridge {#install-the-clickhouse-jdbc-bridge-locally} 使用 ClickHouse JDBC Bridge 最简单的方式,是将其安装并运行在与 ClickHouse 相同的主机上: @@ -107,7 +107,7 @@ java -jar clickhouse-jdbc-bridge-2.0.7-shaded.jar ::: -## 在 ClickHouse 中使用 JDBC 连接 +## 在 ClickHouse 中使用 JDBC 连接 {#use-the-jdbc-connection-from-within-clickhouse} ClickHouse 现在可以通过使用 [jdbc 表函数](/sql-reference/table-functions/jdbc.md) 或 [JDBC 表引擎](/engines/table-engines/integrations/jdbc.md) 来访问 MySQL 数据。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md index a26143f7d74..f4308b7d8e5 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/dbms/postgresql/connecting-to-postgresql.md @@ -10,27 +10,24 @@ doc_type: 'guide' import CloudNotSupportedBadge from '@theme/badges/CloudNotSupportedBadge'; import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; - -# 将 ClickHouse 连接到 PostgreSQL +# 将 ClickHouse 连接到 PostgreSQL {#connecting-clickhouse-to-postgresql} 本页介绍以下几种将 PostgreSQL 与 ClickHouse 集成的方式: -- 使用 `PostgreSQL` 表引擎,从 PostgreSQL 表中读取数据 -- 使用试验性的 `MaterializedPostgreSQL` 数据库引擎,将 PostgreSQL 中的数据库与 ClickHouse 中的数据库进行同步 +* 使用 `PostgreSQL` 表引擎,从 PostgreSQL 表中读取数据 +* 使用试验性的 `MaterializedPostgreSQL` 数据库引擎,将 PostgreSQL 中的数据库与 ClickHouse 中的数据库进行同步 :::tip 我们推荐使用由 PeerDB 提供支持的 [ClickPipes](/integrations/clickpipes/postgres),这是一项 ClickHouse Cloud 的托管集成服务。 或者,你也可以使用 [PeerDB](https://github.com/PeerDB-io/peerdb),它是一个专门为将 PostgreSQL 数据库复制到自托管 ClickHouse 和 ClickHouse Cloud 而设计的开源 CDC 工具。 ::: - - -## 使用 PostgreSQL 表引擎 +## 使用 PostgreSQL 表引擎 {#using-the-postgresql-table-engine} `PostgreSQL` 表引擎允许 ClickHouse 对存储在远程 PostgreSQL 服务器上的数据执行 **SELECT** 和 **INSERT** 操作。 本文将通过单个表来演示基本的集成方法。 -### 1. 设置 PostgreSQL +### 1. 设置 PostgreSQL {#1-setting-up-postgresql} 1. 在 `postgresql.conf` 中添加以下条目,以便让 PostgreSQL 监听网络接口: @@ -93,7 +90,7 @@ psql -U clickhouse_user -W -d db_in_psg -h <你的_postgresql_主机地址> 有关出站流量的详细信息,请查看 ClickHouse 的 [Cloud Endpoints API](/cloud/get-started/query-endpoints)。 ::: -### 2. 在 ClickHouse 中定义一张表 +### 2. 在 ClickHouse 中定义一张表 {#2-define-a-table-in-clickhouse} 1. 登录 `clickhouse-client`: @@ -131,7 +128,7 @@ ENGINE = PostgreSQL('postgres-host.domain.com:5432', 'db_in_psg', 'table1', 'cli 查看 [PostgreSQL 表引擎](/engines/table-engines/integrations/postgresql) 文档页面以获取完整的参数列表。 ::: -### 3 测试集成 +### 3 测试集成 {#3-test-the-integration} 1. 在 ClickHouse 中查看初始数据行: @@ -166,7 +163,6 @@ VALUES SELECT * FROM db_in_ch.table1 ``` - 响应应如下: ```response @@ -209,8 +205,7 @@ id | column1 请参阅 [PostgreSQL 表引擎的文档页面](/engines/table-engines/integrations/postgresql),了解更多功能,例如指定 schema、仅返回部分列以及连接到多个副本。另请参阅博客文章:[ClickHouse and PostgreSQL - a match made in data heaven - part 1](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres)。 - -## 使用 MaterializedPostgreSQL 数据库引擎 +## 使用 MaterializedPostgreSQL 数据库引擎 {#using-the-materializedpostgresql-database-engine} @@ -221,7 +216,7 @@ PostgreSQL 数据库引擎利用 PostgreSQL 的复制功能来创建该数据库 ***在以下步骤中,将使用 PostgreSQL 命令行客户端 (`psql`) 和 ClickHouse 命令行客户端 (`clickhouse-client`)。PostgreSQL 服务器安装在 Linux 上。下面给出的配置是针对全新测试安装的 PostgreSQL 数据库的最小配置。*** -### 1. 在 PostgreSQL 中 +### 1. 在 PostgreSQL 中 {#1-in-postgresql} 1. 在 `postgresql.conf` 中,设置基本的监听参数、WAL 复制级别以及复制槽: @@ -276,7 +271,6 @@ VALUES 7. 配置 PostgreSQL,允许使用新用户连接到新数据库以进行复制。下面是在 `pg_hba.conf` 文件中需要添加的最小必要条目: - ```text # TYPE DATABASE USER ADDRESS METHOD host db1 clickhouse_user 192.168.1.0/24 password @@ -350,7 +344,7 @@ Query id: df2381ac-4e30-4535-b22e-8be3894aaafc └────┴─────────┘ ``` -### 3. 测试基本复制 +### 3. 测试基本复制 {#2-in-clickhouse} 1. 在 PostgreSQL 中添加新行: @@ -386,7 +380,7 @@ Query id: b0729816-3917-44d3-8d1a-fed912fb59ce └────┴─────────┘ ``` -### 4. 总结 +### 4. 总结 {#3-test-basic-replication} 本集成指南重点通过一个简单示例说明如何复制一个包含单个表的数据库,不过也有更高级的选项,例如复制整个数据库,或在现有复制基础上新增表和模式(schema)。虽然此复制方式不支持 DDL 命令,但可以将引擎配置为在发生结构性变更时检测更改并重新加载表。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md index 6f13040568f..0e022f79bf0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/emqx/index.md @@ -40,7 +40,7 @@ import clickhouse_result from '@site/static/images/integrations/data-ingestion/e import Image from '@theme/IdealImage'; -# 将 EMQX 与 ClickHouse 集成 +# 将 EMQX 与 ClickHouse 集成 {#integrating-emqx-with-clickhouse} @@ -63,7 +63,7 @@ import Image from '@theme/IdealImage'; -## 获取 ClickHouse Cloud 服务 +## 获取 ClickHouse Cloud 服务 {#get-your-clickhouse-cloudservice} 在本次部署过程中,我们在 AWS 美国北弗吉尼亚(us-east-1)区域部署了一个 ClickHouse 实例,并在同一地区部署了一个 EMQX Cloud 实例。 @@ -153,7 +153,7 @@ EMQX Cloud 默认不允许匿名连接,所以你需要添加一个客户端凭 -## 将 EMQX Cloud 与 ClickHouse Cloud 集成 +## 将 EMQX Cloud 与 ClickHouse Cloud 集成 {#integration-emqx-cloud-with-clickhouse-cloud} [EMQX Cloud Data Integrations](https://docs.emqx.com/en/cloud/latest/rule_engine/introduction.html#general-flow) 用于配置处理和响应 EMQX 消息流与设备事件的规则。Data Integrations 不仅提供了清晰且灵活的可配置架构方案,还简化了开发流程、提升了用户体验,并降低了业务系统与 EMQX Cloud 之间的耦合度。同时,它还为 EMQX Cloud 专有能力的定制化提供了完善的基础设施。 @@ -163,7 +163,7 @@ EMQX Cloud 为常见数据系统提供了 30 多种原生集成方案,ClickHou -### 创建 ClickHouse 资源 +### 创建 ClickHouse 资源 {#create-clickhouse-resource} 点击左侧菜单中的 “Data Integrations”,然后点击 “View All Resources”。您可以在 Data Persistence 部分找到 ClickHouse,或者直接搜索 ClickHouse。 @@ -177,7 +177,7 @@ EMQX Cloud 为常见数据系统提供了 30 多种原生集成方案,ClickHou -### 创建新规则 +### 创建新规则 {#create-a-new-rule} 在创建资源的过程中,您会看到一个弹窗,点击 “New” 会跳转到规则创建页面。 @@ -212,7 +212,7 @@ FROM 现在点击 "NEXT" 按钮。此步骤是告诉 EMQX Cloud 如何将处理后的数据写入你的 ClickHouse 数据库。 -### 添加响应操作 +### 添加响应操作 {#add-a-response-action} 如果你只有一个资源,则无需修改 'Resource' 和 'Action Type'。 你只需要设置 SQL 模板。以下是本教程中使用的示例: @@ -225,7 +225,7 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ 这是一个用于向 ClickHouse 写入数据的模板,可以看到这里使用了变量。 -### 查看规则详情 +### 查看规则详情 {#view-rules-details} 点击 “Confirm” 和 “View Details”。现在一切都已配置就绪。你可以在规则详情页面看到数据集成的运行情况。 @@ -234,13 +234,13 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ 发送到 `temp_hum/emqx` 主题的所有 MQTT 消息都会被持久化到你的 ClickHouse Cloud 数据库中。 -## 将数据保存到 ClickHouse +## 将数据保存到 ClickHouse {#saving-data-into-clickhouse} 我们将模拟温度和湿度数据,通过 MQTT X 将这些数据上报到 EMQX Cloud,然后使用 EMQX Cloud 的数据集成功能将数据保存到 ClickHouse Cloud 中。 -### 向 EMQX Cloud 发布 MQTT 消息 +### 向 EMQX Cloud 发布 MQTT 消息 {#publish-mqtt-messages-to-emqx-cloud} 你可以使用任意 MQTT 客户端或 SDK 发布消息。在本教程中,我们将使用 [MQTT X](https://mqttx.app/),这是由 EMQ 提供的一款用户友好的 MQTT 客户端应用程序。 @@ -274,13 +274,13 @@ INSERT INTO temp_hum (client_id, timestamp, topic, temp, hum) VALUES ('${client_ -### 查看规则监控 +### 查看规则监控 {#view-rules-monitoring} 检查规则监控,确认成功次数已增加 1。 -### 检查持久化数据 +### 检查持久化数据 {#check-the-data-persisted} 现在是时候查看 ClickHouse Cloud 上的数据了。理想情况下,你使用 MQTTX 发送的数据会进入 EMQX Cloud,并在原生数据集成的帮助下持久化到 ClickHouse Cloud 的数据库中。 @@ -293,6 +293,6 @@ SELECT * FROM emqx.temp_hum; -### 总结 +### 总结 {#summary} 你无需编写任何代码,就已经让 MQTT 数据从 EMQX Cloud 流转到了 ClickHouse Cloud。借助 EMQX Cloud 和 ClickHouse Cloud,你无需自行管理基础设施,只需专注于编写物联网 (IoT) 应用,而数据会安全地存储在 ClickHouse Cloud 中。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md index 9c9b98a987d..78681183269 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md @@ -25,7 +25,7 @@ import airbyte09 from '@site/static/images/integrations/data-ingestion/etl-tools import PartnerBadge from '@theme/badges/PartnerBadge'; -# 将 Airbyte 连接到 ClickHouse +# 将 Airbyte 连接到 ClickHouse {#connect-airbyte-to-clickhouse} @@ -70,7 +70,7 @@ import PartnerBadge from '@theme/badges/PartnerBadge'; -## 将 ClickHouse 添加为目标 +## 将 ClickHouse 添加为目标 {#2-add-clickhouse-as-a-destination} 在本节中,我们将展示如何将一个 ClickHouse 实例添加为目标。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md index 441455abc73..b56dbf2cfe0 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/apache-beam.md @@ -13,7 +13,7 @@ keywords: ['apache beam', 'stream processing', 'batch processing', 'jdbc connect import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# 集成 Apache Beam 与 ClickHouse +# 集成 Apache Beam 与 ClickHouse {#integrating-apache-beam-and-clickhouse} @@ -29,9 +29,9 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## 设置 Apache Beam ClickHouse 包 +## 设置 Apache Beam ClickHouse 包 {#setup-of-the-apache-beam-clickhouse-package} -### 安装包 +### 安装包 {#package-installation} 将以下依赖添加到你的包管理工具中: @@ -50,7 +50,7 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; 相关构件可以在[官方 Maven 仓库](https://mvnrepository.com/artifact/org.apache.beam/beam-sdks-java-io-clickhouse)中找到。 -### 代码示例 +### 代码示例 {#code-example} 以下示例将名为 `input.csv` 的 CSV 文件读取为 `PCollection`,将其转换为 Row 对象(基于已定义的 schema),并使用 `ClickHouseIO` 将其插入到本地 ClickHouse 实例中: diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md index b712370db52..34a438409e6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/bladepipe-and-clickhouse.md @@ -21,7 +21,7 @@ import bp_ck_9 from '@site/static/images/integrations/data-ingestion/etl-tools/b import PartnerBadge from '@theme/badges/PartnerBadge'; -# 将 BladePipe 连接到 ClickHouse +# 将 BladePipe 连接到 ClickHouse {#connect-bladepipe-to-clickhouse} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md index f281fbe18cd..314e8685fad 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/features-and-configurations.md @@ -12,7 +12,7 @@ import TOCInline from '@theme/TOCInline'; import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# 功能和配置 +# 功能和配置 {#features-and-configurations} @@ -22,7 +22,7 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## Profile.yml 配置 +## Profile.yml 配置 {#profile-yml-configurations} 要使用 dbt 连接到 ClickHouse,需在 `profiles.yml` 文件中添加一个 [profile](https://docs.getdbt.com/docs/core/connect-data-platform/connection-profiles)。ClickHouse 的 profile 遵循以下语法: @@ -65,16 +65,16 @@ your_profile_name: compress_block_size: [1048576] # 启用压缩时的压缩块大小 ``` -### 模式与数据库 +### 模式与数据库 {#schema-vs-database} dbt 模型关系标识符 `database.schema.table` 与 ClickHouse 不兼容,因为 ClickHouse 不支持 `schema`。 因此我们采用简化形式 `schema.table`,其中 `schema` 实际上就是 ClickHouse 的 database。不推荐使用 `default` 数据库。 -### SET 语句警告 +### SET 语句警告 {#set-statement-warning} 在许多环境中,使用 SET 语句在所有 dbt 查询之间持久化 ClickHouse 设置并不可靠,并可能导致意外失败。对于通过负载均衡器使用 HTTP 连接并将查询分发到多个节点的场景(例如 ClickHouse Cloud),这一点尤为明显;在某些情况下,这种问题在原生 ClickHouse 连接中也可能出现。因此,我们建议将所有必需的 ClickHouse 设置配置在 dbt profile 的 "custom_settings" 属性中,作为最佳实践,而不是依赖在 pre-hook 中执行 "SET" 语句(这一做法曾被偶尔建议过)。 -### 设置 `quote_columns` +### 设置 `quote_columns` {#setting-quote_columns} 为避免出现警告,请务必在 `dbt_project.yml` 中明确设置 `quote_columns` 的值。更多信息请参阅[有关 `quote_columns` 的文档](https://docs.getdbt.com/reference/resource-configs/quote_columns)。 @@ -84,14 +84,14 @@ seeds: +quote_columns: false #若 CSV 列标题含有空格,则设为 `true` ``` -### 关于 ClickHouse 集群 +### 关于 ClickHouse 集群 {#about-the-clickhouse-cluster} 在使用 ClickHouse 集群时,需要考虑两点: * 设置 `cluster` 参数。 * 确保写入后的读取一致性,尤其是在使用多个 `threads` 时。 -#### 集群设置 +#### 集群设置 {#cluster-setting} 配置文件中的 `cluster` 参数允许 dbt-clickhouse 在 ClickHouse 集群上运行。若在配置文件中设置了 `cluster`,则**所有模型默认都会使用 `ON CLUSTER` 子句进行创建**——使用 **Replicated** 引擎的模型除外。这包括: @@ -120,7 +120,7 @@ Replicated 引擎**不会**包含 `ON CLUSTER` 子句,因为它们被设计为 如果某个模型是在没有 `cluster` 设置的情况下创建的,dbt-clickhouse 会识别这一情况,并在对该模型执行所有 DDL/DML 时不使用 `on cluster` 子句。 -#### 写后读一致性 +#### 写后读一致性 {#read-after-write-consistency} dbt 依赖写入后读取(read-after-insert)的一致性模型。如果无法保证所有操作都发送到同一个副本,那么对于具有多个副本的 ClickHouse 集群,这种一致性模型就不兼容。在你日常使用 dbt 的过程中,可能不会遇到问题,但可以根据集群情况采用一些策略来保证这一点: @@ -128,9 +128,9 @@ dbt 依赖写入后读取(read-after-insert)的一致性模型。如果无 * 如果你使用的是自托管集群,请确保所有 dbt 请求都发送到同一个 ClickHouse 副本。如果其前面有负载均衡器,尝试使用 `replica aware routing` / `sticky sessions` 等机制,以始终访问同一副本。在 ClickHouse Cloud 之外的集群中添加设置 `select_sequential_consistency = 1`[是不推荐的](https://clickhouse.com/docs/operations/settings/settings#select_sequential_consistency)。 -## 功能概览 +## 功能概览 {#general-information-about-features} -### 通用表配置 +### 通用表配置 {#general-table-configurations} | Option | Description | Default if any | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | -------------- | @@ -148,7 +148,7 @@ dbt 依赖写入后读取(read-after-insert)的一致性模型。如果无 | definer | 如果 `sql_security` 设置为 `definer`,则必须在 `definer` 子句中指定某个已存在的用户或 `CURRENT_USER`。 | | | projections | 要创建的[投影(projections)列表](/data-modeling/projections)。详细信息参见[关于投影](#projections)。 | | -#### 关于数据跳过索引 +#### 关于数据跳过索引 {#data-skipping-indexes} 数据跳过索引仅适用于 `table` 物化方式。要为表添加数据跳过索引列表,请使用 `indexes` 配置: @@ -162,7 +162,7 @@ dbt 依赖写入后读取(read-after-insert)的一致性模型。如果无 ) }} ``` -#### 关于投影 +#### 关于投影 {#projections} 你可以通过 `projections` 配置为 `table` 和 `distributed_table` 物化方式添加[投影](/data-modeling/projections): @@ -180,7 +180,7 @@ dbt 依赖写入后读取(read-after-insert)的一致性模型。如果无 **注意**:对于分布式表,投影会应用到 `_local` 表,而不是分布式代理表。 -### 支持的表引擎 +### 支持的表引擎 {#supported-table-engines} | 类型 | 详情 | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -191,7 +191,7 @@ dbt 依赖写入后读取(read-after-insert)的一致性模型。如果无 | EmbeddedRocksDB | [https://clickhouse.com/docs/en/engines/table-engines/integrations/embedded-rocksdb](https://clickhouse.com/docs/en/engines/table-engines/integrations/embedded-rocksdb) | | Hive | [https://clickhouse.com/docs/en/engines/table-engines/integrations/hive](https://clickhouse.com/docs/en/engines/table-engines/integrations/hive) | -### 实验性支持的表引擎 +### 实验性支持的表引擎 {#experimental-supported-table-engines} | 类型 | 详情 | @@ -201,13 +201,13 @@ dbt 依赖写入后读取(read-after-insert)的一致性模型。如果无 如果你在使用上述任一引擎时,从 dbt 连接 ClickHouse 遇到问题,请在[这里](https://github.com/ClickHouse/dbt-clickhouse/issues)提交 issue。 -### 关于模型设置的说明 +### 关于模型设置的说明 {#a-note-on-model-settings} ClickHouse 有多种类型/级别的“设置(settings)”。在上面的模型配置中,其中两类是可配置的。`settings` 指的是在 `CREATE TABLE/VIEW` 这类 DDL 语句中使用的 `SETTINGS` 子句,因此通常是特定于某个 ClickHouse 表引擎的设置。新的 `query_settings` 用于在用于模型物化的 `INSERT` 和 `DELETE` 查询中添加 `SETTINGS` 子句(包括增量物化)。 ClickHouse 中有数百个设置,而且并不总是很清楚哪些是“表”级设置,哪些是“用户”级设置(尽管后者通常可以在 `system.settings` 表中查看)。通常推荐使用默认值,若要使用这些属性,应进行充分的调研和测试。 -### 列配置 +### 列配置 {#column-configuration} > ***注意:*** 下列列配置选项要求启用并强制执行[模型契约(model contracts)](https://docs.getdbt.com/docs/collaborate/govern/model-contracts)。 @@ -216,7 +216,7 @@ ClickHouse 中有数百个设置,而且并不总是很清楚哪些是“表” | codec | 一个字符串,由传递给列 DDL 中 `CODEC()` 的参数组成。例如:`codec: "Delta, ZSTD"` 会被编译为 `CODEC(Delta, ZSTD)`。 | | | ttl | 一个字符串,由[TTL(time-to-live)表达式](https://clickhouse.com/docs/guides/developer/ttl)组成,用于在列的 DDL 中定义 TTL 规则。例如:`ttl: ts + INTERVAL 1 DAY` 会被编译为 `TTL ts + INTERVAL 1 DAY`。 | | -#### Schema 配置示例 +#### Schema 配置示例 {#example-of-schema-configuration} ```yaml models: @@ -234,7 +234,7 @@ models: ttl: ts + INTERVAL 1 DAY ``` -#### 添加复杂类型 +#### 添加复杂类型 {#adding-complex-types} dbt 会通过分析用于创建模型的 SQL,自动推断每一列的数据类型。然而,在某些情况下,此过程可能无法准确确定数据类型,进而与契约中 `data_type` 属性指定的类型产生冲突。为了解决这一问题,我们建议在模型 SQL 中使用 `CAST()` 函数显式指定所需类型。例如: @@ -259,9 +259,9 @@ group by event_type ``` -## 功能 +## 功能 {#features} -### 物化类型:view +### 物化类型:view {#materialization-view} 可以将 dbt 模型创建为 [ClickHouse view](https://clickhouse.com/docs/en/sql-reference/table-functions/view/), 并使用以下语法进行配置: @@ -280,7 +280,7 @@ models: {{ config(materialized = "view") }} ``` -### 物化:table +### 物化:table {#materialization-table} 可以将 dbt 模型物化为 [ClickHouse 表](https://clickhouse.com/docs/en/operations/system-tables/tables/),并使用以下语法进行配置: @@ -308,7 +308,7 @@ models: ) }} ``` -### 物化方式:增量(incremental) +### 物化方式:增量(incremental) {#materialization-incremental} 每次执行 dbt 时,表模型都会被重新构建。对于较大的结果集或复杂的转换,这可能不可行且代价极高。为了解决这一问题并减少构建时间,可以将 dbt 模型创建为 ClickHouse 增量表,并使用以下语法进行配置: @@ -340,7 +340,7 @@ models: ) }} ``` -#### 配置 +#### 配置 {#configurations} 针对此物化类型的特定配置如下所示: @@ -351,11 +351,11 @@ models: | `incremental_strategy` | 用于增量物化的策略。支持 `delete+insert`、`append`、`insert_overwrite` 或 `microbatch`。有关各策略的更多详细信息,请参见[此处](/integrations/dbt/features-and-configurations#incremental-model-strategies)。 | 可选(默认:'default') | | `incremental_predicates` | 需要应用于增量物化的附加条件(仅适用于 `delete+insert` 策略) | 可选 | -#### 增量模型策略 +#### 增量模型策略 {#incremental-model-strategies} `dbt-clickhouse` 支持三种增量模型策略。 -##### 默认(传统)策略 +##### 默认(传统)策略 {#default-legacy-strategy} 一直以来,ClickHouse 仅通过异步的 “mutations” 形式有限支持更新和删除操作。 为了模拟预期的 dbt 行为, @@ -363,7 +363,7 @@ dbt-clickhouse 默认会创建一个新的临时表,该表包含所有未受 记录,以及所有新增或更新的记录, 然后将此临时表与现有的增量模型关系进行交换。这是唯一一种在操作完成之前如果出现问题仍能保留原始关系的策略;但是,由于它需要对原始表进行完整拷贝,因此执行代价较高且速度较慢。 -##### Delete+Insert 策略 +##### Delete+Insert 策略 {#delete-insert-strategy} ClickHouse 在 22.8 版本中新增了实验性功能 “lightweight deletes(轻量级删除)”。与 `ALTER TABLE ... DELETE` @@ -437,7 +437,7 @@ ClickHouse 在 22.8 版本中新增了实验性功能 “lightweight deletes( 该策略要求在模型配置中设置 `partition_by`,并会忽略模型配置中所有其他特定于策略的参数。 -### 物化:materialized_view(实验性) +### 物化:materialized_view(实验性) {#materialized-view} `materialized_view` 物化应为对现有(源)表的 `SELECT`。适配器会创建一个名称为模型名的目标表, 以及一个名为 `_mv` 的 ClickHouse MATERIALIZED VIEW。与 PostgreSQL 不同,ClickHouse 的物化视图不是“静态的”(且 @@ -466,7 +466,7 @@ select a,b,c from {{ source('raw', 'table_2') }} > 将会看到如下警告: > `Warning - Table was detected with the same pattern as model name but was not found in this run. In case it is a renamed mv that was previously part of this model, drop it manually (!!!) ` -#### 数据补齐 +#### 数据补齐 {#data-catch-up} 目前,在创建物化视图(MV)时,目标表会先使用历史数据进行填充,然后才创建 MV 本身。 @@ -483,7 +483,7 @@ select a,b,c from {{ source('raw', 'table_2') }} )}} ``` -#### 可刷新物化视图 +#### 可刷新物化视图 {#refreshable-materialized-views} 要使用 [Refreshable Materialized View](https://clickhouse.com/docs/en/materialized-view/refreshable-materialized-view), 请在 MV 模型中按需调整以下配置(所有这些配置都应在一个 refreshable 配置对象中进行设置): @@ -514,7 +514,7 @@ select a,b,c from {{ source('raw', 'table_2') }} }} ``` -#### 限制 +#### 限制 {#limitations} * 在 ClickHouse 中创建具有依赖项的可刷新的物化视图(MV)时,如果在创建时指定的依赖项不存在,ClickHouse 不会抛出错误。 相反,该可刷新 MV 会保持在未激活状态,等待依赖项被满足之后,才会开始处理更新或刷新。 @@ -523,7 +523,7 @@ select a,b,c from {{ source('raw', 'table_2') }} * 截至目前,MV 与其依赖项之间并没有真正的 “dbt 链接(dbt linkage)”,因此无法保证创建顺序。 * 尚未对多个 MV 指向同一目标模型场景下的可刷新特性进行测试。 -### 物化:dictionary(实验性) +### 物化:dictionary(实验性) {#materialization-dictionary} 请参阅 [https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/dictionary/test_dictionary.py](https://github.com/ClickHouse/dbt-clickhouse/blob/main/tests/integration/adapter/dictionary/test_dictionary.py) @@ -531,7 +531,7 @@ select a,b,c from {{ source('raw', 'table_2') }} 以获取如何为 ClickHouse dictionaries 实现物化的示例。 -### 物化:distributed_table(实验性) +### 物化:distributed_table(实验性) {#materialization-distributed-table} 通过以下步骤创建 Distributed 表: @@ -545,7 +545,7 @@ select a,b,c from {{ source('raw', 'table_2') }} * 为了确保下游增量物化操作能够正确执行,dbt-clickhouse 查询现在会自动包含设置 `insert_distributed_sync = 1`。 这可能会导致某些 Distributed 表插入操作比预期更慢。 -#### Distributed 表模型示例 +#### Distributed 表模型示例 {#distributed-table-model-example} ```sql {{ @@ -561,7 +561,7 @@ select id, created_at, item from {{ source('db', 'table') }} ``` -#### 自动生成的迁移 +#### 自动生成的迁移 {#distributed-table-generated-migrations} ```sql CREATE TABLE db.table_local on cluster cluster ( @@ -581,7 +581,7 @@ CREATE TABLE db.table on cluster cluster ( ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id)); ``` -### materialization: distributed_incremental(实验性) +### materialization: distributed_incremental(实验性) {#materialization-distributed-incremental} 基于与 Distributed 表相同理念的增量模型,主要难点在于要正确处理所有增量策略。 @@ -592,7 +592,7 @@ CREATE TABLE db.table on cluster cluster ( 只会替换各分片上的本地表,因为 Distributed 表本身不存储数据。 Distributed 表仅在启用 full_refresh 模式或表结构可能发生变化时才会重新加载。 -#### 分布式增量模型示例 +#### 分布式增量模型示例 {#distributed-incremental-model-example} ```sql @@ -609,7 +609,7 @@ select id, created_at, item from {{ source('db', 'table') }} ``` -#### 自动生成的迁移 +#### 自动生成的迁移 {#distributed-incremental-generated-migrations} ```sql CREATE TABLE db.table_local on cluster cluster ( @@ -628,7 +628,7 @@ CREATE TABLE db.table on cluster cluster ( ENGINE = Distributed ('cluster', 'db', 'table_local', cityHash64(id)); ``` -### 快照 +### 快照 {#snapshot} dbt 快照允许对可变模型随时间发生的变更进行记录。这样一来,就可以在模型上执行按时间点的查询,使分析人员能够“回到过去”查看模型之前的状态。ClickHouse 连接器支持此功能,并可通过以下语法进行配置: @@ -647,15 +647,15 @@ dbt 快照允许对可变模型随时间发生的变更进行记录。这样一 有关配置的更多信息,请查看 [snapshot configs](https://docs.getdbt.com/docs/build/snapshots#snapshot-configs) 参考页面。 -### 合约与约束 +### 合约与约束 {#contracts-and-constraints} 仅支持精确匹配的列类型合约。例如,如果合约中列类型为 UInt32,而模型返回 UInt64 或其他整数类型,则会失败。 ClickHouse *仅* 支持在整个表/模型上的 `CHECK` 约束。不支持主键、外键、唯一键以及列级别的 `CHECK` 约束。 (参见 ClickHouse 关于 primary/ORDER BY 键的文档。) -### 其他 ClickHouse 宏 +### 其他 ClickHouse 宏 {#additional-clickhouse-macros} -#### 模型物化辅助宏 +#### 模型物化辅助宏 {#model-materialization-utility-macros} 包含以下宏,用于简化创建 ClickHouse 特定的表和视图: @@ -672,7 +672,7 @@ ClickHouse *仅* 支持在整个表/模型上的 `CHECK` 约束。不支持主 * `ttl_config` -- 使用 `ttl` 模型配置属性来指定 ClickHouse 表的 TTL 表达式。 默认不设置 TTL。 -#### s3Source 辅助宏 +#### s3Source 辅助宏 {#s3source-helper-macro} `s3source` 宏简化了使用 ClickHouse S3 表函数直接从 S3 中选择 ClickHouse 数据的流程。其工作方式是 从具名配置字典(字典名称必须以 `s3` 结尾)中填充 S3 表函数参数。该宏会 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md index da92b149a67..840f49d5dba 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/guides.md @@ -20,7 +20,7 @@ import dbt_07 from '@site/static/images/integrations/data-ingestion/etl-tools/db import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# 指南 +# 指南 {#guides} @@ -39,13 +39,13 @@ import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -## 设置 +## 设置 {#setup} 请按照[设置 dbt 和 ClickHouse 适配器](/integrations/dbt)部分中的说明来准备环境。 **重要:以下内容已在 Python 3.9 环境下测试通过。** -### 准备 ClickHouse +### 准备 ClickHouse {#prepare-clickhouse} dbt 在对高度关系型的数据进行建模时表现出色。作为示例,我们提供了一个包含如下关系型模式的小型 IMDb 数据集。该数据集来源于[关系型数据集仓库](https://relational.fit.cvut.cz/dataset/IMDb)。与 dbt 常见的模式相比,这个示例非常简单,但可以作为一个便于上手的示例样本: @@ -672,7 +672,7 @@ SELECT * FROM imdb_dbt.actor_summary ORDER BY num_movies DESC LIMIT 2; +------+-------------------+----------+------------------+------+---------+-------------------+ ``` -### 内部实现 +### 内部实现 {#internals} 我们可以通过查询 ClickHouse 的查询日志,找出为完成上述增量更新而执行的语句。 @@ -694,7 +694,7 @@ AND event_time > subtractMinutes(now(), 15) ORDER BY event_time LIMIT 100; 这种策略在非常大的模型上可能会遇到挑战。更多细节请参见 [Limitations](/integrations/dbt#limitations)。 -### 追加策略(仅插入模式) +### 追加策略(仅插入模式) {#append-strategy-inserts-only-mode} 为克服在大数据集上使用增量模型的限制,适配器使用 dbt 配置参数 `incremental_strategy`。该参数可以设置为 `append`。设置后,更新的行会被直接插入到目标表(即 `imdb_dbt.actor_summary`)中,而不会创建临时表。 注意:仅追加模式要求你的数据是不可变的,或者可以接受重复数据。如果你需要一个支持已修改行的增量表模型,请不要使用此模式! @@ -796,7 +796,7 @@ WHERE id > (SELECT max(id) FROM imdb_dbt.actor_summary) OR updated_at > (SELECT 在本次运行中,只有新增的行会直接添加到 `imdb_dbt.actor_summary` 表中,不会涉及创建新表。 -### 删除并插入模式(实验性) +### 删除并插入模式(实验性) {#deleteinsert-mode-experimental} 一直以来,ClickHouse 仅通过异步的 [变更(Mutations)](/sql-reference/statements/alter/index.md) 对更新和删除提供有限支持。这些操作对 IO 消耗极大,通常应尽量避免。 @@ -821,7 +821,7 @@ ClickHouse 22.8 引入了[轻量级删除](/sql-reference/statements/delete.md) -### insert_overwrite 模式(实验性) +### insert_overwrite 模式(实验性) {#insert_overwrite-mode-experimental} 执行以下步骤: @@ -840,7 +840,7 @@ ClickHouse 22.8 引入了[轻量级删除](/sql-reference/statements/delete.md) -## 创建快照 +## 创建快照 {#creating-a-snapshot} dbt 快照允许随着时间推移记录可变模型的变更。这使得可以在模型上执行时间点查询,从而让分析人员“回溯”查看模型先前的状态。其通过使用[类型 2 缓慢变化维度](https://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2:_add_new_row)实现,其中 from 和 to 日期列用于记录某一行数据在什么时间段内有效。ClickHouse 适配器支持此功能,下面将进行演示。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md index 5d664753e77..52588aa666a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dbt/index.md @@ -95,9 +95,9 @@ dbt 提供 4 种物化方式: -## 配置 dbt 和 ClickHouse 适配器 +## 配置 dbt 和 ClickHouse 适配器 {#setup-of-dbt-and-the-clickhouse-adapter} -### 安装 dbt-core 和 dbt-clickhouse +### 安装 dbt-core 和 dbt-clickhouse {#install-dbt-core-and-dbt-clickhouse} dbt 提供了多种安装命令行界面(CLI)的方法,详细说明见 [此处](https://docs.getdbt.com/dbt-cli/install/overview)。我们建议使用 `pip` 安装 dbt 和 dbt-clickhouse。 @@ -105,7 +105,7 @@ dbt 提供了多种安装命令行界面(CLI)的方法,详细说明见 [ pip install dbt-core dbt-clickhouse ``` -### 为 dbt 提供 ClickHouse 实例的连接详细信息。 +### 为 dbt 提供 ClickHouse 实例的连接详细信息。 {#provide-dbt-with-the-connection-details-for-our-clickhouse-instance} 在 `~/.dbt/profiles.yml` 文件中配置名为 `clickhouse-service` 的 profile,并提供 schema、host、port、user 和 password 属性。完整的连接配置选项列表请参见 [功能与配置](/integrations/dbt/features-and-configurations) 页面: @@ -125,7 +125,7 @@ clickhouse-service: secure: True # 使用 TLS(原生协议)或 HTTPS(HTTP 协议) ``` -### 创建 dbt 项目 +### 创建 dbt 项目 {#create-a-dbt-project} 现在你可以在现有项目中使用此配置,或使用以下命令创建新项目: @@ -139,17 +139,17 @@ dbt init <项目名称> profile: 'clickhouse-service' ``` -### 测试连接 +### 测试连接 {#test-connection} 使用 CLI 工具执行 `dbt debug`,以确认 dbt 是否能够连接到 ClickHouse。确认输出中包含 `Connection test: [OK connection ok]`,这表示连接成功。 前往[指南页面](/integrations/dbt/guides)以了解更多关于如何在 ClickHouse 中使用 dbt 的信息。 -### 测试和部署你的模型(CI/CD) +### 测试和部署你的模型(CI/CD) {#testing-and-deploying-your-models-ci-cd} 有多种方式可以测试和部署你的 dbt 项目。dbt 提供了一些关于[最佳实践工作流](https://docs.getdbt.com/best-practices/best-practice-workflows#pro-tips-for-workflows)和[CI 作业](https://docs.getdbt.com/docs/deploy/ci-jobs)的建议。我们将讨论几种策略,但请记住,这些策略可能需要进行较大幅度的调整以适配你的具体用例。 -#### 使用简单数据测试和单元测试的 CI/CD +#### 使用简单数据测试和单元测试的 CI/CD {#ci-with-simple-data-tests-and-unit-tests} 启动 CI 流水线的一种简单方式,是在作业内部运行一个 ClickHouse 集群,然后在其上运行你的模型。在运行模型之前,你可以向该集群插入演示数据。你可以直接使用一个 [seed](https://docs.getdbt.com/reference/commands/seed) 来用生产数据的一个子集填充暂存环境(staging 环境)。 @@ -157,7 +157,7 @@ profile: 'clickhouse-service' 你的 CD 步骤可以非常简单,只需针对生产 ClickHouse 集群运行 `dbt build` 即可。 -#### 更完整的 CI/CD 阶段:使用最新数据,仅测试受影响的模型 +#### 更完整的 CI/CD 阶段:使用最新数据,仅测试受影响的模型 {#more-complete-ci-stage} 一种常见策略是使用 [Slim CI](https://docs.getdbt.com/best-practices/best-practice-workflows#run-only-modified-models-to-test-changes-slim-ci) 作业,只重新部署被修改的模型(以及其上下游依赖)。这种方法利用生产运行生成的制品(例如 [dbt manifest](https://docs.getdbt.com/reference/artifacts/manifest-json))来缩短项目运行时间,并确保各环境之间的模式不会发生漂移。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md index e0a73d59f69..e5069e15042 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/dlt-and-clickhouse.md @@ -10,7 +10,7 @@ doc_type: 'guide' import PartnerBadge from '@theme/badges/PartnerBadge'; -# 将 dlt 连接到 ClickHouse +# 将 dlt 连接到 ClickHouse {#connect-dlt-to-clickhouse} @@ -18,9 +18,9 @@ import PartnerBadge from '@theme/badges/PartnerBadge'; -## 安装适用于 ClickHouse 的 dlt +## 安装适用于 ClickHouse 的 dlt {#install-dlt-with-clickhouse} -### 安装包含 ClickHouse 依赖的 `dlt` 库: +### 安装包含 ClickHouse 依赖的 `dlt` 库: {#to-install-the-dlt-library-with-clickhouse-dependencies} ```bash pip install "dlt[clickhouse]" @@ -99,7 +99,7 @@ dataset_table_separator = "___" # 数据集表名与数据集之间的 ```bash -# 将此配置保持在 toml 文件的顶部,在任何节(section)开始之前。 +# 将此配置保持在 toml 文件的顶部,在任何节(section)开始之前。 {#keep-it-at-the-top-of-your-toml-file-before-any-section-starts} destination.clickhouse.credentials="clickhouse://dlt:Dlt*12345789234567@localhost:9000/dlt?secure=1" ``` @@ -156,7 +156,7 @@ ClickHouse 支持以下GCS table function 自动处理,dlt 在内部会调用该函数。 @@ -240,10 +240,10 @@ dlt 会将这些凭据传递给 ClickHouse,由 ClickHouse 处理认证并访 * 使 filesystem 目标在 s3 兼容模式下与 gcs 正常工作 * Google Cloud Storage staging 区域 支持 -### Dbt 支持 +### Dbt 支持 {#dbt-support} 与 dbt 的集成通常通过 dbt-clickhouse 提供支持。 -### `dlt` 状态同步 +### `dlt` 状态同步 {#syncing-of-dlt-state} 此目标完全支持 dlt 状态同步。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md index cf7fa7d6030..66906e534c6 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/fivetran/index.md @@ -14,7 +14,7 @@ keywords: ['fivetran', '数据迁移', 'etl', 'ClickHouse 目标端', '自动化 import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Fivetran 与 ClickHouse Cloud +# Fivetran 与 ClickHouse Cloud {#fivetran-and-clickhouse-cloud} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md index d5d863f1e5b..e05292332fa 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/nifi-and-clickhouse.md @@ -11,7 +11,7 @@ integration: - category: 'data_ingestion' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; import nifi01 from '@site/static/images/integrations/data-ingestion/etl-tools/nifi_01.png'; import nifi02 from '@site/static/images/integrations/data-ingestion/etl-tools/nifi_02.png'; @@ -31,7 +31,7 @@ import nifi15 from '@site/static/images/integrations/data-ingestion/etl-tools/ni import CommunityMaintainedBadge from '@theme/badges/CommunityMaintained'; -# 将 Apache NiFi 连接到 ClickHouse +# 将 Apache NiFi 连接到 ClickHouse {#connect-apache-nifi-to-clickhouse} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md index 885d9368360..4bc877d7b2a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md @@ -18,8 +18,7 @@ import vector01 from '@site/static/images/integrations/data-ingestion/etl-tools/ import vector02 from '@site/static/images/integrations/data-ingestion/etl-tools/vector_02.png'; import PartnerBadge from '@theme/badges/PartnerBadge'; - -# 将 Vector 与 ClickHouse 集成 +# 将 Vector 与 ClickHouse 集成 {#integrating-vector-with-clickhouse} @@ -31,214 +30,202 @@ ClickHouse 在存储和分析日志数据方面表现卓越,这得益于其出 **前置条件:** -- 您已部署并运行 ClickHouse -- 您已安装 Vector +* 您已部署并运行 ClickHouse +* 您已安装 Vector + ## 创建数据库和表 {#1-create-a-database-and-table} + 定义一个用于存储日志事件的表: -## 创建数据库和表 - -定义一个用于存储日志事件的表: - -1. 首先创建一个名为 `nginxdb` 的新数据库: - -```sql -CREATE DATABASE IF NOT EXISTS nginxdb -``` - -2. 将整条日志事件作为一个字符串插入。显然,这并不是对日志数据进行分析的理想格式,不过我们会在下文中借助***物化视图***来解决这一问题。 - -```sql -CREATE TABLE IF NOT EXISTS nginxdb.access_logs ( - message String -) -ENGINE = MergeTree() -ORDER BY tuple() -``` - -:::note -**ORDER BY** 被设置为 **tuple()**(一个空元组),因为当前还不需要主键。 -::: - - -## 配置 Nginx - -在本步骤中,将演示如何配置 Nginx 日志记录。 - -1. 以下 `access_log` 属性会以 **combined** 格式将日志写入 `/var/log/nginx/my_access.log`。 - 该配置应放在 `nginx.conf` 文件的 `http` 块中: - -```bash -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - access_log /var/log/nginx/my_access.log combined; - sendfile on; - keepalive_timeout 65; - include /etc/nginx/conf.d/*.conf; -} -``` - -2. 如果你修改了 `nginx.conf`,务必重启 Nginx。 - -3. 通过访问 Web 服务器上的页面,在访问日志(access log)中生成一些日志事件。\ - 以 **combined** 格式记录的日志大致如下: - -```bash -192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -192.168.208.1 - - [12/Oct/2021:03:31:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -``` - + 1. 首先创建一个名为 `nginxdb` 的新数据库: -## 配置 Vector + ```sql + CREATE DATABASE IF NOT EXISTS nginxdb + ``` -Vector 会收集、转换并路由日志、指标和追踪数据(统称为 **sources**),将其发送到多个不同的后端目标(统称为 **sinks**),并且开箱即用地兼容 ClickHouse。 -Sources 和 sinks 都在名为 **vector.toml** 的配置文件中定义。 + 2. 将整条日志事件作为一个字符串插入。显然,这并不是对日志数据进行分析的理想格式,不过我们会在下文中借助***物化视图***来解决这一问题。 -1. 以下 **vector.toml** 文件定义了一个类型为 **file** 的 **source**,用于持续跟踪读取 **my_access.log** 文件末尾的内容,同时还定义了一个 **sink**,即上文定义的 **access_logs** 表: + ```sql + CREATE TABLE IF NOT EXISTS nginxdb.access_logs ( + message String + ) + ENGINE = MergeTree() + ORDER BY tuple() + ``` -```bash -[sources.nginx_logs] -type = "file" -include = [ "/var/log/nginx/my_access.log" ] -read_from = "end" + :::note + **ORDER BY** 被设置为 **tuple()**(一个空元组),因为当前还不需要主键。 + ::: -[sinks.clickhouse] -type = "clickhouse" -inputs = ["nginx_logs"] -endpoint = "http://clickhouse-server:8123" -database = "nginxdb" -table = "access_logs" -skip_unknown_fields = true -``` + ## 配置 Nginx {#2--configure-nginx} -2. 使用上述配置启动 Vector。请参阅 Vector 的[文档](https://vector.dev/docs/),以了解更多关于定义 source 和 sink 的详细信息。 + 在本步骤中,将演示如何配置 Nginx 日志记录。 -3. 通过运行以下查询验证访问日志是否已经写入 ClickHouse。您应该能在表中看到这些访问日志: + 1. 以下 `access_log` 属性会以 **combined** 格式将日志写入 `/var/log/nginx/my_access.log`。 + 该配置应放在 `nginx.conf` 文件的 `http` 块中: -```sql -SELECT * FROM nginxdb.access_logs -``` + ```bash + http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log /var/log/nginx/my_access.log combined; + sendfile on; + keepalive_timeout 65; + include /etc/nginx/conf.d/*.conf; + } + ``` - + 2. 如果你修改了 `nginx.conf`,务必重启 Nginx。 + 3. 通过访问 Web 服务器上的页面,在访问日志(access log)中生成一些日志事件。\ + 以 **combined** 格式记录的日志大致如下: -## 解析日志 + ```bash + 192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + 192.168.208.1 - - [12/Oct/2021:03:31:44 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + 192.168.208.1 - - [12/Oct/2021:03:31:49 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + ``` -将日志存储在 ClickHouse 中固然很好,但如果将每个事件都存储为单个字符串,就很难进行有效的数据分析。 -接下来我们将介绍如何使用[物化视图](/materialized-view/incremental-materialized-view)来解析日志事件。 + ## 配置 Vector {#3-configure-vector} -**物化视图**的作用类似于 SQL 中的插入触发器。当数据行被插入到源表时,物化视图会对这些行进行转换,并将结果插入到目标表中。 -我们可以配置物化视图,将 **access_logs** 中的日志事件解析为结构化表示。 -下面是一个此类日志事件的示例: + Vector 会收集、转换并路由日志、指标和追踪数据(统称为 **sources**),将其发送到多个不同的后端目标(统称为 **sinks**),并且开箱即用地兼容 ClickHouse。 + Sources 和 sinks 都在名为 **vector.toml** 的配置文件中定义。 -```bash -192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" -``` - -ClickHouse 中有多种函数可以用来解析上述字符串。[`splitByWhitespace`](/sql-reference/functions/splitting-merging-functions#splitByWhitespace) 函数按空白字符对字符串进行分割,并将每个标记作为数组元素返回。 -为演示这一点,运行以下命令: - -```sql title="Query" -SELECT splitByWhitespace('192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') -``` - -```text title="Response" -["192.168.208.1","-","-","[12/Oct/2021:15:32:43","+0000]","\"GET","/","HTTP/1.1\"","304","0","\"-\"","\"Mozilla/5.0","(Macintosh;","Intel","Mac","OS","X","10_15_7)","AppleWebKit/537.36","(KHTML,","like","Gecko)","Chrome/93.0.4577.63","Safari/537.36\""] -``` - -有些字符串包含一些多余字符,而且用户代理字符串(浏览器信息)其实无需解析,不过 -生成的数组已经与所需结果非常接近。 - -类似于 `splitByWhitespace`,[`splitByRegexp`](/sql-reference/functions/splitting-merging-functions#splitByRegexp) 函数会基于正则表达式将字符串拆分为数组。 -运行以下命令,它会返回两个字符串。 - -```sql -SELECT splitByRegexp('\S \d+ "([^"]*)"', '192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') -``` - -请注意,返回的第二个字符串是从日志中成功解析出的 User-Agent: - -```text -["192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] \"GET / HTTP/1.1\" 30"," \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\""] -``` - -在查看最终的 `CREATE MATERIALIZED VIEW` 命令之前,先来看几个用于清理数据的函数。 -例如,`RequestMethod` 的值是 `"GET`,其中包含一个多余的双引号。 -可以使用 [`trimBoth`(别名 `trim`)](/sql-reference/functions/string-functions#trimBoth) 函数来移除这个双引号: - -```sql -SELECT trim(LEADING '"' FROM '"GET') -``` - -时间字符串开头有一个左方括号,而且其格式也不是 ClickHouse 能够解析为日期的格式。 -但是,如果我们把分隔符从冒号(**:**)改成逗号(**,**),那么就可以顺利完成解析: - -```sql -SELECT parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM '[12/Oct/2021:15:32:43'), ':', ' ')) -``` - - -现在我们可以定义物化视图了。 -下面的定义包含 `POPULATE`,这意味着 **access_logs** 中的现有行将立即被处理并插入。 -运行以下 SQL 语句: - -```sql -CREATE MATERIALIZED VIEW nginxdb.access_logs_view -( - RemoteAddr String, - Client String, - RemoteUser String, - TimeLocal DateTime, - RequestMethod String, - Request String, - HttpVersion String, - Status Int32, - BytesSent Int64, - UserAgent String -) -ENGINE = MergeTree() -ORDER BY RemoteAddr -POPULATE AS -WITH - splitByWhitespace(message) as split, - splitByRegexp('\S \d+ "([^"]*)"', message) as referer -SELECT - split[1] AS RemoteAddr, - split[2] AS Client, - split[3] AS RemoteUser, - parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM split[4]), ':', ' ')) AS TimeLocal, - trim(LEADING '"' FROM split[6]) AS RequestMethod, - split[7] AS Request, - trim(TRAILING '"' FROM split[8]) AS HttpVersion, - split[9] AS Status, - split[10] AS BytesSent, - trim(BOTH '"' from referer[2]) AS UserAgent -FROM - (SELECT message FROM nginxdb.access_logs) -``` - -现在验证其是否生效。 -您应该看到访问日志已被正确解析为列: - -```sql -SELECT * FROM nginxdb.access_logs_view -``` - - - -:::note -上述示例将数据存储在两个表中,但您可以将初始的 `nginxdb.access_logs` 表更改为使用 [`Null`](/engines/table-engines/special/null) 表引擎。 -解析后的数据仍将存储在 `nginxdb.access_logs_view` 表中,但原始数据不会存储在表中。 -::: + 1. 以下 **vector.toml** 文件定义了一个类型为 **file** 的 **source**,用于持续跟踪读取 **my_access.log** 文件末尾的内容,同时还定义了一个 **sink**,即上文定义的 **access_logs** 表: + ```bash + [sources.nginx_logs] + type = "file" + include = [ "/var/log/nginx/my_access.log" ] + read_from = "end" + + [sinks.clickhouse] + type = "clickhouse" + inputs = ["nginx_logs"] + endpoint = "http://clickhouse-server:8123" + database = "nginxdb" + table = "access_logs" + skip_unknown_fields = true + ``` + + 2. 使用上述配置启动 Vector。请参阅 Vector 的[文档](https://vector.dev/docs/),以了解更多关于定义 source 和 sink 的详细信息。 + + 3. 通过运行以下查询验证访问日志是否已经写入 ClickHouse。您应该能在表中看到这些访问日志: + + ```sql + SELECT * FROM nginxdb.access_logs + ``` + + + + ## 解析日志 {#4-parse-the-logs} + + 将日志存储在 ClickHouse 中固然很好,但如果将每个事件都存储为单个字符串,就很难进行有效的数据分析。 + 接下来我们将介绍如何使用[物化视图](/materialized-view/incremental-materialized-view)来解析日志事件。 + + **物化视图**的作用类似于 SQL 中的插入触发器。当数据行被插入到源表时,物化视图会对这些行进行转换,并将结果插入到目标表中。 + 我们可以配置物化视图,将 **access_logs** 中的日志事件解析为结构化表示。 + 下面是一个此类日志事件的示例: + + ```bash + 192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" + ``` + + ClickHouse 中有多种函数可以用来解析上述字符串。[`splitByWhitespace`](/sql-reference/functions/splitting-merging-functions#splitByWhitespace) 函数按空白字符对字符串进行分割,并将每个标记作为数组元素返回。 + 为演示这一点,运行以下命令: + + ```sql title="Query" + SELECT splitByWhitespace('192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') + ``` + + ```text title="Response" + ["192.168.208.1","-","-","[12/Oct/2021:15:32:43","+0000]","\"GET","/","HTTP/1.1\"","304","0","\"-\"","\"Mozilla/5.0","(Macintosh;","Intel","Mac","OS","X","10_15_7)","AppleWebKit/537.36","(KHTML,","like","Gecko)","Chrome/93.0.4577.63","Safari/537.36\""] + ``` + + 有些字符串包含一些多余字符,而且用户代理字符串(浏览器信息)其实无需解析,不过 + 生成的数组已经与所需结果非常接近。 + + 类似于 `splitByWhitespace`,[`splitByRegexp`](/sql-reference/functions/splitting-merging-functions#splitByRegexp) 函数会基于正则表达式将字符串拆分为数组。 + 运行以下命令,它会返回两个字符串。 + + ```sql + SELECT splitByRegexp('\S \d+ "([^"]*)"', '192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"') + ``` + + 请注意,返回的第二个字符串是从日志中成功解析出的 User-Agent: + + ```text + ["192.168.208.1 - - [12/Oct/2021:15:32:43 +0000] \"GET / HTTP/1.1\" 30"," \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36\""] + ``` + + 在查看最终的 `CREATE MATERIALIZED VIEW` 命令之前,先来看几个用于清理数据的函数。 + 例如,`RequestMethod` 的值是 `"GET`,其中包含一个多余的双引号。 + 可以使用 [`trimBoth`(别名 `trim`)](/sql-reference/functions/string-functions#trimBoth) 函数来移除这个双引号: + + ```sql + SELECT trim(LEADING '"' FROM '"GET') + ``` + + 时间字符串开头有一个左方括号,而且其格式也不是 ClickHouse 能够解析为日期的格式。 + 但是,如果我们把分隔符从冒号(**:**)改成逗号(**,**),那么就可以顺利完成解析: + + ```sql + SELECT parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM '[12/Oct/2021:15:32:43'), ':', ' ')) + ``` + + 现在我们可以定义物化视图了。 + 下面的定义包含 `POPULATE`,这意味着 **access_logs** 中的现有行将立即被处理并插入。 + 运行以下 SQL 语句: + + ```sql + CREATE MATERIALIZED VIEW nginxdb.access_logs_view + ( + RemoteAddr String, + Client String, + RemoteUser String, + TimeLocal DateTime, + RequestMethod String, + Request String, + HttpVersion String, + Status Int32, + BytesSent Int64, + UserAgent String + ) + ENGINE = MergeTree() + ORDER BY RemoteAddr + POPULATE AS + WITH + splitByWhitespace(message) as split, + splitByRegexp('\S \d+ "([^"]*)"', message) as referer + SELECT + split[1] AS RemoteAddr, + split[2] AS Client, + split[3] AS RemoteUser, + parseDateTimeBestEffort(replaceOne(trim(LEADING '[' FROM split[4]), ':', ' ')) AS TimeLocal, + trim(LEADING '"' FROM split[6]) AS RequestMethod, + split[7] AS Request, + trim(TRAILING '"' FROM split[8]) AS HttpVersion, + split[9] AS Status, + split[10] AS BytesSent, + trim(BOTH '"' from referer[2]) AS UserAgent + FROM + (SELECT message FROM nginxdb.access_logs) + ``` + + 现在验证其是否生效。 + 您应该看到访问日志已被正确解析为列: + + ```sql + SELECT * FROM nginxdb.access_logs_view + ``` + + + + :::note + 上述示例将数据存储在两个表中,但您可以将初始的 `nginxdb.access_logs` 表更改为使用 [`Null`](/engines/table-engines/special/null) 表引擎。 + 解析后的数据仍将存储在 `nginxdb.access_logs_view` 表中,但原始数据不会存储在表中。 + ::: > 通过使用 Vector(只需简单安装和快速配置),您可以将 Nginx 服务器的日志发送到 ClickHouse 表中。通过使用物化视图,您可以将这些日志解析为列,以便更轻松地进行分析。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md index 45af2f56446..bf23b97b44b 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/gcs/index.md @@ -8,13 +8,13 @@ doc_type: 'guide' keywords: ['Google Cloud Storage ClickHouse', 'GCS ClickHouse 集成', 'GCS 后端 MergeTree', 'ClickHouse GCS 存储', 'Google Cloud ClickHouse'] --- -import BucketDetails from '@site/docs/_snippets/_GCS_authentication_and_bucket.md'; +import BucketDetails from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_GCS_authentication_and_bucket.md'; import Image from '@theme/IdealImage'; import GCS_examine_bucket_1 from '@site/static/images/integrations/data-ingestion/s3/GCS-examine-bucket-1.png'; import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestion/s3/GCS-examine-bucket-2.png'; -# 将 Google Cloud Storage 与 ClickHouse 集成 +# 将 Google Cloud Storage 与 ClickHouse 集成 {#integrate-google-cloud-storage-with-clickhouse} :::note 如果您在 [Google Cloud](https://cloud.google.com) 上使用 ClickHouse Cloud,则本页内容不适用,因为您的服务已经在使用 [Google Cloud Storage](https://cloud.google.com/storage)。如果您希望从 GCS 中执行 `SELECT` 或向 GCS 中执行 `INSERT` 操作,请参阅 [`gcs` 表函数](/sql-reference/table-functions/gcs)。 @@ -24,13 +24,13 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio -## 基于 GCS 的 MergeTree +## 基于 GCS 的 MergeTree {#gcs-backed-mergetree} -### 创建磁盘 +### 创建磁盘 {#creating-a-disk} 要将 GCS 存储桶用作磁盘,首先必须在 `conf.d` 目录下的文件中,在 ClickHouse 配置中声明它。下面展示了一个 GCS 磁盘声明示例。该配置包含多个部分,用于配置 GCS “磁盘”、缓存,以及在需要在 GCS 磁盘上创建表时在 DDL 查询中指定的策略。下面分别对这些部分进行说明。 -#### Storage configuration > disks > gcs +#### Storage configuration > disks > gcs {#storage_configuration--disks--gcs} 配置中高亮显示的这部分内容表示: @@ -68,7 +68,7 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio ``` -#### Storage configuration > disks > cache +#### Storage configuration > disks > cache {#storage_configuration--disks--cache} 下方高亮显示的示例配置为磁盘 `gcs` 启用了 10Gi 内存缓存。 @@ -106,7 +106,7 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio ``` -#### Storage configuration > policies > gcs_main +#### Storage configuration > policies > gcs_main {#storage_configuration--policies--gcs_main} 存储配置中的策略用于选择数据的存放位置。下面高亮的策略通过指定策略 `gcs_main`,允许将数据存储在名为 `gcs` 的磁盘上。例如 `CREATE TABLE ... SETTINGS storage_policy='gcs_main'`。 @@ -141,7 +141,7 @@ import GCS_examine_bucket_2 from '@site/static/images/integrations/data-ingestio 与此磁盘配置相关的设置完整列表可在[此处](/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)中找到。 -### 创建表 +### 创建表 {#creating-a-table} 假设你已经将磁盘配置为使用具有写权限的存储桶,现在应该可以创建如下示例中的表。为简洁起见,我们只使用 NYC taxi 数据集中的部分列,并将数据直接流式写入由 GCS 作为后端存储的表中: @@ -179,11 +179,11 @@ INSERT INTO trips_gcs SELECT trip_id, pickup_date, pickup_datetime, dropoff_date SELECT passenger_count, avg(tip_amount) AS avg_tip, avg(total_amount) AS avg_amount FROM trips_gcs GROUP BY passenger_count; ``` -### 处理复制 +### 处理复制 {#handling-replication} 使用 GCS 磁盘时,可以通过 `ReplicatedMergeTree` 表引擎来实现复制。有关详细信息,请参阅[使用 GCS 在两个 GCP 区域之间复制单个分片](#gcs-multi-region)指南。 -### 了解更多 +### 了解更多 {#learn-more} [Cloud Storage XML API](https://cloud.google.com/storage/docs/xml-api/overview) 可与某些适用于 Amazon Simple Storage Service(Amazon S3)等服务的工具和库互操作。 @@ -305,13 +305,13 @@ ClickHouse Keeper 至少需要两个节点才能工作,因此为了实现高 ``` -### 配置 ClickHouse 服务器 +### 配置 ClickHouse 服务器 {#configure-clickhouse-server} :::note best practice 本指南中的某些步骤会要求你将配置文件放置在 `/etc/clickhouse-server/config.d/` 中。这是 Linux 系统上用于放置覆盖默认配置文件的默认位置。当你将这些文件放入该目录时,ClickHouse 会将其内容与默认配置进行合并。通过将这些文件放在 `config.d` 目录中,你可以在升级过程中避免丢失自己的配置。 ::: -#### 网络 +#### 网络 {#networking} 默认情况下,ClickHouse 监听回环接口;在副本部署环境中,机器之间需要进行网络通信。要监听所有接口: @@ -321,7 +321,7 @@ ClickHouse Keeper 至少需要两个节点才能工作,因此为了实现高 ``` -#### 远程 ClickHouse Keeper 服务器 +#### 远程 ClickHouse Keeper 服务器 {#remote-clickhouse-keeper-servers} 副本复制由 ClickHouse Keeper 协调完成。此配置文件通过主机名和端口号来标识 ClickHouse Keeper 节点。 @@ -346,7 +346,7 @@ ClickHouse Keeper 至少需要两个节点才能工作,因此为了实现高 ``` -#### 远程 ClickHouse 服务器 +#### 远程 ClickHouse 服务器 {#remote-clickhouse-servers} 此文件用于配置集群中每个 ClickHouse 服务器的主机名和端口。默认配置文件包含示例集群定义。为了只显示已完全配置的集群,会在 `remote_servers` 条目中添加标签 `replace="true"`,这样当此配置与默认配置合并时,会替换 `remote_servers` 部分,而不是在其基础上追加内容。 @@ -372,7 +372,7 @@ ClickHouse Keeper 至少需要两个节点才能工作,因此为了实现高 ``` -#### 副本标识 +#### 副本标识 {#replica-identification} 此文件用于配置与 ClickHouse Keeper 路径相关的设置,尤其是用于标识数据属于哪个副本的宏。在一台服务器上,应将副本指定为 `replica_1`,在另一台服务器上指定为 `replica_2`。这些名称可以修改,例如在我们的示例中,一个副本存储在南卡罗来纳州,另一个存储在北弗吉尼亚州,则可以分别命名为 `carolina` 和 `virginia`;只需确保每台机器上的名称彼此不同即可。 @@ -390,7 +390,7 @@ ClickHouse Keeper 至少需要两个节点才能工作,因此为了实现高 ``` -#### 在 GCS 中配置存储 +#### 在 GCS 中配置存储 {#storage-in-gcs} ClickHouse 的存储配置包括 `disks` 和 `policies`。下面配置的磁盘名为 `gcs`,其 `type` 为 `s3`。之所以使用 s3 类型,是因为 ClickHouse 访问 GCS bucket 的方式与访问 AWS S3 bucket 相同。此配置需要准备两份,分别应用于两个 ClickHouse 服务器节点。 @@ -438,7 +438,7 @@ ClickHouse 的存储配置包括 `disks` 和 `policies`。下面配置的磁盘 ``` -### 启动 ClickHouse Keeper +### 启动 ClickHouse Keeper {#start-clickhouse-keeper} 根据所使用的操作系统运行相应的命令,例如: @@ -448,7 +448,7 @@ sudo systemctl start clickhouse-keeper sudo systemctl status clickhouse-keeper ``` -#### 检查 ClickHouse Keeper 状态 +#### 检查 ClickHouse Keeper 状态 {#check-clickhouse-keeper-status} 通过 `netcat` 向 ClickHouse Keeper 发送命令。例如,`mntr` 会返回 ClickHouse Keeper 集群的状态。如果你在每个 Keeper 节点上执行该命令,你会看到其中一个是 leader,另外两个是 follower: @@ -464,11 +464,11 @@ zk_max_latency 11 zk_min_latency 0 zk_packets_received 1783 zk_packets_sent 1783 -# highlight-start +# highlight-start {#highlight-start} zk_num_alive_connections 2 zk_outstanding_requests 0 zk_server_state leader -# highlight-end +# highlight-end {#highlight-end} zk_znode_count 135 zk_watch_count 8 zk_ephemerals_count 3 @@ -477,13 +477,13 @@ zk_key_arena_size 28672 zk_latest_snapshot_size 0 zk_open_file_descriptor_count 182 zk_max_file_descriptor_count 18446744073709551615 -# highlight-start +# highlight-start {#highlight-start} zk_followers 2 zk_synced_followers 2 -# highlight-end +# highlight-end {#highlight-end} ``` -### 启动 ClickHouse 服务器 +### 启动 ClickHouse 服务器 {#start-clickhouse-server} 在 `chnode1` 和 `chnode` 上运行: @@ -495,9 +495,9 @@ sudo service clickhouse-server start sudo service clickhouse-server status ``` -### 验证 +### 验证 {#verification} -#### 验证磁盘配置 +#### 验证磁盘配置 {#verify-disk-configuration} `system.disks` 中应包含每个磁盘对应的一条记录: @@ -565,7 +565,7 @@ cache_path: 3 行数据,耗时 0.002 秒。 ```` -#### 验证在集群上创建的表已在两个节点上创建 +#### 验证在集群上创建的表已在两个节点上创建 {#verify-that-tables-created-on-the-cluster-are-created-on-both-nodes} ```sql -- highlight-next-line create table trips on cluster 'cluster_1S_2R' ( @@ -600,7 +600,7 @@ SETTINGS storage_policy='gcs_main' 2 rows in set. Elapsed: 0.641 sec. ``` -#### 验证数据能否插入 +#### 验证数据能否插入 {#verify-that-data-can-be-inserted} ```sql INSERT INTO trips SELECT @@ -621,7 +621,7 @@ FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz' LIMIT 1000000 ``` -#### 验证该表是否使用了存储策略 `gcs_main`。 +#### 验证该表是否使用了存储策略 `gcs_main`。 {#verify-that-the-storage-policy-gcs_main-is-used-for-the-table} ```sql SELECT @@ -647,14 +647,14 @@ formatReadableSize(total_bytes): 36.42 MiB 返回 1 行。用时:0.002 秒。 ``` -#### 在 Google Cloud 控制台中验证 +#### 在 Google Cloud 控制台中验证 {#verify-in-google-cloud-console} 查看这些 bucket,你会发现每个 bucket 中都创建了一个文件夹,文件夹名称与 `storage.xml` 配置文件中使用的名称相同。展开这些文件夹,你会看到许多文件,对应各个数据分区。 -#### 副本一的 Bucket +#### 副本一的 Bucket {#bucket-for-replica-one} -#### 副本二的 Bucket +#### 副本二的 Bucket {#bucket-for-replica-two} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md index 93aaf4a8927..1e20936a9ce 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/dataflow.md @@ -11,7 +11,7 @@ keywords: ['Google Dataflow ClickHouse', 'Dataflow ClickHouse integration', 'Apa import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# 将 Google Dataflow 与 ClickHouse 集成 +# 将 Google Dataflow 与 ClickHouse 集成 {#integrating-google-dataflow-with-clickhouse} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md index 526ce4ae60b..efd68be8a6e 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/java-runner.md @@ -11,7 +11,7 @@ keywords: ['Dataflow Java Runner', 'Google Dataflow ClickHouse', 'Apache Beam Ja import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Dataflow Java 运行器 +# Dataflow Java 运行器 {#dataflow-java-runner} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md index 636f1d19107..12e84e30270 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates.md @@ -11,7 +11,7 @@ keywords: ['Google Dataflow', 'GCP', '数据管道', '模板', '批处理'] import ClickHouseSupportedBadge from '@theme/badges/ClickHouseSupported'; -# Google Dataflow 模板 +# Google Dataflow 模板 {#google-dataflow-templates} diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md index 8ae6a40e99b..80defca71f1 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/google-dataflow/templates/bigquery-to-clickhouse.md @@ -19,7 +19,7 @@ import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -# Dataflow BigQuery 到 ClickHouse 模板 +# Dataflow BigQuery 到 ClickHouse 模板 {#dataflow-bigquery-to-clickhouse-template} BigQuery 到 ClickHouse 模板是一个批处理管道,用于将 BigQuery 表中的数据摄取到 ClickHouse 表中。 该模板可以读取整个表,或使用提供的 SQL 查询筛选特定记录。 diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md index 8662a276f66..62dee8a883a 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/insert-local-files.md @@ -9,7 +9,7 @@ doc_type: 'guide' keywords: ['插入本地文件 ClickHouse', 'ClickHouse 本地文件导入', 'clickhouse-client 文件上传'] --- -# 插入本地文件 +# 插入本地文件 {#insert-local-files} 你可以使用 `clickhouse-client` 将本地文件以流方式导入到你的 ClickHouse 服务中。这样你就可以在插入前利用众多强大且便捷的 ClickHouse 函数对数据进行预处理。下面来看一个示例…… @@ -79,7 +79,6 @@ LIMIT 7 结果如下: - ```response │ 488 │ comment │ mynameishere │ 2007-02-22 14:48:18 │ "It's too bad. Javascript-in-the-browser and Ajax are both nasty hacks that force programmers to do all sorts of shameful things. And the result is--wanky html tricks. Java, for its faults, is fairly clean when run in the applet environment. It has every superiority over JITBAJAX, except for install issues and a chunky load process. Yahoo games seems like just about the only applet success story. Of course, back in the day, non-trivial Applets tended to be too large for the dial-up accounts people had. At least that is changed." │ [454927] │ ['It','s','too','bad','Javascript','in','the','browser','and','Ajax','are','both','nasty','hacks','that','force','programmers','to','do','all','sorts','of','shameful','things','And','the','result','is','wanky','html','tricks','Java','for','its','faults','is','fairly','clean','when','run','in','the','applet','environment','It','has','every','superiority','over','JITBAJAX','except','for','install','issues','and','a','chunky','load','process','Yahoo','games','seems','like','just','about','the','only','applet','success','story','Of','course','back','in','the','day','non','trivial','Applets','tended','to','be','too','large','for','the','dial','up','accounts','people','had','At','least','that','is','changed'] │ │ 575 │ comment │ leoc │ 2007-02-23 00:09:49 │ "I can't find the reference now, but I *think* I've just read something suggesting that the install process for an Apollo applet will involve an "install-this-application?" confirmation dialog followed by a download of 30 seconds or so. If so then Apollo's less promising than I hoped. That kind of install may be low-friction by desktop-app standards but it doesn't compare to the ease of starting a browser-based AJAX or Flash application. (Consider how easy it is to use maps.google.com for the first time.)

Surely it will at least be that Apollo applications will run untrusted by default, and that an already-installed app will start automatically whenever you take your browser to the URL you downloaded it from?" │ [455071] │ ['I','can','t','find','the','reference','now','but','I','think','I','ve','just','read','something','suggesting','that','the','install','process','for','an','Apollo','applet','will','involve','an','34','install','this','application','34','confirmation','dialog','followed','by','a','download','of','30','seconds','or','so','If','so','then','Apollo','s','less','promising','than','I','hoped','That','kind','of','install','may','be','low','friction','by','desktop','app','standards','but','it','doesn','t','compare','to','the','ease','of','starting','a','browser','based','AJAX','or','Flash','application','Consider','how','easy','it','is','to','use','maps','google','com','for','the','first','time','p','Surely','it','will','at','least','be','that','Apollo','applications','will','run','untrusted','by','default','and','that','an','already','installed','app','will','start','automatically','whenever','you','take','your','browser','to','the','URL','you','downloaded','it','from'] │ diff --git a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md index aa96e925a0c..b74dde6ea29 100644 --- a/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md +++ b/i18n/zh/docusaurus-plugin-content-docs/current/integrations/data-ingestion/kafka/confluent/confluent-cloud.md @@ -12,11 +12,11 @@ integration: - website: 'https://clickhouse.com/cloud/clickpipes' --- -import ConnectionDetails from '@site/docs/_snippets/_gather_your_details_http.mdx'; +import ConnectionDetails from '@site/i18n/zh/docusaurus-plugin-content-docs/current/_snippets/_gather_your_details_http.mdx'; import Image from '@theme/IdealImage'; -# 将 Confluent Cloud 与 ClickHouse 集成 +# 将 Confluent Cloud 与 ClickHouse 集成 {#integrating-confluent-cloud-with-clickhouse}

\ No newline at end of file +