MinervaDB · Data Analytics and Data Warehousing Support · CDC, lakehouse, warehouse, dbt, semantic layer and BI, 24×7

Data Analytics and Data Warehousing Support: One Team From the Source Transaction to the Certified Dashboard

Most analytics incidents cross layers: an upstream column widens, a CDC slot stalls, a late partition breaks an incremental model, the warehouse autoscales into a retry storm, and the revenue dashboard is eight hours stale with a doubled bill. MinervaDB Data Analytics and Data Warehousing Support owns that whole chain, vendor-neutral, with measured freshness, correctness, latency and unit-cost objectives and a 15-minute Severity-1 response around the clock.

15 minSeverity-1 response, 24×7×365
900+enterprises served by MinervaDB
46cities with delivery presence
15+years of database engineering depth
200+years of combined leadership experience

Scope

What full-stack data warehousing support covers

Diagnosing a cross-layer incident needs one team that understands OLTP internals, streaming semantics, distributed query execution and BI caching at once. Data Analytics and Data Warehousing Support from MinervaDB takes ownership of the plumbing, the models and the numbers, and stays accountable for freshness, correctness, latency and unit cost rather than the uptime of a single server.

Architecture and capacity

In data warehousing support we design warehouse and lakehouse topology, table formats, clustering and partitioning, workload isolation and multi-region DR, all sized from measured demand.

Ingestion and CDC

Data Analytics and Data Warehousing Support uses log-based CDC from PostgreSQL, MySQL, MariaDB, SQL Server, Oracle and MongoDB; Kafka and Kinesis design; idempotent sinks; backfill and reseed runbooks.

Transformation engineering

Under data warehousing support: dbt project structure, incremental strategies, snapshots and slowly changing dimensions, contracts and tests, orchestration in Airflow, Dagster or Prefect.

Query and cost performance

For data warehousing support clients: plan-level tuning, materialisation and pre-aggregation, result caching, warehouse sizing and FinOps guardrails with per-team chargeback.

Reliability engineering

Every data warehousing support contract carries freshness and volume SLOs, anomaly detection, contract tests, incident response and written root-cause analyses with permanent fixes.

Governance and security

Data Analytics and Data Warehousing Support delivers role hierarchies, tag-based masking, row policies, lineage and audit evidence for SOC 2, ISO 27001, HIPAA, PCI DSS and GDPR assessments.

Reference architecture

The analytics platform data warehousing support is designed around

Every data warehousing support engagement starts with a written architecture. Your stack may use Iceberg instead of Delta or ClickHouse instead of BigQuery; the failure modes, the objectives and the review checkpoints stay the same.

Data Analytics and Data Warehousing Support reference architecture: sources, CDC and streaming ingestion, immutable lake landing zone, warehouse and real-time OLAP compute, dbt transformation and serving, with a freshness budget per hop and the 24x7 cross-cutting engineering layer

Figure 1. Six layers of data flow, an example freshness budget for a 30-minute mart objective, and the cross-cutting layer the data warehousing support on-call team owns.

Replayable landing zone

In data warehousing support designs, the raw zone is immutable and append-only, so any model can be rebuilt from history without touching production OLTP systems again.

Declarative, versioned transforms

Every metric is code in Git, reviewed and tested in CI, which makes each number auditable and each change reversible.

Cost as a first-class objective

Data Analytics and Data Warehousing Support designs in compute isolation, result caching and pre-aggregation from day one, rather than retrofitting them after the first surprise invoice.

Modelling and physical design

Dimensional modelling in data warehousing support

Poorly modelled warehouses fail slowly: metrics drift, joins fan out, storage grows faster than value and analysts build a shadow estate of spreadsheets. Data Analytics and Data Warehousing Support starts by declaring the grain of every fact, conforming shared dimensions and separating the logical model from each engine's physical layout.

Data Analytics and Data Warehousing Support conformed star schema: fact_sales at order-line grain with surrogate keys to conformed dimensions, and a Type 2 slowly changing dimension timeline

Figure 2. A conformed star schema with an explicit grain, and how Type 2 history keeps historical revenue by segment stable, reviewed in every data warehousing support design audit.

SQL · warehouse DDL with surrogate keys and a tested additivity rule

