{"id":8111,"date":"2026-01-26T09:39:55","date_gmt":"2026-01-26T08:39:55","guid":{"rendered":"https:\/\/launix.de\/launix\/?p=8111"},"modified":"2026-01-26T09:39:56","modified_gmt":"2026-01-26T08:39:56","slug":"warum-sql-datenbanken-immer-wieder-dasselbe-neu-ausrechnen","status":"publish","type":"post","link":"https:\/\/launix.de\/launix\/en\/warum-sql-datenbanken-immer-wieder-dasselbe-neu-ausrechnen\/","title":{"rendered":"Warum SQL-Datenbanken immer wieder dasselbe neu ausrechnen"},"content":{"rendered":"<p><em>(Ein Beitrag f\u00fcr SQL-Anf\u00e4nger und t\u00e4gliche Nutzer)<\/em><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Wenn du SQL nutzt, kennst du solche Abfragen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT customer_id, SUM(amount)\nFROM orders\nWHERE created_at &gt;= '2025-01-01'\nGROUP BY customer_id;<\/code><\/pre>\n\n\n\n<p>Du schreibst sowas jeden Tag.<br>F\u00fcr Reports. Dashboards. APIs. Hintergrundjobs.<\/p>\n\n\n\n<p>Und jedes Mal denkst du:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eWarum dauert das eigentlich immer so lange?\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>Die kurze Antwort:<br><strong>Weil die Datenbank jedes Mal wieder von vorne rechnet.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Das eigentliche Problem<\/h2>\n\n\n\n<p>Stell dir vor, du fragst deine Datenbank:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eWie viel Umsatz hat jeder Kunde dieses Jahr gemacht?\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>Am n\u00e4chsten Tag:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eWie viel Umsatz hat jeder Kunde diesen Monat gemacht?\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>Sp\u00e4ter:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eWie viel Umsatz hat Kunde 42 heute gemacht?\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>F\u00fcr dich ist das alles dieselbe Art von Frage.<br>F\u00fcr die Datenbank sind es komplett neue Berechnungen.<\/p>\n\n\n\n<p>Sie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>liest wieder Millionen Zeilen<\/li>\n\n\n\n<li>sortiert, gruppiert, summiert<\/li>\n\n\n\n<li>wirft das Ergebnis weg<\/li>\n\n\n\n<li>und f\u00e4ngt beim n\u00e4chsten Mal wieder von vorne an<\/li>\n<\/ul>\n\n\n\n<p>So arbeiten die meisten SQL-Datenbanken heute.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u201eAber Datenbanken sind doch schlau?\u201c<\/h2>\n\n\n\n<p>Ja \u2013 aber vor allem bei:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Suchen<\/li>\n\n\n\n<li>Filtern<\/li>\n\n\n\n<li>Joins<\/li>\n<\/ul>\n\n\n\n<p>Bei <strong>Summen, Z\u00e4hlungen und Gruppierungen<\/strong> gilt oft:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eRechne alles neu.\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>Und genau das ist das Problem.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Was Menschen intuitiv tun w\u00fcrden<\/h2>\n\n\n\n<p>Ein Mensch w\u00fcrde sagen:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eMoment \u2013 das habe ich doch gestern schon berechnet.<br>Ich merke mir das Ergebnis und passe es an, wenn neue Daten dazukommen.\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>Genau das nennt man <em>Aggregate Caching<\/em>.<\/p>\n\n\n\n<p>Oder einfacher:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Zwischenergebnisse merken, statt immer neu rechnen.<\/strong><\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Warum machen Datenbanken das nicht einfach?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Option 1: \u201eMach es selbst\u201c<\/h3>\n\n\n\n<p>Viele Systeme sagen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lege spezielle Tabellen an<\/li>\n\n\n\n<li>Pflege sie manuell<\/li>\n\n\n\n<li>baue Jobs zum Aktualisieren<\/li>\n<\/ul>\n\n\n\n<p>Problem:<br>\ud83d\udc49 Normale Entwickler wollen das nicht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option 2: \u201eWir merken uns das Ergebnis\u201c<\/h3>\n\n\n\n<p>Manche Datenbanken merken sich:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>exakt dieselbe Abfrage<\/li>\n\n\n\n<li>exakt dieselben Parameter<\/li>\n<\/ul>\n\n\n\n<p>Problem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>kleine \u00c4nderung \u2192 Cache nutzlos<\/li>\n\n\n\n<li>neue Daten \u2192 alles neu<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Das fehlende Feature<\/h2>\n\n\n\n<p>Was fast keine Open-Source-Datenbank heute kann:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eIch sehe, dass hier st\u00e4ndig \u00e4hnliche Summen berechnet werden.<br>Ich k\u00fcmmere mich selbst darum.\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>Ohne:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>neue Befehle<\/li>\n\n\n\n<li>neue Tabellen<\/li>\n\n\n\n<li>neue Konzepte<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Wie sich das ideal anf\u00fchlen m\u00fcsste<\/h2>\n\n\n\n<p>Du schreibst normales SQL.<\/p>\n\n\n\n<p>Am Anfang ist es langsam.<br>Nach ein paar Abfragen pl\u00f6tzlich schnell.<\/p>\n\n\n\n<p>Du hast:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>nichts konfiguriert<\/li>\n\n\n\n<li>nichts angelegt<\/li>\n\n\n\n<li>nichts gelernt<\/li>\n<\/ul>\n\n\n\n<p>Die Datenbank hat einfach gelernt:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eDiese Berechnung lohnt sich zu merken.\u201c<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Warum das schwer ist<\/h2>\n\n\n\n<p>Weil die Datenbank selbst entscheiden muss:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>was sich lohnt<\/li>\n\n\n\n<li>wie lange man es beh\u00e4lt<\/li>\n\n\n\n<li>was bei neuen Daten passiert<\/li>\n\n\n\n<li>was bei wenig Speicher passiert<\/li>\n<\/ul>\n\n\n\n<p>Das sind harte Probleme.<br>Aber sie sollten <strong>keine Entwicklerprobleme<\/strong> sein.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Ein normaler SQL-Nutzer sollte nicht wissen m\u00fcssen, was:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aggregate<\/li>\n\n\n\n<li>Caches<\/li>\n\n\n\n<li>Views<\/li>\n\n\n\n<li>Optimizer<\/li>\n<\/ul>\n\n\n\n<p>sind.<\/p>\n\n\n\n<p>Er sollte nur merken:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eMeine Abfragen werden mit der Zeit schneller \u2013 ganz von allein.\u201c<\/p>\n<\/blockquote>\n\n\n\n<p>Dass es dieses Verhalten in Open Source-Datenbanken wie MySQL und PostgreSQL 30 Jahre nach Erforschung dieser Techniken noch nicht gibt, ist eigentlich traurig.<\/p>\n\n\n\n<p>Deshalb schaut euch MemCP an:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/launix-de\/memcp\">https:\/\/github.com\/launix-de\/memcp<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>(Ein Beitrag f\u00fcr SQL-Anf\u00e4nger und t\u00e4gliche Nutzer)<\/p>","protected":false},"author":2,"featured_media":4842,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-8111","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","single-item"],"featured_image_urls_v2":{"full":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"thumbnail":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-150x150.png",150,150,true],"medium":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"medium_large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"1536x1536":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"2048x2048":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"trp-custom-language-flag":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",14,12,false],"xs-thumb":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-64x64.png",64,64,true],"appku-shop-single":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false]},"post_excerpt_stackable_v2":"<p>(Ein Beitrag f\u00fcr SQL-Anf\u00e4nger und t\u00e4gliche Nutzer) Wenn du SQL nutzt, kennst du solche Abfragen: SELECT customer_id, SUM(amount) FROM orders WHERE created_at &gt;= &#8216;2025-01-01&#8217; GROUP BY customer_id; Du schreibst sowas jeden Tag.F\u00fcr Reports. Dashboards. APIs. Hintergrundjobs. Und jedes Mal denkst du: \u201eWarum dauert das eigentlich immer so lange?\u201c Die kurze Antwort:Weil die Datenbank jedes Mal wieder von vorne rechnet. Das eigentliche Problem Stell dir vor, du fragst deine Datenbank: \u201eWie viel Umsatz hat jeder Kunde dieses Jahr gemacht?\u201c Am n\u00e4chsten Tag: \u201eWie viel Umsatz hat jeder Kunde diesen Monat gemacht?\u201c Sp\u00e4ter: \u201eWie viel Umsatz hat Kunde 42 heute gemacht?\u201c F\u00fcr&hellip;<\/p>\n","category_list_v2":"<a href=\"https:\/\/launix.de\/launix\/en\/category\/allgemein\/\" rel=\"category tag\">Allgemein<\/a>","author_info_v2":{"name":"Carl-Philip H\u00e4nsch","url":"https:\/\/launix.de\/launix\/en\/author\/carli\/"},"comments_num_v2":"0 comments","uagb_featured_image_src":{"full":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"thumbnail":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-150x150.png",150,150,true],"medium":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"medium_large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"1536x1536":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"2048x2048":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"trp-custom-language-flag":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",14,12,false],"xs-thumb":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-64x64.png",64,64,true],"appku-shop-single":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false]},"uagb_author_info":{"display_name":"Carl-Philip H\u00e4nsch","author_link":"https:\/\/launix.de\/launix\/en\/author\/carli\/"},"uagb_comment_info":0,"uagb_excerpt":"(Ein Beitrag f\u00fcr SQL-Anf\u00e4nger und t\u00e4gliche Nutzer)","_links":{"self":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts\/8111","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/comments?post=8111"}],"version-history":[{"count":1,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts\/8111\/revisions"}],"predecessor-version":[{"id":8112,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts\/8111\/revisions\/8112"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/media\/4842"}],"wp:attachment":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/media?parent=8111"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/categories?post=8111"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/tags?post=8111"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}