Study guide

13.3 BI Engine In-Memory Acceleration and Enterprise Looker/LookML Semantic Modeling

Google Cloud Certified Professional Data Engineer Exam

Track your progress as you read

Finished sections get a check mark.

1 Chapter 1: Security, IAM, and Data Protection

1.1 Cloud IAM, Service Accounts, and Resource Hierarchy in GCP Data Systems 1.2 Data Encryption, Key Management (CMEK), and Cloud KMS 1.3 Sensitive Data Protection: Cloud DLP, De-identification, and Masking

2 Chapter 2: Reliability and Compliance Architecture

2.1 High Availability, Regional vs Multi-Regional Deployments, and Disaster Recovery 2.2 Data Residency, Sovereignty, and Regulatory Compliance (HIPAA, GDPR) 2.3 Modern Data Architecture Patterns: Data Mesh, Lakehouse, and Modern Data Stack

3 Chapter 3: Cross-Cloud and Federated Governance

3.1 BigLake Architecture: Unified Multicloud Storage and Fine-Grained Access Control 3.2 BigQuery Omni: Multicloud Analytics Across AWS S3, Azure ADLS, and Google Cloud 3.3 Analytics Hub and Federated Computational Governance

4 Chapter 4: Data Ingestion and Pipeline Planning

4.1 Data Pipeline Planning: Sources, Sinks, and Network Architecture (VPC, PSC, Interconnect) 4.2 Batch vs Streaming Processing Trade-Offs and Architecture Selection 4.3 Change Data Capture (CDC) with Datastream for Continuous Database Ingestion

5 Chapter 5: Streaming Ingestion with Cloud Pub/Sub

5.1 Cloud Pub/Sub Core Architecture: Topics, Subscriptions, and Message Lifecycle 5.2 Pub/Sub Message Ordering, Exactly-Once Delivery, and Deduplication 5.3 Pub/Sub BigQuery/Cloud Storage Direct Subscriptions and Dead-Letter Topics

6 Chapter 6: Pipeline Processing with Apache Beam and Cloud Dataflow

6.1 Apache Beam Programming Model: Pipelines, PCollections, and Core PTransforms 6.2 Cloud Dataflow Architecture: Autoscaling, Worker Allocation, and Dataflow Prime 6.3 Windowing Strategies in Streaming Dataflow: Fixed, Sliding, and Session Windows

7 Chapter 7: Advanced Dataflow: Robustness and Exactly-Once Semantics

7.1 Watermarks, Triggers, Accumulating vs Discarding Panes, and Late Data Handling 7.2 Side Inputs, Broadcast Joins, and Stateful Stream Processing 7.3 Pipeline Robustness: Dead-Letter Queues, Error Handling, and Pipeline Lifecycle Management

8 Chapter 8: Managed Data Processing: Cloud Dataproc and Cloud Data Fusion

8.1 Cloud Dataproc: Architecture, Ephemeral vs Persistent Clusters, and Spark Tuning 8.2 Dataproc Serverless and Autoscaling Policies for Batch Processing 8.3 Cloud Data Fusion: Visual ETL/ELT Pipelines, CDAP Plugins, and Data Lineage

9 Chapter 9: Storage Selection and Cloud Storage Architecture

9.1 GCP Storage Selection Decision Matrix: Relational, NoSQL, Object, and Analytical Stores 9.2 Cloud Storage Architecture: Storage Classes, Lifecycle Rules, and Object Versioning 9.3 Cloud Storage Security: Bucket Lock (WORM), Access Control, and Data Migration Tools

10 Chapter 10: Relational Cloud Databases: Cloud Spanner and Cloud SQL

10.1 Cloud Spanner Architecture: TrueTime, External Consistency, and Global Scalability 10.2 Cloud Spanner Schema Design: Primary Keys, Interleaved Tables, and Query Tuning 10.3 Cloud SQL: High Availability, Read Replicas, Maintenance, and Point-in-Time Recovery

11 Chapter 11: Scalable NoSQL Databases: Cloud Bigtable and Firestore

11.1 Cloud Bigtable Architecture: Storage Model, Tablet Splitting, and Cluster Management 11.2 Cloud Bigtable Row Key Design: Lexicographical Ordering, Salt Keys, and Anti-Patterns 11.3 Cloud Firestore: Document Model, Real-Time Sync, and ACID Collections