-- Conformed dimension with SCD Type 2 history (ANSI-style DDL; Snowflake shown)
CREATE TABLE IF NOT EXISTS dw.dim_customer (
    customer_key      BIGINT        NOT NULL,   -- surrogate key
    customer_id       VARCHAR(64)   NOT NULL,   -- natural / business key
    customer_name     VARCHAR(256),
    segment           VARCHAR(32),
    country_code      CHAR(2),
    scd2_valid_from   TIMESTAMP_NTZ NOT NULL,
    scd2_valid_to     TIMESTAMP_NTZ NOT NULL DEFAULT '9999-12-31 00:00:00'::TIMESTAMP_NTZ,
    scd2_is_current   BOOLEAN       NOT NULL DEFAULT TRUE,
    row_hash          VARCHAR(64)   NOT NULL,   -- change detection
    CONSTRAINT pk_dim_customer PRIMARY KEY (customer_key)   -- informational in Snowflake
);

-- Fact at ONE grain: the order line. Never mix grains in one fact table.
CREATE TABLE IF NOT EXISTS dw.fact_sales (
    sale_id          VARCHAR(64)    NOT NULL,
    date_key         INTEGER        NOT NULL,
    customer_key     BIGINT         NOT NULL,
    product_key      BIGINT         NOT NULL,
    store_key        BIGINT         NOT NULL,
    order_line_id    VARCHAR(64)    NOT NULL,   -- degenerate dimension
    quantity         NUMBER(18,3)   NOT NULL,
    gross_amount     NUMBER(18,4)   NOT NULL,
    discount_amount  NUMBER(18,4)   NOT NULL DEFAULT 0,
    net_amount       NUMBER(18,4)   NOT NULL,
    margin_amount    NUMBER(18,4),
    dw_loaded_at     TIMESTAMP_NTZ  NOT NULL,
    CONSTRAINT pk_fact_sales PRIMARY KEY (sale_id),
    CONSTRAINT fk_fact_sales_customer FOREIGN KEY (customer_key) REFERENCES dw.dim_customer (customer_key)
)
CLUSTER BY (date_key, store_key);

-- Snowflake does not enforce PK/FK/CHECK, so additivity is tested, not assumed (dbt test or scheduled check):
SELECT COUNT(*) AS broken_rows
FROM dw.fact_sales
WHERE net_amount <> gross_amount - discount_amount;

Cloud warehouses such as Snowflake and BigQuery treat primary, foreign and check constraints as informational, so data warehousing support turns every modelling rule into a test that runs on each load. The same logical contract is then materialised per engine. On ClickHouse the fact becomes a sorted, compressed MergeTree with a projection for the most-used dashboard filter and a roll-up the dashboard reads instead of raw rows.

SQL · ClickHouse physical design: partitioning, sort order, codecs and projections

