[{"data":1,"prerenderedAt":2432},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fde\u002Fdata\u002Fcohort-table-architecture-scaling-retention-analysis-production":13},{"i18nKey":4,"paths":5},"data-007-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fcohort-table-architecture-scaling-retention-analysis-production","\u002Fen\u002Fdata\u002Fcohort-table-architecture-scaling-retention-analysis-production","\u002Fes\u002Fdata\u002Farquitectura-tabla-cohorte-escalando-analisis-retencion","\u002Ffr\u002Fdata\u002Farchitecture-table-cohort-retention-optimisation-production","\u002Fit\u002Fdata\u002Farchitettura-tabella-cohort-scalabilita-retention-analysis-production","\u002Fru\u002Fdata\u002Fcohort-table-architecture-scaling-retention","\u002Ftr\u002Fdata\u002Fcohort-tablo-mimarisi-retention-analizinin-productionda-olceklenmesi",{"_path":6,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":2426,"_id":2427,"_source":2428,"_file":2429,"_stem":2430,"_extension":2431},"data",false,"","Cohort-Tabellenarchitektur: Skalierung der Retention-Analyse in der Produktion","Erfahren Sie, wie Sie Cohort-Analysetabellen in der Produktionsumgebung mit materialisierten Views, Partitionierung und Query-Kostenoptimierung skalieren.","2026-07-28",[21,22,23,24,25],"cohort-analysis","bigquery","materialized-views","data-engineering","retention",9,"Roibase",{"type":29,"children":30,"toc":2411},"root",[31,48,55,84,511,524,529,536,541,624,644,678,683,689,707,896,901,943,948,1199,1219,1225,1237,1553,1558,1564,1576,1903,1907,1954,1967,1973,1993,2000,2026,2034,2058,2074,2080,2085,2138,2151,2180,2185,2202,2208,2221,2226,2262,2283,2289,2294,2317,2329,2376,2393,2405],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,46],{"type":37,"value":38},"text","Jede Organisation, die Retention-Analysen durchführt, stößt auf das gleiche Problem: Cohort-Abfragen dauern in der Produktion entweder 30 Sekunden oder die BigQuery-Rechnung nähert sich monatlich 8.000 Dollar. Eine ",{"type":32,"tag":40,"props":41,"children":43},"code",{"className":42},[],[44],{"type":37,"value":45},"GROUP BY user_id, cohort_week",{"type":37,"value":47},"-Abfrage, die mit 100.000 Nutzern in der Test-Umgebung reibungslos funktioniert, bricht zusammen, wenn sie mit 50 Millionen Nutzern und zwei Jahren Event-Logs konfrontiert wird. Die Lösung ist nicht einfach — es genügt nicht, einen Index hinzuzufügen oder Caching zu aktivieren. Die Tabellenarchitektur muss von Grund auf für Retention-Workloads neu gestaltet werden.",{"type":32,"tag":49,"props":50,"children":52},"h2",{"id":51},"warum-cohort-analyse-eine-andere-architektur-erfordert",[53],{"type":37,"value":54},"Warum Cohort-Analyse eine andere Architektur erfordert",{"type":32,"tag":33,"props":56,"children":57},{},[58,60,66,68,74,76,82],{"type":37,"value":59},"Eine klassische Event-Log-Tabelle basiert auf ",{"type":32,"tag":40,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"user_id",{"type":37,"value":67},", ",{"type":32,"tag":40,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"event_time",{"type":37,"value":75}," und ",{"type":32,"tag":40,"props":77,"children":79},{"className":78},[],[80],{"type":37,"value":81},"event_name",{"type":37,"value":83},". Jede Cohort-Abfrage durchsucht diese Tabelle rückwirkend nach Milliarden von Zeilen und gruppiert Nutzer nach ihrem ersten Event-Datum. In BigQuery sieht diese Abfrage folgendermaßen aus:",{"type":32,"tag":85,"props":86,"children":90},"pre",{"className":87,"code":88,"language":89,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","WITH cohorts AS (\n  SELECT user_id, DATE_TRUNC(MIN(event_time), WEEK) AS cohort_week\n  FROM events\n  GROUP BY user_id\n),\nretention AS (\n  SELECT \n    c.cohort_week,\n    DATE_DIFF(DATE_TRUNC(e.event_time, WEEK), c.cohort_week, WEEK) AS weeks_since_cohort,\n    COUNT(DISTINCT e.user_id) AS active_users\n  FROM cohorts c\n  JOIN events e ON c.user_id = e.user_id\n  GROUP BY 1, 2\n)\nSELECT * FROM retention ORDER BY 1, 2;\n","sql",[91],{"type":32,"tag":40,"props":92,"children":93},{"__ignoreMap":16},[94,122,166,180,194,203,220,233,257,325,370,383,433,455,464],{"type":32,"tag":95,"props":96,"children":99},"span",{"class":97,"line":98},"line",1,[100,106,112,117],{"type":32,"tag":95,"props":101,"children":103},{"style":102},"--shiki-default:#F97583",[104],{"type":37,"value":105},"WITH",{"type":32,"tag":95,"props":107,"children":109},{"style":108},"--shiki-default:#E1E4E8",[110],{"type":37,"value":111}," cohorts ",{"type":32,"tag":95,"props":113,"children":114},{"style":102},[115],{"type":37,"value":116},"AS",{"type":32,"tag":95,"props":118,"children":119},{"style":108},[120],{"type":37,"value":121}," (\n",{"type":32,"tag":95,"props":123,"children":125},{"class":97,"line":124},2,[126,131,136,142,147,152,157,161],{"type":32,"tag":95,"props":127,"children":128},{"style":102},[129],{"type":37,"value":130},"  SELECT",{"type":32,"tag":95,"props":132,"children":133},{"style":108},[134],{"type":37,"value":135}," user_id, DATE_TRUNC(",{"type":32,"tag":95,"props":137,"children":139},{"style":138},"--shiki-default:#79B8FF",[140],{"type":37,"value":141},"MIN",{"type":32,"tag":95,"props":143,"children":144},{"style":108},[145],{"type":37,"value":146},"(event_time), ",{"type":32,"tag":95,"props":148,"children":149},{"style":102},[150],{"type":37,"value":151},"WEEK",{"type":32,"tag":95,"props":153,"children":154},{"style":108},[155],{"type":37,"value":156},") ",{"type":32,"tag":95,"props":158,"children":159},{"style":102},[160],{"type":37,"value":116},{"type":32,"tag":95,"props":162,"children":163},{"style":108},[164],{"type":37,"value":165}," cohort_week\n",{"type":32,"tag":95,"props":167,"children":169},{"class":97,"line":168},3,[170,175],{"type":32,"tag":95,"props":171,"children":172},{"style":102},[173],{"type":37,"value":174},"  FROM",{"type":32,"tag":95,"props":176,"children":177},{"style":108},[178],{"type":37,"value":179}," events\n",{"type":32,"tag":95,"props":181,"children":183},{"class":97,"line":182},4,[184,189],{"type":32,"tag":95,"props":185,"children":186},{"style":102},[187],{"type":37,"value":188},"  GROUP BY",{"type":32,"tag":95,"props":190,"children":191},{"style":108},[192],{"type":37,"value":193}," user_id\n",{"type":32,"tag":95,"props":195,"children":197},{"class":97,"line":196},5,[198],{"type":32,"tag":95,"props":199,"children":200},{"style":108},[201],{"type":37,"value":202},"),\n",{"type":32,"tag":95,"props":204,"children":206},{"class":97,"line":205},6,[207,211,216],{"type":32,"tag":95,"props":208,"children":209},{"style":102},[210],{"type":37,"value":25},{"type":32,"tag":95,"props":212,"children":213},{"style":102},[214],{"type":37,"value":215}," AS",{"type":32,"tag":95,"props":217,"children":218},{"style":108},[219],{"type":37,"value":121},{"type":32,"tag":95,"props":221,"children":223},{"class":97,"line":222},7,[224,228],{"type":32,"tag":95,"props":225,"children":226},{"style":102},[227],{"type":37,"value":130},{"type":32,"tag":95,"props":229,"children":230},{"style":108},[231],{"type":37,"value":232}," \n",{"type":32,"tag":95,"props":234,"children":236},{"class":97,"line":235},8,[237,242,247,252],{"type":32,"tag":95,"props":238,"children":239},{"style":138},[240],{"type":37,"value":241},"    c",{"type":32,"tag":95,"props":243,"children":244},{"style":108},[245],{"type":37,"value":246},".",{"type":32,"tag":95,"props":248,"children":249},{"style":138},[250],{"type":37,"value":251},"cohort_week",{"type":32,"tag":95,"props":253,"children":254},{"style":108},[255],{"type":37,"value":256},",\n",{"type":32,"tag":95,"props":258,"children":259},{"class":97,"line":26},[260,265,270,274,278,282,286,291,296,300,304,308,312,316,320],{"type":32,"tag":95,"props":261,"children":262},{"style":108},[263],{"type":37,"value":264},"    DATE_DIFF(DATE_TRUNC(",{"type":32,"tag":95,"props":266,"children":267},{"style":138},[268],{"type":37,"value":269},"e",{"type":32,"tag":95,"props":271,"children":272},{"style":108},[273],{"type":37,"value":246},{"type":32,"tag":95,"props":275,"children":276},{"style":138},[277],{"type":37,"value":73},{"type":32,"tag":95,"props":279,"children":280},{"style":108},[281],{"type":37,"value":67},{"type":32,"tag":95,"props":283,"children":284},{"style":102},[285],{"type":37,"value":151},{"type":32,"tag":95,"props":287,"children":288},{"style":108},[289],{"type":37,"value":290},"), ",{"type":32,"tag":95,"props":292,"children":293},{"style":138},[294],{"type":37,"value":295},"c",{"type":32,"tag":95,"props":297,"children":298},{"style":108},[299],{"type":37,"value":246},{"type":32,"tag":95,"props":301,"children":302},{"style":138},[303],{"type":37,"value":251},{"type":32,"tag":95,"props":305,"children":306},{"style":108},[307],{"type":37,"value":67},{"type":32,"tag":95,"props":309,"children":310},{"style":102},[311],{"type":37,"value":151},{"type":32,"tag":95,"props":313,"children":314},{"style":108},[315],{"type":37,"value":156},{"type":32,"tag":95,"props":317,"children":318},{"style":102},[319],{"type":37,"value":116},{"type":32,"tag":95,"props":321,"children":322},{"style":108},[323],{"type":37,"value":324}," weeks_since_cohort,\n",{"type":32,"tag":95,"props":326,"children":328},{"class":97,"line":327},10,[329,334,339,344,349,353,357,361,365],{"type":32,"tag":95,"props":330,"children":331},{"style":138},[332],{"type":37,"value":333},"    COUNT",{"type":32,"tag":95,"props":335,"children":336},{"style":108},[337],{"type":37,"value":338},"(",{"type":32,"tag":95,"props":340,"children":341},{"style":102},[342],{"type":37,"value":343},"DISTINCT",{"type":32,"tag":95,"props":345,"children":346},{"style":138},[347],{"type":37,"value":348}," e",{"type":32,"tag":95,"props":350,"children":351},{"style":108},[352],{"type":37,"value":246},{"type":32,"tag":95,"props":354,"children":355},{"style":138},[356],{"type":37,"value":65},{"type":32,"tag":95,"props":358,"children":359},{"style":108},[360],{"type":37,"value":156},{"type":32,"tag":95,"props":362,"children":363},{"style":102},[364],{"type":37,"value":116},{"type":32,"tag":95,"props":366,"children":367},{"style":108},[368],{"type":37,"value":369}," active_users\n",{"type":32,"tag":95,"props":371,"children":373},{"class":97,"line":372},11,[374,378],{"type":32,"tag":95,"props":375,"children":376},{"style":102},[377],{"type":37,"value":174},{"type":32,"tag":95,"props":379,"children":380},{"style":108},[381],{"type":37,"value":382}," cohorts c\n",{"type":32,"tag":95,"props":384,"children":386},{"class":97,"line":385},12,[387,392,397,402,407,411,415,420,424,428],{"type":32,"tag":95,"props":388,"children":389},{"style":102},[390],{"type":37,"value":391},"  JOIN",{"type":32,"tag":95,"props":393,"children":394},{"style":108},[395],{"type":37,"value":396}," events e ",{"type":32,"tag":95,"props":398,"children":399},{"style":102},[400],{"type":37,"value":401},"ON",{"type":32,"tag":95,"props":403,"children":404},{"style":138},[405],{"type":37,"value":406}," c",{"type":32,"tag":95,"props":408,"children":409},{"style":108},[410],{"type":37,"value":246},{"type":32,"tag":95,"props":412,"children":413},{"style":138},[414],{"type":37,"value":65},{"type":32,"tag":95,"props":416,"children":417},{"style":102},[418],{"type":37,"value":419}," =",{"type":32,"tag":95,"props":421,"children":422},{"style":138},[423],{"type":37,"value":348},{"type":32,"tag":95,"props":425,"children":426},{"style":108},[427],{"type":37,"value":246},{"type":32,"tag":95,"props":429,"children":430},{"style":138},[431],{"type":37,"value":432},"user_id\n",{"type":32,"tag":95,"props":434,"children":436},{"class":97,"line":435},13,[437,441,446,450],{"type":32,"tag":95,"props":438,"children":439},{"style":102},[440],{"type":37,"value":188},{"type":32,"tag":95,"props":442,"children":443},{"style":138},[444],{"type":37,"value":445}," 1",{"type":32,"tag":95,"props":447,"children":448},{"style":108},[449],{"type":37,"value":67},{"type":32,"tag":95,"props":451,"children":452},{"style":138},[453],{"type":37,"value":454},"2\n",{"type":32,"tag":95,"props":456,"children":458},{"class":97,"line":457},14,[459],{"type":32,"tag":95,"props":460,"children":461},{"style":108},[462],{"type":37,"value":463},")\n",{"type":32,"tag":95,"props":465,"children":467},{"class":97,"line":466},15,[468,473,478,483,488,493,497,501,506],{"type":32,"tag":95,"props":469,"children":470},{"style":102},[471],{"type":37,"value":472},"SELECT",{"type":32,"tag":95,"props":474,"children":475},{"style":102},[476],{"type":37,"value":477}," *",{"type":32,"tag":95,"props":479,"children":480},{"style":102},[481],{"type":37,"value":482}," FROM",{"type":32,"tag":95,"props":484,"children":485},{"style":102},[486],{"type":37,"value":487}," retention",{"type":32,"tag":95,"props":489,"children":490},{"style":102},[491],{"type":37,"value":492}," ORDER BY",{"type":32,"tag":95,"props":494,"children":495},{"style":138},[496],{"type":37,"value":445},{"type":32,"tag":95,"props":498,"children":499},{"style":108},[500],{"type":37,"value":67},{"type":32,"tag":95,"props":502,"children":503},{"style":138},[504],{"type":37,"value":505},"2",{"type":32,"tag":95,"props":507,"children":508},{"style":108},[509],{"type":37,"value":510},";\n",{"type":32,"tag":33,"props":512,"children":513},{},[514,516,522],{"type":37,"value":515},"Diese Abfrage liest jedes Mal die gesamte ",{"type":32,"tag":40,"props":517,"children":519},{"className":518},[],[520],{"type":37,"value":521},"events",{"type":37,"value":523},"-Tabelle. 500 Millionen Zeilen × 16 Byte durchschnittlich = 8 GB Scan. In BigQuery kosten 1 TB Scan $6,25, also 1.000 Abfragen = $50. Wenn das Dashboard alle 5 Minuten aktualisiert wird, sind das 8.640 Abfragen monatlich = $432 nur für das Cohort-Widget. Füge dem Team 10 weitere Analysten hinzu, lass Slack-Bots Queries auslösen, und die Kosten verdoppeln sich.",{"type":32,"tag":33,"props":525,"children":526},{},[527],{"type":37,"value":528},"Das eigentliche Problem ist nicht einmal die Kosteneffizienz — es ist die Latenz. Der JOIN mit 500 Millionen Zeilen dauert 15–30 Sekunden. Der Nutzer ändert einen Filter auf dem Dashboard, wartet 20 Sekunden auf neue Cohort-Daten. Retention-Analyse kann nicht iterativ sein, wenn die Latenz so hoch ist.",{"type":32,"tag":530,"props":531,"children":533},"h3",{"id":532},"materialisierte-views-sind-ein-erster-schritt-aber-nicht-ausreichend",[534],{"type":37,"value":535},"Materialisierte Views sind ein erster Schritt, aber nicht ausreichend",{"type":32,"tag":33,"props":537,"children":538},{},[539],{"type":37,"value":540},"BigQuery-Materialisierte Views pre-computet die Cohort-Abfrage:",{"type":32,"tag":85,"props":542,"children":544},{"className":87,"code":543,"language":89,"meta":16,"style":16},"CREATE MATERIALIZED VIEW cohort_retention AS\nSELECT \n  cohort_week,\n  weeks_since_cohort,\n  active_users\nFROM retention; -- Ergebnis der obigen CTE-Abfrage\n",[545],{"type":32,"tag":40,"props":546,"children":547},{"__ignoreMap":16},[548,566,577,585,593,601],{"type":32,"tag":95,"props":549,"children":550},{"class":97,"line":98},[551,556,561],{"type":32,"tag":95,"props":552,"children":553},{"style":102},[554],{"type":37,"value":555},"CREATE",{"type":32,"tag":95,"props":557,"children":558},{"style":108},[559],{"type":37,"value":560}," MATERIALIZED VIEW cohort_retention ",{"type":32,"tag":95,"props":562,"children":563},{"style":102},[564],{"type":37,"value":565},"AS\n",{"type":32,"tag":95,"props":567,"children":568},{"class":97,"line":124},[569,573],{"type":32,"tag":95,"props":570,"children":571},{"style":102},[572],{"type":37,"value":472},{"type":32,"tag":95,"props":574,"children":575},{"style":108},[576],{"type":37,"value":232},{"type":32,"tag":95,"props":578,"children":579},{"class":97,"line":168},[580],{"type":32,"tag":95,"props":581,"children":582},{"style":108},[583],{"type":37,"value":584},"  cohort_week,\n",{"type":32,"tag":95,"props":586,"children":587},{"class":97,"line":182},[588],{"type":32,"tag":95,"props":589,"children":590},{"style":108},[591],{"type":37,"value":592},"  weeks_since_cohort,\n",{"type":32,"tag":95,"props":594,"children":595},{"class":97,"line":196},[596],{"type":32,"tag":95,"props":597,"children":598},{"style":108},[599],{"type":37,"value":600},"  active_users\n",{"type":32,"tag":95,"props":602,"children":603},{"class":97,"line":205},[604,609,613,618],{"type":32,"tag":95,"props":605,"children":606},{"style":102},[607],{"type":37,"value":608},"FROM",{"type":32,"tag":95,"props":610,"children":611},{"style":102},[612],{"type":37,"value":487},{"type":32,"tag":95,"props":614,"children":615},{"style":108},[616],{"type":37,"value":617},"; ",{"type":32,"tag":95,"props":619,"children":621},{"style":620},"--shiki-default:#6A737D",[622],{"type":37,"value":623},"-- Ergebnis der obigen CTE-Abfrage\n",{"type":32,"tag":33,"props":625,"children":626},{},[627,629,635,637,642],{"type":37,"value":628},"Das Dashboard liest nun die ",{"type":32,"tag":40,"props":630,"children":632},{"className":631},[],[633],{"type":37,"value":634},"cohort_retention",{"type":37,"value":636},"-Tabelle statt die ",{"type":32,"tag":40,"props":638,"children":640},{"className":639},[],[641],{"type":37,"value":521},{"type":37,"value":643},"-Tabelle. Der Scan sinkt von 8 GB auf 80 MB. Die Latenz fällt von 20 Sekunden auf 800 ms. Aber es gibt zwei Einschränkungen:",{"type":32,"tag":645,"props":646,"children":647},"ol",{},[648,660],{"type":32,"tag":649,"props":650,"children":651},"li",{},[652,658],{"type":32,"tag":653,"props":654,"children":655},"strong",{},[656],{"type":37,"value":657},"Refresh-Kosten:",{"type":37,"value":659}," Jedes Mal, wenn die materialisierte View aktualisiert wird, führt sie die Basis-Abfrage erneut aus. Das bedeutet, es findet wieder ein 8-GB-Scan statt. Wenn die View stündlich aktualisiert wird, sind das 24 × 8 GB = 192 GB\u002FTag = monatlich 5,8 TB Scan. Die Kosten sind nicht gesunken, nur die Latenz.",{"type":32,"tag":649,"props":661,"children":662},{},[663,668,670,676],{"type":32,"tag":653,"props":664,"children":665},{},[666],{"type":37,"value":667},"Flexibilität:",{"type":37,"value":669}," Die materialisierte View ist statisch. Wenn der Nutzer \"iOS-Cohort-Retention\" filtert, muss die View neu berechnet werden. Man kann keinen Pre-Filter hinzufügen, weil ",{"type":32,"tag":40,"props":671,"children":673},{"className":672},[],[674],{"type":37,"value":675},"WHERE platform = 'iOS'",{"type":37,"value":677}," eine andere View erfordert.",{"type":32,"tag":33,"props":679,"children":680},{},[681],{"type":37,"value":682},"Deshalb muss die Cohort-Architektur dreischichtig aufgebaut werden: Raw Events → Cohort-Zuordnungstabelle → Aggregierte Retention-Tabelle.",{"type":32,"tag":49,"props":684,"children":686},{"id":685},"die-cohort-zuordnungstabelle-separieren",[687],{"type":37,"value":688},"Die Cohort-Zuordnungstabelle separieren",{"type":32,"tag":33,"props":690,"children":691},{},[692,694,699,700,705],{"type":37,"value":693},"Der erste Schritt besteht darin, eine separate Tabelle zu erstellen, die jeden Nutzer seiner Cohort zuordnet. Diese Tabelle enthält nur ",{"type":32,"tag":40,"props":695,"children":697},{"className":696},[],[698],{"type":37,"value":65},{"type":37,"value":75},{"type":32,"tag":40,"props":701,"children":703},{"className":702},[],[704],{"type":37,"value":251},{"type":37,"value":706},", wird aus dem Event-Log abgeleitet, aber nur einmal täglich berechnet:",{"type":32,"tag":85,"props":708,"children":710},{"className":87,"code":709,"language":89,"meta":16,"style":16},"CREATE OR REPLACE TABLE cohort_assignments\nPARTITION BY cohort_week\nCLUSTER BY user_id\nAS\nSELECT \n  user_id,\n  DATE_TRUNC(MIN(event_time), WEEK) AS cohort_week,\n  MIN(event_time) AS first_seen_at\nFROM events\nWHERE event_time >= '2024-01-01'\nGROUP BY user_id;\n",[711],{"type":32,"tag":40,"props":712,"children":713},{"__ignoreMap":16},[714,733,750,767,774,785,793,826,848,859,883],{"type":32,"tag":95,"props":715,"children":716},{"class":97,"line":98},[717,722,727],{"type":32,"tag":95,"props":718,"children":719},{"style":102},[720],{"type":37,"value":721},"CREATE OR REPLACE",{"type":32,"tag":95,"props":723,"children":724},{"style":102},[725],{"type":37,"value":726}," TABLE",{"type":32,"tag":95,"props":728,"children":730},{"style":729},"--shiki-default:#B392F0",[731],{"type":37,"value":732}," cohort_assignments\n",{"type":32,"tag":95,"props":734,"children":735},{"class":97,"line":124},[736,741,746],{"type":32,"tag":95,"props":737,"children":738},{"style":102},[739],{"type":37,"value":740},"PARTITION",{"type":32,"tag":95,"props":742,"children":743},{"style":102},[744],{"type":37,"value":745}," BY",{"type":32,"tag":95,"props":747,"children":748},{"style":108},[749],{"type":37,"value":165},{"type":32,"tag":95,"props":751,"children":752},{"class":97,"line":168},[753,758,763],{"type":32,"tag":95,"props":754,"children":755},{"style":108},[756],{"type":37,"value":757},"CLUSTER ",{"type":32,"tag":95,"props":759,"children":760},{"style":102},[761],{"type":37,"value":762},"BY",{"type":32,"tag":95,"props":764,"children":765},{"style":108},[766],{"type":37,"value":193},{"type":32,"tag":95,"props":768,"children":769},{"class":97,"line":182},[770],{"type":32,"tag":95,"props":771,"children":772},{"style":102},[773],{"type":37,"value":565},{"type":32,"tag":95,"props":775,"children":776},{"class":97,"line":196},[777,781],{"type":32,"tag":95,"props":778,"children":779},{"style":102},[780],{"type":37,"value":472},{"type":32,"tag":95,"props":782,"children":783},{"style":108},[784],{"type":37,"value":232},{"type":32,"tag":95,"props":786,"children":787},{"class":97,"line":205},[788],{"type":32,"tag":95,"props":789,"children":790},{"style":108},[791],{"type":37,"value":792},"  user_id,\n",{"type":32,"tag":95,"props":794,"children":795},{"class":97,"line":222},[796,801,805,809,813,817,821],{"type":32,"tag":95,"props":797,"children":798},{"style":108},[799],{"type":37,"value":800},"  DATE_TRUNC(",{"type":32,"tag":95,"props":802,"children":803},{"style":138},[804],{"type":37,"value":141},{"type":32,"tag":95,"props":806,"children":807},{"style":108},[808],{"type":37,"value":146},{"type":32,"tag":95,"props":810,"children":811},{"style":102},[812],{"type":37,"value":151},{"type":32,"tag":95,"props":814,"children":815},{"style":108},[816],{"type":37,"value":156},{"type":32,"tag":95,"props":818,"children":819},{"style":102},[820],{"type":37,"value":116},{"type":32,"tag":95,"props":822,"children":823},{"style":108},[824],{"type":37,"value":825}," cohort_week,\n",{"type":32,"tag":95,"props":827,"children":828},{"class":97,"line":235},[829,834,839,843],{"type":32,"tag":95,"props":830,"children":831},{"style":138},[832],{"type":37,"value":833},"  MIN",{"type":32,"tag":95,"props":835,"children":836},{"style":108},[837],{"type":37,"value":838},"(event_time) ",{"type":32,"tag":95,"props":840,"children":841},{"style":102},[842],{"type":37,"value":116},{"type":32,"tag":95,"props":844,"children":845},{"style":108},[846],{"type":37,"value":847}," first_seen_at\n",{"type":32,"tag":95,"props":849,"children":850},{"class":97,"line":26},[851,855],{"type":32,"tag":95,"props":852,"children":853},{"style":102},[854],{"type":37,"value":608},{"type":32,"tag":95,"props":856,"children":857},{"style":108},[858],{"type":37,"value":179},{"type":32,"tag":95,"props":860,"children":861},{"class":97,"line":327},[862,867,872,877],{"type":32,"tag":95,"props":863,"children":864},{"style":102},[865],{"type":37,"value":866},"WHERE",{"type":32,"tag":95,"props":868,"children":869},{"style":108},[870],{"type":37,"value":871}," event_time ",{"type":32,"tag":95,"props":873,"children":874},{"style":102},[875],{"type":37,"value":876},">=",{"type":32,"tag":95,"props":878,"children":880},{"style":879},"--shiki-default:#9ECBFF",[881],{"type":37,"value":882}," '2024-01-01'\n",{"type":32,"tag":95,"props":884,"children":885},{"class":97,"line":372},[886,891],{"type":32,"tag":95,"props":887,"children":888},{"style":102},[889],{"type":37,"value":890},"GROUP BY",{"type":32,"tag":95,"props":892,"children":893},{"style":108},[894],{"type":37,"value":895}," user_id;\n",{"type":32,"tag":33,"props":897,"children":898},{},[899],{"type":37,"value":900},"Diese Tabelle:",{"type":32,"tag":902,"props":903,"children":904},"ul",{},[905,923,933],{"type":32,"tag":649,"props":906,"children":907},{},[908,913,915,921],{"type":32,"tag":653,"props":909,"children":910},{},[911],{"type":37,"value":912},"Partition nach cohort_week:",{"type":37,"value":914}," BigQuery erstellt für jede Woche separate Dateiblöcke. Der Filter ",{"type":32,"tag":40,"props":916,"children":918},{"className":917},[],[919],{"type":37,"value":920},"WHERE cohort_week = '2026-01-05'",{"type":37,"value":922}," liest nur 1 Partition.",{"type":32,"tag":649,"props":924,"children":925},{},[926,931],{"type":32,"tag":653,"props":927,"children":928},{},[929],{"type":37,"value":930},"Clustering nach user_id:",{"type":37,"value":932}," Innerhalb der Partition sortierte Speicherung nach user_id. JOINs werden schneller.",{"type":32,"tag":649,"props":934,"children":935},{},[936,941],{"type":32,"tag":653,"props":937,"children":938},{},[939],{"type":37,"value":940},"Größe:",{"type":37,"value":942}," 50 Millionen Nutzer × 3 Spalten × 16 Byte = ~2,4 GB. Wenn das Event-Log 500 GB groß ist, ist die Cohort-Tabelle 200× kleiner.",{"type":32,"tag":33,"props":944,"children":945},{},[946],{"type":37,"value":947},"Nun verwendet die Retention-Abfrage diese Tabelle:",{"type":32,"tag":85,"props":949,"children":951},{"className":87,"code":950,"language":89,"meta":16,"style":16},"SELECT \n  c.cohort_week,\n  DATE_DIFF(DATE_TRUNC(e.event_time, WEEK), c.cohort_week, WEEK) AS weeks_since,\n  COUNT(DISTINCT e.user_id) AS active_users\nFROM cohort_assignments c\nJOIN events e ON c.user_id = e.user_id\nWHERE c.cohort_week >= '2026-01-01'\nGROUP BY 1, 2;\n",[952],{"type":32,"tag":40,"props":953,"children":954},{"__ignoreMap":16},[955,966,986,1051,1091,1103,1147,1176],{"type":32,"tag":95,"props":956,"children":957},{"class":97,"line":98},[958,962],{"type":32,"tag":95,"props":959,"children":960},{"style":102},[961],{"type":37,"value":472},{"type":32,"tag":95,"props":963,"children":964},{"style":108},[965],{"type":37,"value":232},{"type":32,"tag":95,"props":967,"children":968},{"class":97,"line":124},[969,974,978,982],{"type":32,"tag":95,"props":970,"children":971},{"style":138},[972],{"type":37,"value":973},"  c",{"type":32,"tag":95,"props":975,"children":976},{"style":108},[977],{"type":37,"value":246},{"type":32,"tag":95,"props":979,"children":980},{"style":138},[981],{"type":37,"value":251},{"type":32,"tag":95,"props":983,"children":984},{"style":108},[985],{"type":37,"value":256},{"type":32,"tag":95,"props":987,"children":988},{"class":97,"line":168},[989,994,998,1002,1006,1010,1014,1018,1022,1026,1030,1034,1038,1042,1046],{"type":32,"tag":95,"props":990,"children":991},{"style":108},[992],{"type":37,"value":993},"  DATE_DIFF(DATE_TRUNC(",{"type":32,"tag":95,"props":995,"children":996},{"style":138},[997],{"type":37,"value":269},{"type":32,"tag":95,"props":999,"children":1000},{"style":108},[1001],{"type":37,"value":246},{"type":32,"tag":95,"props":1003,"children":1004},{"style":138},[1005],{"type":37,"value":73},{"type":32,"tag":95,"props":1007,"children":1008},{"style":108},[1009],{"type":37,"value":67},{"type":32,"tag":95,"props":1011,"children":1012},{"style":102},[1013],{"type":37,"value":151},{"type":32,"tag":95,"props":1015,"children":1016},{"style":108},[1017],{"type":37,"value":290},{"type":32,"tag":95,"props":1019,"children":1020},{"style":138},[1021],{"type":37,"value":295},{"type":32,"tag":95,"props":1023,"children":1024},{"style":108},[1025],{"type":37,"value":246},{"type":32,"tag":95,"props":1027,"children":1028},{"style":138},[1029],{"type":37,"value":251},{"type":32,"tag":95,"props":1031,"children":1032},{"style":108},[1033],{"type":37,"value":67},{"type":32,"tag":95,"props":1035,"children":1036},{"style":102},[1037],{"type":37,"value":151},{"type":32,"tag":95,"props":1039,"children":1040},{"style":108},[1041],{"type":37,"value":156},{"type":32,"tag":95,"props":1043,"children":1044},{"style":102},[1045],{"type":37,"value":116},{"type":32,"tag":95,"props":1047,"children":1048},{"style":108},[1049],{"type":37,"value":1050}," weeks_since,\n",{"type":32,"tag":95,"props":1052,"children":1053},{"class":97,"line":182},[1054,1059,1063,1067,1071,1075,1079,1083,1087],{"type":32,"tag":95,"props":1055,"children":1056},{"style":138},[1057],{"type":37,"value":1058},"  COUNT",{"type":32,"tag":95,"props":1060,"children":1061},{"style":108},[1062],{"type":37,"value":338},{"type":32,"tag":95,"props":1064,"children":1065},{"style":102},[1066],{"type":37,"value":343},{"type":32,"tag":95,"props":1068,"children":1069},{"style":138},[1070],{"type":37,"value":348},{"type":32,"tag":95,"props":1072,"children":1073},{"style":108},[1074],{"type":37,"value":246},{"type":32,"tag":95,"props":1076,"children":1077},{"style":138},[1078],{"type":37,"value":65},{"type":32,"tag":95,"props":1080,"children":1081},{"style":108},[1082],{"type":37,"value":156},{"type":32,"tag":95,"props":1084,"children":1085},{"style":102},[1086],{"type":37,"value":116},{"type":32,"tag":95,"props":1088,"children":1089},{"style":108},[1090],{"type":37,"value":369},{"type":32,"tag":95,"props":1092,"children":1093},{"class":97,"line":196},[1094,1098],{"type":32,"tag":95,"props":1095,"children":1096},{"style":102},[1097],{"type":37,"value":608},{"type":32,"tag":95,"props":1099,"children":1100},{"style":108},[1101],{"type":37,"value":1102}," cohort_assignments c\n",{"type":32,"tag":95,"props":1104,"children":1105},{"class":97,"line":205},[1106,1111,1115,1119,1123,1127,1131,1135,1139,1143],{"type":32,"tag":95,"props":1107,"children":1108},{"style":102},[1109],{"type":37,"value":1110},"JOIN",{"type":32,"tag":95,"props":1112,"children":1113},{"style":108},[1114],{"type":37,"value":396},{"type":32,"tag":95,"props":1116,"children":1117},{"style":102},[1118],{"type":37,"value":401},{"type":32,"tag":95,"props":1120,"children":1121},{"style":138},[1122],{"type":37,"value":406},{"type":32,"tag":95,"props":1124,"children":1125},{"style":108},[1126],{"type":37,"value":246},{"type":32,"tag":95,"props":1128,"children":1129},{"style":138},[1130],{"type":37,"value":65},{"type":32,"tag":95,"props":1132,"children":1133},{"style":102},[1134],{"type":37,"value":419},{"type":32,"tag":95,"props":1136,"children":1137},{"style":138},[1138],{"type":37,"value":348},{"type":32,"tag":95,"props":1140,"children":1141},{"style":108},[1142],{"type":37,"value":246},{"type":32,"tag":95,"props":1144,"children":1145},{"style":138},[1146],{"type":37,"value":432},{"type":32,"tag":95,"props":1148,"children":1149},{"class":97,"line":222},[1150,1154,1158,1162,1166,1171],{"type":32,"tag":95,"props":1151,"children":1152},{"style":102},[1153],{"type":37,"value":866},{"type":32,"tag":95,"props":1155,"children":1156},{"style":138},[1157],{"type":37,"value":406},{"type":32,"tag":95,"props":1159,"children":1160},{"style":108},[1161],{"type":37,"value":246},{"type":32,"tag":95,"props":1163,"children":1164},{"style":138},[1165],{"type":37,"value":251},{"type":32,"tag":95,"props":1167,"children":1168},{"style":102},[1169],{"type":37,"value":1170}," >=",{"type":32,"tag":95,"props":1172,"children":1173},{"style":879},[1174],{"type":37,"value":1175}," '2026-01-01'\n",{"type":32,"tag":95,"props":1177,"children":1178},{"class":97,"line":235},[1179,1183,1187,1191,1195],{"type":32,"tag":95,"props":1180,"children":1181},{"style":102},[1182],{"type":37,"value":890},{"type":32,"tag":95,"props":1184,"children":1185},{"style":138},[1186],{"type":37,"value":445},{"type":32,"tag":95,"props":1188,"children":1189},{"style":108},[1190],{"type":37,"value":67},{"type":32,"tag":95,"props":1192,"children":1193},{"style":138},[1194],{"type":37,"value":505},{"type":32,"tag":95,"props":1196,"children":1197},{"style":108},[1198],{"type":37,"value":510},{"type":32,"tag":33,"props":1200,"children":1201},{},[1202,1204,1210,1212,1217],{"type":37,"value":1203},"Mit ",{"type":32,"tag":40,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":37,"value":1209},"cohort_assignments",{"type":37,"value":1211}," werden durch Partition Pruning nur 4 Wochen Daten gelesen = 200 MB Scan. Der JOIN mit ",{"type":32,"tag":40,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":37,"value":521},{"type":37,"value":1218}," ist immer noch vorhanden, aber er beginnt mit gefilterten Cohort-Daten — keine überflüssigen Nutzer.",{"type":32,"tag":530,"props":1220,"children":1222},{"id":1221},"inkrementelle-aktualisierung",[1223],{"type":37,"value":1224},"Inkrementelle Aktualisierung",{"type":32,"tag":33,"props":1226,"children":1227},{},[1228,1230,1235],{"type":37,"value":1229},"Die ",{"type":32,"tag":40,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":37,"value":1209},{"type":37,"value":1236},"-Tabelle wird täglich aktualisiert, aber nicht jedes Mal von Grund auf neu berechnet. Verwende ein dbt-Incremental-Modell:",{"type":32,"tag":85,"props":1238,"children":1240},{"className":87,"code":1239,"language":89,"meta":16,"style":16},"{{\n  config(\n    materialized='incremental',\n    partition_by={'field': 'cohort_week', 'data_type': 'date'},\n    cluster_by=['user_id']\n  )\n}}\n\nSELECT \n  user_id,\n  DATE_TRUNC(MIN(event_time), WEEK) AS cohort_week,\n  MIN(event_time) AS first_seen_at\nFROM {{ ref('events') }}\n{% if is_incremental() %}\n  WHERE event_time > (SELECT MAX(first_seen_at) FROM {{ this }})\n{% endif %}\nGROUP BY user_id\n",[1241],{"type":32,"tag":40,"props":1242,"children":1243},{"__ignoreMap":16},[1244,1252,1260,1282,1337,1354,1362,1370,1379,1390,1397,1428,1447,1469,1487,1532,1541],{"type":32,"tag":95,"props":1245,"children":1246},{"class":97,"line":98},[1247],{"type":32,"tag":95,"props":1248,"children":1249},{"style":108},[1250],{"type":37,"value":1251},"{{\n",{"type":32,"tag":95,"props":1253,"children":1254},{"class":97,"line":124},[1255],{"type":32,"tag":95,"props":1256,"children":1257},{"style":108},[1258],{"type":37,"value":1259},"  config(\n",{"type":32,"tag":95,"props":1261,"children":1262},{"class":97,"line":168},[1263,1268,1273,1278],{"type":32,"tag":95,"props":1264,"children":1265},{"style":108},[1266],{"type":37,"value":1267},"    materialized",{"type":32,"tag":95,"props":1269,"children":1270},{"style":102},[1271],{"type":37,"value":1272},"=",{"type":32,"tag":95,"props":1274,"children":1275},{"style":879},[1276],{"type":37,"value":1277},"'incremental'",{"type":32,"tag":95,"props":1279,"children":1280},{"style":108},[1281],{"type":37,"value":256},{"type":32,"tag":95,"props":1283,"children":1284},{"class":97,"line":182},[1285,1290,1294,1299,1304,1309,1314,1318,1323,1327,1332],{"type":32,"tag":95,"props":1286,"children":1287},{"style":108},[1288],{"type":37,"value":1289},"    partition_by",{"type":32,"tag":95,"props":1291,"children":1292},{"style":102},[1293],{"type":37,"value":1272},{"type":32,"tag":95,"props":1295,"children":1296},{"style":108},[1297],{"type":37,"value":1298},"{",{"type":32,"tag":95,"props":1300,"children":1301},{"style":879},[1302],{"type":37,"value":1303},"'field'",{"type":32,"tag":95,"props":1305,"children":1306},{"style":108},[1307],{"type":37,"value":1308},": ",{"type":32,"tag":95,"props":1310,"children":1311},{"style":879},[1312],{"type":37,"value":1313},"'cohort_week'",{"type":32,"tag":95,"props":1315,"children":1316},{"style":108},[1317],{"type":37,"value":67},{"type":32,"tag":95,"props":1319,"children":1320},{"style":879},[1321],{"type":37,"value":1322},"'data_type'",{"type":32,"tag":95,"props":1324,"children":1325},{"style":108},[1326],{"type":37,"value":1308},{"type":32,"tag":95,"props":1328,"children":1329},{"style":879},[1330],{"type":37,"value":1331},"'date'",{"type":32,"tag":95,"props":1333,"children":1334},{"style":108},[1335],{"type":37,"value":1336},"},\n",{"type":32,"tag":95,"props":1338,"children":1339},{"class":97,"line":196},[1340,1345,1349],{"type":32,"tag":95,"props":1341,"children":1342},{"style":108},[1343],{"type":37,"value":1344},"    cluster_by",{"type":32,"tag":95,"props":1346,"children":1347},{"style":102},[1348],{"type":37,"value":1272},{"type":32,"tag":95,"props":1350,"children":1351},{"style":108},[1352],{"type":37,"value":1353},"['user_id']\n",{"type":32,"tag":95,"props":1355,"children":1356},{"class":97,"line":205},[1357],{"type":32,"tag":95,"props":1358,"children":1359},{"style":108},[1360],{"type":37,"value":1361},"  )\n",{"type":32,"tag":95,"props":1363,"children":1364},{"class":97,"line":222},[1365],{"type":32,"tag":95,"props":1366,"children":1367},{"style":108},[1368],{"type":37,"value":1369},"}}\n",{"type":32,"tag":95,"props":1371,"children":1372},{"class":97,"line":235},[1373],{"type":32,"tag":95,"props":1374,"children":1376},{"emptyLinePlaceholder":1375},true,[1377],{"type":37,"value":1378},"\n",{"type":32,"tag":95,"props":1380,"children":1381},{"class":97,"line":26},[1382,1386],{"type":32,"tag":95,"props":1383,"children":1384},{"style":102},[1385],{"type":37,"value":472},{"type":32,"tag":95,"props":1387,"children":1388},{"style":108},[1389],{"type":37,"value":232},{"type":32,"tag":95,"props":1391,"children":1392},{"class":97,"line":327},[1393],{"type":32,"tag":95,"props":1394,"children":1395},{"style":108},[1396],{"type":37,"value":792},{"type":32,"tag":95,"props":1398,"children":1399},{"class":97,"line":372},[1400,1404,1408,1412,1416,1420,1424],{"type":32,"tag":95,"props":1401,"children":1402},{"style":108},[1403],{"type":37,"value":800},{"type":32,"tag":95,"props":1405,"children":1406},{"style":138},[1407],{"type":37,"value":141},{"type":32,"tag":95,"props":1409,"children":1410},{"style":108},[1411],{"type":37,"value":146},{"type":32,"tag":95,"props":1413,"children":1414},{"style":102},[1415],{"type":37,"value":151},{"type":32,"tag":95,"props":1417,"children":1418},{"style":108},[1419],{"type":37,"value":156},{"type":32,"tag":95,"props":1421,"children":1422},{"style":102},[1423],{"type":37,"value":116},{"type":32,"tag":95,"props":1425,"children":1426},{"style":108},[1427],{"type":37,"value":825},{"type":32,"tag":95,"props":1429,"children":1430},{"class":97,"line":385},[1431,1435,1439,1443],{"type":32,"tag":95,"props":1432,"children":1433},{"style":138},[1434],{"type":37,"value":833},{"type":32,"tag":95,"props":1436,"children":1437},{"style":108},[1438],{"type":37,"value":838},{"type":32,"tag":95,"props":1440,"children":1441},{"style":102},[1442],{"type":37,"value":116},{"type":32,"tag":95,"props":1444,"children":1445},{"style":108},[1446],{"type":37,"value":847},{"type":32,"tag":95,"props":1448,"children":1449},{"class":97,"line":435},[1450,1454,1459,1464],{"type":32,"tag":95,"props":1451,"children":1452},{"style":102},[1453],{"type":37,"value":608},{"type":32,"tag":95,"props":1455,"children":1456},{"style":108},[1457],{"type":37,"value":1458}," {{ ref(",{"type":32,"tag":95,"props":1460,"children":1461},{"style":879},[1462],{"type":37,"value":1463},"'events'",{"type":32,"tag":95,"props":1465,"children":1466},{"style":108},[1467],{"type":37,"value":1468},") }}\n",{"type":32,"tag":95,"props":1470,"children":1471},{"class":97,"line":457},[1472,1477,1482],{"type":32,"tag":95,"props":1473,"children":1474},{"style":108},[1475],{"type":37,"value":1476},"{% ",{"type":32,"tag":95,"props":1478,"children":1479},{"style":102},[1480],{"type":37,"value":1481},"if",{"type":32,"tag":95,"props":1483,"children":1484},{"style":108},[1485],{"type":37,"value":1486}," is_incremental() %}\n",{"type":32,"tag":95,"props":1488,"children":1489},{"class":97,"line":466},[1490,1495,1499,1504,1509,1513,1518,1523,1527],{"type":32,"tag":95,"props":1491,"children":1492},{"style":102},[1493],{"type":37,"value":1494},"  WHERE",{"type":32,"tag":95,"props":1496,"children":1497},{"style":108},[1498],{"type":37,"value":871},{"type":32,"tag":95,"props":1500,"children":1501},{"style":102},[1502],{"type":37,"value":1503},">",{"type":32,"tag":95,"props":1505,"children":1506},{"style":108},[1507],{"type":37,"value":1508}," (",{"type":32,"tag":95,"props":1510,"children":1511},{"style":102},[1512],{"type":37,"value":472},{"type":32,"tag":95,"props":1514,"children":1515},{"style":138},[1516],{"type":37,"value":1517}," MAX",{"type":32,"tag":95,"props":1519,"children":1520},{"style":108},[1521],{"type":37,"value":1522},"(first_seen_at) ",{"type":32,"tag":95,"props":1524,"children":1525},{"style":102},[1526],{"type":37,"value":608},{"type":32,"tag":95,"props":1528,"children":1529},{"style":108},[1530],{"type":37,"value":1531}," {{ this }})\n",{"type":32,"tag":95,"props":1533,"children":1535},{"class":97,"line":1534},16,[1536],{"type":32,"tag":95,"props":1537,"children":1538},{"style":108},[1539],{"type":37,"value":1540},"{% endif %}\n",{"type":32,"tag":95,"props":1542,"children":1544},{"class":97,"line":1543},17,[1545,1549],{"type":32,"tag":95,"props":1546,"children":1547},{"style":102},[1548],{"type":37,"value":890},{"type":32,"tag":95,"props":1550,"children":1551},{"style":108},[1552],{"type":37,"value":193},{"type":32,"tag":33,"props":1554,"children":1555},{},[1556],{"type":37,"value":1557},"Dieses Modell verarbeitet beim ersten Durchlauf alle Daten, bei nachfolgenden Durchläufen nur neue Nutzer. Der Scan sinkt von 500 GB auf täglich 2 GB.",{"type":32,"tag":49,"props":1559,"children":1561},{"id":1560},"aggregierte-retention-tabelle-pre-compute-von-metriken-auf-wochenebene",[1562],{"type":37,"value":1563},"Aggregierte Retention-Tabelle: Pre-Compute von Metriken auf Wochenebene",{"type":32,"tag":33,"props":1565,"children":1566},{},[1567,1569,1574],{"type":37,"value":1568},"Die Cohort-Zuordnungstabelle beschleunigte die Retention-Abfrage, aber das Dashboard führt immer noch einen JOIN mit der ",{"type":32,"tag":40,"props":1570,"children":1572},{"className":1571},[],[1573],{"type":37,"value":521},{"type":37,"value":1575},"-Tabelle durch, wenn es eine Abfrage erhält. Ein weiterer Schritt: Pre-compute die Retention-Metriken auf Wochenbasis und speichere sie in einer separaten Tabelle.",{"type":32,"tag":85,"props":1577,"children":1579},{"className":87,"code":1578,"language":89,"meta":16,"style":16},"CREATE TABLE cohort_retention_weekly\nPARTITION BY cohort_week\nCLUSTER BY weeks_since_cohort\nAS\nSELECT \n  c.cohort_week,\n  DATE_DIFF(DATE_TRUNC(e.event_time, WEEK), c.cohort_week, WEEK) AS weeks_since_cohort,\n  COUNT(DISTINCT e.user_id) AS active_users,\n  COUNT(*) AS total_events,\n  APPROX_QUANTILES(session_duration, 100)[OFFSET(50)] AS median_session_duration\nFROM cohort_assignments c\nJOIN events e ON c.user_id = e.user_id\nGROUP BY 1, 2;\n",[1580],{"type":32,"tag":40,"props":1581,"children":1582},{"__ignoreMap":16},[1583,1599,1614,1630,1637,1648,1667,1730,1770,1799,1826,1837,1880],{"type":32,"tag":95,"props":1584,"children":1585},{"class":97,"line":98},[1586,1590,1594],{"type":32,"tag":95,"props":1587,"children":1588},{"style":102},[1589],{"type":37,"value":555},{"type":32,"tag":95,"props":1591,"children":1592},{"style":102},[1593],{"type":37,"value":726},{"type":32,"tag":95,"props":1595,"children":1596},{"style":729},[1597],{"type":37,"value":1598}," cohort_retention_weekly\n",{"type":32,"tag":95,"props":1600,"children":1601},{"class":97,"line":124},[1602,1606,1610],{"type":32,"tag":95,"props":1603,"children":1604},{"style":102},[1605],{"type":37,"value":740},{"type":32,"tag":95,"props":1607,"children":1608},{"style":102},[1609],{"type":37,"value":745},{"type":32,"tag":95,"props":1611,"children":1612},{"style":108},[1613],{"type":37,"value":165},{"type":32,"tag":95,"props":1615,"children":1616},{"class":97,"line":168},[1617,1621,1625],{"type":32,"tag":95,"props":1618,"children":1619},{"style":108},[1620],{"type":37,"value":757},{"type":32,"tag":95,"props":1622,"children":1623},{"style":102},[1624],{"type":37,"value":762},{"type":32,"tag":95,"props":1626,"children":1627},{"style":108},[1628],{"type":37,"value":1629}," weeks_since_cohort\n",{"type":32,"tag":95,"props":1631,"children":1632},{"class":97,"line":182},[1633],{"type":32,"tag":95,"props":1634,"children":1635},{"style":102},[1636],{"type":37,"value":565},{"type":32,"tag":95,"props":1638,"children":1639},{"class":97,"line":196},[1640,1644],{"type":32,"tag":95,"props":1641,"children":1642},{"style":102},[1643],{"type":37,"value":472},{"type":32,"tag":95,"props":1645,"children":1646},{"style":108},[1647],{"type":37,"value":232},{"type":32,"tag":95,"props":1649,"children":1650},{"class":97,"line":205},[1651,1655,1659,1663],{"type":32,"tag":95,"props":1652,"children":1653},{"style":138},[1654],{"type":37,"value":973},{"type":32,"tag":95,"props":1656,"children":1657},{"style":108},[1658],{"type":37,"value":246},{"type":32,"tag":95,"props":1660,"children":1661},{"style":138},[1662],{"type":37,"value":251},{"type":32,"tag":95,"props":1664,"children":1665},{"style":108},[1666],{"type":37,"value":256},{"type":32,"tag":95,"props":1668,"children":1669},{"class":97,"line":222},[1670,1674,1678,1682,1686,1690,1694,1698,1702,1706,1710,1714,1718,1722,1726],{"type":32,"tag":95,"props":1671,"children":1672},{"style":108},[1673],{"type":37,"value":993},{"type":32,"tag":95,"props":1675,"children":1676},{"style":138},[1677],{"type":37,"value":269},{"type":32,"tag":95,"props":1679,"children":1680},{"style":108},[1681],{"type":37,"value":246},{"type":32,"tag":95,"props":1683,"children":1684},{"style":138},[1685],{"type":37,"value":73},{"type":32,"tag":95,"props":1687,"children":1688},{"style":108},[1689],{"type":37,"value":67},{"type":32,"tag":95,"props":1691,"children":1692},{"style":102},[1693],{"type":37,"value":151},{"type":32,"tag":95,"props":1695,"children":1696},{"style":108},[1697],{"type":37,"value":290},{"type":32,"tag":95,"props":1699,"children":1700},{"style":138},[1701],{"type":37,"value":295},{"type":32,"tag":95,"props":1703,"children":1704},{"style":108},[1705],{"type":37,"value":246},{"type":32,"tag":95,"props":1707,"children":1708},{"style":138},[1709],{"type":37,"value":251},{"type":32,"tag":95,"props":1711,"children":1712},{"style":108},[1713],{"type":37,"value":67},{"type":32,"tag":95,"props":1715,"children":1716},{"style":102},[1717],{"type":37,"value":151},{"type":32,"tag":95,"props":1719,"children":1720},{"style":108},[1721],{"type":37,"value":156},{"type":32,"tag":95,"props":1723,"children":1724},{"style":102},[1725],{"type":37,"value":116},{"type":32,"tag":95,"props":1727,"children":1728},{"style":108},[1729],{"type":37,"value":324},{"type":32,"tag":95,"props":1731,"children":1732},{"class":97,"line":235},[1733,1737,1741,1745,1749,1753,1757,1761,1765],{"type":32,"tag":95,"props":1734,"children":1735},{"style":138},[1736],{"type":37,"value":1058},{"type":32,"tag":95,"props":1738,"children":1739},{"style":108},[1740],{"type":37,"value":338},{"type":32,"tag":95,"props":1742,"children":1743},{"style":102},[1744],{"type":37,"value":343},{"type":32,"tag":95,"props":1746,"children":1747},{"style":138},[1748],{"type":37,"value":348},{"type":32,"tag":95,"props":1750,"children":1751},{"style":108},[1752],{"type":37,"value":246},{"type":32,"tag":95,"props":1754,"children":1755},{"style":138},[1756],{"type":37,"value":65},{"type":32,"tag":95,"props":1758,"children":1759},{"style":108},[1760],{"type":37,"value":156},{"type":32,"tag":95,"props":1762,"children":1763},{"style":102},[1764],{"type":37,"value":116},{"type":32,"tag":95,"props":1766,"children":1767},{"style":108},[1768],{"type":37,"value":1769}," active_users,\n",{"type":32,"tag":95,"props":1771,"children":1772},{"class":97,"line":26},[1773,1777,1781,1786,1790,1794],{"type":32,"tag":95,"props":1774,"children":1775},{"style":138},[1776],{"type":37,"value":1058},{"type":32,"tag":95,"props":1778,"children":1779},{"style":108},[1780],{"type":37,"value":338},{"type":32,"tag":95,"props":1782,"children":1783},{"style":102},[1784],{"type":37,"value":1785},"*",{"type":32,"tag":95,"props":1787,"children":1788},{"style":108},[1789],{"type":37,"value":156},{"type":32,"tag":95,"props":1791,"children":1792},{"style":102},[1793],{"type":37,"value":116},{"type":32,"tag":95,"props":1795,"children":1796},{"style":108},[1797],{"type":37,"value":1798}," total_events,\n",{"type":32,"tag":95,"props":1800,"children":1801},{"class":97,"line":327},[1802,1807,1812,1817,1821],{"type":32,"tag":95,"props":1803,"children":1804},{"style":108},[1805],{"type":37,"value":1806},"  APPROX_QUANTILES(session_duration, ",{"type":32,"tag":95,"props":1808,"children":1809},{"style":138},[1810],{"type":37,"value":1811},"100",{"type":32,"tag":95,"props":1813,"children":1814},{"style":108},[1815],{"type":37,"value":1816},")[OFFSET(50)] ",{"type":32,"tag":95,"props":1818,"children":1819},{"style":102},[1820],{"type":37,"value":116},{"type":32,"tag":95,"props":1822,"children":1823},{"style":108},[1824],{"type":37,"value":1825}," median_session_duration\n",{"type":32,"tag":95,"props":1827,"children":1828},{"class":97,"line":372},[1829,1833],{"type":32,"tag":95,"props":1830,"children":1831},{"style":102},[1832],{"type":37,"value":608},{"type":32,"tag":95,"props":1834,"children":1835},{"style":108},[1836],{"type":37,"value":1102},{"type":32,"tag":95,"props":1838,"children":1839},{"class":97,"line":385},[1840,1844,1848,1852,1856,1860,1864,1868,1872,1876],{"type":32,"tag":95,"props":1841,"children":1842},{"style":102},[1843],{"type":37,"value":1110},{"type":32,"tag":95,"props":1845,"children":1846},{"style":108},[1847],{"type":37,"value":396},{"type":32,"tag":95,"props":1849,"children":1850},{"style":102},[1851],{"type":37,"value":401},{"type":32,"tag":95,"props":1853,"children":1854},{"style":138},[1855],{"type":37,"value":406},{"type":32,"tag":95,"props":1857,"children":1858},{"style":108},[1859],{"type":37,"value":246},{"type":32,"tag":95,"props":1861,"children":1862},{"style":138},[1863],{"type":37,"value":65},{"type":32,"tag":95,"props":1865,"children":1866},{"style":102},[1867],{"type":37,"value":419},{"type":32,"tag":95,"props":1869,"children":1870},{"style":138},[1871],{"type":37,"value":348},{"type":32,"tag":95,"props":1873,"children":1874},{"style":108},[1875],{"type":37,"value":246},{"type":32,"tag":95,"props":1877,"children":1878},{"style":138},[1879],{"type":37,"value":432},{"type":32,"tag":95,"props":1881,"children":1882},{"class":97,"line":435},[1883,1887,1891,1895,1899],{"type":32,"tag":95,"props":1884,"children":1885},{"style":102},[1886],{"type":37,"value":890},{"type":32,"tag":95,"props":1888,"children":1889},{"style":138},[1890],{"type":37,"value":445},{"type":32,"tag":95,"props":1892,"children":1893},{"style":108},[1894],{"type":37,"value":67},{"type":32,"tag":95,"props":1896,"children":1897},{"style":138},[1898],{"type":37,"value":505},{"type":32,"tag":95,"props":1900,"children":1901},{"style":108},[1902],{"type":37,"value":510},{"type":32,"tag":33,"props":1904,"children":1905},{},[1906],{"type":37,"value":900},{"type":32,"tag":902,"props":1908,"children":1909},{},[1910,1919,1944],{"type":32,"tag":649,"props":1911,"children":1912},{},[1913,1917],{"type":32,"tag":653,"props":1914,"children":1915},{},[1916],{"type":37,"value":940},{"type":37,"value":1918}," 52 Wochen × 52 weeks_since × 3 Metriken = ~8.100 Zeilen (für Daten eines Jahres). Im Kilobyte-Bereich.",{"type":32,"tag":649,"props":1920,"children":1921},{},[1922,1927,1929,1935,1937,1942],{"type":32,"tag":653,"props":1923,"children":1924},{},[1925],{"type":37,"value":1926},"Scan:",{"type":37,"value":1928}," Das Dashboard liest ",{"type":32,"tag":40,"props":1930,"children":1932},{"className":1931},[],[1933],{"type":37,"value":1934},"cohort_retention_weekly",{"type":37,"value":1936},", nicht ",{"type":32,"tag":40,"props":1938,"children":1940},{"className":1939},[],[1941],{"type":37,"value":521},{"type":37,"value":1943},". Scan \u003C 1 MB.",{"type":32,"tag":649,"props":1945,"children":1946},{},[1947,1952],{"type":32,"tag":653,"props":1948,"children":1949},{},[1950],{"type":37,"value":1951},"Latenz:",{"type":37,"value":1953}," BigQuery liest 1 MB Daten in 80 ms. Das Dashboard ist nun sub-second.",{"type":32,"tag":33,"props":1955,"children":1956},{},[1957,1959,1965],{"type":37,"value":1958},"Trade-off: Diese Tabelle muss täglich aktualisiert werden. Wenn veraltete Daten nicht akzeptabel sind, alle Stunde aktualisieren (dbt Schedule ",{"type":32,"tag":40,"props":1960,"children":1962},{"className":1961},[],[1963],{"type":37,"value":1964},"0 * * * *",{"type":37,"value":1966},"). Refresh-Kosten: cohort_assignments JOIN events, ~10 GB Scan. 24× täglich = 240 GB, monatlich 7,2 TB. Zum Vergleich: Hätte das Dashboard 1.000× die Cohort-Abfrage ausgeführt, wären es 8 TB Scan gewesen. Die aggregierte Tabelle reduzierte den Scan um ~10%, reduzierte aber die Latenz von 20 Sekunden auf 80 ms.",{"type":32,"tag":530,"props":1968,"children":1970},{"id":1969},"partitionierungsstrategie-cohort_week-vs-event_week",[1971],{"type":37,"value":1972},"Partitionierungsstrategie: cohort_week vs event_week",{"type":32,"tag":33,"props":1974,"children":1975},{},[1976,1978,1983,1985,1991],{"type":37,"value":1977},"Sollte die Cohort-Retention-Tabelle nach ",{"type":32,"tag":40,"props":1979,"children":1981},{"className":1980},[],[1982],{"type":37,"value":251},{"type":37,"value":1984}," oder ",{"type":32,"tag":40,"props":1986,"children":1988},{"className":1987},[],[1989],{"type":37,"value":1990},"event_week",{"type":37,"value":1992}," partitioniert werden? Es gibt zwei Ansätze:",{"type":32,"tag":33,"props":1994,"children":1995},{},[1996],{"type":32,"tag":653,"props":1997,"children":1998},{},[1999],{"type":37,"value":912},{"type":32,"tag":902,"props":2001,"children":2002},{},[2003,2008,2021],{"type":32,"tag":649,"props":2004,"children":2005},{},[2006],{"type":37,"value":2007},"Anwendungsfall: \"Was ist die Retention-Kurve von Cohort 2026-W03?\"",{"type":32,"tag":649,"props":2009,"children":2010},{},[2011,2013,2019],{"type":37,"value":2012},"Pruning: ",{"type":32,"tag":40,"props":2014,"children":2016},{"className":2015},[],[2017],{"type":37,"value":2018},"WHERE cohort_week = '2026-01-13'",{"type":37,"value":2020}," → 1 Partition wird gelesen",{"type":32,"tag":649,"props":2022,"children":2023},{},[2024],{"type":37,"value":2025},"Schwachstelle: Wenn das Dashboard \"gesamte Retention der letzten 4 Wochen\" abfragt, werden 4 Partitions gelesen. Aber da die meisten Retention-Analysen cohort-basiert sind, ist dies optimal.",{"type":32,"tag":33,"props":2027,"children":2028},{},[2029],{"type":32,"tag":653,"props":2030,"children":2031},{},[2032],{"type":37,"value":2033},"Partition nach event_week:",{"type":32,"tag":902,"props":2035,"children":2036},{},[2037,2042,2053],{"type":32,"tag":649,"props":2038,"children":2039},{},[2040],{"type":37,"value":2041},"Anwendungsfall: \"Welche Cohorts waren diese Woche aktiv?\"",{"type":32,"tag":649,"props":2043,"children":2044},{},[2045,2046,2052],{"type":37,"value":2012},{"type":32,"tag":40,"props":2047,"children":2049},{"className":2048},[],[2050],{"type":37,"value":2051},"WHERE event_week = '2026-07-21'",{"type":37,"value":2020},{"type":32,"tag":649,"props":2054,"children":2055},{},[2056],{"type":37,"value":2057},"Schwachstelle: Wenn ein Cohort-Filter hinzugefügt wird, funktioniert die Partition Pruning nicht, alle Partitions werden gelesen.",{"type":32,"tag":33,"props":2059,"children":2060},{},[2061,2063,2072],{"type":37,"value":2062},"Bei Roibase-",{"type":32,"tag":2064,"props":2065,"children":2069},"a",{"href":2066,"rel":2067},"https:\u002F\u002Fwww.roibase.com.tr\u002Fde\u002Fverianalizi",[2068],"nofollow",[2070],{"type":37,"value":2071},"Datenanalytik",{"type":37,"value":2073},"-Projekten werden Retention-Tabellen nach cohort_week partitioniert, weil 80% der Retention-Abfragen das Format \"Cohort X in Woche N\" haben.",{"type":32,"tag":49,"props":2075,"children":2077},{"id":2076},"query-kostenoptimierung-clustering-und-bi-engine",[2078],{"type":37,"value":2079},"Query-Kostenoptimierung: Clustering und BI Engine",{"type":32,"tag":33,"props":2081,"children":2082},{},[2083],{"type":37,"value":2084},"Partitionierung pruned von oben nach unten (welche Dateiveblöcke werden gelesen), Clustering sortiert von links nach rechts (welche Zeilen im Block werden gelesen). Zusammen minimiert dies den Scan.",{"type":32,"tag":85,"props":2086,"children":2088},{"className":87,"code":2087,"language":89,"meta":16,"style":16},"CREATE TABLE cohort_retention_weekly\nPARTITION BY cohort_week\nCLUSTER BY weeks_since_cohort, platform, country;\n",[2089],{"type":32,"tag":40,"props":2090,"children":2091},{"__ignoreMap":16},[2092,2107,2122],{"type":32,"tag":95,"props":2093,"children":2094},{"class":97,"line":98},[2095,2099,2103],{"type":32,"tag":95,"props":2096,"children":2097},{"style":102},[2098],{"type":37,"value":555},{"type":32,"tag":95,"props":2100,"children":2101},{"style":102},[2102],{"type":37,"value":726},{"type":32,"tag":95,"props":2104,"children":2105},{"style":729},[2106],{"type":37,"value":1598},{"type":32,"tag":95,"props":2108,"children":2109},{"class":97,"line":124},[2110,2114,2118],{"type":32,"tag":95,"props":2111,"children":2112},{"style":102},[2113],{"type":37,"value":740},{"type":32,"tag":95,"props":2115,"children":2116},{"style":102},[2117],{"type":37,"value":745},{"type":32,"tag":95,"props":2119,"children":2120},{"style":108},[2121],{"type":37,"value":165},{"type":32,"tag":95,"props":2123,"children":2124},{"class":97,"line":168},[2125,2129,2133],{"type":32,"tag":95,"props":2126,"children":2127},{"style":108},[2128],{"type":37,"value":757},{"type":32,"tag":95,"props":2130,"children":2131},{"style":102},[2132],{"type":37,"value":762},{"type":32,"tag":95,"props":2134,"children":2135},{"style":108},[2136],{"type":37,"value":2137}," weeks_since_cohort, platform, country;\n",{"type":32,"tag":33,"props":2139,"children":2140},{},[2141,2143,2149],{"type":37,"value":2142},"Wenn die Abfrage ",{"type":32,"tag":40,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":37,"value":2148},"WHERE weeks_since_cohort = 4 AND platform = 'iOS'",{"type":37,"value":2150}," ist:",{"type":32,"tag":645,"props":2152,"children":2153},{},[2154,2159],{"type":32,"tag":649,"props":2155,"children":2156},{},[2157],{"type":37,"value":2158},"Partition Pruning → nur relevante cohort_week Partitions",{"type":32,"tag":649,"props":2160,"children":2161},{},[2162,2164,2170,2172,2178],{"type":37,"value":2163},"Clustering → innerhalb der Partition zuerst ",{"type":32,"tag":40,"props":2165,"children":2167},{"className":2166},[],[2168],{"type":37,"value":2169},"weeks_since_cohort = 4",{"type":37,"value":2171}," Zeilen, dann ",{"type":32,"tag":40,"props":2173,"children":2175},{"className":2174},[],[2176],{"type":37,"value":2177},"platform = 'iOS'",{"type":37,"value":2179}," Zeilen",{"type":32,"tag":33,"props":2181,"children":2182},{},[2183],{"type":37,"value":2184},"BigQuery akzeptiert maximal 4 Clustering-Spalten. Die Reihenfolge ist wichtig: die am häufigsten gefilterte Spalte zuerst.",{"type":32,"tag":33,"props":2186,"children":2187},{},[2188,2193,2195,2200],{"type":32,"tag":653,"props":2189,"children":2190},{},[2191],{"type":37,"value":2192},"BI Engine:",{"type":37,"value":2194}," BigQuery's In-Memory-Cache-Layer. Wenn man 100 GB BI Engine reserviert, werden häufig verwendete Tabellen im RAM gespeichert. Wenn die ",{"type":32,"tag":40,"props":2196,"children":2198},{"className":2197},[],[2199],{"type":37,"value":1934},{"type":37,"value":2201},"-Tabelle 50 MB groß ist, bleibt sie komplett im BI Engine, Scan = 0 (Cache Hit). Kosten: 100 GB BI Engine = $100\u002FMonat. Gegenwert: monatlich 10 TB Scan-Einsparungen = $62,50. ROI ist positiv.",{"type":32,"tag":530,"props":2203,"children":2205},{"id":2204},"approximationsfunktionen-metriken-die-keine-exakte-genauigkeit-erfordern",[2206],{"type":37,"value":2207},"Approximationsfunktionen: Metriken, die keine exakte Genauigkeit erfordern",{"type":32,"tag":33,"props":2209,"children":2210},{},[2211,2213,2219],{"type":37,"value":2212},"Bei der Cohort-Retention-Berechnung müssen einige Metriken exakt sein (",{"type":32,"tag":40,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":37,"value":2218},"COUNT(DISTINCT user_id)",{"type":37,"value":2220},"), andere können Approximationen sein (Median Session Duration, Perzentile).",{"type":32,"tag":33,"props":2222,"children":2223},{},[2224],{"type":37,"value":2225},"BigQuery Approximationsfunktionen:",{"type":32,"tag":902,"props":2227,"children":2228},{},[2229,2240,2251],{"type":32,"tag":649,"props":2230,"children":2231},{},[2232,2238],{"type":32,"tag":40,"props":2233,"children":2235},{"className":2234},[],[2236],{"type":37,"value":2237},"APPROX_COUNT_DISTINCT(user_id)",{"type":37,"value":2239}," → Fehlertoleranz 2%, 10× schneller",{"type":32,"tag":649,"props":2241,"children":2242},{},[2243,2249],{"type":32,"tag":40,"props":2244,"children":2246},{"className":2245},[],[2247],{"type":37,"value":2248},"APPROX_QUANTILES(value, 100)[OFFSET(50)]",{"type":37,"value":2250}," → Median, Fehlertoleranz 1%",{"type":32,"tag":649,"props":2252,"children":2253},{},[2254,2260],{"type":32,"tag":40,"props":2255,"children":2257},{"className":2256},[],[2258],{"type":37,"value":2259},"APPROX_TOP_COUNT(event_name, 10)",{"type":37,"value":2261}," → Top 10 Events, Fehlertoleranz gering",{"type":32,"tag":33,"props":2263,"children":2264},{},[2265,2267,2273,2275,2281],{"type":37,"value":2266},"Beispiel: Für 50 Millionen Nutzer dauert exaktes ",{"type":32,"tag":40,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":37,"value":2272},"COUNT(DISTINCT ...)",{"type":37,"value":2274}," 8 Sekunden, ",{"type":32,"tag":40,"props":2276,"children":2278},{"className":2277},[],[2279],{"type":37,"value":2280},"APPROX_COUNT_DISTINCT",{"type":37,"value":2282}," 800 ms. Für Live-Filter im Dashboard Approximationen verwenden, für finale Berichte exakt.",{"type":32,"tag":49,"props":2284,"children":2286},{"id":2285},"inkrementelle-update-strategie-event-time-vs-processing-time",[2287],{"type":37,"value":2288},"Inkrementelle Update-Strategie: Event-Time vs Processing-Time",{"type":32,"tag":33,"props":2290,"children":2291},{},[2292],{"type":37,"value":2293},"Während die Cohort-Tabelle täglich aktualisiert wird, welche Events sollten verarbeitet werden? Es gibt zwei Timestamps:",{"type":32,"tag":645,"props":2295,"children":2296},{},[2297,2307],{"type":32,"tag":649,"props":2298,"children":2299},{},[2300,2305],{"type":32,"tag":653,"props":2301,"children":2302},{},[2303],{"type":37,"value":2304},"event_time:",{"type":37,"value":2306}," Zeitstempel, wann der Nutzer das Event durchgeführt hat (Client-seitig)",{"type":32,"tag":649,"props":2308,"children":2309},{},[2310,2315],{"type":32,"tag":653,"props":2311,"children":2312},{},[2313],{"type":37,"value":2314},"_PARTITIONTIME:",{"type":37,"value":2316}," Zeitstempel, wann BigQuery das Event gespeichert hat (Server-seitig)",{"type":32,"tag":33,"props":2318,"children":2319},{},[2320,2322,2327],{"type":37,"value":2321},"Wenn inkrementelle Aktualisierung ",{"type":32,"tag":40,"props":2323,"children":2325},{"className":2324},[],[2326],{"type":37,"value":73},{"type":37,"value":2328}," nutzt:",{"type":32,"tag":85,"props":2330,"children":2332},{"className":87,"code":2331,"language":89,"meta":16,"style":16},"WHERE event_time > (SELECT MAX(event_time) FROM cohort_assignments)\n",[2333],{"type":32,"tag":40,"props":2334,"children":2335},{"__ignoreMap":16},[2336],{"type":32,"tag":95,"props":2337,"children":2338},{"class":97,"line":98},[2339,2343,2347,2351,2355,2359,2363,2367,2371],{"type":32,"tag":95,"props":2340,"children":2341},{"style":102},[2342],{"type":37,"value":866},{"type":32,"tag":95,"props":2344,"children":2345},{"style":108},[2346],{"type":37,"value":871},{"type":32,"tag":95,"props":2348,"children":2349},{"style":102},[2350],{"type":37,"value":1503},{"type":32,"tag":95,"props":2352,"children":2353},{"style":108},[2354],{"type":37,"value":1508},{"type":32,"tag":95,"props":2356,"children":2357},{"style":102},[2358],{"type":37,"value":472},{"type":32,"tag":95,"props":2360,"children":2361},{"style":138},[2362],{"type":37,"value":1517},{"type":32,"tag":95,"props":2364,"children":2365},{"style":108},[2366],{"type":37,"value":838},{"type":32,"tag":95,"props":2368,"children":2369},{"style":102},[2370],{"type":37,"value":608},{"type":32,"tag":95,"props":2372,"children":2373},{"style":108},[2374],{"type":37,"value":2375}," cohort_assignments)\n",{"type":32,"tag":33,"props":2377,"children":2378},{},[2379,2384,2386,2391],{"type":32,"tag":653,"props":2380,"children":2381},{},[2382],{"type":37,"value":2383},"Problem:",{"type":37,"value":2385}," Late-arriving Events. Der Nutzer ist 3 Tage offline, Event kommt als Batch-Upload. Wenn ",{"type":32,"tag":40,"props":2387,"children":2389},{"className":2388},[],[2390],{"type":37,"value":73},{"type":37,"value":2392}," 3 Tage zurückliegt, verpasst die inkrementelle Abfrage es.",{"type":32,"tag":33,"props":2394,"children":2395},{},[2396,2397,2403],{"type":37,"value":2321},{"type":32,"tag":40,"props":2398,"children":2400},{"className":2399},[],[2401],{"type":37,"value":2402},"_PARTITIONTIME",{"type":37,"value":2404}," nutzt",{"type":32,"tag":2406,"props":2407,"children":2408},"style",{},[2409],{"type":37,"value":2410},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":168,"depth":168,"links":2412},[2413,2416,2419,2422,2425],{"id":51,"depth":124,"text":54,"children":2414},[2415],{"id":532,"depth":168,"text":535},{"id":685,"depth":124,"text":688,"children":2417},[2418],{"id":1221,"depth":168,"text":1224},{"id":1560,"depth":124,"text":1563,"children":2420},[2421],{"id":1969,"depth":168,"text":1972},{"id":2076,"depth":124,"text":2079,"children":2423},[2424],{"id":2204,"depth":168,"text":2207},{"id":2285,"depth":124,"text":2288},"markdown","content:de:data:cohort-table-architecture-scaling-retention-analysis-production.md","content","de\u002Fdata\u002Fcohort-table-architecture-scaling-retention-analysis-production.md","de\u002Fdata\u002Fcohort-table-architecture-scaling-retention-analysis-production","md",1785967477500]