Strategii de optimizare a interogărilor

Introducere în BigQuery

Matt Forrest

Field CTO

Trei reguli de bază

Există trei reguli principale de optimizare:

  1. Reduceți cantitatea de date procesate
  2. Optimizați operațiunile din interogare
  3. Reduceți dimensiunea rezultatelor
1 https://cloud.google.com/bigquery/docs/best-practices-performance-compute#use-bi-engine
Introducere în BigQuery

Reducerea cantității de date

  • Evitați SELECT * și selectați doar coloanele necesare
  • Filtrați datele din CTE-uri devreme și frecvent
  • Filtrați datele cu clauza WHERE devreme și frecvent
Introducere în BigQuery

Optimizarea join-urilor

  • Reduceți datele necesare folosind CTE-uri.
  • Realizați join-uri folosind tipul de date 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)
Introducere în BigQuery

Optimizarea clauzei WHERE

  • În BigQuery, utilizați

    • BOOL
    • INT
    • FLOAT
    • DATE
  • Tipurile de date cu WHERE, STRING sau BYTE sunt neoptimale.

Neoptimal

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

Optimal

SELECT user_id, date_ordered
FROM dataset.table
WHERE product_id = 1234
Introducere în BigQuery

Optimizări pentru ORDER BY

  • ORDER BY trebuie să fie întotdeauna la finalul interogării
  • Singura excepție este utilizarea ORDER BY într-o clauză de fereastră
Introducere în BigQuery

ORDER BY fără optimizare

Neoptimal

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);
Introducere în BigQuery

ORDER BY cu optimizare

Optimal

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;
Introducere în BigQuery

EXISTS vs. COUNT

  • Dacă trebuie să verificăm existența unui înregistrări, utilizați EXISTS
  • Evitați utilizarea COUNT pentru acest caz
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'
);
Introducere în BigQuery

Alte metode de optimizare

  • Utilizați funcții agregate aproximative precum APPROX_TOP_SUM sau APPROX_COUNT_DISTINCT.
  • Multe tabele BigQuery sunt partiționate după dată — includeți date în clauza WHERE.
Introducere în BigQuery

Să exersăm!

Introducere în BigQuery

Preparing Video For Download...