CREATE TABLE analytics.fact_sales
(
    event_date        Date,
    event_time        DateTime64(3, 'UTC'),
    store_id          UInt32   CODEC(T64, ZSTD(3)),
    product_id        UInt32   CODEC(T64, ZSTD(3)),
    customer_id       UInt64   CODEC(T64, ZSTD(3)),
    channel           LowCardinality(String),
    quantity          Decimal(18,3),
    net_amount        Decimal(18,4) CODEC(ZSTD(3)),
    ingested_at       DateTime  DEFAULT now(),
    PROJECTION proj_store_daily
    (
        SELECT store_id, event_date, sum(net_amount), sum(quantity)
        GROUP BY store_id, event_date
    )
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (store_id, event_date, product_id)
TTL event_date + INTERVAL 36 MONTH TO VOLUME 'cold',
    event_date + INTERVAL 84 MONTH DELETE
SETTINGS index_granularity = 8192,
         min_bytes_for_wide_part = 10485760;

-- Incremental roll-up so dashboards never scan raw rows
CREATE MATERIALIZED VIEW analytics.mv_store_daily
ENGINE = SummingMergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (store_id, event_date)
AS SELECT store_id, event_date, sum(net_amount) AS net_amount, sum(quantity) AS quantity
FROM analytics.fact_sales
GROUP BY store_id, event_date;

CDC and streaming

Ingestion, change data capture and streaming pipelines

Batch extraction against a production OLTP database is the most common cause of both stale dashboards and primary-database incidents. Data Analytics and Data Warehousing Support replaces query-based extraction with log-based change data capture wherever the source allows it, so the warehouse follows the write-ahead log instead of competing with customer transactions.

Data Analytics and Data Warehousing Support log-based CDC path: WAL or binlog, Debezium on Kafka Connect, keyed Kafka topics with schema registry, stream processing, sink loaders and raw zone, with per-hop latency targets and monitored failure points

Figure 3. The ingestion path data warehousing support hardens during onboarding: per-hop latency targets, the four failure points watched first, and the alerts every pipeline ships with.

JSON · Debezium PostgreSQL connector hardened for production CDC

{
  "name": "pg-sales-cdc",
  "config": {
    "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
    "plugin.name": "pgoutput",
    "database.hostname": "pg-primary.internal",
    "database.dbname": "sales",
    "slot.name": "dbz_sales_slot",
    "publication.autocreate.mode": "filtered",
    "table.include.list": "public.orders,public.order_lines,public.customers",
    "topic.prefix": "sales",
    "snapshot.mode": "initial",
    "incremental.snapshot.chunk.size": 20480,
    "heartbeat.interval.ms": 10000,
    "heartbeat.action.query": "UPDATE dbz.heartbeat SET ts = now()",
    "decimal.handling.mode": "precise",
    "time.precision.mode": "adaptive_time_microseconds",
    "tombstones.on.delete": "true",
    "producer.override.compression.type": "zstd",
    "producer.override.acks": "all",
    "errors.tolerance": "all",
    "errors.deadletterqueue.topic.name": "dlq.sales",
    "errors.deadletterqueue.context.headers.enable": "true",
    "transforms": "route,unwrap",
    "transforms.unwrap.type": "io.debezium.transforms.ExtractNewRecordState",
    "transforms.unwrap.add.fields": "op,source.lsn,source.ts_ms",
    "transforms.unwrap.delete.handling.mode": "rewrite"
  }
}

The heartbeat setting is what separates a pipeline that survives a quiet weekend from one that fills the primary's disk. Without it, a low-traffic logical slot stops advancing its confirmed flush LSN and PostgreSQL retains WAL indefinitely. Our data warehousing support runbooks alert on retained WAL in bytes and on wal_status, not only on consumer lag in messages, as the PostgreSQL logical replication documentation recommends watching.

SQL · replication slot and WAL retention watchdog (PostgreSQL source)

SELECT slot_name,
       active,
       wal_status,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn))  AS retained_wal,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), confirmed_flush_lsn)) AS unflushed,
       safe_wal_size
FROM   pg_replication_slots
WHERE  slot_type = 'logical'
ORDER  BY pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) DESC;

-- Alert thresholds we deploy by default:
--   WARNING  retained_wal > 10 GB or wal_status = 'extended'
--   CRITICAL retained_wal > 40 GB or wal_status IN ('unreserved','lost')
--   CRITICAL slot inactive for more than 5 minutes

In data warehousing support, loads are idempotent. The DAG below reads the last committed watermark rather than trusting wall-clock time, merges on the key so a retried task cannot double-count revenue, and blocks promotion behind freshness and reconciliation gates. It uses the Airflow 2 TaskFlow API; on Airflow 3 the decorators import from airflow.sdk, per the Apache Airflow documentation.

Python · Airflow DAG: watermarked, idempotent incremental load with quality gates

from datetime import datetime, timedelta
from airflow.decorators import dag, task
from airflow.providers.common.sql.operators.sql import SQLCheckOperator

DEFAULT_ARGS = {
    "owner": "minervadb-analytics",
    "retries": 3,
    "retry_delay": timedelta(minutes=5),
    "retry_exponential_backoff": True,
    "execution_timeout": timedelta(hours=2),
}

