Strategier för frågeoptimering

Introduktion till BigQuery

Matt Forrest

Field CTO

Tre tumregler

Det finns tre huvudsakliga optimeringsregler:

  1. Minska mängden data som behöver bearbetas
  2. Optimera frågeoperationerna
  3. Minska utdatastorleken för din fråga
1 https://cloud.google.com/bigquery/docs/best-practices-performance-compute#use-bi-engine
Introduktion till BigQuery

Minska datamängden

  • Undvik SELECT * – välj bara de kolumner du behöver
  • Filtrera data i dina CTE:er tidigt och ofta
  • Filtrera data med WHERE-satsen tidigt och ofta
Introduktion till BigQuery

Optimera joins

  • Minska datamängden med CTE:er.
  • Joina med datatypen INT64.
WITH filter_my_data AS (SELECT 
-- Filter data with 
-- WHERE in the CTE first
)
SELECT 
-- This query will run 
-- faster with less data
JOIN a USING (user_id)
Introduktion till BigQuery

Optimera WHERE-satsen

  • Använd i BigQuery

    • BOOL
    • INT
    • FLOAT
    • DATE
  • Datatyperna WHERE, STRING och BYTE är inte optimala.

Inte optimalt

SELECT user_id, date_ordered
FROM dataset.table
WHERE product = 'shoes'

Optimalt

SELECT user_id, date_ordered
FROM dataset.table
WHERE product_id = 1234
Introduktion till BigQuery

Optimeringar med ORDER BY

  • ORDER BY ska alltid placeras ytterst (i slutet) av frågan
  • Det enda undantaget är ORDER BY i en fönsterfunktionssats
Introduktion till BigQuery

ORDER BY utan optimering

Inte optimalt

WITH order_total AS (SELECT
user_id,           
sum(product_price) as order_sum
FROM orders
GROUP BY user_id   
-- Order by is not at the end of the query
ORDER BY last_purchase_date
)
SELECT order_total.order_sum, 
users.user_name
FROM dataset.users users
JOIN order_total USING (user_id);
Introduktion till BigQuery

ORDER BY med optimering

Optimalt

WITH order_total AS (SELECT
user_id,    
last_purchase_date
sum(product_price) as order_sum
GROUP BY user_id         
)
SELECT order_total.order_sum, 
users.user_name
FROM dataset.users users
JOIN a USING (user_id)
-- Order by should always be at the end
ORDER BY orders_total.last_purchase_date;
Introduktion till BigQuery

EXISTS jämfört med COUNT

  • Om du bara behöver kontrollera om en post finns i tabellen, använd EXISTS
  • Undvik att använda COUNT för detta ändamål
SELECT EXISTS (

  -- Write the main query as a subquery within the exists call
  SELECT
    user_id
  FROM
    dataset.table
  WHERE
    product_category = 'home_goods'
    AND status = 'Closed Account'
);
Introduktion till BigQuery

Andra optimeringsmetoder

  • Använd ungefärliga aggregatfunktioner som APPROX_TOP_SUM eller APPROX_COUNT_DISTINCT.
  • Många BigQuery-tabeller är partitionerade efter datum – inkludera datum i WHERE-satsen.
Introduktion till BigQuery

Nu kör vi en övning!

Introduktion till BigQuery

Preparing Video For Download...