12 Chapter 12: Enterprise Data Warehousing with BigQuery

12.1 BigQuery Architecture: Capacitor Columnar Format, Jupiter Network, and Borg Slots 12.2 BigQuery Partitioning: Ingestion-Time, Date/Timestamp, and Integer Range Strategies 12.3 BigQuery Clustering: Cardinality, Multi-Column Ordering, and Performance Optimization 12.4 Data Warehouse Modeling: Normalization, Star Schemas, and Slowly Changing Dimensions

13 Chapter 13: Advanced Analytical Queries and Transformations in BigQuery

13.1 Advanced SQL in BigQuery: Window Analytic Functions, ARRAY/STRUCT, and PIVOT/UNPIVOT 13.2 Modern SQL Orchestration with Dataform: DAG Modeling, Testing, and Documentation 13.3 BI Engine In-Memory Acceleration and Enterprise Looker/LookML Semantic Modeling

14 Chapter 14: Machine Learning and Feature Engineering with BigQuery ML

14.1 BigQuery ML Architecture: In-Database Training, Model Topologies, and SQL Analytics 14.2 Feature Engineering: ML.TRANSFORM, Preprocessing Pipelines, and Vertex AI Feature Store 14.3 MLOps, Model Governance, Continuous Monitoring, and Deployment Lifecycles

15 Chapter 15: Operations, Orchestration, and Data Governance

15.1 Workflow Orchestration with Cloud Composer: Managed Airflow, DAG Design, and Dependencies 15.2 Unified Data Governance with Dataplex: Lakes, Zones, Data Quality, and Lineage 15.3 Pipeline Observability, FinOps, and Cost Optimization Across GCP Data Services

13.3 BI Engine In-Memory Acceleration and Enterprise Looker/LookML Semantic Modeling

Key Takeaways Explain This Topic AI

BI Engine uses vectorized CPU execution and intelligent columnar caching; if a query references uncached data or unsupported SQL constructs, it seamlessly delegates execution to standard BigQuery Dremel slots without failing.

Looker connects natively to BigQuery via the LookML semantic modeling layer, abstracting SQL complexity into centrally governed Dimensions, Measures, Views, and Explores to ensure enterprise-wide metric consistency.

Persistent Derived Tables (PDTs) materialize complex, computationally intensive transformations inside BigQuery scratch datasets, using datagroups with SQL triggers to automate cache invalidation and incremental refreshes.

Looker's symmetric aggregates eliminate fan-out errors when joining tables with one-to-many relationships by tracking distinct primary keys, calculating mathematically accurate sums and averages without manual subqueries.

Precalculating fields converts repeated dashboard slot-seconds into cheap stored bytes: use a materialized view when the aggregate is a supported single-table function, and a scheduled Dataform rollup when joins, window functions, or non-deterministic functions disqualify the view.

Last updated: September 2026

13.3 BI Engine In-Memory Acceleration and Enterprise Looker/LookML Semantic Modeling

Exam Focus: The Google Cloud Professional Data Engineer exam rigorously tests your ability to optimize enterprise business intelligence workloads. You must understand how BigQuery BI Engine accelerates interactive dashboards with sub-second latency, how to size and manage BI Engine memory reservations , how BI Engine handles query delegation and graceful fallback , how Looker and LookML govern enterprise metrics centrally, how to manage the lifecycle of Persistent Derived Tables (PDTs) with datagroups , and how symmetric aggregates resolve the classic relational join fan-out problem.

Modern enterprise analytics platforms face a challenging dual requirement: data engineering pipelines must manage petabytes of historical data with high throughput, while business executives and analysts demand interactive, sub-second query response times in BI tools (such as Looker, Looker Studio, Tableau, and Power BI). Running standard BigQuery queries against raw tables introduces a 2-to-5-second slot negotiation and execution overhead—acceptable for batch ELT, but sluggish for an interactive dashboard with dozens of filter dropdowns.

To bridge this gap, Google Cloud provides a tightly integrated business intelligence stack: BigQuery BI Engine for in-memory hardware acceleration, paired with Looker and LookML for semantic metric governance and resilient data modeling.

1. BigQuery BI Engine Architecture & In-Memory Acceleration