@dag(
    dag_id="warehouse_sales_incremental",
    schedule="*/30 * * * *",
    start_date=datetime(2026, 1, 1),
    catchup=False,
    max_active_runs=1,               # protects the warehouse from run pile-up
    default_args=DEFAULT_ARGS,
    tags=["warehouse", "incremental", "minervadb"],
)
def warehouse_sales_incremental():

    @task
    def resolve_watermark(data_interval_start=None) -> str:
        """Never trust wall-clock time: read the last committed watermark."""
        from airflow.providers.snowflake.hooks.snowflake import SnowflakeHook
        hook = SnowflakeHook(snowflake_conn_id="dw")
        low = hook.get_first(
            "SELECT COALESCE(MAX(dw_loaded_at), '1970-01-01') FROM dw.fact_sales"
        )[0]
        return low.isoformat()

    @task
    def merge_increment(watermark: str) -> int:
        """MERGE is idempotent, so a retried task cannot double-count revenue."""
        from airflow.providers.snowflake.hooks.snowflake import SnowflakeHook
        hook = SnowflakeHook(snowflake_conn_id="dw")
        rows = hook.run(
            """
            MERGE INTO dw.fact_sales AS t
            USING (
                SELECT s.sale_id, d.date_key, c.customer_key, p.product_key,
                       st.store_key, s.order_line_id, s.quantity,
                       s.gross_amount, s.discount_amount, s.net_amount,
                       s.updated_at AS dw_loaded_at
                FROM   raw.sales_stream      s
                JOIN   dw.dim_date           d  ON d.calendar_date = s.order_date
                JOIN   dw.dim_customer       c  ON c.customer_id = s.customer_id
                                                AND c.scd2_is_current
                JOIN   dw.dim_product        p  ON p.product_key = s.product_key
                JOIN   dw.dim_store          st ON st.store_code = s.store_code
                WHERE  s.updated_at > %(watermark)s
                  AND  s._op != 'd'
            ) AS s
            ON t.sale_id = s.sale_id
            WHEN MATCHED THEN UPDATE SET
                 t.quantity = s.quantity, t.net_amount = s.net_amount,
                 t.dw_loaded_at = s.dw_loaded_at
            WHEN NOT MATCHED THEN INSERT VALUES (
                 s.sale_id, s.date_key, s.customer_key, s.product_key,
                 s.store_key, s.order_line_id, s.quantity, s.gross_amount,
                 s.discount_amount, s.net_amount, NULL, HASH(s.sale_id))
            """,
            parameters={"watermark": watermark},
            handler=lambda cur: cur.rowcount,
        )
        return rows

    freshness_gate = SQLCheckOperator(
        task_id="freshness_sla_gate",
        conn_id="dw",
        sql="""
            SELECT TIMESTAMPDIFF('minute', MAX(dw_loaded_at), CURRENT_TIMESTAMP()) < 45
            FROM dw.fact_sales
        """,
    )

    reconciliation_gate = SQLCheckOperator(
        task_id="source_to_warehouse_reconciliation",
        conn_id="dw",
        sql="""
            WITH src AS (SELECT COUNT(*) c FROM raw.sales_stream WHERE _op != 'd'),
                 dwh AS (SELECT COUNT(*) c FROM dw.fact_sales)
            SELECT ABS(src.c - dwh.c) / NULLIF(src.c, 0) < 0.001 FROM src, dwh
        """,
    )

    merge_increment(resolve_watermark()) >> freshness_gate >> reconciliation_gate

warehouse_sales_incremental()

Transformation

dbt, contracts and the semantic layer

Transformation is where analytics becomes software engineering, and where data warehousing support pays for itself fastest. We standardise on staging, intermediate and mart layers, deterministic incremental strategies, enforced contracts and a single semantic definition for every metric that finance and product both trust.

SQL · dbt incremental model with a late-arrival window and point-in-time SCD2 joins

-- models/marts/fact_sales.sql  (dbt-snowflake 1.8+; delete+insert keeps late rows idempotent)
{{ config(
    materialized         = 'incremental',
    incremental_strategy = 'delete+insert',
    unique_key           = 'sale_id',
    cluster_by           = ['date_key', 'store_key'],
    on_schema_change     = 'append_new_columns',
    tags                 = ['mart', 'revenue']
) }}

WITH orders AS (
    SELECT
        o.order_line_id,
        o.order_date,
        o.customer_id,
        o.store_code,
        o.product_key,
        o.quantity,
        o.gross_amount,
        o.discount_amount,
        o.gross_amount - o.discount_amount AS net_amount,
        o._ingested_at
    FROM {{ ref('stg_sales__order_lines') }} AS o
    {% if is_incremental() %}
    -- 3-day trailing window: late-arriving events self-heal on the next run
    WHERE o.order_date >= (SELECT DATEADD('day', -3, MAX(order_date)) FROM {{ this }})
    {% endif %}
)

