[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-nl-\u002Fblog\u002Fpostgresql-configuration-optimization-\u002Fblog\u002Fpostgresql-configuration-optimization":3,"blog-post-surround-nl-\u002Fblog\u002Fpostgresql-configuration-optimization-\u002Fblog\u002Fpostgresql-configuration-optimization":1342,"related-posts-nl-\u002Fblog\u002Fpostgresql-configuration-optimization-\u002Fblog\u002Fpostgresql-configuration-optimization":1353},{"id":4,"title":5,"authors":6,"badge":13,"body":15,"categories":1324,"date":1326,"description":1327,"extension":1328,"image":1329,"meta":1331,"navigation":287,"path":1332,"readingTime":549,"seo":1333,"stem":1334,"tags":1335,"__hash__":1341},"posts_nl\u002Fblog\u002F10.postgresql-configuration-optimization.md","PostgreSQL Configuratie: De Instellingen Die Ertoe Doen",[7],{"name":8,"to":9,"avatar":10,"bio":12},"Rob Schoenaker","https:\u002F\u002Flinkedin.com\u002Fin\u002Frobschoenaker",{"src":11},"\u002Fimages\u002Fteam\u002Frob.jpg","Managing Partner bij UpstreamAds en Partner bij Ludulicious B.V. met meer dan 20 jaar ervaring in softwareontwikkeling, gespecialiseerd in .NET Core, ServiceStack, C# en database design.",{"label":14},"Configuratie",{"type":16,"value":17,"toc":1297},"minimark",[18,23,27,33,49,54,96,107,111,114,119,133,137,142,145,181,186,218,224,228,231,256,261,317,322,348,354,358,361,396,400,432,437,441,445,448,478,482,485,727,731,745,750,754,758,761,786,790,793,833,873,917,921,935,940,944,1034,1038,1042,1053,1057,1068,1072,1083,1087,1098,1102,1113,1117,1120,1200,1204,1207,1210,1213,1233,1238,1246,1284,1287,1293],[19,20,22],"h2",{"id":21},"het-probleem-default-configuratie-is-niet-genoeg","Het Probleem: Default Configuratie Is Niet Genoeg",[24,25,26],"p",{},"In 2023 stonden we voor een kritieke database performance uitdaging. Onze PostgreSQL databases draaiden op default instellingen en presteerden ver onder hun potentieel. Query tijden waren inconsistent, geheugen gebruik was inefficiënt, en connection overhead was een constante bottleneck.",[24,28,29],{},[30,31,32],"strong",{},"De Uitdaging:",[34,35,36,40,43,46],"ul",{},[37,38,39],"li",{},"Default PostgreSQL instellingen geoptimaliseerd voor algemeen gebruik",[37,41,42],{},"Geheugen allocatie niet afgestemd op onze workloads",[37,44,45],{},"Connection management veroorzaakte overhead",[37,47,48],{},"Geen monitoring van configuratie drift",[24,50,51],{},[30,52,53],{},"De Cijfers:",[55,56,61],"pre",{"className":57,"code":58,"language":59,"meta":60,"style":60},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Default configuratie presteerde slecht\nSHOW shared_buffers;     -- 128MB (te laag voor onze workload)\nSHOW work_mem;           -- 4MB (te laag voor complexe queries)\nSHOW max_connections;    -- 100 (te hoog zonder pooling)\nSHOW effective_cache_size; -- 4GB (niet ingesteld)\n","sql","",[62,63,64,72,78,84,90],"code",{"__ignoreMap":60},[65,66,69],"span",{"class":67,"line":68},"line",1,[65,70,71],{},"-- Default configuratie presteerde slecht\n",[65,73,75],{"class":67,"line":74},2,[65,76,77],{},"SHOW shared_buffers;     -- 128MB (te laag voor onze workload)\n",[65,79,81],{"class":67,"line":80},3,[65,82,83],{},"SHOW work_mem;           -- 4MB (te laag voor complexe queries)\n",[65,85,87],{"class":67,"line":86},4,[65,88,89],{},"SHOW max_connections;    -- 100 (te hoog zonder pooling)\n",[65,91,93],{"class":67,"line":92},5,[65,94,95],{},"SHOW effective_cache_size; -- 4GB (niet ingesteld)\n",[24,97,98],{},[99,100],"img",{"alt":101,"className":102,"height":104,"src":105,"width":106},"PostgreSQL configuratie optimalisatie",[103],"rounded-lg",600,"https:\u002F\u002Fpicsum.photos\u002Fid\u002F12\u002F1000\u002F600",1000,[19,108,110],{"id":109},"de-oorzaak-ongeoptimaliseerde-configuratie","De Oorzaak: Ongeoptimaliseerde Configuratie",[24,112,113],{},"Het probleem was duidelijk uit onze monitoring:",[24,115,116],{},[30,117,118],{},"Wat er gebeurde:",[34,120,121,124,127,130],{},[37,122,123],{},"Default instellingen waren niet afgestemd op onze workloads",[37,125,126],{},"Geheugen allocatie was inefficiënt",[37,128,129],{},"Connection overhead veroorzaakte performance problemen",[37,131,132],{},"Geen monitoring van configuratie wijzigingen",[19,134,136],{"id":135},"de-oplossing-workload-specifieke-configuratie","De Oplossing: Workload-Specifieke Configuratie",[138,139,141],"h3",{"id":140},"stap-1-geheugen-optimalisatie","Stap 1: Geheugen Optimalisatie",[24,143,144],{},"De eerste doorbraak kwam met geheugen optimalisatie:",[55,146,148],{"className":57,"code":147,"language":59,"meta":60,"style":60},"-- Productie geheugen instellingen die ons probleem oplosten\nshared_buffers = 2GB                    -- 25% van RAM voor shared buffers\nwork_mem = 64MB                         -- Verhoogd voor complexe queries\nmaintenance_work_mem = 512MB            -- Voor VACUUM en CREATE INDEX\neffective_cache_size = 8GB              -- Totale beschikbare cache\ntemp_buffers = 8MB                      -- Voor tijdelijke tabellen\n",[62,149,150,155,160,165,170,175],{"__ignoreMap":60},[65,151,152],{"class":67,"line":68},[65,153,154],{},"-- Productie geheugen instellingen die ons probleem oplosten\n",[65,156,157],{"class":67,"line":74},[65,158,159],{},"shared_buffers = 2GB                    -- 25% van RAM voor shared buffers\n",[65,161,162],{"class":67,"line":80},[65,163,164],{},"work_mem = 64MB                         -- Verhoogd voor complexe queries\n",[65,166,167],{"class":67,"line":86},[65,168,169],{},"maintenance_work_mem = 512MB            -- Voor VACUUM en CREATE INDEX\n",[65,171,172],{"class":67,"line":92},[65,173,174],{},"effective_cache_size = 8GB              -- Totale beschikbare cache\n",[65,176,178],{"class":67,"line":177},6,[65,179,180],{},"temp_buffers = 8MB                      -- Voor tijdelijke tabellen\n",[24,182,183],{},[30,184,185],{},"Waarom Deze Instellingen Werken:",[34,187,188,194,200,206,212],{},[37,189,190,193],{},[62,191,192],{},"shared_buffers = 2GB",": Cacheert veelgebruikte data in geheugen, vermindert disk I\u002FO",[37,195,196,199],{},[62,197,198],{},"work_mem = 64MB",": Meer geheugen voor sort en hash operaties, verbetert query performance",[37,201,202,205],{},[62,203,204],{},"maintenance_work_mem = 512MB",": Snellere VACUUM en index operaties",[37,207,208,211],{},[62,209,210],{},"effective_cache_size = 8GB",": Helpt query planner betere beslissingen te maken",[37,213,214,217],{},[62,215,216],{},"temp_buffers = 8MB",": Snellere tijdelijke tabel operaties",[24,219,220,223],{},[30,221,222],{},"Immediate Resultaat:"," Query performance verbeterde met 40% voor complexe queries",[138,225,227],{"id":226},"stap-2-connection-pooling-implementatie","Stap 2: Connection Pooling Implementatie",[24,229,230],{},"Met betere geheugen configuratie werd connection management de bottleneck:",[55,232,234],{"className":57,"code":233,"language":59,"meta":60,"style":60},"-- Connection instellingen optimalisatie\nmax_connections = 50                    -- Verlaagd voor betere resource gebruik\nshared_preload_libraries = 'pg_stat_statements,pg_stat_activity'\ntrack_activity_query_size = 2048\n",[62,235,236,241,246,251],{"__ignoreMap":60},[65,237,238],{"class":67,"line":68},[65,239,240],{},"-- Connection instellingen optimalisatie\n",[65,242,243],{"class":67,"line":74},[65,244,245],{},"max_connections = 50                    -- Verlaagd voor betere resource gebruik\n",[65,247,248],{"class":67,"line":80},[65,249,250],{},"shared_preload_libraries = 'pg_stat_statements,pg_stat_activity'\n",[65,252,253],{"class":67,"line":86},[65,254,255],{},"track_activity_query_size = 2048\n",[24,257,258],{},[30,259,260],{},"PgBouncer Configuratie:",[55,262,266],{"className":263,"code":264,"language":265,"meta":60,"style":60},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# pgbouncer.ini\n[databases]\nproduction = host=localhost port=5432 dbname=production pool_size=25\n\n[pgbouncer]\npool_mode = transaction\nmax_client_conn = 200\ndefault_pool_size = 25\nserver_reset_query = DISCARD ALL\n","ini",[62,267,268,273,278,283,289,294,299,305,311],{"__ignoreMap":60},[65,269,270],{"class":67,"line":68},[65,271,272],{},"# pgbouncer.ini\n",[65,274,275],{"class":67,"line":74},[65,276,277],{},"[databases]\n",[65,279,280],{"class":67,"line":80},[65,281,282],{},"production = host=localhost port=5432 dbname=production pool_size=25\n",[65,284,285],{"class":67,"line":86},[65,286,288],{"emptyLinePlaceholder":287},true,"\n",[65,290,291],{"class":67,"line":92},[65,292,293],{},"[pgbouncer]\n",[65,295,296],{"class":67,"line":177},[65,297,298],{},"pool_mode = transaction\n",[65,300,302],{"class":67,"line":301},7,[65,303,304],{},"max_client_conn = 200\n",[65,306,308],{"class":67,"line":307},8,[65,309,310],{},"default_pool_size = 25\n",[65,312,314],{"class":67,"line":313},9,[65,315,316],{},"server_reset_query = DISCARD ALL\n",[24,318,319],{},[30,320,321],{},"Waarom Dit Werkt:",[34,323,324,330,336,342],{},[37,325,326,329],{},[62,327,328],{},"max_connections = 50",": Verlaagt resource overhead per connection",[37,331,332,335],{},[62,333,334],{},"pool_mode = transaction",": Hergebruikt connections over transacties",[37,337,338,341],{},[62,339,340],{},"pool_size = 25",": Onderhoudt 25 persistente connections naar PostgreSQL",[37,343,344,347],{},[62,345,346],{},"server_reset_query = DISCARD ALL",": Reset connections tussen transacties",[24,349,350,353],{},[30,351,352],{},"Resultaat:"," Connection overhead verminderde met 60%",[138,355,357],{"id":356},"stap-3-query-planner-optimalisatie","Stap 3: Query Planner Optimalisatie",[24,359,360],{},"Met betere connection management werd query planning de volgende bottleneck:",[55,362,364],{"className":57,"code":363,"language":59,"meta":60,"style":60},"-- Query planner instellingen\nrandom_page_cost = 1.1                  -- Voor SSD storage\nseq_page_cost = 1.0                    -- Baseline voor sequential reads\ncpu_tuple_cost = 0.01                  -- CPU kosten voor tuple processing\ncpu_index_tuple_cost = 0.005           -- CPU kosten voor index operaties\ncpu_operator_cost = 0.0025             -- CPU kosten voor operaties\n",[62,365,366,371,376,381,386,391],{"__ignoreMap":60},[65,367,368],{"class":67,"line":68},[65,369,370],{},"-- Query planner instellingen\n",[65,372,373],{"class":67,"line":74},[65,374,375],{},"random_page_cost = 1.1                  -- Voor SSD storage\n",[65,377,378],{"class":67,"line":80},[65,379,380],{},"seq_page_cost = 1.0                    -- Baseline voor sequential reads\n",[65,382,383],{"class":67,"line":86},[65,384,385],{},"cpu_tuple_cost = 0.01                  -- CPU kosten voor tuple processing\n",[65,387,388],{"class":67,"line":92},[65,389,390],{},"cpu_index_tuple_cost = 0.005           -- CPU kosten voor index operaties\n",[65,392,393],{"class":67,"line":177},[65,394,395],{},"cpu_operator_cost = 0.0025             -- CPU kosten voor operaties\n",[24,397,398],{},[30,399,185],{},[34,401,402,408,414,420,426],{},[37,403,404,407],{},[62,405,406],{},"random_page_cost = 1.1",": Reflecteert SSD performance voor random reads",[37,409,410,413],{},[62,411,412],{},"seq_page_cost = 1.0",": Baseline voor sequential reads",[37,415,416,419],{},[62,417,418],{},"cpu_tuple_cost = 0.01",": Helpt planner CPU vs I\u002FO kosten te balanceren",[37,421,422,425],{},[62,423,424],{},"cpu_index_tuple_cost = 0.005",": Optimaliseert index gebruik",[37,427,428,431],{},[62,429,430],{},"cpu_operator_cost = 0.0025",": Helpt planner operatie kosten te schatten",[24,433,434,436],{},[30,435,352],{}," Query planner maakte betere beslissingen, 25% snellere queries",[19,438,440],{"id":439},"de-game-changer-geautomatiseerde-configuratie-monitoring","De Game Changer: Geautomatiseerde Configuratie Monitoring",[138,442,444],{"id":443},"het-probleem-configuratie-drift","Het Probleem: Configuratie Drift",[24,446,447],{},"Zelfs met optimalisatie dreven configuraties weg van optimale instellingen:",[55,449,451],{"className":57,"code":450,"language":59,"meta":60,"style":60},"-- Probleem: Configuratie drift over tijd\nSELECT name, setting, unit, context \nFROM pg_settings \nWHERE name IN ('shared_buffers', 'work_mem', 'max_connections')\nORDER BY name;\n",[62,452,453,458,463,468,473],{"__ignoreMap":60},[65,454,455],{"class":67,"line":68},[65,456,457],{},"-- Probleem: Configuratie drift over tijd\n",[65,459,460],{"class":67,"line":74},[65,461,462],{},"SELECT name, setting, unit, context \n",[65,464,465],{"class":67,"line":80},[65,466,467],{},"FROM pg_settings \n",[65,469,470],{"class":67,"line":86},[65,471,472],{},"WHERE name IN ('shared_buffers', 'work_mem', 'max_connections')\n",[65,474,475],{"class":67,"line":92},[65,476,477],{},"ORDER BY name;\n",[138,479,481],{"id":480},"de-oplossing-configuratie-monitoring-dashboard","De Oplossing: Configuratie Monitoring Dashboard",[24,483,484],{},"We implementeerden uitgebreide configuratie monitoring:",[55,486,488],{"className":57,"code":487,"language":59,"meta":60,"style":60},"-- Configuratie monitoring view\nCREATE VIEW config_monitoring AS\nSELECT \n    name,\n    setting,\n    unit,\n    context,\n    CASE \n        WHEN name = 'shared_buffers' AND setting::int \u003C 1024 THEN 'WARNING: shared_buffers te laag'\n        WHEN name = 'work_mem' AND setting::int \u003C 32 THEN 'WARNING: work_mem te laag'\n        WHEN name = 'max_connections' AND setting::int > 100 THEN 'WARNING: max_connections te hoog'\n        ELSE 'OK'\n    END as status\nFROM pg_settings \nWHERE name IN ('shared_buffers', 'work_mem', 'max_connections', 'effective_cache_size');\n\n-- Geautomatiseerde configuratie validatie functie\nCREATE OR REPLACE FUNCTION validate_configuration()\nRETURNS TABLE(config_name text, current_value text, recommended_value text, status text) AS $$\nBEGIN\n    RETURN QUERY\n    SELECT \n        'shared_buffers'::text,\n        (SELECT setting FROM pg_settings WHERE name = 'shared_buffers'),\n        '2GB'::text,\n        CASE \n            WHEN (SELECT setting::int FROM pg_settings WHERE name = 'shared_buffers') \u003C 1024 \n            THEN 'NEEDS_ATTENTION'::text\n            ELSE 'OK'::text\n        END\n    UNION ALL\n    SELECT \n        'work_mem'::text,\n        (SELECT setting FROM pg_settings WHERE name = 'work_mem'),\n        '64MB'::text,\n        CASE \n            WHEN (SELECT setting::int FROM pg_settings WHERE name = 'work_mem') \u003C 32 \n            THEN 'NEEDS_ATTENTION'::text\n            ELSE 'OK'::text\n        END;\nEND;\n$$ LANGUAGE plpgsql;\n",[62,489,490,495,500,505,510,515,520,525,530,535,541,547,553,559,564,570,575,581,587,593,599,605,611,617,623,629,635,641,647,653,659,665,670,676,682,688,693,699,704,709,715,721],{"__ignoreMap":60},[65,491,492],{"class":67,"line":68},[65,493,494],{},"-- Configuratie monitoring view\n",[65,496,497],{"class":67,"line":74},[65,498,499],{},"CREATE VIEW config_monitoring AS\n",[65,501,502],{"class":67,"line":80},[65,503,504],{},"SELECT \n",[65,506,507],{"class":67,"line":86},[65,508,509],{},"    name,\n",[65,511,512],{"class":67,"line":92},[65,513,514],{},"    setting,\n",[65,516,517],{"class":67,"line":177},[65,518,519],{},"    unit,\n",[65,521,522],{"class":67,"line":301},[65,523,524],{},"    context,\n",[65,526,527],{"class":67,"line":307},[65,528,529],{},"    CASE \n",[65,531,532],{"class":67,"line":313},[65,533,534],{},"        WHEN name = 'shared_buffers' AND setting::int \u003C 1024 THEN 'WARNING: shared_buffers te laag'\n",[65,536,538],{"class":67,"line":537},10,[65,539,540],{},"        WHEN name = 'work_mem' AND setting::int \u003C 32 THEN 'WARNING: work_mem te laag'\n",[65,542,544],{"class":67,"line":543},11,[65,545,546],{},"        WHEN name = 'max_connections' AND setting::int > 100 THEN 'WARNING: max_connections te hoog'\n",[65,548,550],{"class":67,"line":549},12,[65,551,552],{},"        ELSE 'OK'\n",[65,554,556],{"class":67,"line":555},13,[65,557,558],{},"    END as status\n",[65,560,562],{"class":67,"line":561},14,[65,563,467],{},[65,565,567],{"class":67,"line":566},15,[65,568,569],{},"WHERE name IN ('shared_buffers', 'work_mem', 'max_connections', 'effective_cache_size');\n",[65,571,573],{"class":67,"line":572},16,[65,574,288],{"emptyLinePlaceholder":287},[65,576,578],{"class":67,"line":577},17,[65,579,580],{},"-- Geautomatiseerde configuratie validatie functie\n",[65,582,584],{"class":67,"line":583},18,[65,585,586],{},"CREATE OR REPLACE FUNCTION validate_configuration()\n",[65,588,590],{"class":67,"line":589},19,[65,591,592],{},"RETURNS TABLE(config_name text, current_value text, recommended_value text, status text) AS $$\n",[65,594,596],{"class":67,"line":595},20,[65,597,598],{},"BEGIN\n",[65,600,602],{"class":67,"line":601},21,[65,603,604],{},"    RETURN QUERY\n",[65,606,608],{"class":67,"line":607},22,[65,609,610],{},"    SELECT \n",[65,612,614],{"class":67,"line":613},23,[65,615,616],{},"        'shared_buffers'::text,\n",[65,618,620],{"class":67,"line":619},24,[65,621,622],{},"        (SELECT setting FROM pg_settings WHERE name = 'shared_buffers'),\n",[65,624,626],{"class":67,"line":625},25,[65,627,628],{},"        '2GB'::text,\n",[65,630,632],{"class":67,"line":631},26,[65,633,634],{},"        CASE \n",[65,636,638],{"class":67,"line":637},27,[65,639,640],{},"            WHEN (SELECT setting::int FROM pg_settings WHERE name = 'shared_buffers') \u003C 1024 \n",[65,642,644],{"class":67,"line":643},28,[65,645,646],{},"            THEN 'NEEDS_ATTENTION'::text\n",[65,648,650],{"class":67,"line":649},29,[65,651,652],{},"            ELSE 'OK'::text\n",[65,654,656],{"class":67,"line":655},30,[65,657,658],{},"        END\n",[65,660,662],{"class":67,"line":661},31,[65,663,664],{},"    UNION ALL\n",[65,666,668],{"class":67,"line":667},32,[65,669,610],{},[65,671,673],{"class":67,"line":672},33,[65,674,675],{},"        'work_mem'::text,\n",[65,677,679],{"class":67,"line":678},34,[65,680,681],{},"        (SELECT setting FROM pg_settings WHERE name = 'work_mem'),\n",[65,683,685],{"class":67,"line":684},35,[65,686,687],{},"        '64MB'::text,\n",[65,689,691],{"class":67,"line":690},36,[65,692,634],{},[65,694,696],{"class":67,"line":695},37,[65,697,698],{},"            WHEN (SELECT setting::int FROM pg_settings WHERE name = 'work_mem') \u003C 32 \n",[65,700,702],{"class":67,"line":701},38,[65,703,646],{},[65,705,707],{"class":67,"line":706},39,[65,708,652],{},[65,710,712],{"class":67,"line":711},40,[65,713,714],{},"        END;\n",[65,716,718],{"class":67,"line":717},41,[65,719,720],{},"END;\n",[65,722,724],{"class":67,"line":723},42,[65,725,726],{},"$$ LANGUAGE plpgsql;\n",[24,728,729],{},[30,730,321],{},[34,732,733,736,739,742],{},[37,734,735],{},"Monitort kritieke configuratie instellingen",[37,737,738],{},"Detecteert configuratie drift automatisch",[37,740,741],{},"Biedt aanbevelingen voor optimale instellingen",[37,743,744],{},"Voorkomt performance degradatie door configuratie wijzigingen",[24,746,747,749],{},[30,748,352],{}," Consistente performance door configuratie stabiliteit",[19,751,753],{"id":752},"de-finale-optimalisatie-workload-specifieke-tuning","De Finale Optimalisatie: Workload-Specifieke Tuning",[138,755,757],{"id":756},"het-probleem-one-size-fits-all-configuratie","Het Probleem: One-Size-Fits-All Configuratie",[24,759,760],{},"Zelfs met monitoring waren configuraties niet afgestemd op specifieke workloads:",[55,762,764],{"className":57,"code":763,"language":59,"meta":60,"style":60},"-- Probleem: Dezelfde configuratie voor alle workloads\n-- Duikersgids: Spatial queries, grote datasets\n-- Rijmwoordenboek: Text search, veel kleine queries\n-- UpstreamAds: Write-heavy, veel transacties\n",[62,765,766,771,776,781],{"__ignoreMap":60},[65,767,768],{"class":67,"line":68},[65,769,770],{},"-- Probleem: Dezelfde configuratie voor alle workloads\n",[65,772,773],{"class":67,"line":74},[65,774,775],{},"-- Duikersgids: Spatial queries, grote datasets\n",[65,777,778],{"class":67,"line":80},[65,779,780],{},"-- Rijmwoordenboek: Text search, veel kleine queries\n",[65,782,783],{"class":67,"line":86},[65,784,785],{},"-- UpstreamAds: Write-heavy, veel transacties\n",[138,787,789],{"id":788},"de-oplossing-workload-specifieke-configuraties","De Oplossing: Workload-Specifieke Configuraties",[24,791,792],{},"We implementeerden workload-specifieke configuraties:",[55,794,796],{"className":57,"code":795,"language":59,"meta":60,"style":60},"-- Duikersgids configuratie (spatial queries, grote datasets)\n-- postgresql-duikersgids.conf\nshared_buffers = 4GB                    -- Meer geheugen voor grote datasets\nwork_mem = 128MB                       -- Voor complexe spatial queries\nmaintenance_work_mem = 1GB             -- Voor spatial index operaties\neffective_cache_size = 16GB            -- Reflecteert beschikbare RAM\nrandom_page_cost = 1.0                 -- SSD optimalisatie\n",[62,797,798,803,808,813,818,823,828],{"__ignoreMap":60},[65,799,800],{"class":67,"line":68},[65,801,802],{},"-- Duikersgids configuratie (spatial queries, grote datasets)\n",[65,804,805],{"class":67,"line":74},[65,806,807],{},"-- postgresql-duikersgids.conf\n",[65,809,810],{"class":67,"line":80},[65,811,812],{},"shared_buffers = 4GB                    -- Meer geheugen voor grote datasets\n",[65,814,815],{"class":67,"line":86},[65,816,817],{},"work_mem = 128MB                       -- Voor complexe spatial queries\n",[65,819,820],{"class":67,"line":92},[65,821,822],{},"maintenance_work_mem = 1GB             -- Voor spatial index operaties\n",[65,824,825],{"class":67,"line":177},[65,826,827],{},"effective_cache_size = 16GB            -- Reflecteert beschikbare RAM\n",[65,829,830],{"class":67,"line":301},[65,831,832],{},"random_page_cost = 1.0                 -- SSD optimalisatie\n",[55,834,836],{"className":57,"code":835,"language":59,"meta":60,"style":60},"-- Rijmwoordenboek configuratie (text search, veel kleine queries)\n-- postgresql-rijmwoordenboek.conf\nshared_buffers = 1GB                   -- Geoptimaliseerd voor text search\nwork_mem = 32MB                        -- Voor text search operaties\nmaintenance_work_mem = 256MB           -- Voor text index operaties\neffective_cache_size = 8GB             -- Reflecteert beschikbare RAM\nenable_seqscan = off                    -- Forceer index gebruik voor text search\n",[62,837,838,843,848,853,858,863,868],{"__ignoreMap":60},[65,839,840],{"class":67,"line":68},[65,841,842],{},"-- Rijmwoordenboek configuratie (text search, veel kleine queries)\n",[65,844,845],{"class":67,"line":74},[65,846,847],{},"-- postgresql-rijmwoordenboek.conf\n",[65,849,850],{"class":67,"line":80},[65,851,852],{},"shared_buffers = 1GB                   -- Geoptimaliseerd voor text search\n",[65,854,855],{"class":67,"line":86},[65,856,857],{},"work_mem = 32MB                        -- Voor text search operaties\n",[65,859,860],{"class":67,"line":92},[65,861,862],{},"maintenance_work_mem = 256MB           -- Voor text index operaties\n",[65,864,865],{"class":67,"line":177},[65,866,867],{},"effective_cache_size = 8GB             -- Reflecteert beschikbare RAM\n",[65,869,870],{"class":67,"line":301},[65,871,872],{},"enable_seqscan = off                    -- Forceer index gebruik voor text search\n",[55,874,876],{"className":57,"code":875,"language":59,"meta":60,"style":60},"-- UpstreamAds configuratie (write-heavy, veel transacties)\n-- postgresql-upstreamads.conf\nshared_buffers = 2GB                   -- Geoptimaliseerd voor write performance\nwork_mem = 64MB                        -- Voor write operaties\nmaintenance_work_mem = 512MB           -- Voor write-heavy maintenance\neffective_cache_size = 8GB             -- Reflecteert beschikbare RAM\nwal_buffers = 16MB                     -- Voor write performance\ncheckpoint_completion_target = 0.9     -- Voor write performance\n",[62,877,878,883,888,893,898,903,907,912],{"__ignoreMap":60},[65,879,880],{"class":67,"line":68},[65,881,882],{},"-- UpstreamAds configuratie (write-heavy, veel transacties)\n",[65,884,885],{"class":67,"line":74},[65,886,887],{},"-- postgresql-upstreamads.conf\n",[65,889,890],{"class":67,"line":80},[65,891,892],{},"shared_buffers = 2GB                   -- Geoptimaliseerd voor write performance\n",[65,894,895],{"class":67,"line":86},[65,896,897],{},"work_mem = 64MB                        -- Voor write operaties\n",[65,899,900],{"class":67,"line":92},[65,901,902],{},"maintenance_work_mem = 512MB           -- Voor write-heavy maintenance\n",[65,904,905],{"class":67,"line":177},[65,906,867],{},[65,908,909],{"class":67,"line":301},[65,910,911],{},"wal_buffers = 16MB                     -- Voor write performance\n",[65,913,914],{"class":67,"line":307},[65,915,916],{},"checkpoint_completion_target = 0.9     -- Voor write performance\n",[24,918,919],{},[30,920,321],{},[34,922,923,926,929,932],{},[37,924,925],{},"Elke workload heeft geoptimaliseerde instellingen",[37,927,928],{},"Spatial queries krijgen meer geheugen voor complexe operaties",[37,930,931],{},"Text search wordt geforceerd om indexes te gebruiken",[37,933,934],{},"Write-heavy workloads krijgen WAL optimalisatie",[24,936,937,939],{},[30,938,352],{}," Workload-specifieke performance verbeteringen van 30-50%",[19,941,943],{"id":942},"performance-resultaten-samenvatting","Performance Resultaten Samenvatting",[945,946,947,963],"table",{},[948,949,950],"thead",{},[951,952,953,957,960],"tr",{},[954,955,956],"th",{},"Optimalisatie Stap",[954,958,959],{},"Performance Verbetering",[954,961,962],{},"Configuratie Focus",[964,965,966,980,993,1006,1019],"tbody",{},[951,967,968,974,977],{},[969,970,971],"td",{},[30,972,973],{},"Geheugen Optimalisatie",[969,975,976],{},"40% snellere queries",[969,978,979],{},"shared_buffers, work_mem",[951,981,982,987,990],{},[969,983,984],{},[30,985,986],{},"Connection Pooling",[969,988,989],{},"60% minder overhead",[969,991,992],{},"max_connections, PgBouncer",[951,994,995,1000,1003],{},[969,996,997],{},[30,998,999],{},"Query Planner Tuning",[969,1001,1002],{},"25% snellere queries",[969,1004,1005],{},"random_page_cost, CPU costs",[951,1007,1008,1013,1016],{},[969,1009,1010],{},[30,1011,1012],{},"Configuratie Monitoring",[969,1014,1015],{},"Consistente performance",[969,1017,1018],{},"Automatische validatie",[951,1020,1021,1026,1029],{},[969,1022,1023],{},[30,1024,1025],{},"Workload-Specifieke Tuning",[969,1027,1028],{},"30-50% verbetering",[969,1030,1031],{},[30,1032,1033],{},"Workload-geoptimaliseerde configs",[19,1035,1037],{"id":1036},"belangrijkste-lessen-geleerd","Belangrijkste Lessen Geleerd",[138,1039,1041],{"id":1040},"_1-default-configuratie-is-niet-genoeg","1. Default Configuratie Is Niet Genoeg",[34,1043,1044,1047,1050],{},[37,1045,1046],{},"PostgreSQL default instellingen zijn geoptimaliseerd voor algemeen gebruik",[37,1048,1049],{},"Workload-specifieke configuratie is essentieel voor optimale performance",[37,1051,1052],{},"Geheugen allocatie heeft de grootste impact op performance",[138,1054,1056],{"id":1055},"_2-connection-pooling-is-kritiek","2. Connection Pooling Is Kritiek",[34,1058,1059,1062,1065],{},[37,1060,1061],{},"Te veel connections veroorzaken resource overhead",[37,1063,1064],{},"PgBouncer elimineert connection overhead",[37,1066,1067],{},"Transaction-level pooling is ideaal voor meeste workloads",[138,1069,1071],{"id":1070},"_3-query-planner-tuning-maakt-uit","3. Query Planner Tuning Maakt Uit",[34,1073,1074,1077,1080],{},[37,1075,1076],{},"Cost parameters moeten afgestemd zijn op je hardware",[37,1078,1079],{},"SSD storage vereist andere instellingen dan traditionele disks",[37,1081,1082],{},"CPU vs I\u002FO kosten balanceren is cruciaal",[138,1084,1086],{"id":1085},"_4-monitoring-voorkomt-drift","4. Monitoring Voorkomt Drift",[34,1088,1089,1092,1095],{},[37,1090,1091],{},"Configuraties kunnen over tijd wegdrift van optimale instellingen",[37,1093,1094],{},"Geautomatiseerde monitoring voorkomt performance degradatie",[37,1096,1097],{},"Regelmatige validatie behoudt optimale performance",[138,1099,1101],{"id":1100},"_5-workload-specifieke-configuratie-schaal","5. Workload-Specifieke Configuratie Schaal",[34,1103,1104,1107,1110],{},[37,1105,1106],{},"Verschillende workloads hebben verschillende optimalisatie behoeften",[37,1108,1109],{},"Spatial queries hebben andere instellingen nodig dan text search",[37,1111,1112],{},"Write-heavy workloads vereisen andere configuratie dan read-heavy",[19,1114,1116],{"id":1115},"implementatie-checklist","Implementatie Checklist",[24,1118,1119],{},"Als je PostgreSQL configuratie wilt optimaliseren:",[34,1121,1124,1137,1146,1155,1164,1173,1182,1191],{"className":1122},[1123],"contains-task-list",[37,1125,1128,1132,1133,1136],{"className":1126},[1127],"task-list-item",[1129,1130],"input",{"disabled":287,"type":1131},"checkbox"," ",[30,1134,1135],{},"Analyseer je workload",": Identificeer query patronen en resource gebruik",[37,1138,1140,1132,1142,1145],{"className":1139},[1127],[1129,1141],{"disabled":287,"type":1131},[30,1143,1144],{},"Optimaliseer geheugen instellingen",": Configureer shared_buffers, work_mem",[37,1147,1149,1132,1151,1154],{"className":1148},[1127],[1129,1150],{"disabled":287,"type":1131},[30,1152,1153],{},"Implementeer connection pooling",": Gebruik PgBouncer voor connection management",[37,1156,1158,1132,1160,1163],{"className":1157},[1127],[1129,1159],{"disabled":287,"type":1131},[30,1161,1162],{},"Tune query planner",": Pas cost parameters aan op je hardware",[37,1165,1167,1132,1169,1172],{"className":1166},[1127],[1129,1168],{"disabled":287,"type":1131},[30,1170,1171],{},"Voeg configuratie monitoring toe",": Automatiseer configuratie validatie",[37,1174,1176,1132,1178,1181],{"className":1175},[1127],[1129,1177],{"disabled":287,"type":1131},[30,1179,1180],{},"Implementeer workload-specifieke configs",": Maak configuraties per workload",[37,1183,1185,1132,1187,1190],{"className":1184},[1127],[1129,1186],{"disabled":287,"type":1131},[30,1188,1189],{},"Monitor performance",": Track query tijden en resource gebruik",[37,1192,1194,1132,1196,1199],{"className":1193},[1127],[1129,1195],{"disabled":287,"type":1131},[30,1197,1198],{},"Test onder belasting",": Zorg dat performance behouden blijft tijdens piekgebruik",[19,1201,1203],{"id":1202},"samenvatting","Samenvatting",[24,1205,1206],{},"Het optimaliseren van PostgreSQL configuratie vereist een uitgebreide aanpak. Door geheugen optimalisatie, connection pooling, query planner tuning, geautomatiseerde monitoring en workload-specifieke configuraties te combineren, bereikten we significante performance verbeteringen voor al onze databases.",[24,1208,1209],{},"De sleutel was begrijpen dat configuratie optimalisatie niet alleen gaat over het instellen van parameters—het gaat over het creëren van een complete configuratie strategie die afgestemd is op je specifieke workloads en hardware.",[24,1211,1212],{},"Als dit artikel je hielp PostgreSQL configuratie te begrijpen, kunnen we je helpen deze technieken te implementeren in je eigen databases. Bij Ludulicious specialiseren we ons in:",[34,1214,1215,1221,1227],{},[37,1216,1217,1220],{},[30,1218,1219],{},"Database Configuratie Optimalisatie",": Workload-specifieke PostgreSQL tuning",[37,1222,1223,1226],{},[30,1224,1225],{},"Performance Monitoring",": Geautomatiseerde configuratie en performance monitoring",[37,1228,1229,1232],{},[30,1230,1231],{},"Custom Development",": Op maat gemaakte database oplossingen",[24,1234,1235],{},[30,1236,1237],{},"Klaar om je PostgreSQL configuratie te optimaliseren?",[24,1239,1240,1245],{},[1241,1242,1244],"a",{"href":1243},"\u002Fcontact","Neem contact op"," voor een gratis consultatie, of bekijk onze andere optimalisatie gidsen:",[34,1247,1248,1254,1260,1266,1272,1278],{},[37,1249,1250],{},[1241,1251,1253],{"href":1252},"\u002Fblog\u002Fpostgresql-performance-strategy","PostgreSQL Performance Tuning: Strategische Lessen uit Productie",[37,1255,1256],{},[1241,1257,1259],{"href":1258},"\u002Fblog\u002Fduikersgids-ruimtelijk-zoeken-optimalisatie","Duikersgids: Hoe Ik Ruimtelijk Zoeken 55x Sneller Maakte",[37,1261,1262],{},[1241,1263,1265],{"href":1264},"\u002Fblog\u002Frijmwoordenboek-fonetische-zoekoptimalisatie","Rijmwoordenboek: Het 3-Seconden Fonetische Zoekprobleem Oplossen",[37,1267,1268],{},[1241,1269,1271],{"href":1270},"\u002Fblog\u002Frijmwoordenboek-caching-optimization","Rijmwoordenboek: Pagina's Onder 15ms Met Betere Caching",[37,1273,1274],{},[1241,1275,1277],{"href":1276},"\u002Fblog\u002Fupstreamads-fulltext-zoekoptimalisatie","UpstreamAds: Van 1.2s naar 35ms Full-Text Zoeken",[37,1279,1280],{},[1241,1281,1283],{"href":1282},"\u002Fblog\u002Fupstreamads-wal-optimization","UpstreamAds: Write Performance Oplossen Met WAL Optimalisatie",[1285,1286],"hr",{},[24,1288,1289],{},[1290,1291,1292],"em",{},"Deze optimalisatie case study is gebaseerd op echte productie ervaring met PostgreSQL databases. Alle performance cijfers zijn van echte productie systemen.",[1294,1295,1296],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":60,"searchDepth":74,"depth":74,"links":1298},[1299,1300,1301,1306,1310,1314,1315,1322,1323],{"id":21,"depth":74,"text":22},{"id":109,"depth":74,"text":110},{"id":135,"depth":74,"text":136,"children":1302},[1303,1304,1305],{"id":140,"depth":80,"text":141},{"id":226,"depth":80,"text":227},{"id":356,"depth":80,"text":357},{"id":439,"depth":74,"text":440,"children":1307},[1308,1309],{"id":443,"depth":80,"text":444},{"id":480,"depth":80,"text":481},{"id":752,"depth":74,"text":753,"children":1311},[1312,1313],{"id":756,"depth":80,"text":757},{"id":788,"depth":80,"text":789},{"id":942,"depth":74,"text":943},{"id":1036,"depth":74,"text":1037,"children":1316},[1317,1318,1319,1320,1321],{"id":1040,"depth":80,"text":1041},{"id":1055,"depth":80,"text":1056},{"id":1070,"depth":80,"text":1071},{"id":1085,"depth":80,"text":1086},{"id":1100,"depth":80,"text":1101},{"id":1115,"depth":74,"text":1116},{"id":1202,"depth":74,"text":1203},[1325,14],"Database Optimalisatie","2025-01-17","Leer de essentiële PostgreSQL configuratie instellingen die performance beïnvloeden, van geheugen allocatie tot connection pooling. Gebaseerd op echte productie ervaring met het optimaliseren van databases voor high-traffic applicaties.","md",{"src":1330},"https:\u002F\u002Fpicsum.photos\u002Fid\u002F12\u002F640\u002F360",{},"\u002Fblog\u002Fpostgresql-configuration-optimization",{"title":5,"description":1327},"blog\u002F10.postgresql-configuration-optimization",[1336,1337,1338,1339,986,1340],"PostgreSQL","Database Configuratie","Performance Tuning","Geheugen Management","Monitoring","ryXpWNSLgVH_xnDdNUjc394HC902aWVojpTSiavi4To",[1343,1348],{"title":1344,"path":1345,"stem":1346,"description":1347,"children":-1},"Hoe maak je eenvoudig een portal voor je klanten","\u002Fblog\u002Fcustomer-portal","blog\u002F1.customer-portal","Wij creëren een spannend nieuw product dat klanten in staat stelt snel hun eigen klantenportal te maken. Het zal een startpunt zijn dat kan worden aangepast en uitgebreid.",{"title":1349,"path":1350,"stem":1351,"description":1352,"children":-1},"Domain Structuur Uitdagingen: Wanneer Klanten Niet Weten Wat Ze Willen","\u002Fblog\u002Fdomain-structure-challenges","blog\u002F11.domain-structure-challenges","Leer hoe je domain structuur uitdagingen kunt navigeren wanneer klanten onzeker zijn over hun vereisten. Echte wereld strategieën voor het verzamelen van vereisten, het beheren van scope creep, en het leveren van succesvolle projecten ondanks onduidelijke initiële specificaties.",[]]