BigQuery BI Engine is a fully managed, in-memory analysis service built directly into the BigQuery kernel. It accelerates analytical queries by caching frequently accessed table columns in memory and executing SQL operations using a specialized vectorized CPU execution engine. +─────────────────────────────────────────────────────────────────────────────────+

  • | BIGQUERY BI ENGINE ARCHITECTURE |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • | |
  • | [ Business Intelligence Tool (Looker / Looker Studio / Tableau) ] |
  • | │ |
  • | ▼ |
  • | [ BigQuery SQL Interface & BI Engine Query Planner ] |
  • | │ |
  • | ┌─────────────────────────────┴─────────────────────────────┐ |
  • | ▼ ▼ |
  • | [ BI ENGINE IN-MEMORY CACHE ] [ STANDARD SLOTS ] |
  • | - Sub-second vector execution in RAM - Standard Dremel |
  • | - Zero slot scheduling delay - Used on cache-miss |
  • | - Evaluates Filter, Project, Group By, Join - Full SQL support |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • Core Technical Principles of BI Engine

Zero Architecture Modification: BI Engine requires no ETL pipelines, no cube definitions, and no changes to existing SQL queries or dashboard connections. Applications continue issuing standard GoogleSQL queries to BigQuery.

Vectorized In-Memory Processing: Unlike standard Dremel slots that read compressed Capacitor columns from Colossus over the Jupiter network, BI Engine evaluates data loaded directly into host RAM using vectorized CPU SIMD registers, achieving sub-second query latencies.

Reservation Capacity Model: Administrators provision BI Engine capacity as a memory reservation (measured in GiB) within a specific Google Cloud region. Capacity can be assigned to an entire project or isolated to specific datasets and tables.

Smart Columnar Caching: BI Engine does not require users to manually load or refresh data. It continuously monitors query patterns and automatically caches the most frequently accessed columns, partitions, and tables.

2. Query Routing, Acceleration Modes, and Graceful Fallback

When a query enters BigQuery, the query optimizer evaluates the query structure and available BI Engine memory to determine the optimal execution path. +─────────────────────────────────────────────────────────────────────────────────+

  • | BI ENGINE QUERY PLANNING & FALLBACK PATH |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • | |
  • | Incoming Analytical SQL Query |
  • | │ |
  • | ▼ |
  • | Does query match cached tables/columns? |
  • | AND are SQL operators supported by BI Engine? |
  • | │ |
  • | ├───> [ FULL ACCELERATION ] ──> Evaluates 100% in RAM |
  • | │ (Sub-second response; zero slot wait) |
  • | │ |
  • | ├───> [ PARTIAL ACCELERATION ]─> Evaluates filters/scans in RAM |
  • | │ Delegates complex joins/UDFs to slots |
  • | │ |
  • | └───> [ FALLBACK (DISABLED) ] ─> Transparently routes 100% to |
  • | standard BigQuery Dremel slots |
  • | (Query never fails due to cache miss) |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • The Three Acceleration Modes

FULL : The entire query (scans, filters, aggregations, and supported joins) is evaluated within BI Engine RAM. Delivers the fastest possible performance (typically 50ms - 500ms).

PARTIAL : Specific stages of the query (such as scanning and filtering high-volume base tables) are executed in memory, while unsupported operations (such as non-equijoins or complex window functions) are delegated to standard BigQuery slots.

DISABLED (Graceful Fallback): If the required tables exceed memory reservations, or if the query contains unsupported constructs (e.g., JavaScript UDFs or complex federated queries), BI Engine gracefully falls back to standard Dremel slot execution . Queries never fail due to BI Engine memory exhaustion or cache misses.

Inspecting BI Engine Performance via INFORMATION_SCHEMA

Data engineers can audit BI Engine utilization and identify why specific queries fell back to standard slots by querying INFORMATION_SCHEMA.JOBS_BY_* : SELECT

  • job_id,
  • query,
  • total_slot_ms,
  • bi_engine_statistics.bi_engine_mode,
  • bi_engine_statistics.bi_engine_reasons
  • FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
  • WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  • AND bi_engine_statistics IS NOT NULL;