SELECT
    {{ dbt_utils.generate_surrogate_key(['o.order_line_id']) }} AS sale_id,
    d.date_key,
    c.customer_key,
    o.product_key,
    s.store_key,
    o.order_line_id,
    o.order_date,
    o.quantity,
    o.gross_amount,
    o.discount_amount,
    o.net_amount,
    o.net_amount - (o.quantity * p.unit_cost)                  AS margin_amount,
    o._ingested_at                                             AS dw_loaded_at
FROM orders AS o
JOIN {{ ref('dim_date') }}     AS d ON d.calendar_date = o.order_date
JOIN {{ ref('dim_customer') }} AS c ON c.customer_id   = o.customer_id
                                   AND o.order_date >= c.scd2_valid_from
                                   AND o.order_date <  c.scd2_valid_to     -- point-in-time, not "current"
JOIN {{ ref('dim_store') }}    AS s ON s.store_code    = o.store_code
JOIN {{ ref('dim_product') }}  AS p ON p.product_key   = o.product_key AND p.scd2_is_current

For data warehousing support reviews, two details in the model matter more than they look. The three-day trailing window lets late events self-heal without a full refresh, and the customer join is point-in-time against scd2_valid_from and scd2_valid_to, so a customer's current segment never rewrites last year's revenue. Contracts and tests then block a bad deploy in CI, per the dbt model contracts documentation.

YAML · dbt contracts, tests and freshness SLAs that block a bad deploy

version: 2

sources:
  - name: raw
    database: analytics_raw
    freshness:
      warn_after:  {count: 30, period: minute}
      error_after: {count: 90, period: minute}
    loaded_at_field: _ingested_at
    tables:
      - name: sales_stream
        columns:
          - name: order_line_id
            tests: [not_null, unique]

models:
  - name: fact_sales
    description: "Revenue fact at order-line grain. Owner: analytics-platform@minervadb.com"
    config:
      contract: {enforced: true}
    columns:
      - name: sale_id
        data_type: varchar
        constraints: [{type: not_null}, {type: primary_key}]
        tests: [unique, not_null]
      - name: customer_key
        data_type: bigint
        tests:
          - relationships: {to: ref('dim_customer'), field: customer_key}
      - name: net_amount
        data_type: numeric(18,4)
        tests:
          - dbt_utils.expression_is_true:
              expression: ">= -1000000"
          - dbt_expectations.expect_column_values_to_not_be_null
    tests:
      - dbt_utils.equal_rowcount:
          compare_model: ref('stg_sales__order_lines')
      - dbt_utils.recency:
          datepart: hour
          field: order_date
          interval: 24

Performance engineering

Query performance and concurrency in data warehousing support

Warehouse performance work in data warehousing support is evidence-driven. We rank queries by total cost rather than worst single execution, read the physical plan, and fix the cause: a missing pre-aggregation, an exploding join, an unpruned partition, an implicit cast, or a BI tool issuing one query per tile. Only then do we discuss adding compute.

Data Analytics and Data Warehousing Support performance triage: rank queries by total cost from each engine's query history, read the plan for pruning, spill, fan-out and queueing, and apply the matching fix before adding compute

Figure 4. The triage sequence and the query-history source we read on each engine, with the five plan patterns behind most slow or expensive workloads.

The ranking query below is the first thing we run on Snowflake and ClickHouse estates. Grouping by the normalised query hash turns thousands of executions into a short list of shapes, and the columns show whether the problem is scanning, spilling or caching. The same triage runs on BigQuery from INFORMATION_SCHEMA.JOBS and on Redshift from SYS_QUERY_HISTORY.

For user-facing analytics that must answer in milliseconds, data warehousing support moves the hot path to real-time OLAP: ClickHouse projections and materialised roll-ups, Druid or Pinot rollups, and tiered storage for history, as described in the ClickHouse documentation.

SQL · find the queries that actually cost money (Snowflake and ClickHouse)

SELECT
    query_hash,
    ANY_VALUE(LEFT(query_text, 120))                       AS sample_sql,
    COUNT(*)                                               AS executions,
    ROUND(SUM(total_elapsed_time) / 1000 / 60, 1)          AS total_minutes,
    ROUND(AVG(total_elapsed_time) / 1000, 2)               AS avg_seconds,
    ROUND(SUM(bytes_scanned) / POWER(1024, 4), 3)          AS tb_scanned,
    ROUND(AVG(percentage_scanned_from_cache), 1)           AS pct_from_cache,
    SUM(bytes_spilled_to_remote_storage)                   AS remote_spill,
    ROUND(SUM(credits_used_cloud_services), 3)             AS cloud_credits
