# BigQuery-kosten beheren [[TOC]] ## Hoe BigQuery kosten berekent BigQuery brengt kosten in rekening op twee manieren: voor het verwerken van queries en voor het opslaan van data. **On-demand (betalen per gebruik):** - Queries: ongeveer 6,25 dollar per TiB verwerkte data, met de eerste 1 TiB per maand gratis. - Actieve opslag: ongeveer 0,02 dollar per GB per maand (data die binnen 90 dagen is gewijzigd). - Langetermijn-opslag: ongeveer 0,01 dollar per GB per maand (data die 90 dagen ongewijzigd is). De eerste 10 GB opslag per maand is gratis. **Capacity-pricing via BigQuery Editions:** Voor organisaties met hoge, voorspelbare query-volumes koop je verwerkingscapaciteit (slots) per maand of per jaar via een Edition (Standard, Enterprise of Enterprise Plus). Dit is goedkoper dan on-demand bij intensief gebruik. Het oude flat-rate-model is hierdoor vervangen; nieuwe afnames lopen via Editions met autoscaling of vaste slot-commitments. :::info title="On-demand is meestal genoeg" Voor de meeste Google Workspace-klanten is on-demand de juiste keuze. Capacity-pricing wordt pas voordelig bij grote, terugkerende query-volumes. Prijzen verschillen per regio en kunnen wijzigen; controleer altijd de actuele tarieven op de officiele BigQuery-prijspagina van Google Cloud. ::: ## Kostenbesparing: selecteer alleen benodigde kolommen BigQuery berekent on-demand-kosten op basis van de kolommen die je selecteert, niet op het aantal resultaatrijen. Een `SELECT *` op een tabel van 100 GB verwerkt 100 GB, ook als je `WHERE` slechts 10 rijen teruggeeft. Slecht (verwerkt alle kolommen): ```sql SELECT * FROM `project.dataset.orders` WHERE datum = '2024-01-01' ``` Goed (verwerkt alleen de benodigde kolommen): ```sql SELECT order_id, klant_id, omzet FROM `project.dataset.orders` WHERE datum = '2024-01-01' ``` Bij een tabel met 20 kolommen waarvan je er maar 3 nodig hebt, bespaar je grofweg 85 procent van de querykosten. ## Partitionering: onmisbaar voor grote tabellen Een gepartitioneerde tabel is opgesplitst in segmenten op basis van een datum- of integer-kolom. Als je filtert op de partitie-kolom, verwerkt BigQuery alleen die segmenten in plaats van de hele tabel. :::howto title="Gepartitioneerde tabel aanmaken" 1. Ga naar de BigQuery-console in de Google Cloud Console. 2. Selecteer een dataset en klik op **Tabel aanmaken**. 3. Kies je databron. 4. Scroll bij het schema-gedeelte naar **Partitionering**. 5. Kies **Partitioneren op veld** en selecteer een `DATE`- of `TIMESTAMP`-kolom. 6. Optioneel: stel een partitie-vervaldatum in, bijvoorbeeld 365 dagen. 7. Klik op **Tabel aanmaken**. ::: Een bestaande tabel partitioneer je door de data opnieuw te laden in een nieuwe gepartitioneerde tabel: ```sql CREATE TABLE `project.dataset.orders_partitioned` PARTITION BY DATE(order_date) AS SELECT * FROM `project.dataset.orders` ``` ### Filter altijd op de partitiekolom Met partitionering bespaar je alleen kosten als je daadwerkelijk filtert op de partitiekolom. Geen besparing (verwerkt alle partities): ```sql SELECT * FROM `project.dataset.orders_partitioned` WHERE klant_id = 123 ``` Wel besparing (verwerkt alleen de partities van 2024): ```sql SELECT * FROM `project.dataset.orders_partitioned` WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31' ``` :::warning title="Wikkel de partitiekolom niet in een functie" Als je een functie om de partitiekolom heen zet, bijvoorbeeld `WHERE DATE(order_date) = ...` terwijl de kolom al een `DATE` is, kan BigQuery de partities niet wegsnijden en verwerk je alsnog de hele tabel. Filter rechtstreeks op de kale partitiekolom. ::: ## Clustering voor extra besparing Clustering organiseert data binnen een partitie op een of meer kolommen. Als je vaak filtert op dezelfde kolom, bijvoorbeeld regio of productcategorie, versnelt clustering de query en verlaagt het de kosten. ```sql CREATE TABLE `project.dataset.orders_clustered` PARTITION BY DATE(order_date) CLUSTER BY regio, product_categorie AS SELECT * FROM `project.dataset.orders` ``` Combineer partitionering en clustering voor de beste prestaties op grote tabellen. ## Budget-alerts instellen Stel budgetwaarschuwingen in zodat je een melding krijgt als je kosten een drempel naderen. Let op: een budget-alert waarschuwt alleen, het stopt geen queries. :::howto title="Budget-alert aanmaken in de Cloud Console" 1. Ga naar `console.cloud.google.com` en open **Facturering**. 2. Klik op **Budgetten en meldingen**. 3. Klik op **Budget aanmaken**. 4. Selecteer het project en kies eventueel **BigQuery** als dienst om alleen die kosten te volgen. 5. Stel een maandelijks budget in, bijvoorbeeld 50 euro. 6. Voeg drempelwaarschuwingen toe bij 50, 90 en 100 procent. 7. Klik op **Opslaan**. ::: ## Query-quota en harde limieten instellen Budget-alerts waarschuwen achteraf. Om kosten echt te begrenzen, stel je harde limieten in die queries blokkeren voordat ze te duur worden: - **Maximaal verwerkte bytes per query**: stel in de query-instellingen een limiet op het aantal te verwerken bytes in. Queries die de limiet overschrijden, worden geweigerd voordat ze draaien en kosten dus niets. - **Quotum per gebruiker per dag**: beperk via de quota-pagina hoeveel querydata een gebruiker of het hele project per dag mag verwerken. - **Kostenmonitoring**: gebruik `INFORMATION_SCHEMA.JOBS` om te zien wie de duurste queries draait. :::warning title="Zonder limieten kan een query je budget opmaken" Zonder quota of byte-limieten kan een enkele slecht geschreven query enorme kosten veroorzaken. Stel voor productieomgevingen altijd een maximale byte-limiet per query in. ::: ## Opslagkosten verlagen - **Verwijder ongebruikte tabellen**: controleer welke tabellen al 90 of meer dagen niet zijn geopend en ruim ze op. - **Laat langetermijn-opslag werken**: data die 90 dagen ongewijzigd blijft, wordt automatisch goedkoper. Je hoeft hier niets voor te doen, maar onnodige updates op oude partities resetten de teller. - **Stel partitie-verval in**: laat data ouder dan een x aantal dagen automatisch verwijderen. - **Gebruik externe tabellen**: bewaar grote, zelden geraadpleegde historische datasets in Google Cloud Storage en koppel ze als externe BigQuery-tabel. :::tip title="Maak per nacht een geaggregeerde tabel" Laat dashboards niet rechtstreeks op de ruwe data draaien. Gebruik een Scheduled Query om een keer per nacht een kleine geaggregeerde tabel bij te werken. Je betaalt dan eenmaal per dag voor de samenvoeging en alle rapporten lezen daarna de kleine tabel. ::: :::faq ### Ik zie onverwacht hoge kosten deze maand. Hoe vind ik de oorzaak? Bevraag `INFORMATION_SCHEMA.JOBS_BY_PROJECT` voor een overzicht van alle queries met hun verwerkte bytes. Sorteer op `total_bytes_billed` aflopend en kijk welke gebruiker of welk dashboard de zwaarste queries draait. Voorbeeld: `SELECT user_email, total_bytes_billed, query FROM region-eu.INFORMATION_SCHEMA.JOBS_BY_PROJECT ORDER BY total_bytes_billed DESC LIMIT 20`. ### Hoe schat ik vooraf in wat een query kost? Zet in de BigQuery-console de query-validator aan. Voordat je een query uitvoert, toont BigQuery hoeveel data hij naar verwachting verwerkt. Vermenigvuldig dat met het tarief per TiB om de kosten te schatten. Een dry run via de API of de bq-tool geeft dezelfde schatting zonder de query echt te draaien. ### Beinvloeden Looker Studio-rapporten ook de kosten? Ja. Elk rapport dat BigQuery benadert, triggert een query die kosten genereert. Zet caching in Looker Studio aan om het aantal queries te beperken, en laat rapporten op een kleine geaggregeerde tabel draaien in plaats van op de ruwe data. ### Kan ik gratis een voorbeeld van data bekijken? Ja. Gebruik de Preview-tab in de BigQuery-console. Die is gratis en verbruikt geen queryquotum. Gebruik daarnaast `LIMIT` in je queries als je snel wilt controleren hoe data eruitziet. ### Wat is de goedkoopste manier om dagelijks data samen te voegen? Gebruik een Scheduled Query die per nacht een geaggregeerde tabel bijwerkt. Je betaalt dan eenmaal per dag voor de samenvoeging in plaats van bij elke dashboard-weergave opnieuw op de ruwe data te queryen. ### Is het oude flat-rate-model nog beschikbaar? Nee. Flat-rate is vervangen door BigQuery Editions met capacity-pricing. Je kiest een Edition en gebruikt autoscaling of vaste slot-commitments. Bestaande flat-rate-afnemers hebben een migratiepad gekregen, maar nieuwe afnames lopen via Editions. :::