Common values in bi_engine_reasons include TABLE_TOO_LARGE (reservation size must be increased), UNSUPPORTED_EXPRESSION (query contains SQL constructs outside BI Engine's execution engine), or MEMORY_LIMIT_EXCEEDED .

3. Optimizing BI Engine: Partitioning and Clustering Synergy

A critical misconception is that an enterprise must reserve enough BI Engine RAM to hold an entire multi-terabyte dataset. In reality, BI Engine is designed to work in synergy with BigQuery table partitioning and clustering . +─────────────────────────────────────────────────────────────────────────────────+

  • | BI ENGINE + PARTITION PRUNING SYNERGY |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • | |
  • | TOTAL TABLE SIZE ON COLOSSUS: 20 TB (5 Years of Daily Partitions) |
  • | |
  • | Looker Dashboard Filter: WHERE transaction_date >= '2026-09-01' (Last 14 Days) |
  • | │ |
  • | ▼ |
  • | 1. BigQuery Partition Pruner: Discards 99% of storage blocks |
  • | Active Scanned Data: 120 GB |
  • | │ |
  • | ▼ |
  • | 2. Explicit Column Projection: Scans 5 columns out of 50 |
  • | Memory Footprint: 12 GB |
  • | │ |
  • | ▼ |
  • | 3. BI Engine In-Memory Reservation: 25 GiB Capacity |
  • | RESULT: Fits 100% in RAM -> Sub-second interactive dashboard tiles! |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • Best Practices for Maximizing Reservation Efficiency

Enforce Partition Pruning: Always partition base tables by date/timestamp and configure mandatory dashboard filters. BI Engine loads only the partitions referenced by queries, allowing a 50 GiB reservation to accelerate queries over a 50 TB table.

Cluster by Common Filter Dimensions: Clustering tables by dimensions frequently selected in dashboard filters (e.g., store_id , region , product_category ) allows BI Engine to prune memory blocks within cached segments.

Pair with Materialized Views: Materialized views that aggregate raw events into daily dimensional summaries can be cached entirely inside a modest BI Engine reservation, delivering instant aggregations over billions of raw rows.

4. Looker and LookML: The Enterprise Semantic Layer

While BI Engine provides raw computational acceleration, enterprise scale requires governing the business logic that generates the SQL. Without a centralized semantic modeling layer, individual analysts write divergent SQL queries in different reporting tools, resulting in conflicting business metric definitions (such as four different definitions of "Monthly Active Users" across finance, marketing, and product teams).

Looker addresses this governance crisis through LookML (Looker Modeling Language) , a declarative language that defines relationships, dimensions, aggregates, and data governance rules directly against BigQuery. +─────────────────────────────────────────────────────────────────────────────────+

  • | THE LOOKML HIERARCHY |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • | |
  • | [ PROJECT ] ──> Encapsulates entire codebase, Git repo, and database configs |
  • | │ |
  • | ▼ |
  • | [ MODEL ] ──> Defines BigQuery connection and exposes specific Explores |
  • | │ |
  • | ▼ |
  • | [ EXPLORE ] ──> Declares primary View and pre-joins related Views |
  • | │ (Defines join types, foreign keys, and relationship cardinalities) |
  • | ▼ |
  • | [ VIEW ] ──> Represents a BigQuery table, view, or derived query |
  • | │ |
  • | ├─> [ DIMENSIONS ] ──> Column-level attributes, slices, and buckets |
  • | │ (e.g., customer_city, order_status, date_tier) |
  • | │ |
  • | └─> [ MEASURES ] ──> Aggregated metrics computed over dimensions |
  • | (e.g., total_revenue, avg_order_value, count) |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • Core LookML Structural Building Blocks
  • 1. Views and Fields (Dimensions and Measures)

A View corresponds to a database table or derived query. Inside a view, engineers declare fields:

Dimensions: Attributes used for row-level filtering, grouping, or slicing (e.g., strings, dates, numbers): dimension: order_id {

  • primary_key: yes
  • type: string
  • sql: ${TABLE}.order_id ;;
  • }
  • dimension_group: created {
  • type: time
  • timeframes: [raw, date, week, month, quarter, year]
  • sql: ${TABLE}.created_at ;;
  • }
  • Measures: Aggregated metrics calculated over groups of rows: measure: total_revenue {
  • type: sum
  • sql: ${TABLE}.amount ;;
  • value_format_name: usd
  • }
  • measure: distinct_purchasers {
  • type: count_distinct
  • sql: ${TABLE}.customer_id ;;
  • }
  • 2. Explores and Join Relationships

An Explore is a curated starting point for business users to query data visually. It establishes how views join together: explore: orders {

  • label: "Customer Orders & Fulfillment"
  • join: customers {
  • type: left_outer
  • relationship: many_to_one
  • sql_on: ${orders.customer_id} = ${customers.id} ;;
  • }
  • join: order_items {
  • type: left_outer
  • relationship: one_to_many
  • sql_on: ${orders.order_id} = ${order_items.order_id} ;;
  • }
  • }
  • 5. Persistent Derived Tables (PDTs) and Materialization Lifecycle

In enterprise modeling, certain business metrics require complex pre-computations (such as multi-stage funnel window functions, customer lifetime value models, or sessionization logic) that are too compute-heavy to execute dynamically during dashboard rendering.

Looker solves this through Derived Tables , with production environments relying heavily on Persistent Derived Tables (PDTs) . +─────────────────────────────────────────────────────────────────────────────────+

  • | PERSISTENT DERIVED TABLE (PDT) LIFECYCLE |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • | |
  • | Looker Server checks Datagroup Trigger |
  • | (sql_trigger_value: SELECT MAX(event_timestamp) FROM raw_events) |
  • | │ |
  • | ├───> Trigger Value Unchanged ──> Serves cached PDT from BigQuery |
  • | │ (Sub-second response; zero ETL cost) |
  • | │ |
  • | └───> Trigger Value Changed ──> Regenerates PDT in BigQuery |
  • | 1. Executes SQL into scratch table |
  • | (`looker_scratch.LR$XYZ...`) |
  • | 2. Builds indexes / clustering |
  • | 3. Atomically swaps active pointer |
  • | 4. Drops obsolete staging table |
  • +─────────────────────────────────────────────────────────────────────────────────+
  • Transient Derived Tables vs. Persistent Derived Tables (PDTs)

Transient Derived Table (Ephemeral): Looker wraps the transformation query as a Common Table Expression (CTE) or subquery inside the generated SQL. BigQuery executes the full computation on every single user interaction, which on complex queries wastes slots and increases dashboard latency.

Persistent Derived Table (PDT): Looker executes the transformation query in BigQuery and physically materializes the result set into a designated scratch dataset ( looker_scratch ) within your BigQuery project. Subsequent dashboard queries read directly from this precomputed table.

Managing PDT Refresh via datagroups

PDT persistence is governed by datagroups , which establish automated caching and invalidation policies: # In model file: define datagroup

connection: "bigquery_production"

  • datagroup: daily_etl_datagroup {
  • sql_trigger_value: SELECT MAX(batch_id) FROM `prod.etl_control_table` ;;
  • max_cache_age: "24 hours"
  • }
  • # In view file: attach datagroup to PDT
  • view: customer_lifetime_metrics {
  • derived_table: {

sql:

  • SELECT
  • customer_id,
  • MIN(order_date) AS first_order_date,
  • COUNT(DISTINCT order_id) AS lifetime_orders,
  • SUM(order_amount) AS lifetime_spend
  • FROM `prod.orders`
  • GROUP BY customer_id ;;
  • datagroup_trigger: daily_etl_datagroup
  • partition_keys: ["first_order_date"]
  • cluster_keys: ["customer_id"]
  • }
  • }
  • Incremental PDTs

For massive tables where even rebuilding a PDT daily takes too long, Looker supports Incremental PDTs . By declaring increment_key and increment_offset , Looker queries and appends only new time intervals into the materialized table, reducing daily regeneration slot time by over 90%.

6. Solving the Relational Fan-Out Dilemma: Symmetric Aggregates

One of the most complex challenges in relational database querying is the fan-out problem , which occurs when joining tables across a one-to-many ( 1:N ) relationship. ORDERS TABLE (1 Row per Order)

  • +----------+-------------+--------------+
  • | order_id | customer_id | order_amount |
  • +----------+-------------+--------------+
  • | 101 | CUST-1 | $100.00 |
  • +----------+-------------+--------------+
  • ORDER_ITEMS TABLE (Multiple Rows per Order: 1-to-Many)
  • +---------+----------+---------+-------+
  • | item_id | order_id | sku | price |
  • +---------+----------+---------+-------+
  • | 1 | 101 | SKU-A | $60 |
  • | 2 | 101 | SKU-B | $40 |
  • +---------+----------+---------+-------+

STANDARD RELATIONAL JOIN RESULT:

  • +----------+--------------+---------+-------+
  • | order_id | order_amount | item_id | price |
  • +----------+--------------+---------+-------+

| 101 | $100.00 | 1 | $60 | <-- order_amount is duplicated!

| 101 | $100.00 | 2 | $40 | <-- order_amount is duplicated!

+----------+--------------+---------+-------+

SQL AGGREGATION ERROR:

  • SUM(price) = $60 + $40 = $100.00 (CORRECT)
  • SUM(order_amount) = $100 + $100 = $200.00 (CORRUPTED! 2x Inflated Fan-Out!)
  • Traditional Workarounds and Their Deficiencies

Nested Subqueries / Pre-aggregation: Aggregating order_items before joining. This prevents users from freely slicing order attributes by item attributes (e.g., filtering orders by SKU category).

Manual Distinct Math: Writing complex manual formulas that divide by count duplicates, which breaks as soon as multiple one-to-many joins are chained together.

The Looker Solution: Symmetric Aggregates

Looker solves this relational dilemma automatically through Symmetric Aggregates .

Mandatory Prerequisites for Symmetric Aggregates

Every LookML view involved in the join must have a strictly defined primary_key: yes dimension.

The Explore join configuration must accurately declare the relationship ( many_to_one , one_to_many , one_to_one ).

How Symmetric Aggregates Work Under the Hood

When Looker detects that a measure from the "one" side of a 1:N join is requested alongside attributes from the "many" side, Looker generates specialized SQL in BigQuery that tracks the unique primary key of each record. It applies a hashing and distinct-weighting algorithm: -- Conceptual Looker-Generated Symmetric Aggregate SQL in BigQuery

  • SELECT
  • - Standard sum on the 'many' side
  • SUM(order_items.price) AS total_item_price,
  • - Symmetric Aggregate on the 'one' side: eliminates duplicate order amounts
  • CAST(
  • COALESCE(
  • - Uses primary key hash to aggregate each order_id exactly once
  • SUM(DISTINCT
  • (CAST(FLOOR(COALESCE(orders.order_amount, 0) * 1000000) AS NUMERIC) +
  • (CAST(FARM_FINGERPRINT(CAST(orders.order_id AS STRING)) AS NUMERIC) * 1e-12))
  • ) -
  • SUM(DISTINCT (CAST(FARM_FINGERPRINT(CAST(orders.order_id AS STRING)) AS NUMERIC) * 1e-12)),
  • 0
  • ) / 1000000 AS FLOAT64
  • ) AS total_order_amount
  • FROM `ecommerce.orders` AS orders
  • LEFT JOIN `ecommerce.order_items` AS order_items
  • ON orders.order_id = order_items.order_id;

By incorporating the primary key's distinct identity into the mathematical aggregation, Looker guarantees that SUM(order_amount) evaluates to exactly $100.00 , completely eliminating fan-out distortion regardless of how many items or subsidiary tables are joined.

7. Precalculating Fields: Moving Work Out of Dashboard Query Time

"Precalculating fields" is its own bullet in blueprint topic 4.1, and it is the cheapest latency win available to a BI workload. Every derived value a dashboard computes — a margin percentage, a currency conversion, a date bucket, a customer-lifetime-value rollup — is recomputed on every filter change, by every viewer, across the full scanned partition. Computing it once, upstream, converts repeated slot-seconds into stored bytes, which are orders of magnitude cheaper.

The precalculation ladder — pick the lowest rung that meets freshness

Mechanism Refresh behaviour Choose it when

Materialized view BigQuery refreshes automatically and incrementally as base data changes; queries against the base table are transparently rewritten to hit the view The derived value is a deterministic aggregate (SUM, COUNT, APPROX_COUNT_DISTINCT) over one table and must stay near-real-time

Scheduled rollup table (Dataform incremental model or scheduled query) Refreshed on a schedule you control The logic is too complex for a materialized view — multi-table joins, window functions, non-deterministic functions, UDFs

Persistent Derived Table (PDT) in Looker Rebuilt on a datagroup trigger, typically tied to ETL completion The logic is Looker-specific and should not leak into the warehouse

Generated / stored column in the base table Computed at write time The value is a pure row-level expression such as a margin, a parsed date part, or a normalized key

BI Engine acceleration In-memory, no precomputation The query is already lean and just needs to avoid a cold scan

Materialized views: the constraints that decide exam answers

Materialized views are the default answer for "the dashboard aggregate must be fast and fresh," but only if the aggregate fits:

Supported aggregates include SUM , COUNT , MIN , MAX , AVG and APPROX_COUNT_DISTINCT ; arbitrary JOIN s, window functions, UNION ALL and non-deterministic functions such as CURRENT_TIMESTAMP() or RAND() disqualify the view.

Inherit the base table's partitioning so partition pruning still applies, and set enable_refresh plus refresh_interval_minutes deliberately — an aggressive refresh on a high-churn table can cost more than the queries it saves.

Smart tuning rewrites qualifying queries onto the view automatically, so dashboards do not need to be re-pointed. A scenario where analysts "must not change their existing SQL" is pointing at a materialized view.

The anti-pattern this bullet exists to catch -- Anti-pattern: recomputed by every viewer on every filter change

  • SELECT
  • DATE_TRUNC(order_ts, MONTH) AS order_month,
  • SAFE_DIVIDE(SUM(revenue) - SUM(cost), SUM(revenue)) * 100 AS margin_pct,
  • SUM(revenue * fx.rate) AS revenue_usd
  • FROM `sales.orders` o JOIN `ref.fx_rates` fx USING (currency, rate_date)
  • GROUP BY order_month;

The join to fx_rates rules out a materialized view, so the correct architecture is a nightly Dataform incremental model producing sales.monthly_margin , with the dashboard reading the rollup and BI Engine holding it in memory. Latency drops from a multi-terabyte scan to a lookup over a table measured in megabytes.

Exam Trap: Reaching for BI Engine to fix a slow dashboard that scans 12 TB per refresh. BI Engine accelerates queries that fit its reservation; it does not shrink the work. Precalculate first, partition and cluster second, then accelerate what remains.

8. Architectural Anti-Patterns and Exam Traps

Production Scenario Architectural Anti-Pattern Correct Google Cloud Architecture

Inflated Multi-Table Metrics ; An analyst joins orders to order_items in Looker. A measure calculating SUM(orders.order_amount) outputs triple the actual enterprise revenue. Missing primary_key: yes on the orders LookML view, or omitting the relationship: one_to_many declaration in the Explore join. Designate the unique primary key dimension in every view ( primary_key: yes ) and explicitly define relationship in the Explore. This allows Looker to activate Symmetric Aggregates , eliminating fan-out errors.

Exceeding BI Engine Capacity ; A data engineering team provisions a 10 GiB BI Engine reservation to accelerate an interactive Looker Studio dashboard that queries an unpartitioned 15 TB sales table. Expecting BI Engine to cache an unpartitioned 15 TB table in a 10 GiB RAM pool. Queries fall back to standard Dremel slots, incurring full scan costs and multi-second latencies. Partition the sales table by date and cluster by frequently filtered dashboard dimensions. Enforce dashboard filters on the partition column, allowing BI Engine to load only the pruned active date range (e.g., last 7 days = 8 GiB), fitting comfortably in RAM.

Runaway Ephemeral Derived Tables ; A Looker dashboard contains 10 tiles, each querying an ephemeral derived table that executes an 8-table join with complex regex string parsing. Using ephemeral derived tables for heavy computations forces BigQuery to execute the identical expensive subquery 10 times concurrently whenever the dashboard loads. Convert the query into a Persistent Derived Table (PDT) governed by a datagroup . BigQuery materializes the transformed table once into looker_scratch , and all 10 dashboard tiles query the precomputed result in milliseconds.

Using JavaScript UDFs with BI Engine ; A team adds custom JavaScript UDFs to their dashboard SQL queries to parse JSON strings, wondering why BI Engine acceleration is disabled. JavaScript UDFs execute inside single-threaded V8 worker sandboxes and cannot be vectorized or accelerated by BI Engine's in-memory engine. Replace JavaScript UDFs with native BigQuery SQL expressions or native SQL UDFs. Native SQL functions execute compiled C++ code that BI Engine can accelerate directly in RAM.

Loading diagram... Enterprise BI Architecture: Looker Semantic Modeling, PDT Caching, and BI Engine In-Memory Acceleration