FROM   snowflake.account_usage.query_history
WHERE  start_time >= DATEADD('day', -7, CURRENT_TIMESTAMP())
  AND  execution_status = 'SUCCESS'
GROUP  BY query_hash
HAVING total_minutes > 5
ORDER  BY total_minutes DESC
LIMIT  25;

-- The same triage on ClickHouse:
SELECT normalized_query_hash,
       count()                                             AS executions,
       round(avg(query_duration_ms))                       AS avg_ms,
       formatReadableSize(sum(read_bytes))                 AS read_total,
       round(sum(read_rows) / 1e9, 2)                      AS billion_rows,
       formatReadableSize(max(memory_usage))               AS peak_memory
FROM   system.query_log
WHERE  type = 'QueryFinish' AND event_time > now() - INTERVAL 7 DAY
GROUP  BY normalized_query_hash
ORDER  BY sum(query_duration_ms) DESC
LIMIT  25;

Governance

Security, governance and compliance

The warehouse is usually the widest-reaching copy of customer data, which makes it the most consequential system in an audit. Data Analytics and Data Warehousing Support implements least-privilege roles, tag-based classification, dynamic masking, row policies and audit queries, and produces the evidence assessors ask for.

The pattern alongside classifies a column once and lets policy follow the tag, rather than multiplying secure views. IS_ROLE_IN_SESSION respects role hierarchies, which CURRENT_ROLE() comparisons do not, and the row-policy argument is named differently from the column it protects to avoid silent shadowing. Equivalent controls exist on BigQuery (policy tags, row-level security), Redshift (dynamic data masking, RLS) and Databricks Unity Catalog.

In data warehousing support, evidence matters as much as enforcement. Access history answers "who read this PII column" with a query, not a spreadsheet exercise, and this work aligns with our database auditing, privacy and security practice.

SQL · tag-based classification, masking, row access policy and audit evidence

-- 1. Classify once, enforce everywhere (Snowflake Enterprise Edition features)
CREATE TAG IF NOT EXISTS governance.data_sensitivity
    ALLOWED_VALUES 'public', 'internal', 'confidential', 'pii', 'phi';

ALTER TABLE dw.dim_customer MODIFY COLUMN email_address
    SET TAG governance.data_sensitivity = 'pii';

-- 2. Tag-based masking: every STRING column tagged pii is masked by role
CREATE OR REPLACE MASKING POLICY governance.mask_pii_string AS (val STRING)
RETURNS STRING ->
    CASE
        WHEN IS_ROLE_IN_SESSION('DATA_PROTECTION_OFFICER') THEN val
        WHEN IS_ROLE_IN_SESSION('ANALYST')                  THEN REGEXP_REPLACE(val, '^[^@]+', '****')
        ELSE '***MASKED***'
    END;

ALTER TAG governance.data_sensitivity SET MASKING POLICY governance.mask_pii_string;

-- 3. Row access policy for residency (argument named to avoid shadowing the column)
CREATE OR REPLACE ROW ACCESS POLICY governance.region_rap AS (p_country CHAR(2))
RETURNS BOOLEAN ->
    EXISTS (
        SELECT 1
        FROM governance.role_region_map AS m
        WHERE IS_ROLE_IN_SESSION(m.role_name)
          AND m.country_code IN (p_country, 'ALL')
    );

ALTER TABLE dw.dim_customer ADD ROW ACCESS POLICY governance.region_rap ON (country_code);

-- 4. Evidence: who read the PII column in the last 30 days (ACCOUNT_USAGE lags by up to ~3 hours)
SELECT
    ah.user_name,
    ah.query_start_time,
    obj.value:"objectName"::STRING AS object_name
FROM snowflake.account_usage.access_history AS ah,
     LATERAL FLATTEN(input => ah.base_objects_accessed) AS obj,
     LATERAL FLATTEN(input => obj.value:"columns")      AS col
