{"id":74737,"date":"2020-03-20T08:43:14","date_gmt":"2020-03-20T05:43:14","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/optimizacziya-strok-v-clickhouse-doklad-yandeksa"},"modified":"2020-03-20T08:43:14","modified_gmt":"2020-03-20T05:43:14","slug":"optimizacziya-strok-v-clickhouse-doklad-yandeksa","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/optimizacziya-strok-v-clickhouse-doklad-yandeksa","title":{"rendered":"Optimalisatie van strings in ClickHouse. Presentatie van Yandex","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>De analytische database ClickHouse verwerkt veel verschillende strings en verbruikt middelen. Om de prestaties van het systeem te versnellen, worden er voortdurend nieuwe optimalisaties toegevoegd. Ontwikkelaar ClickHouse Nikolay Kochetov legt het string datatypesysteem uit, inclusief het nieuwe type LowCardinality, en hoe je de prestaties bij het werken met strings kunt verbeteren. <\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"rqf-ILRgBdY\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/rqf-ILRgBdY\/hqdefault.jpg\" alt=\"Video afspelen\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nLaten we eerst eens bekijken hoe we strings kunnen opslaan. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/5e38e903aaaf54a533bd3026e76a14be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe hebben stringdatatypen. String is standaard goed geschikt en moet bijna altijd worden gebruikt. Het heeft een kleine overhead van 9 bytes per string. Als we willen dat de grootte van de strings vast en vooraf bekend is, is het beter om FixedString te gebruiken. Hiermee kun je het gewenste aantal bytes instellen, wat handig is voor gegevens zoals IP-adressen of hash-functies. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/eaae898fb5163cb1c070c34a13f6f160.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNatuurlijk, soms verloopt het wel traag. Stel je voor dat je een query naar een tabel uitvoert. ClickHouse leest een vrij grote hoeveelheid data, laten we zeggen, met een snelheid van 100 GB\/s, terwijl er weinig strings worden verwerkt. We hebben twee tabellen die bijna dezelfde gegevens opslaan. ClickHouse leest gegevens uit de tweede tabel sneller, maar het aantal strings per seconde is drie keer lager. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/be7cc47e628112bb212ed0e8ff9091ed.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAls we naar de grootte van de gecomprimeerde gegevens kijken, zal deze vrijwel gelijk zijn. In werkelijkheid zijn in de tabellen dezelfde gegevens opgeslagen - de eerste miljard nummers - alleen zijn ze in de eerste kolom opgeslagen als UInt64, en in de tweede als String. Dit zorgt ervoor dat de tweede query langer nodig heeft om gegevens van de schijf te lezen en deze te decomprimeren. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/c699103cecd972fcee73841cc35716d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier is een ander voorbeeld. Stel dat er een vooraf bekende verzameling strings is, die beperkt is tot een constante van 1000 of 10.000 en praktisch nooit verandert. Voor deze situatie is het datatype Enum geschikt; ClickHouse heeft er twee - Enum8 en Enum16. Door op te slaan in Enum kunnen we de queries snel verwerken. <\/p>\n<p>In ClickHouse zijn er versnellingen voor GROUP BY, IN, DISTINCT en optimalisaties voor sommige functies, bijvoorbeeld voor vergelijking met een constante string. Natuurlijk worden de getallen in de string niet geconverteerd, maar daarentegen wordt de constante string omgezet naar de Enum-waarde. Daarna worden alle vergelijkingen snel uitgevoerd. <\/p>\n<p>Maar er zijn ook minpunten. Zelfs als we de exacte verzameling strings kennen, moet deze soms worden aangevuld. Een nieuwe string is binnengekomen - we moeten ALTER uitvoeren. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/064c35faaf3d9de2f12d29f83197e983.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe ALTER voor Enum in ClickHouse is optimaal ge\u00efmplementeerd. We herschrijven de gegevens niet op de schijf, maar ALTER kan langzaam zijn omdat de Enum-structuren binnen het schema van de tabel worden opgeslagen. Daarom moeten we wachten op leesverzoeken uit de tabel, bijvoorbeeld. <\/p>\n<p>De vraag rijst of het beter kan. Waarschijnlijk wel. We kunnen de Enum-structuur niet in het tabelschema opslaan, maar in ZooKeeper. Er kunnen echter synchronisatieproblemen optreden. Bijvoorbeeld, als de ene replica de gegevens heeft ontvangen en de andere niet, en als deze een oude Enum heeft, zal er iets misgaan. (In ClickHouse zijn we bijna klaar met niet-blokkerende ALTER-verzoeken. Wanneer we deze volledig hebben afgerond, hoeven we niet meer te wachten op leesverzoeken.)<\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/f5d2fdf14778f6afdd4acc8c204e163c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm niet te rommelen met ALTER Enum, kunnen we externe woordenboeken in ClickHouse gebruiken. Ter herinnering, dit is een key-value datastructuur binnen ClickHouse waarmee je gegevens van externe bronnen kunt ophalen, zoals MySQL-tabellen. <\/p>\n<p>In het ClickHouse-woordenboek slaan we veel verschillende strings op, terwijl we in de tabel hun identificatoren als getallen hebben. Als we een string willen ophalen, roepen we de functie dictGet aan en werken we ermee. Daarna hoeven we geen ALTER uit te voeren. Om iets aan de Enum toe te voegen, voegen we dit toe aan dezelfde MySQL-tabel. <\/p>\n<p>Maar er ontstaan andere problemen. Ten eerste is er een ongemakkelijke syntaxis. Als we een string willen ophalen, moeten we dictGet aanroepen. Ten tweede ontbreken sommige optimalisaties. Vergelijkingen met een constante string voor woordenboeken kunnen niet zo snel worden gemaakt. <\/p>\n<p>Er kunnen ook problemen zijn met updates. Stel dat we een string in het cache-woordenboek hebben opgevraagd, maar deze is niet in de cache terechtgekomen. Dan moeten we wachten totdat de gegevens van de externe bron zijn geladen. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/534818ee523a243623a5cb2babe08040.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEen algemeen nadeel van beide methoden is dat we alle sleutels op \u00e9\u00e9n plek opslaan en deze synchroniseren. Waarom zouden we de woordenboeken niet lokaal opslaan? Geen synchronisatie betekent geen problemen. We kunnen het woordenboek lokaal opslaan in een stuk op de schijf. Dat wil zeggen, we hebben een Insert gedaan, het woordenboek genoteerd. Als we met gegevens in het geheugen werken, kunnen we het woordenboek of in een datablok opslaan, of in een kolomstuk, of in een cache om de berekeningen te versnellen.<\/p>\n<h3>Woordcodering van strings <\/h3>\n<p>\nZo zijn we gekomen tot de creatie van een nieuw datatypes in ClickHouse - LowCardinality. Dit is een gegevensopslagformaat: hoe ze op de schijf worden geschreven en gelezen, hoe ze in het geheugen zijn weergegeven en het schema voor hun verwerking. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/e25b2eb12ff158b89b7d2dbdfb8e2e5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe diafragma bevat twee kolommen. Aan de rechterkant worden de rijen standaard opgeslagen als type String. Het lijkt erop dat het om mobiele telefoons gaat. Aan de linkerkant is er precies dezelfde kolom, maar dan in het type LowCardinality. Deze bestaat uit een woordenboek met verschillende rijen (de rijen uit de kolom aan de rechterkant) en een lijst van posities (rijnummers). <\/p>\n<p>Met behulp van deze twee structuren kan de oorspronkelijke kolom worden hersteld. Er is ook een omgekeerde index - een hash-tabel die helpt om via een rij de positie in het woordenboek te vinden. Dit is nodig om sommige query's te versnellen. Bijvoorbeeld, als we een rij in onze kolom willen vergelijken of zoeken, of ze samen willen voegen. <\/p>\n<p>LowCardinality is een parametertype. Het kan een nummer zijn, of iets dat als een nummer is opgeslagen, of een string, of Nullable van deze types. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/d52ef0c99617238442d4f71e43af48af.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKenmerk van LowCardinality is dat het opgeslagen kan worden voor bepaalde functies. Op de diafragma is een voorbeeld van een query te zien. In de eerste regel heb ik een kolom van het type LowCardinality van String gemaakt, deze genoemd S. Vervolgens vroeg ik de naam ervan - ClickHouse zei dat het LowCardinality van String is. Dat klopt.<\/p>\n<p>De derde regel is bijna hetzelfde, alleen hebben we de functie length aangeroepen. In ClickHouse retourneert de functie length het datatype UInt64. Maar nu hebben we LowCardinality van UInt64. Wat is het doel hiervan?<\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/a4a51a0f1ecd68f7fffd521ab786c8a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn het woordenboek stonden de namen van mobiele telefoons, we hebben de functie length toegepast. Nu hebben we een vergelijkbaar woordenboek, bestaande alleen uit cijfers - dit zijn de lengtes van de rijen. De kolom met posities is onveranderd gebleven. Uiteindelijk hebben we minder data verwerkt, wat tijd bespaarde bij de query. <\/p>\n<p>Er kunnen ook andere optimalisaties zijn, bijvoorbeeld het toevoegen van een eenvoudige cache. Bij het berekenen van de waarde van een functie kan deze worden onthouden en kan een vergelijkbare worden gemaakt zonder het opnieuw te berekenen. <\/p>\n<p>Er kan ook een optimalisatie van GROUP BY worden uitgevoerd, omdat onze kolom met het woordenboek al gedeeltelijk is geaggregeerd - het kan sneller worden om de waarden van hash-functies te berekenen en ongeveer te vinden in welke bucket de volgende rij moet worden geplaatst. Bovendien kunnen sommige aggregatiefuncties worden gespecialiseerd, bijvoorbeeld uniq, aangezien alleen het woordenboek kan worden verzonden en de posities intact blijven - zo werkt alles sneller. De eerste twee optimalisaties hebben we al in ClickHouse toegevoegd.<\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/943e0a8ae5a37cd47164246db3a67893.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWat als we een kolom cre\u00ebren met ons datatypen en we daar veel slechte, verschillende regels in invoegen? Vul ik dan ons geheugen niet te vol? Nee, daarvoor zijn er in ClickHouse twee speciale instellingen. De eerste is low_cardinality_max_dictionary_size. Dit is de maximale grootte van het woordenboek dat op de schijf kan worden geschreven. De invoeging gebeurt als volgt: wanneer we gegevens invoegen, komen er een stroom van regels naar ons toe, waaruit we een groot gezamenlijke woordenboek kunnen vormen. Als het woordenboek groter wordt dan de waarde van de instelling, schrijven we het huidige woordenboek naar de schijf en de andere regels worden ergens \"naast\" bewaard, naast de indexen. Uiteindelijk zullen we nooit een groot woordenboek opnieuw tellen en zullen we geen geheugenproblemen krijgen. <\/p>\n<p>De tweede instelling heet low_cardinality_use_single_dictionary_for_part. Stel je voor dat in het vorige schema, toen we gegevens invoegden, ons woordenboek vol raakte en we het naar de schijf hebben geschreven. De vraag rijst, waarom zouden we nu niet nog een precies hetzelfde woordenboek vormen? <\/p>\n<p>Wanneer het vol is, schrijven we het opnieuw naar de schijf en beginnen we met het vormen van een derde. Deze instelling schakelt standaard deze mogelijkheid uit. <\/p>\n<p>Eigenlijk kunnen veel woordenboeken nuttig zijn als we een bepaalde set regels willen invoegen, maar per ongeluk \"afval\" hebben ingevoerd. Laten we zeggen dat we eerst slechte regels hebben ingevoegd en daarna goede. Dan zal het woordenboek zich opsplitsen in veel kleine woordenboeken. Een deel daarvan bevat \"afval\", maar de laatste zal goede regels bevatten. En als we bijvoorbeeld alleen de laatste fractie lezen, zal alles ook snel werken. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/834ba3295ace98870334aa10a78e4781.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVoordat ik het heb over de voordelen van LowCardinality, moet ik meteen zeggen dat we waarschijnlijk geen vermindering van de gegevens op de schijf zullen bereiken (hoewel dit kan gebeuren), omdat ClickHouse gegevens comprimeert. Er is een standaardoptie \u2014 LZ4. Je kunt ook compressie toepassen met ZSTD. Maar beide algoritmes implementeren al woordenboekcompressie, dus ons externe woordenboek ClickHouse zal niet veel helpen. <\/p>\n<p>Om niet ongeldig te zijn, heb ik enkele gegevens uit de metriek genomen \u2014 String, LowCardinality(String) en Enum \u2014 en deze in verschillende datatypes opgeslagen. Dit resulteerde in drie kolommen met elk \u00e9\u00e9n miljard rijen. In de eerste kolom, CodePage, zijn er in totaal 62 waarden. Het is duidelijk dat we ze beter hebben gecomprimeerd in LowCardinality(String). String presteert iets slechter, maar dat komt waarschijnlijk omdat de strings kort zijn; we slaan hun lengte op, en die nemen veel ruimte in beslag en worden slecht gecomprimeerd. <\/p>\n<p>Als we kijken naar PhoneModel, zijn dat er 48.000 \u2014 al meer, en de verschillen tussen String en LowCardinality(String) zijn bijna niet merkbaar. Voor URL hebben we ook maar 2 GB bespaard \u2014 ik denk niet dat we daarop moeten vertrouwen. <\/p>\n<h3>Beoordeling van de snelheid<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/0b646570639f8f2e29b599473b84e25c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/toddwschneider\/nyc-taxi-data\">Link van de dia<\/a><\/noindex><\/b><\/p>\n<p>Laten we nu de snelheid beoordelen. Om dit te doen, heb ik een dataset gebruikt met beschrijvingen van taxiritten in New York. Deze is <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/toddwschneider\/nyc-taxi-data\">beschikbaar is<\/a><\/noindex> op GitHub. Deze bevat net iets meer dan een miljard ritten. Hierin zijn locatie, start- en eindtijd van de rit, betalingsmethode, aantal passagiers en zelfs het soort taxi \u2014 groen, geel en Uber \u2014 opgenomen. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/0901669dec01b0f956d6976e3aa8b741.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMijn eerste query heb ik vrij eenvoudig gemaakt \u2014 ik vroeg waar het vaakst taxi's worden besteld. Hiervoor moet je de locatie nemen van waar de bestellingen zijn gedaan, deze met GROUP BY groeperen en de functie count tellen. Dit geeft iets terug in ClickHouse. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/50983341e20bcbc1b5adbaed35f8624d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm de snelheid van de queryverwerking te meten, heb ik drie tabellen gemaakt met dezelfde gegevens, maar heb ik voor onze startlocatie drie verschillende datatypes gebruikt \u2014 String, LowCardinality en Enum. LowCardinality en Enum waren vijf keer sneller dan String. Enum is sneller omdat het met nummers werkt. LowCardinality is sneller vanwege de implementatie van de GROUP BY-optimalisatie. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/e2ce4f2127d8728287488c85c92085fc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLaten we de query nog ingewikkelder maken \u2014 we vragen waar het populairste park in New York is. We zullen opnieuw meten waar de meeste taxi's worden besteld, maar we filteren alleen de locaties met het woord \"park\". We voegen ook de functie like toe. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/7cf6fd64751f3ae578581caddde17aaf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe kijken naar de tijd \u2014 we zien dat Enum plotseling trager begon te worden. Het werkt zelfs trager dan het standaard datatype String. Dit gebeurt omdat de functie like helemaal niet is geoptimaliseerd voor Enum. We moeten onze strings van Enum naar gewone strings converteren \u2014 we doen meer werk. LowCardinality(String) is ook niet standaard geoptimaliseerd, maar daar werkt like op het woordenboek, waardoor de query versneld wordt in vergelijking met String. <\/p>\n<p>Bij het werken met Enum is er een groter probleem. Als we het willen optimaliseren, moeten we dit op elke plek in de code doen. Stel dat we een nieuwe functie schrijven \u2014 we moeten altijd een optimalisatie voor Enum bedenken. Bij LowCardinality is dit standaard geoptimaliseerd.<\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/459243eb5b3dd993393d0184b224ea09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLaten we kijken naar de laatste query, die meer kunstmatig is. We zullen simpelweg de hash-functie van onze locatie berekenen. De hash-functie is een vrij langzame aanvraag, het duurt even, dus alles zal ongeveer drie keer vertraging oplopen.<\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/a5f49c22748971646ec358eb52d3feda.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLowCardinality werkt nog steeds sneller, ook al is er geen filtering. Dit komt omdat onze functies alleen op het woordenboek werken. De hash-berekeningsfunctie heeft \u00e9\u00e9n argument \u2014 deze kan minder gegevens verwerken en ook LowCardinality teruggeven. <\/p>\n<p><img decoding=\"async\" alt=\"Optimalisatie van strings in ClickHouse. Presentatie van Yandex\" src=\"\/wp-content\/uploads\/2020\/03\/7842b7eb2debb4a4b1d4cbc3488deb32.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOns mondiale plan is om een snelheid te bereiken die niet lager is dan die van String in welke situatie dan ook, en om de versnellingsvoordelen te behouden. En misschien zullen we op een dag String vervangen door LowCardinality, u werkt ClickHouse bij, en alles zal een beetje sneller werken.<br \/>\n<br \/>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/492868\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0421\u0423\u0411\u0414 ClickHouse \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a ClickHouse \u041d\u0438\u043a\u043e\u043b\u0430\u0439 \u041a\u043e\u0447\u0435\u0442\u043e\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c \u0442\u0438\u043f\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043e \u043d\u043e\u0432\u043e\u043c \u0442\u0438\u043f\u0435, LowCardinality, \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438. \u2014 \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74738,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74737","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0410\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0421\u0423\u0411\u0414 ClickHouse \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/optimizacziya-strok-v-clickhouse-doklad-yandeksa\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 ClickHouse. \u0414\u043e\u043a\u043b\u0430\u0434 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0421\u0423\u0411\u0414 ClickHouse \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/optimizacziya-strok-v-clickhouse-doklad-yandeksa\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-20T05:43:14+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-20T05:43:14+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Optimalisatie van rijen in ClickHouse. Presentatie van Yandex | ProHoster","description":"De analytische database ClickHouse verwerkt een verscheidenheid aan rijen en verbruikt middelen. Om de werking van het systeem te versnellen, worden voortdurend nieuwe optimalisaties toegevoegd.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/optimizacziya-strok-v-clickhouse-doklad-yandeksa","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 ClickHouse. \u0414\u043e\u043a\u043b\u0430\u0434 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 | ProHoster","og:description":"\u0410\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0421\u0423\u0411\u0414 ClickHouse \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/optimizacziya-strok-v-clickhouse-doklad-yandeksa","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-20T05:43:14+00:00","article:modified_time":"2020-03-20T05:43:14+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74737","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:23:10","updated":"2022-09-27 14:48:44","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/74737","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=74737"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/74737\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/74738"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=74737"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=74737"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=74737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}