Customer 360 Enterprise Data Platform — Denodo on Azure  ·  View 21 of 39  ·  Runtime

Query Optimisation

The stages between a statement and a plan, and which of them do the real work.

Editable source SVG draw.io All views
Parse Incoming statement SQL, REST or GraphQL Metadata lookup views, stats, policies Rewrite View expansion Predicate normalisation Constant folding Prune Branch pruning unreferenced sources Column trimming Partition pruning Delta files skipped Delegate Capability check what the source can do Aggregation pushdown Join delegation same-source joins Execute Cost-based join order statistics driven MPP offload when scan exceeds 10 M Parallel fetch per data source pool Return Row filter and masking Result to client two sources left cannot delegate Query Optimisation — How a Five-Source View Becomes Two Source Calls Application we own Data store Decision point Security / platform synchronous failure / alternate Masking is applied after execution, never pushed down. A masked column is never sent to a source system as a predicate, so masking cannot leak through a WHERE clause. v 1.0 · owner Data & AI Global Practice · date 2026-09

Where the performance comes from

  • Branch pruning and column trimming, in that order, before anything is costed. A Customer360 query that projects six columns should never touch the sources that own the other sixty.
  • Delegation is decided by a capability check per source, not by a global setting — the same join is pushed to SAP and executed locally against ServiceNow, because only one of them can do it.
  • MPP offload is the fallback for the case where nothing can be delegated and the scan is large, not the default path.

The security constraint on the optimiser

  • Masking is applied after execution and is never pushed down. This costs some performance and removes a whole class of leak, where a masked column becomes visible through a predicate the source evaluates.

Risks

  • An ad hoc query that defeats pruning — SELECT * over Customer360 — contacts every source at once. The analytical pool's row limit and the interactive pool's 8-second timeout exist to contain it.