WHERE col.value:"columnName"::STRING = 'EMAIL_ADDRESS'
  AND ah.query_start_time >= DATEADD('day', -30, CURRENT_TIMESTAMP())
ORDER BY ah.query_start_time DESC;

Engagement and service levels

How a data warehousing support engagement runs

We do not start by rewriting your platform. We measure it, remove the fragility that causes pages at 03:00, and only then invest in optimisation and automation. The first ninety days follow a fixed, deliverable-driven path.

Data Analytics and Data Warehousing Support 90-day onboarding: discovery, stabilise, optimise, automate and operate as overlapping workstreams with the deliverable that closes each

Figure 5. The 90-day onboarding path for data warehousing support, with the written deliverable that closes each phase.

Severity 115 minCertified data wrong or unavailable, pipeline or warehouse down. 24×7×365.
Severity 212 hFreshness SLO breached or severe degradation, no workaround.
Severity 324 hDegradation with a workaround in place.
Severity 448 hQuestions, reviews and advisory requests.
CapabilityAdvisoryManaged AnalyticsMission Critical 24×7
Pipeline and DAG on-callAdvisory onlyShared with your teamMinervaDB holds the pager
Warehouse tuning and cost reviewQuarterlyMonthlyContinuous, weekly report
dbt, Airflow and CI ownershipCode reviewCo-developmentFull engineering delivery
Data quality and contract testingFramework designImplemented and monitoredMonitored against SLOs
Disaster recovery drillsRunbook authoringSemi-annualQuarterly, with evidence
Executive reportingQuarterly summaryMonthly review packMonthly review and roadmap

Test every model, pipeline, policy and sizing change in a non-production environment first, keep a replayable raw zone and warehouse time travel or snapshots before destructive changes, and maintain a robust disaster-recovery posture for the warehouse and the lake.

FAQ

Questions about data warehousing support

The questions data leaders ask most often before a data warehousing support engagement starts.

What does full-stack data warehousing support include?

Architecture and capacity design, CDC and streaming ingestion, warehouse and lakehouse administration, dimensional modelling, dbt and orchestration engineering, query and cost optimisation, data quality and observability, governance, disaster recovery and 24×7 incident response, from source systems to certified dashboards.

Do we have to migrate to get support?

No. Data Analytics and Data Warehousing Support covers what you already run. Any migration we later recommend comes with measured benchmarks, a cost model and a reversible cutover plan.

Can MinervaDB own on-call for our data pipelines?

Yes. On the Mission Critical data warehousing support tier we hold the pager for pipelines, warehouses and BI availability, respond to Severity-1 incidents within 15 minutes, and deliver a written root-cause analysis with a permanent fix rather than a restart.

How quickly do we see results?

The written data warehousing support discovery report lands within three business days with a ranked list of risks and cost findings. Measured performance and cost changes follow in the optimisation phase, reported as before-and-after numbers from your own query history.

How do you reduce warehouse cost without hurting performance?

By removing waste before touching capacity: incremental models instead of full refreshes, pruning-friendly layouts, pre-aggregation, result caching, auto-suspend and statement timeouts, workload isolation, and per-team budgets with chargeback.

Can you work alongside our analytics engineers?

Yes. Data Analytics and Data Warehousing Support acts as an embedded senior tier: your engineers keep domain ownership while we provide architecture review, hard-problem escalation, code review and out-of-hours cover, with knowledge transfer as a contractual deliverable.

Do you support real-time, sub-second analytics?

Yes. Data Analytics and Data Warehousing Support covers real-time OLAP on ClickHouse, Druid, Pinot and StarRocks fed by Kafka and Flink as a core competency, including projections, materialised roll-ups and tiered storage for user-facing dashboards.

Is the service compatible with our compliance obligations?

We work inside SOC 2, ISO 27001, HIPAA, PCI DSS, GDPR and regional residency regimes, implement least-privilege access, masking and row policies, and produce the lineage and audit evidence assessors request.

Related MinervaDB services: data strategy and analytics, data engineering, Kafka consulting, vector data engineering, consultative support and 24/7 emergency DBA coverage. Upstream specifications we track include the Apache Iceberg table specification.

Get a written assessment in three business days

Tell us which engines you run, where the pain is and what your reporting deadlines are. A MinervaDB principal engineer reviews the architecture, quantifies risk and cost exposure, and shows what data warehousing support would change.