Dive deep into the Snowflake Data Cloud. Guides on building a modern cloud data warehouse, data sharing, performance optimization, and leveraging advanced features like Snowpipe and Streams.
I’ve spent the last few days working with Snowflake Intelligence, and I want to share what actually works—not just the marketing pitch. If you’re tired of being the bottleneck for every data request in your organization, this might be exactly what you need.
Why This Actually Matters
Here’s the thing: most companies still treat data like it’s 2010. Your sales team wants to know last quarter’s performance by region? They file a ticket. Marketing needs customer segmentation data? Another ticket. By the time your data team gets through the backlog, the insights are already stale.
I was skeptical at first. Natural language querying isn’t new—we’ve all seen chatbots that completely miss the point. But the difference here is the architecture. The system uses AI agents that understand your specific business context, not generic SQL generation.
The Three Building Blocks
Understanding how this works helps you use it better. There are three key pieces:
Natural Language Processing (NLP) translates what you’re asking into something the system can work with. It’s not just keyword matching—it understands context. When someone asks about “Q4 performance,” it knows whether they mean fiscal or calendar year based on your company’s setup.
AI Agents are where the magic happens. Think of them as specialized assistants. Your finance agent knows the difference between GAAP revenue and recognized revenue. Your supply chain agent understands lead times and reorder points. You configure these agents to match how your business actually works.
Semantic Views sit between the agents and your raw data. They’re essentially curated views of your data that make sense to humans and AI alike. Instead of exposing 47 columns from your sales table, you create a semantic view with the 12 that actually matter for reporting.
Setting This Up (The Real Way)
Let me walk you through a realistic implementation. I’m using Snowflake’s sample data so you can follow along.
Step 1: Create Your Semantic View
Start simple. Here’s a semantic view built on Snowflake’s TPCH sample dataset:
-- First, get access to the sample data
USE DATABASE SNOWFLAKE_SAMPLE_DATA;
USE SCHEMA TPCH_SF1;
-- Create your own database for semantic views
CREATE DATABASE IF NOT EXISTS MY_INTELLIGENCE_DB;
CREATE SCHEMA IF NOT EXISTS MY_INTELLIGENCE_DB.SEMANTIC_LAYER;
-- Build a semantic view for customer orders
CREATE OR REPLACE VIEW MY_INTELLIGENCE_DB.SEMANTIC_LAYER.CUSTOMER_ORDERS AS
SELECT
c.C_CUSTKEY as customer_id,
c.C_NAME as customer_name,
c.C_MKTSEGMENT as market_segment,
n.N_NAME as country,
o.O_ORDERKEY as order_id,
o.O_ORDERDATE as order_date,
o.O_TOTALPRICE as order_total,
o.O_ORDERSTATUS as order_status
FROM SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER c
JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS o
ON c.C_CUSTKEY = o.O_CUSTKEY
JOIN SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION n
ON c.C_NATIONKEY = n.N_NATIONKEY
WHERE o.O_ORDERDATE >= '1995-01-01';
This view hides the complexity of joins and uses clear, business-friendly column names. Your AI agent will query this, not the raw tables.
For views that get hit frequently,regular view makes a huge difference:
CREATE OR REPLACE VIEW MY_INTELLIGENCE_DB.SEMANTIC_LAYER.DAILY_SALES_SUMMARY AS
SELECT
DATE_TRUNC('day', order_date) AS sale_date,
market_segment,
country,
COUNT(DISTINCT order_id) AS order_count,
SUM(order_total) AS total_revenue,
AVG(order_total) AS avg_order_value
FROM MY_INTELLIGENCE_DB.SEMANTIC_LAYER.CUSTOMER_ORDERS
GROUP BY 1, 2, 3;
Run this and check the results:
SELECT *
FROM MY_INTELLIGENCE_DB.SEMANTIC_LAYER.DAILY_SALES_SUMMARY
WHERE sale_date >= '1998-01-01'
ORDER BY total_revenue DESC
LIMIT 20;
When you set up an AI agent in Snowflake Intelligence, you give it specific instructions. Here’s what mine looks like for a sales agent:
Agent Name: Sales Analytics Agent
Instructions:
You have access to customer order data through the SEMANTIC_LAYER.CUSTOMER_ORDERS view.
When users ask about:
- "Revenue" or "sales" - use the order_total column
- "Customers" - always include customer_name and market_segment
- Time periods - default to the last 90 days unless specified
- "Top customers" - rank by total order_total, limit to 10 unless specified
Always format currency as USD with 2 decimal places.
If a query would scan more than 1 million rows, ask the user to narrow the date range.
What Actually Breaks (And How to Fix It)
I’ve seen these issues kill projects:
Vague Questions = Expensive Queries When someone asks “show me everything about customers,” the system might scan your entire data warehouse. Train your users to be specific: “Show me customers in the AUTOMOBILE segment who ordered more than $100k in 1998.”
Semantic Views That Drift Your source tables change. Columns get renamed. New status codes appear. Your semantic views break, and suddenly the AI returns garbage. Set up a weekly validation job:
-- Quick health check for your semantic views
SELECT
TABLE_SCHEMA,
TABLE_NAME,
LAST_ALTERED,
ROW_COUNT
FROM MY_INTELLIGENCE_DB.INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'SEMANTIC_LAYER'
AND TABLE_TYPE = 'VIEW'
ORDER BY LAST_ALTERED DESC;
Runaway Costs One enthusiastic user can rack up hundreds in compute charges with poorly scoped questions. Use resource monitors:
-- Create a resource monitor for your Intelligence workload
CREATE RESOURCE MONITOR INTELLIGENCE_BUDGET
WITH CREDIT_QUOTA = 100
FREQUENCY = MONTHLY
START_TIMESTAMP = IMMEDIATELY
TRIGGERS
ON 75 PERCENT DO NOTIFY
ON 100 PERCENT DO SUSPEND;
-- Assign it to your warehouse
ALTER WAREHOUSE INTELLIGENCE_WH SET RESOURCE_MONITOR = INTELLIGENCE_BUDGET;
Performance Tips That Actually Work
Clustering Keys If your semantic views filter by date constantly, cluster on that date:
-- Add clustering to improve query performance
ALTER TABLE MY_INTELLIGENCE_DB.SEMANTIC_LAYER.DAILY_SALES_SUMMARY
CLUSTER BY (sale_date);
Query Tagging for Cost Tracking Tag queries so you can see exactly what each agent costs:
-- At the start of an agent session
ALTER SESSION SET QUERY_TAG = 'sales_agent_q4_analysis';
-- Your queries here
-- View tagged query costs later
SELECT
QUERY_TAG,
COUNT(*) as query_count,
SUM(TOTAL_ELAPSED_TIME)/1000 as total_seconds,
SUM(CREDITS_USED_CLOUD_SERVICES) as credits_used
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE QUERY_TAG IS NOT NULL
AND START_TIME >= DATEADD(day, -7, CURRENT_TIMESTAMP())
GROUP BY 1
ORDER BY credits_used DESC;
Test Queries to Validate Your Setup
Run these to make sure everything works:
-- Test 1: Basic aggregation
SELECT
market_segment,
COUNT(DISTINCT customer_id) as customer_count,
SUM(order_total) as total_revenue
FROM MY_INTELLIGENCE_DB.SEMANTIC_LAYER.CUSTOMER_ORDERS
WHERE order_date BETWEEN '1998-01-01' AND '1998-12-31'
GROUP BY 1
ORDER BY 2 DESC;
-- Test 2: Top customers
SELECT
customer_name,
country,
COUNT(order_id) as order_count,
SUM(order_total) as lifetime_value
FROM MY_INTELLIGENCE_DB.SEMANTIC_LAYER.CUSTOMER_ORDERS
GROUP BY 1, 2
HAVING SUM(order_total) > 500000
ORDER BY 4 DESC
LIMIT 10;
-- Test 3: Time series
SELECT
DATE_TRUNC('month', order_date) as month,
market_segment,
SUM(order_total) as monthly_revenue
FROM MY_INTELLIGENCE_DB.SEMANTIC_LAYER.CUSTOMER_ORDERS
WHERE order_date >= '1997-01-01'
GROUP BY 1, 2
ORDER BY 1, 3 DESC;
The Bottom Line
Snowflake Intelligence isn’t magic, but it does work when you set it up right. Focus on clean semantic views, specific agent instructions, and cost controls from day one.
Start with one use case—maybe sales reporting or customer analytics. Get that working well before expanding. And involve your actual end users in testing. They’ll phrase questions in ways you never anticipated, and that feedback is gold.
The goal isn’t to eliminate your data team. It’s to free them from repetitive requests so they can focus on complex analysis and building better data products.
Run dbt Core Directly in Snowflake Without Infrastructure
Snowflake native dbt integration announced at Summit 2025 eliminates the need for separate containers or VMs to run dbt Core. Data teams can now execute dbt transformations directly within Snowflake, with built-in lineage tracking, logging, and job scheduling through Snowsight. This breakthrough simplifies data pipeline architecture and reduces operational overhead significantly.
For years, running dbt meant managing separate infrastructure—deploying containers, configuring CI/CD pipelines, and maintaining compute resources outside your data warehouse. The Snowflake native dbt integration changes everything by bringing dbt Core execution inside Snowflake’s secure environment.
What Is Snowflake Native dbt Integration?
Snowflake native dbt integration allows data teams to run dbt Core transformations directly within Snowflake without external orchestration tools. The integration provides a managed environment where dbt projects execute using Snowflake’s compute resources, with full visibility through Snowsight.
Key Benefits
The native integration delivers:
Zero infrastructure management – No containers, VMs, or separate compute
Built-in lineage tracking – Automatic data flow visualization
Native job scheduling – Schedule dbt runs using Snowflake Tasks
Integrated logging – Debug pipelines directly in Snowsight
No licensing costs – dbt Core runs free within Snowflake
Organizations using Snowflake Dynamic Tables can now complement those automated refreshes with sophisticated dbt transformations, creating comprehensive data pipeline solutions entirely within the Snowflake ecosystem.
How Native dbt Integration Works
Execution Architecture
When you deploy a dbt project to Snowflake native dbt integration, the platform:
Stores project files in Snowflake’s internal stage
Compiles dbt models using Snowflake’s compute
Executes SQL transformations against your data
Captures lineage automatically for all dependencies
Logs results to Snowsight for debugging
Similar to how real-time data pipeline architectures require proper orchestration, dbt projects benefit from Snowflake’s native task scheduling and dependency management.
-- Create a dbt job in Snowflake
CREATE OR REPLACE TASK run_dbt_models
WAREHOUSE = transform_wh
SCHEDULE = 'USING CRON 0 2 * * * America/Los_Angeles'
AS
CALL DBT.RUN_DBT_PROJECT('my_analytics_project');
-- Enable the task
ALTER TASK run_dbt_models RESUME;
Setting Up Native dbt Integration
Prerequisites
Before deploying dbt projects natively:
Snowflake account with ACCOUNTADMIN or appropriate role
Existing dbt project with proper structure
Git repository containing dbt code (optional but recommended)
Step-by-Step Implementation
1: Prepare Your dbt Project
Ensure your project follows standard dbt structure:
Improved security (execution stays within Snowflake perimeter)
Better integration with Snowflake features
Cost Considerations
Compute Consumption
Snowflake native dbt integration uses standard warehouse compute:
Charged per second of active execution
Auto-suspend reduces idle costs
Share warehouses across multiple jobs for efficiency
Comparison with External Solutions
Aspect
External dbt
Native dbt Integration
Infrastructure
EC2/VM costs
Only Snowflake compute
Maintenance
Manual updates
Managed by Snowflake
Licensing
dbt Cloud fees
Free (dbt Core)
Integration
External APIs
Native Snowflake
Organizations using automation strategies across their data stack can consolidate tools and reduce total cost of ownership.
Real-World Use Cases
Use Case 1: Financial Services Reporting
A fintech company moved 200+ dbt models from AWS containers to Snowflake native dbt integration, achieving:
60% reduction in infrastructure costs
40% faster transformation execution
Zero downtime migrations using blue-green deployment
Use Case 2: E-commerce Analytics
An online retailer consolidated their data pipeline by combining native dbt with Dynamic Tables:
dbt handles complex business logic transformations
Dynamic Tables maintain real-time aggregations
Both execute entirely within Snowflake
Use Case 3: Healthcare Data Warehousing
A healthcare provider simplified compliance by keeping all transformations inside Snowflake’s secure perimeter:
HIPAA compliance maintained without data egress
Audit logs automatically captured
PHI never leaves Snowflake environment
Advanced Features
Git Integration
Connect dbt projects directly to repositories:
CREATE GIT REPOSITORY dbt_repo
ORIGIN = 'https://github.com/myorg/dbt-project.git'
API_INTEGRATION = github_integration;
-- Run dbt from specific branch
CALL run_dbt_from_git('dbt_repo', 'production');
Testing and Validation
Native integration supports full dbt testing:
Schema tests validate data structure
Data tests check business rules
Custom tests enforce specific requirements
Multi-Environment Support
Manage dev, staging, and production through Snowflake databases:
sql
-- Development environment
USE DATABASE dev_analytics;
CALL run_dbt('dev_project');
-- Production environment
USE DATABASE prod_analytics;
CALL run_dbt('prod_project');
Troubleshooting Common Issues
Issue 1: Slow Model Compilation
Solution: Pre-compile dbt projects and cache results:
sql
-- Cache compiled SQL for faster execution
ALTER TASK dbt_refresh SET
SUSPEND_TASK_AFTER_NUM_FAILURES = 3;
Issue 2: Dependency Conflicts
Solution: Use Snowflake’s Python environment isolation:
Snowflake plans to enhance native dbt integration with:
Visual dbt model builder for low-code transformations
Automatic optimization suggestions using AI
Enhanced collaboration features for team workflows
Deeper integration with Snowflake’s AI capabilities
Organizations exploring autonomous AI agents in other platforms will find similar intelligence coming to dbt optimization.
Conclusion: Simplified Data Transformation
Snowflake native dbt integration represents a significant evolution in data transformation architecture. By eliminating external infrastructure and bringing dbt Core inside Snowflake, data teams achieve simplified operations, reduced costs, and enhanced security.
The integration is production-ready today, with thousands of organizations already migrating their dbt workloads. Teams should evaluate their current dbt architecture and plan migrations to take advantage of this native capability.
Start with non-critical projects, validate performance, and progressively move production workloads. The combination of zero infrastructure overhead, built-in observability, and seamless Snowflake integration makes native dbt integration the future of transformation pipelines.
When you think of aggregation functions in SQL, SUM(), COUNT(), and AVG() likely come to mind first. These are the workhorses of data analysis, undoubtedly. However, Snowflake, a titan in the data cloud, offers a treasure trove of specialized, unique aggregation functions that often fly under the radar. These functions aren’t just novelties; they are powerful tools that can simplify complex analytical problems and provide insights you might otherwise struggle to extract.
Let’s dive into some of Snowflake’s most potent, yet often overlooked, aggregation capabilities.
1. APPROX_TOP_K (and APPROX_TOP_K_ARRAY): Finding the Most Frequent Items Efficiently
Imagine you have billions of customer transactions and you need to quickly identify the top 10 most purchased products, or the top 5 most active users. A GROUP BY and ORDER BY on such a massive dataset can be resource-intensive. This is where APPROX_TOP_K shines.
This function provides an approximate list of the most frequent values in an expression. While not 100% precise (hence “approximate”), it offers a significantly faster and more resource-efficient way to get high-confidence results, especially on very large datasets.
Example Use Case: Top Products by Sales
Let’s use some sample sales data.
-- Create some sample sales data
CREATE OR REPLACE TABLE sales_data (
sale_id INT,
product_name VARCHAR(50),
customer_id INT
);
INSERT INTO sales_data VALUES
(1, 'Laptop', 101),
(2, 'Mouse', 102),
(3, 'Laptop', 103),
(4, 'Keyboard', 101),
(5, 'Mouse', 104),
(6, 'Laptop', 105),
(7, 'Monitor', 101),
(8, 'Laptop', 102),
(9, 'Mouse', 103),
(10, 'External SSD', 106);
-- Find the top 3 most frequently sold products using APPROX_TOP_K_ARRAY
SELECT APPROX_TOP_K_ARRAY(product_name, 3) AS top_3_products
FROM sales_data;
-- Expected Output:
-- [
-- { "VALUE": "Laptop", "COUNT": 4 },
-- { "VALUE": "Mouse", "COUNT": 3 },
-- { "VALUE": "Keyboard", "COUNT": 1 }
-- ]
APPROX_TOP_K returns a single JSON object, while APPROX_TOP_K_ARRAY returns an array of JSON objects, which is often more convenient for downstream processing.
2. MODE(): Identifying the Most Common Value Directly
Often, you need to find the value that appears most frequently within a group. While you could achieve this with GROUP BY, COUNT(), and QUALIFY ROW_NUMBER(), Snowflake simplifies it with a dedicated MODE() function.
Example Use Case: Most Common Payment Method by Region
Imagine you want to know which payment method is most popular in each sales region.
-- Sample transaction data
CREATE OR REPLACE TABLE transactions (
transaction_id INT,
region VARCHAR(50),
payment_method VARCHAR(50)
);
INSERT INTO transactions VALUES
(1, 'North', 'Credit Card'),
(2, 'North', 'Credit Card'),
(3, 'North', 'PayPal'),
(4, 'South', 'Cash'),
(5, 'South', 'Cash'),
(6, 'South', 'Credit Card'),
(7, 'East', 'Credit Card'),
(8, 'East', 'PayPal'),
(9, 'East', 'PayPal');
-- Find the mode of payment_method for each region
SELECT
region,
MODE(payment_method) AS most_common_payment_method
FROM
transactions
GROUP BY
region;
-- Expected Output:
-- REGION | MOST_COMMON_PAYMENT_METHOD
-- -------|--------------------------
-- North | Credit Card
-- South | Cash
-- East | PayPal
The MODE() function cleanly returns the most frequent non-NULL value. If there’s a tie, it can return any one of the tied values.
3. COLLECT_LIST() and COLLECT_SET(): Aggregating Values into Arrays
These functions are incredibly powerful for denormalization or when you need to gather all related items into a single, iterable structure within a column.
• COLLECT_LIST(): Returns an array of all input values, including duplicates, in an arbitrary order.
• COLLECT_SET(): Returns an array of all distinct input values, also in an arbitrary order.
Example Use Case: Customer Purchase History
You want to see all products a customer has ever purchased, aggregated into a single list.
-- Using the sales_data from above
-- Aggregate all products purchased by each customer
SELECT
customer_id,
COLLECT_LIST(product_name) AS all_products_purchased,
COLLECT_SET(product_name) AS distinct_products_purchased
FROM
sales_data
GROUP BY
customer_id
ORDER BY customer_id;
-- Expected Output (order of items in array may vary):
-- CUSTOMER_ID | ALL_PRODUCTS_PURCHASED | DISTINCT_PRODUCTS_PURCHASED
-- ------------|------------------------|---------------------------
-- 101 | ["Laptop", "Keyboard", "Monitor"] | ["Laptop", "Keyboard", "Monitor"]
-- 102 | ["Mouse", "Laptop"] | ["Mouse", "Laptop"]
-- 103 | ["Laptop", "Mouse"] | ["Laptop", "Mouse"]
-- 104 | ["Mouse"] | ["Mouse"]
-- 105 | ["Laptop"] | ["Laptop"]
-- 106 | ["External SSD"] | ["External SSD"]
These functions are game-changers for building semi-structured data points or preparing data for machine learning features.
4. SKEW() and KURTOSIS(): Advanced Statistical Insights
For data scientists and advanced analysts, understanding the shape of a data distribution is crucial. SKEW() and KURTOSIS() provide direct measures of this.
• SKEW(): Measures the asymmetry of the probability distribution of a real-valued random variable about its mean. A negative skew indicates the tail is on the left, a positive skew on the right.
• KURTOSIS(): Measures the “tailedness” of the probability distribution. High kurtosis means more extreme outliers (heavier tails), while low kurtosis means lighter tails.
Example Use Case: Analyzing Price Distribution
-- Sample product prices
CREATE OR REPLACE TABLE product_prices (
product_id INT,
price_usd DECIMAL(10, 2)
);
INSERT INTO product_prices VALUES
(1, 10.00), (2, 12.50), (3, 11.00), (4, 100.00), (5, 9.50),
(6, 11.20), (7, 10.80), (8, 9.90), (9, 13.00), (10, 10.50);
-- Calculate skewness and kurtosis for product prices
SELECT
SKEW(price_usd) AS price_skewness,
KURTOSIS(price_usd) AS price_kurtosis
FROM
product_prices;
-- Expected Output (values will vary based on data):
-- PRICE_SKEWNESS | PRICE_KURTOSIS
-- ---------------|----------------
-- 2.658... | 6.946...
This clearly shows a positive skew (the price of 100.00 is pulling the average up) and high kurtosis due to that outlier.
Conclusion: Unlock Deeper Insights with Snowflake Unique Aggregations
While the common aggregation functions are essential, mastering these Snowflake unique aggregations can elevate your analytical capabilities significantly. They empower you to solve complex problems more efficiently, prepare data for advanced use cases, and derive insights that might otherwise remain hidden. Don’t let these powerful tools gather dust; integrate them into your data analysis toolkit today.
Revolutionary Declarative Data Pipelines That Transform ETL
In 2025,Snowflake Dynamic Tables have become the most powerful way to build automated data pipelines. This comprehensive guide covers everything from target lag configuration to incremental refresh strategies, with real-world examples showing how dynamic tables eliminate complex orchestration code and transform pipeline creation through simple SQL statements.
For years, building data pipelines meant wrestling with Streams, Tasks, complex scheduling logic, and dependency management. Dynamic tables changed everything. Now data engineers define the end state they want, and Snowflake handles all the orchestration automatically. The impact is remarkable: pipelines that previously required hundreds of lines of procedural code now need just a single CREATE DYNAMIC TABLE statement.
These tables automatically detect changes in base tables, incrementally update results, and maintain freshness targets—all without external orchestration tools. Leading enterprises use them to build production-ready pipelines processing billions of rows daily, achieving both faster development and lower operational costs.
What Are Snowflake Dynamic Tables and Why They Matter
Snowflake Dynamic Tables are specialized tables that automatically maintain query results through intelligent refresh processes. Unlike traditional tables that require manual updates, dynamic tables continuously monitor source data changes and update themselves based on defined freshness requirements.
Core Concept Explained
When you create a Snowflake Dynamic Table, you define a query that transforms data from base tables. Snowflake then takes full responsibility for refreshing the table, managing dependencies, and optimizing the refresh process. This declarative approach represents a fundamental shift from imperative pipeline coding.
The traditional approach:
sql
-- Old way: Manual orchestration with Streams and Tasks
CREATE STREAM sales_stream ON TABLE raw_sales;
CREATE TASK refresh_daily_sales
WAREHOUSE = compute_wh
SCHEDULE = '5 MINUTE'
WHEN SYSTEM$STREAM_HAS_DATA('sales_stream')
AS
MERGE INTO daily_sales_summary dst
USING (
SELECT product_id,
DATE_TRUNC('day', sale_date) as day,
SUM(amount) as total_sales
FROM sales_stream
GROUP BY 1, 2
) src
ON dst.product_id = src.product_id
AND dst.day = src.day
WHEN MATCHED THEN UPDATE SET total_sales = src.total_sales
WHEN NOT MATCHED THEN INSERT VALUES (src.product_id, src.day, src.total_sales);
The Snowflake Dynamic Tables approach:
sql
-- New way: Simple declarative definition
CREATE DYNAMIC TABLE daily_sales_summary
TARGET_LAG = '5 minutes'
WAREHOUSE = compute_wh
AS
SELECT product_id,
DATE_TRUNC('day', sale_date) as day,
SUM(amount) as total_sales
FROM raw_sales
GROUP BY 1, 2;
The second approach achieves the same result with 80% less code and zero orchestration logic.
How Automated Refresh Works
Snowflake Dynamic Tables use a sophisticated two-step refresh process:
Step 1: Change Detection Snowflake analyzes the dynamic table’s query and creates a Directed Acyclic Graph (DAG) based on dependencies. Behind the scenes, Snowflake creates lightweight streams on base tables to capture change metadata (only ROW_ID, operation type, and timestamp—minimal storage cost).
Step 2: Incremental Merge Only detected changes are incorporated into the dynamic table. This incremental processing dramatically reduces compute consumption compared to full table refreshes. For queries that support it (most aggregations, joins, and filters), Snowflake automatically uses incremental mode.
Real-world example: A global retailer processes 50 million daily transactions. When 10,000 new orders arrive, their Snowflake Dynamic Table refreshes in seconds by processing only those 10,000 rows—not the entire 50 million row history.
Understanding Target Lag Configuration
Target lag defines how fresh your data needs to be. It’s the maximum acceptable delay between changes in base tables and their reflection in the dynamic table.
Target Lag Options and Trade-offs
sql
-- High freshness (low lag) for real-time dashboards
CREATE DYNAMIC TABLE real_time_metrics
TARGET_LAG = '1 minute'
WAREHOUSE = small_wh
AS SELECT * FROM live_events WHERE event_time > CURRENT_TIMESTAMP - INTERVAL '1 hour';
-- Moderate freshness for hourly reports
CREATE DYNAMIC TABLE hourly_summary
TARGET_LAG = '30 minutes'
WAREHOUSE = medium_wh
AS SELECT DATE_TRUNC('hour', ts) as hour, COUNT(*) FROM events GROUP BY 1;
-- Lower freshness (higher lag) for daily aggregates
CREATE DYNAMIC TABLE daily_rollup
TARGET_LAG = '6 hours'
WAREHOUSE = large_wh
AS SELECT DATE(ts) as day, SUM(revenue) FROM sales GROUP BY 1;
Trade-off considerations:
Lower target lag = More frequent refreshes = Higher compute costs = Fresher data
Higher target lag = Less frequent refreshes = Lower compute costs = Older data
Using DOWNSTREAM Lag for Pipeline DAGs
For pipeline DAGs with multiple Snowflake Dynamic Tables, use TARGET_LAG = DOWNSTREAM:
sql
-- Layer 1: Base transformation
CREATE DYNAMIC TABLE customer_events_cleaned
TARGET_LAG = DOWNSTREAM
WAREHOUSE = compute_wh
AS
SELECT customer_id, event_type, event_time
FROM raw_events
WHERE event_time IS NOT NULL;
-- Layer 2: Aggregation (defines the lag requirement)
CREATE DYNAMIC TABLE customer_daily_summary
TARGET_LAG = '15 minutes'
WAREHOUSE = compute_wh
AS
SELECT customer_id,
DATE(event_time) as day,
COUNT(*) as event_count
FROM customer_events_cleaned
GROUP BY 1, 2;
The upstream table (customer_events_cleaned) automatically inherits the 15-minute lag from its downstream consumer. This ensures the entire pipeline maintains consistent freshness without redundant configuration.
Comparing Dynamic Tables vs Streams and Tasks
Understanding when to use Dynamic Tables versus traditional Streams and Tasks is critical for optimal pipeline architecture.
When to Use Dynamic Tables
Choose Dynamic Tables when:
You need declarative, SQL-only transformations without procedural code
Your pipeline has straightforward dependencies that form a clear DAG
You want automatic incremental processing without manual merge logic
Time-based freshness (target lag) meets your requirements
You prefer Snowflake to automatically manage refresh scheduling
Your transformations involve standard SQL operations (joins, aggregations, filters)
Choose Streams and Tasks when:
You need fine-grained control over exact refresh timing
Your pipeline requires complex conditional logic beyond SQL
You need event-driven triggers from external systems
Your workflow involves cross-database operations or external API calls
You require custom error handling and retry logic
Your processing needs transaction boundaries across multiple steps
-- Complex multi-table join with aggregation
CREATE DYNAMIC TABLE customer_lifetime_value
TARGET_LAG = '1 hour'
WAREHOUSE = compute_wh
AS
SELECT
c.customer_id,
c.customer_name,
COUNT(DISTINCT o.order_id) as total_orders,
SUM(o.order_amount) as lifetime_value,
MAX(o.order_date) as last_order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
LEFT JOIN order_items oi ON o.order_id = oi.order_id
WHERE c.customer_status = 'active'
GROUP BY 1, 2;
This query would be impossible in a materialized view but works perfectly in Dynamic Tables.
Incremental vs Full Refresh
Dynamic Tables automatically choose between incremental and full refresh modes based on your query patterns.
Understanding Refresh Modes
Incremental refresh (default for most queries):
Processes only changed rows since last refresh
Dramatically reduces compute costs
Works for most aggregations, joins, and filters
Requires deterministic queries
Full refresh (fallback for complex scenarios):
Reprocesses entire dataset on each refresh
Required for non-deterministic functions
Used when change tracking isn’t feasible
Higher compute consumption
sql
-- This uses incremental refresh automatically
CREATE DYNAMIC TABLE sales_by_region
TARGET_LAG = '10 minutes'
WAREHOUSE = compute_wh
AS
SELECT region,
SUM(sales_amount) as total_sales
FROM transactions
WHERE transaction_date >= '2025-01-01'
GROUP BY region;
-- This forces full refresh (non-deterministic function)
CREATE DYNAMIC TABLE random_sample_data
TARGET_LAG = '1 hour'
WAREHOUSE = compute_wh
REFRESH_MODE = FULL -- Explicitly set to FULL
AS
SELECT *
FROM large_dataset
WHERE RANDOM() < 0.01; -- Non-deterministic
Forcing Incremental Mode
You can explicitly force incremental mode for supported queries:
sql
CREATE DYNAMIC TABLE optimized_pipeline
TARGET_LAG = '5 minutes'
WAREHOUSE = compute_wh
REFRESH_MODE = INCREMENTAL -- Explicitly set
AS
SELECT customer_id,
DATE(order_time) as order_date,
COUNT(*) as order_count,
SUM(order_total) as daily_revenue
FROM orders
WHERE order_time > CURRENT_TIMESTAMP - INTERVAL '90 days'
GROUP BY 1, 2;
Production Best Practices
Building reliable production pipelines requires following proven patterns.
Performance Optimization tips
Break down complex transformations:
sql
-- Bad: Single complex dynamic table
CREATE DYNAMIC TABLE complex_report
TARGET_LAG = '15 minutes'
WAREHOUSE = compute_wh
AS
-- 500 lines of complex SQL with multiple CTEs, joins, window functions
...;
-- Good: Multiple simple dynamic tables
CREATE DYNAMIC TABLE cleaned_events
TARGET_LAG = DOWNSTREAM
WAREHOUSE = compute_wh
AS
SELECT customer_id, event_type, CAST(event_time AS TIMESTAMP) as event_time
FROM raw_events
WHERE event_time IS NOT NULL;
CREATE DYNAMIC TABLE enriched_events
TARGET_LAG = DOWNSTREAM
WAREHOUSE = compute_wh
AS
SELECT e.*, c.customer_segment
FROM cleaned_events e
JOIN customers c ON e.customer_id = c.customer_id;
CREATE DYNAMIC TABLE final_report
TARGET_LAG = '15 minutes'
WAREHOUSE = compute_wh
AS
SELECT customer_segment,
DATE(event_time) as day,
COUNT(*) as event_count
FROM enriched_events
GROUP BY 1, 2;
Monitoring and Debugging
Monitor your Tables through Snowsight or SQL:
sql
-- Show all dynamic tables
SHOW DYNAMIC TABLES;
-- Get detailed information about refresh history
SELECT *
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY('daily_sales_summary'))
ORDER BY data_timestamp DESC
LIMIT 10;
-- Check if dynamic table is using incremental refresh
SELECT *
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_GRAPH_HISTORY(
'my_dynamic_table'
))
WHERE refresh_action = 'INCREMENTAL';
-- View the DAG for your pipeline-- In Snowsight: Go to Data → Databases → Your Database → Dynamic Tables-- Click on a dynamic table to see the dependency graph visualization
Cost Optimization Strategies
Right-size your warehouse:
sql
-- Small warehouse for simple transformations
CREATE DYNAMIC TABLE lightweight_transform
TARGET_LAG = '10 minutes'
WAREHOUSE = x_small_wh -- Start small
AS SELECT * FROM source WHERE active = TRUE;
-- Large warehouse only for heavy aggregations
CREATE DYNAMIC TABLE heavy_analytics
TARGET_LAG = '1 hour'
WAREHOUSE = large_wh -- Size appropriately
AS
SELECT product_category,
date,
COUNT(DISTINCT customer_id) as unique_customers,
SUM(revenue) as total_revenue
FROM sales_fact
JOIN product_dim USING (product_id)
GROUP BY 1, 2;
Use clustering keys for large tables:
sql
CREATE DYNAMIC TABLE partitioned_sales
TARGET_LAG = '30 minutes'
WAREHOUSE = medium_wh
CLUSTER BY (sale_date, region) -- Improves refresh performance
AS
SELECT sale_date, region, product_id, SUM(amount) as sales
FROM transactions
GROUP BY 1, 2, 3;
Real-World Use Cases
Use Case 1: Real-Time Analytics Dashboard
Scenario: E-commerce company needs up-to-the-minute sales dashboards
sql
-- Real-time order metrics
CREATE DYNAMIC TABLE real_time_order_metrics
TARGET_LAG = '2 minutes'
WAREHOUSE = reporting_wh
AS
SELECT
DATE_TRUNC('minute', order_time) as minute,
COUNT(*) as order_count,
SUM(order_total) as revenue,
AVG(order_total) as avg_order_value
FROM orders
WHERE order_time >= CURRENT_TIMESTAMP - INTERVAL '24 hours'
GROUP BY 1;
-- Product inventory status
CREATE DYNAMIC TABLE inventory_status
TARGET_LAG = '5 minutes'
WAREHOUSE = operations_wh
AS
SELECT
p.product_id,
p.product_name,
p.stock_quantity,
COALESCE(SUM(o.quantity), 0) as pending_orders,
p.stock_quantity - COALESCE(SUM(o.quantity), 0) as available_stock
FROM products p
LEFT JOIN order_items o ON p.product_id = o.product_id
WHERE o.order_status = 'pending'
GROUP BY 1, 2, 3;
Use Case 2:Change Data Capture Pipelines
Scenario: Financial services company tracks account balance changes
sql
-- Capture all balance changes
CREATE DYNAMIC TABLE account_balance_history
TARGET_LAG = '1 minute'
WAREHOUSE = finance_wh
AS
SELECT
account_id,
transaction_id,
transaction_time,
transaction_amount,
SUM(transaction_amount) OVER (
PARTITION BY account_id
ORDER BY transaction_time
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) as running_balance
FROM transactions
ORDER BY account_id, transaction_time;
-- Daily account summaries
CREATE DYNAMIC TABLE daily_account_summary
TARGET_LAG = '15 minutes'
WAREHOUSE = finance_wh
AS
SELECT
account_id,
DATE(transaction_time) as summary_date,
MIN(running_balance) as min_balance,
MAX(running_balance) as max_balance,
COUNT(*) as transaction_count
FROM account_balance_history
GROUP BY 1, 2;
Use Case 3: Slowly Changing Dimensions
Scenario: Type 2 SCD implementation for customer dimension
sql
-- Customer SCD Type 2 with dynamic table
CREATE DYNAMIC TABLE customer_dimension_scd2
TARGET_LAG = '10 minutes'
WAREHOUSE = etl_wh
AS
WITH numbered_changes AS (
SELECT
customer_id,
customer_name,
customer_address,
customer_segment,
update_timestamp,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY update_timestamp
) as version_number
FROM customer_changes_stream
)
SELECT
customer_id,
version_number,
customer_name,
customer_address,
customer_segment,
update_timestamp as valid_from,
LEAD(update_timestamp) OVER (
PARTITION BY customer_id
ORDER BY update_timestamp
) as valid_to,
CASE
WHEN LEAD(update_timestamp) OVER (
PARTITION BY customer_id
ORDER BY update_timestamp
) IS NULL THEN TRUE
ELSE FALSE
END as is_current
FROM numbered_changes;
Use Case 4:Multi-Layer Data Mart Architecture
Scenario: Building a star schema data mart with automated refresh
sql
-- Bronze layer: Data cleaning
CREATE DYNAMIC TABLE bronze_sales
TARGET_LAG = DOWNSTREAM
WAREHOUSE = etl_wh
AS
SELECT
CAST(sale_id AS NUMBER) as sale_id,
CAST(sale_date AS DATE) as sale_date,
CAST(customer_id AS NUMBER) as customer_id,
CAST(product_id AS NUMBER) as product_id,
CAST(quantity AS NUMBER) as quantity,
CAST(unit_price AS DECIMAL(10,2)) as unit_price
FROM raw_sales
WHERE sale_id IS NOT NULL;
-- Silver layer: Business logic
CREATE DYNAMIC TABLE silver_sales_enriched
TARGET_LAG = DOWNSTREAM
WAREHOUSE = transform_wh
AS
SELECT
s.*,
s.quantity * s.unit_price as total_amount,
c.customer_segment,
p.product_category,
p.product_subcategory
FROM bronze_sales s
JOIN dim_customer c ON s.customer_id = c.customer_id
JOIN dim_product p ON s.product_id = p.product_id;
-- Gold layer: Analytics-ready
CREATE DYNAMIC TABLE gold_sales_summary
TARGET_LAG = '15 minutes'
WAREHOUSE = analytics_wh
AS
SELECT
sale_date,
customer_segment,
product_category,
COUNT(DISTINCT sale_id) as transaction_count,
SUM(total_amount) as revenue,
AVG(total_amount) as avg_transaction_value
FROM silver_sales_enriched
GROUP BY 1, 2, 3;
New features in 2025
Immutability Constraints
New in 2025: Lock specific rows while allowing incremental updates to others
sql
CREATE DYNAMIC TABLE sales_with_closed_periods
TARGET_LAG = '30 minutes'
WAREHOUSE = compute_wh
IMMUTABLE WHERE (sale_date < '2025-01-01') -- Lock historical data
AS
SELECT
sale_date,
region,
SUM(amount) as total_sales
FROM transactions
GROUP BY 1, 2;
This prevents accidental modifications to closed accounting periods while continuing to update current data.
CURRENT_TIMESTAMP Support for incremental mode
New in 2025: Use time-based filters in incremental mode
sql
CREATE DYNAMIC TABLE rolling_30_day_metrics
TARGET_LAG = '10 minutes'
WAREHOUSE = compute_wh
REFRESH_MODE = INCREMENTAL -- Now works with CURRENT_TIMESTAMP
AS
SELECT
customer_id,
COUNT(*) as recent_orders,
SUM(order_total) as recent_revenue
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY customer_id;
Previously, using CURRENT_TIMESTAMP forced full refresh. Now it works with incremental mode.
Backfill from Clone feature
New in 2025: Initialize dynamic tables from historical snapshots
sql
-- Clone existing table with corrected data
CREATE TABLE sales_corrected CLONE sales_with_errors;
-- Apply corrections
UPDATE sales_corrected SET amount = amount * 1.1 WHERE region = 'APAC';
-- Create dynamic table using corrected data as baseline
CREATE DYNAMIC TABLE sales_summary
BACKFILL FROM sales_corrected
IMMUTABLE WHERE (sale_date < '2025-01-01')
TARGET_LAG = '15 minutes'
WAREHOUSE = compute_wh
AS
SELECT sale_date, region, SUM(amount) as total_sales
FROM sales
GROUP BY 1, 2;
Advanced Patterns and Techniques
Pattern 1: Handling Late-Arriving Data
Handle records that arrive out of order:
sql
CREATE DYNAMIC TABLE ordered_events
TARGET_LAG = '30 minutes'
WAREHOUSE = compute_wh
AS
SELECT
event_id,
event_time,
customer_id,
event_type,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY event_time, event_id
) as sequence_number
FROM raw_events
WHERE event_time >= CURRENT_TIMESTAMP - INTERVAL '7 days'
ORDER BY customer_id, event_time;
Pattern 2: Using window Functions for cumulative calculations
Build cumulative calculations automatically:
sql
CREATE DYNAMIC TABLE customer_cumulative_spend
TARGET_LAG = '20 minutes'
WAREHOUSE = analytics_wh
AS
SELECT
customer_id,
order_date,
order_amount,
SUM(order_amount) OVER (
PARTITION BY customer_id
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) as lifetime_value,
COUNT(*) OVER (
PARTITION BY customer_id
ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) as order_count
FROM orders;
Pattern 3: Automated Data Quality Checks
Automate data validation:
sql
CREATE DYNAMIC TABLE data_quality_metrics
TARGET_LAG = '10 minutes'
WAREHOUSE = monitoring_wh
AS
SELECT
'customers' as table_name,
CURRENT_TIMESTAMP as check_time,
COUNT(*) as total_rows,
COUNT(DISTINCT customer_id) as unique_ids,
SUM(CASE WHEN email IS NULL THEN 1 ELSE 0 END) as missing_emails,
SUM(CASE WHEN LENGTH(phone) < 10 THEN 1 ELSE 0 END) as invalid_phones,
MAX(updated_at) as last_update
FROM customers
UNION ALL
SELECT
'orders' as table_name,
CURRENT_TIMESTAMP as check_time,
COUNT(*) as total_rows,
COUNT(DISTINCT order_id) as unique_ids,
SUM(CASE WHEN order_amount <= 0 THEN 1 ELSE 0 END) as invalid_amounts,
SUM(CASE WHEN customer_id IS NULL THEN 1 ELSE 0 END) as orphaned_orders,
MAX(order_date) as last_update
FROM orders;
Troubleshooting Common Issues
Issue 1: Tables Not Refreshing
Problem: Dynamic table shows “suspended” status
Solution:
sql
-- Check for errors in refresh history
SELECT *
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_REFRESH_HISTORY('my_table'))
WHERE state = 'FAILED'
ORDER BY data_timestamp DESC;
-- Resume the dynamic table
ALTER DYNAMIC TABLE my_table RESUME;
-- Check dependencies
SHOW DYNAMIC TABLES LIKE 'my_table';
Issue 2: Using Full Refresh Instead of Incremental
Problem: Query should support incremental but uses full refresh
Complex nested queries: Simplify or break into multiple dynamic tables
Masking policies on base tables: Consider alternative security approaches
LATERAL FLATTEN: May force full refresh for complex nested structures
sql
-- Check current refresh mode
SELECT refresh_mode
FROM TABLE(INFORMATION_SCHEMA.DYNAMIC_TABLE_GRAPH_HISTORY('my_table'))
LIMIT 1;
-- If full refresh is required, optimize for performance
ALTER DYNAMIC TABLE my_table SET WAREHOUSE = larger_warehouse;
Issue 3: High compute Costs
Problem: Unexpected credit consumption
Solutions:
sql
-- 1. Analyze compute usage
SELECT
name,
warehouse_name,
SUM(credits_used) as total_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.DYNAMIC_TABLE_REFRESH_HISTORY
WHERE start_time >= DATEADD(day, -7, CURRENT_TIMESTAMP)
GROUP BY 1, 2
ORDER BY total_credits DESC;
-- 2. Increase target lag to reduce refresh frequency
ALTER DYNAMIC TABLE expensive_table
SET TARGET_LAG = '30 minutes'; -- Was '5 minutes'-- 3. Use smaller warehouse
ALTER DYNAMIC TABLE expensive_table
SET WAREHOUSE = small_wh; -- Was large_wh-- 4. Check if incremental is being used-- If not, optimize query to support incremental processing
Migration from Streams and Tasks
Converting existing Stream/Task pipelines to Dynamic Tables:
Before (Streams and Tasks):
sql
-- Stream to capture changes
CREATE STREAM order_changes ON TABLE raw_orders;
-- Task to process stream
CREATE TASK process_orders
WAREHOUSE = compute_wh
SCHEDULE = '10 MINUTE'
WHEN SYSTEM$STREAM_HAS_DATA('order_changes')
AS
INSERT INTO processed_orders
SELECT
order_id,
customer_id,
order_date,
order_total,
CASE
WHEN order_total > 1000 THEN 'high_value'
WHEN order_total > 100 THEN 'medium_value'
ELSE 'low_value'
END as value_tier
FROM order_changes
WHERE METADATA$ACTION = 'INSERT';
ALTER TASK process_orders RESUME;
After (Snowflake Dynamic Tables):
sql
CREATE DYNAMIC TABLE processed_orders
TARGET_LAG = '10 minutes'
WAREHOUSE = compute_wh
AS
SELECT
order_id,
customer_id,
order_date,
order_total,
CASE
WHEN order_total > 1000 THEN 'high_value'
WHEN order_total > 100 THEN 'medium_value'
ELSE 'low_value'
END as value_tier
FROM raw_orders;
Benefits of migration:
75% less code to maintain
Automatic dependency management
No manual stream/task orchestration
Automatic incremental processing
Built-in monitoring and observability
Snowflake Dynamic Tables: Comparison with Other Platforms
Feature
Snowflake Dynamic Tables
dbt Incremental Models
Databricks Delta Live Tables
Setup complexity
Low (native Snowflake)
Medium (external tool)
Medium (Databricks-specific)
Automatic orchestration
Yes
No (requires scheduler)
Yes
Incremental processing
Automatic
Manual configuration
Automatic
Query language
SQL
SQL + Jinja
SQL + Python
Dependency management
Automatic DAG
Manual ref() functions
Automatic DAG
Cost optimization
Automatic warehouse sizing
Manual
Automatic cluster sizing
Monitoring
Built-in Snowsight
dbt Cloud or custom
Databricks UI
Multi-cloud
AWS, Azure, GCP
Any Snowflake account
Databricks only
Conclusion: The Future of Data Pipeline develoment
Snowflake Dynamic Tables represent a paradigm shift in data pipeline development. By eliminating complex orchestration code and automating refresh management, they allow data teams to focus on business logic rather than infrastructure.
Key transformations enabled:
80% reduction in pipeline code complexity
Zero orchestration maintenance overhead
Automatic incremental processing without manual merge logic
Self-managing dependencies through intelligent DAG analysis
Built-in monitoring and observability
Cost optimization through intelligent refresh scheduling
As data freshness requirements increase and pipeline complexity grows, dynamic tables provide the declarative approach needed to build scalable, maintainable data infrastructure.
Start with simple use cases, measure performance, and progressively migrate complex pipelines. The investment in learning this technology pays dividends in reduced maintenance burden and faster feature delivery.
In 2025, Snowflake has introduced groundbreaking improvements that fundamentally change how data engineers write queries. This Snowflake SQL tutorial covers the latest features including MERGE ALL BY NAME, UNION BY NAME, and Cortex AISQL. Whether you’re learning Snowflake SQL or optimizing existing code, this tutorial demonstrateshow these enhancements eliminate tedious column mapping, reduce errors, and dramatically simplify complex data operations.
The star feature?MERGE ALL BY NAME—announced on September 29, 2025—automatically matches columns by name, eliminating the need to manually map every column when upserting data. This Snowflake SQL tutorial will show you how this single feature can transform a 50-line MERGE statement into just 5 lines.
But that’s not all.Additionally, this SQL tutorial covers:
UNION BY NAME for flexible data combining
Cortex AISQL for AI-powered SQL functions
Enhanced PIVOT/UNPIVOT with aliasing
Snowflake Scripting UDFs for procedural SQL
Lambda expressions in higher-order functions
For data engineers, these improvements mean less boilerplate code, fewer errors, and more time focused on solving business problems rather than wrestling with SQL syntax.
But that’s not all.Additionally, Snowflake 2025 brings:
UNION BY NAME for flexible data combining
Cortex AISQL for AI-powered SQL functions
Enhanced PIVOT/UNPIVOT with aliasing
Snowflake Scripting UDFs for procedural SQL
Lambda expressions in higher-order functions
For data engineers, these improvements mean less boilerplate code, fewer errors, and more time focused on solving business problems rather than wrestling with SQL syntax.
Snowflake SQL Tutorial: MERGE ALL BY NAME Feature
This Snowflake SQL tutorial begins with the most impactful feature of 2025…
Announced on September 29, 2025, MERGE ALL BY NAME is arguably the most impactful SQL improvement Snowflake has released this year. This feature automatically matches columns between source and target tables based on column names rather than positions.
The SQL Problem MERGE ALL BY NAME Solves
Traditionally, writing a MERGE statement required manually listing and mapping each column:
sql
-- OLD WAY: Manual column mapping (tedious and error-prone)
MERGE INTO customer_target t
USING customer_updates s
ON t.customer_id = s.customer_id
WHEN MATCHED THEN
UPDATE SET
t.first_name = s.first_name,
t.last_name = s.last_name,
t.email = s.email,
t.phone = s.phone,
t.address = s.address,
t.city = s.city,
t.state = s.state,
t.zip_code = s.zip_code,
t.country = s.country,
t.updated_date = s.updated_date
WHEN NOT MATCHED THEN
INSERT (customer_id, first_name, last_name, email, phone,
address, city, state, zip_code, country, updated_date)
VALUES (s.customer_id, s.first_name, s.last_name, s.email,
s.phone, s.address, s.city, s.state, s.zip_code,
s.country, s.updated_date);
This approach suffers from multiple pain points:
Manual mapping for every single column
High risk of typos and mismatches
Difficult maintenance when schemas evolve
Time-consuming for tables with many columns
The Snowflake SQL Solution: MERGE ALL BY NAME
With MERGE ALL BY NAME, the same operation becomes elegantly simple:
sql
-- NEW WAY: Automatic column matching (clean and reliable)
MERGE INTO customer_target
USING customer_updates
ON customer_target.customer_id = customer_updates.customer_id
WHEN MATCHED THEN
UPDATE ALL BY NAME
WHEN NOT MATCHED THEN
INSERT ALL BY NAME;
That’s it!Just 2 lines instead of 20+ lines of column mapping.
How MERGE ALL BY NAME Works
The magic happens through intelligent column name matching:
Snowflake analyzes both target and source tables
It identifies columns with matching names
It automatically maps columns regardless of position
It handles different column orders seamlessly
It executes the MERGE with proper type conversion
Importantly, MERGE ALL BY NAME works even when:
Columns are in different orders
Tables have extra columns in one but not the other
Column names use different casing (Snowflake is case-insensitive by default)
Requirements for MERGE ALL BY NAME
For this feature to work correctly:
Target and source must have the same number of matching columns
Column names must be identical (case-insensitive)
Data types must be compatible (Snowflake handles automatic casting)
However, column order doesn’t matter:
sql
-- This works perfectly!
CREATE TABLE target (
id INT,
name VARCHAR,
email VARCHAR,
created_date DATE
);
CREATE TABLE source (
created_date DATE, -- Different order
email VARCHAR, -- Different order
id INT, -- Different order
name VARCHAR -- Different order
);
MERGE INTO target
USING source
ON target.id = source.id
WHEN MATCHED THEN UPDATE ALL BY NAME
WHEN NOT MATCHED THEN INSERT ALL BY NAME;
Snowflake intelligently matches id with id, name with name, etc., regardless of position.
Real-World Use Case: Slowly Changing Dimensions
Consider implementing a Type 1 SCD (Slowly Changing Dimension) for product data:
sql
-- Product dimension table
CREATE OR REPLACE TABLE dim_product (
product_id INT PRIMARY KEY,
product_name VARCHAR,
category VARCHAR,
price DECIMAL(10,2),
description VARCHAR,
supplier_id INT,
last_updated TIMESTAMP
);
-- Daily product updates from source system
CREATE OR REPLACE TABLE product_updates (
product_id INT,
description VARCHAR, -- Different column order
price DECIMAL(10,2),
product_name VARCHAR,
category VARCHAR,
supplier_id INT,
last_updated TIMESTAMP
);
-- SCD Type 1: Upsert with MERGE ALL BY NAME
MERGE INTO dim_product
USING product_updates
ON dim_product.product_id = product_updates.product_id
WHEN MATCHED THEN
UPDATE ALL BY NAME
WHEN NOT MATCHED THEN
INSERT ALL BY NAME;
This handles:
Updating existing products with latest information
Inserting new products automatically
Different column orders between systems
All columns without manual mapping
Benefits of MERGE ALL BY NAME
Data engineers report significant advantages:
Time Savings:
90% less code for MERGE statements
5 minutes instead of 30 minutes to write complex merges
Faster schema evolution without code changes
Error Reduction:
Zero typos from manual column mapping
No mismatched columns from copy-paste errors
Automatic validation by Snowflake
Maintenance Simplification:
Schema changes don’t require code updates
New columns automatically included
Removed columns handled gracefully
Code Readability:
Clear intent from simple syntax
Easy review in code reviews
Self-documenting logic
Snowflake SQL UNION BY NAME: Flexible Data Combining
This section of our Snowflake SQL tutorial explores how UNION BY NAME Introduced at Snowflake Summit 2025, UNION BY NAME revolutionizes how we combine datasets from different sources by focusing on column names rather than positions.
The Traditional UNION Problem
For years, SQL developers struggled with UNION ALL’s rigid requirements:
sql
-- TRADITIONAL UNION ALL: Requires exact column matching
SELECT id, name, department
FROM employees
UNION ALL
SELECT emp_id, emp_name, dept -- Different names: FAILS!
FROM contingent_workers;
This fails because:
Column names don’t match
Positions matter, not names
Adding columns breaks existing queries
Schema evolution requires constant maintenance
UNION BY NAME Solution
With UNION BY NAME, column matching happens by name:
sql
-- NEW: UNION BY NAME matches columns by name
CREATE TABLE employees (
id INT,
name VARCHAR,
department VARCHAR,
role VARCHAR
);
CREATE TABLE contingent_workers (
id INT,
name VARCHAR,
department VARCHAR
-- Note: No 'role' column
);
SELECT * FROM employees
UNION ALL BY NAME
SELECT * FROM contingent_workers;
-- Result: Combines by name, fills missing 'role' with NULL
Output:
ID | NAME | DEPARTMENT | ROLE
---+---------+------------+--------
1 | Alice | Sales | Manager
2 | Bob | IT | Developer
3 | Charlie | Sales | NULL
4 | Diana | IT | NULL
Key behaviors:
Columns matched by name, not position
Missing columns filled with NULL
Extra columns included automatically
Order doesn’t matter
Use Cases for UNION BY NAME
This feature excels in several scenarios:
Merging Legacy and Modern Systems:
sql
-- Legacy system with old column names
SELECT
cust_id AS customer_id,
cust_name AS name,
phone_num AS phone
FROM legacy_customers
UNION ALL BY NAME
-- Modern system with new column names
SELECT
customer_id,
name,
phone,
email -- New column not in legacy
FROM modern_customers;
Combining Data from Multiple Regions:
sql
-- Different regions have different optional fields
SELECT * FROM us_sales -- Has 'state' column
UNION ALL BY NAME
SELECT * FROM eu_sales -- Has 'country' column
UNION ALL BY NAME
SELECT * FROM asia_sales; -- Has 'region' column
Incremental Schema Evolution:
sql
-- Historical data without new fields
SELECT * FROM sales_2023
UNION ALL BY NAME
-- Current data with additional tracking
SELECT * FROM sales_2024 -- Added 'source_channel' column
UNION ALL BY NAME
SELECT * FROM sales_2025; -- Added 'attribution_id' column
While powerful, UNION BY NAME has slight overhead:
When to use UNION BY NAME:
Schemas differ across sources
Evolution happens frequently
Maintainability matters more than marginal performance
When to use traditional UNION ALL:
Schemas are identical and stable
Maximum performance is critical
Large-scale production queries with billions of rows
Best practice:Use UNION BY NAME for data integration and ELT pipelines where flexibility outweighs marginal performance costs.
Cortex AISQL: AI-Powered SQL Functions
Announced on June 2, 2025, Cortex AISQL brings powerful AI capabilities directly into Snowflake’s SQL engine, enabling AI pipelines with familiar SQL commands.
Revolutionary AI Functions
Cortex AISQL introduces three groundbreaking SQL functions:
AI_FILTER: Intelligent Data Filtering
Filter data using natural language questions instead of complex WHERE clauses:
sql
-- Traditional approach: Complex WHERE clause
SELECT *
FROM customer_reviews
WHERE (
LOWER(review_text) LIKE '%excellent%' OR
LOWER(review_text) LIKE '%amazing%' OR
LOWER(review_text) LIKE '%outstanding%' OR
LOWER(review_text) LIKE '%fantastic%'
) AND (
sentiment_score > 0.7
);
-- AI_FILTER approach: Natural language
SELECT *
FROM customer_reviews
WHERE AI_FILTER(review_text, 'Is this a positive review praising the product?');
Use cases:
Filtering images by content (“Does this image contain a person?”)
Classifying text by intent (“Is this a complaint?”)
Quality control (“Is this product photo high quality?”)
AI_CLASSIFY: Intelligent Classification
Classify text or images into user-defined categories:
sql
-- Classify customer support tickets automatically
SELECT
ticket_id,
subject,
AI_CLASSIFY(
description,
['Technical Issue', 'Billing Question', 'Feature Request',
'Bug Report', 'Account Access']
) AS ticket_category
FROM support_tickets;
-- Multi-label classification
SELECT
product_id,
AI_CLASSIFY(
product_description,
['Electronics', 'Clothing', 'Home & Garden', 'Sports'],
'multi_label'
) AS categories
FROM products;
Advantages:
No training required
Plain-language category definitions
Single or multi-label classification
Works on text and images
AI_AGG: Intelligent Aggregation
Aggregate text columns and extract insights across multiple rows:
sql
-- Traditional: Difficult to get insights from text
SELECT
product_id,
STRING_AGG(review_text, ' | ') -- Just concatenates
FROM reviews
GROUP BY product_id;
-- AI_AGG: Extract meaningful insights
SELECT
product_id,
AI_AGG(
review_text,
'Summarize the common themes in these reviews, highlighting both positive and negative feedback'
) AS review_summary
FROM reviews
GROUP BY product_id;
Key benefit:Not subject to context window limitations—can process unlimited rows.
Cortex AISQL Real-World Example
Complete pipeline for analyzing customer feedback:
sql
-- Step 1: Filter relevant feedback
CREATE OR REPLACE TABLE relevant_feedback AS
SELECT *
FROM customer_feedback
WHERE AI_FILTER(feedback_text, 'Is this feedback about product quality or features?');
-- Step 2: Classify feedback by category
CREATE OR REPLACE TABLE categorized_feedback AS
SELECT
feedback_id,
customer_id,
AI_CLASSIFY(
feedback_text,
['Product Quality', 'Feature Request', 'User Experience',
'Performance', 'Pricing']
) AS feedback_category,
feedback_text
FROM relevant_feedback;
-- Step 3: Aggregate insights by category
SELECT
feedback_category,
COUNT(*) AS feedback_count,
AI_AGG(
feedback_text,
'Summarize the key points from this feedback, identifying the top 3 issues or requests mentioned'
) AS category_insights
FROM categorized_feedback
GROUP BY feedback_category;
This replaces:
Hours of manual review
Complex NLP pipelines with external tools
Expensive ML model training and deployment
Enhanced PIVOT and UNPIVOT with Aliases
Snowflake 2025 adds aliasing capabilities to PIVOT and UNPIVOT operations, improving readability and flexibility.
PIVOT with Column Aliases
Now you can specify aliases for pivot column names:
sql
-- Sample data: Monthly sales by product
CREATE OR REPLACE TABLE monthly_sales (
product VARCHAR,
month VARCHAR,
sales_amount DECIMAL(10,2)
);
INSERT INTO monthly_sales VALUES
('Laptop', 'Jan', 50000),
('Laptop', 'Feb', 55000),
('Laptop', 'Mar', 60000),
('Phone', 'Jan', 30000),
('Phone', 'Feb', 35000),
('Phone', 'Mar', 40000);
-- PIVOT with aliases for readable column names
SELECT *
FROM monthly_sales
PIVOT (
SUM(sales_amount)
FOR month IN ('Jan', 'Feb', 'Mar')
) AS pivot_alias (
product,
january_sales, -- Custom alias instead of 'Jan'
february_sales, -- Custom alias instead of 'Feb'
march_sales -- Custom alias instead of 'Mar'
);
-- OLD: Limited to array elements only
SELECT FILTER(
price_array,
x -> x > 100 -- Can only use array elements
)
FROM products;
Now you can reference table columns:
sql
-- NEW: Reference table columns in lambda
CREATE TABLE products (
product_id INT,
product_name VARCHAR,
prices ARRAY,
discount_threshold FLOAT
);
-- Use table column 'discount_threshold' in lambda
SELECT
product_id,
product_name,
FILTER(
prices,
p -> p > discount_threshold -- References table column!
) AS prices_above_threshold
FROM products;
Real-World Use Case: Dynamic Filtering
sql
-- Inventory table with multiple warehouse locations
CREATE TABLE inventory (
product_id INT,
warehouse_locations ARRAY,
min_stock_level INT,
stock_levels ARRAY
);
-- Filter warehouses where stock is below minimum
SELECT
product_id,
FILTER(
warehouse_locations,
(loc, idx) -> stock_levels[idx] < min_stock_level
) AS understocked_warehouses,
FILTER(
stock_levels,
level -> level < min_stock_level
) AS low_stock_amounts
FROM inventory;
Complex Example: Price Optimization
sql
-- Apply dynamic discounts based on product-specific rules
CREATE TABLE product_pricing (
product_id INT,
base_prices ARRAY,
competitor_prices ARRAY,
max_discount_pct FLOAT,
margin_threshold FLOAT
);
SELECT
product_id,
TRANSFORM(
base_prices,
(price, idx) ->
CASE
-- Don't discount if already below competitor
WHEN price <= competitor_prices[idx] * 0.95 THEN price
-- Apply discount but respect margin threshold
WHEN price * (1 - max_discount_pct / 100) >= margin_threshold
THEN price * (1 - max_discount_pct / 100)
-- Use margin threshold as floor
ELSE margin_threshold
END
) AS optimized_prices
FROM product_pricing;
Additional SQL Improvements in 2025
Beyond the major features, Snowflake 2025 includes numerous enhancements:
Enhanced SEARCH Function Modes
New search modes for more precise text matching:
PHRASE Mode: Match exact phrases with token order
sql
SELECT *
FROM documents
WHERE SEARCH(content, 'data engineering best practices', 'PHRASE');
AND Mode: All tokens must be present
sql
SELECT *
FROM articles
WHERE SEARCH(title, 'snowflake performance optimization', 'AND');
OR Mode: Any token matches (existing, now explicit)
sql
SELECT *
FROM blogs
WHERE SEARCH(content, 'sql python scala', 'OR');
Increased VARCHAR and BINARY Limits
Maximum lengths significantly increased:
VARCHAR: Now 128 MB (previously 16 MB)
VARIANT, ARRAY, OBJECT: Now 128 MB
BINARY, GEOGRAPHY, GEOMETRY: Now 64 MB
This enables:
Storing large JSON documents
Processing big text blobs
Handling complex geographic shapes
Schema-Level Replication for Failover
Selective replication for databases in failover groups:
sql
-- Replicate only specific schemas
ALTER DATABASE production_db
SET REPLICABLE_WITH_FAILOVER_GROUPS = TRUE;
ALTER SCHEMA production_db.critical_schema
SET REPLICABLE_WITH_FAILOVER_GROUPS = TRUE;
-- Other schemas not replicated, reducing costs
XML Format Support (General Availability)
Native XML support for semi-structured data:
sql
-- Load XML files
COPY INTO xml_data
FROM @my_stage/data.xml
FILE_FORMAT = (TYPE = 'XML');
-- Query XML with familiar functions
SELECT
xml_data:customer:@id::STRING AS customer_id,
xml_data:customer:name::STRING AS customer_name
FROM xml_data;
Best Practices for Snowflake SQL 2025
This Snowflake SQL tutorial wouldn’t be complete without best practices…
To maximize the benefits of these improvements:
When to Use MERGE ALL BY NAME
Use it when:
Tables have 5+ columns to map
Schemas evolve frequently
Column order varies across systems
Maintenance is a priority
Avoid it when:
Fine control needed over specific columns
Conditional updates require different logic per column
Performance is absolutely critical (marginal difference)
When to Use UNION BY NAME
Use it when:
Combining data from multiple sources with varying schemas
Schema evolution happens regularly
Missing columns should be NULL-filled
Flexibility outweighs performance
Avoid it when:
Schemas are identical and stable
Maximum performance is required
Large-scale production queries (billions of rows)
Cortex AISQL Performance Tips
Optimize AI function usage:
Filter data first before applying AI functions
Batch similar operations together
Use WHERE clauses to limit rows processed
Cache results when possible
Example optimization:
sql
-- POOR: AI function on entire table
SELECT AI_CLASSIFY(text, categories) FROM large_table;
-- BETTER: Filter first, then classify
SELECT AI_CLASSIFY(text, categories)
FROM large_table
WHERE date >= CURRENT_DATE - 7 -- Only recent data
AND text IS NOT NULL
AND LENGTH(text) > 50; -- Only substantial text
Snowflake Scripting UDF Guidelines
Best practices:
Keep UDFs deterministic when possible
Test thoroughly with edge cases
Document complex logic with comments
Consider performance for frequently-called functions
Use instead of stored procedures when called in SELECT
Migration Guide: Adopting 2025 Features
For teams transitioning to these new features:
Phase 1: Assess Current Code
Identify candidates for improvement:
sql
-- Find MERGE statements that could use ALL BY NAME
SELECT query_text
FROM snowflake.account_usage.query_history
WHERE query_text ILIKE '%MERGE INTO%'
AND query_text ILIKE '%UPDATE SET%'
AND query_text LIKE '%=%' -- Has manual mapping
AND start_time >= DATEADD(month, -3, CURRENT_TIMESTAMP());
Phase 2: Test in Development
Create test cases:
Copy production MERGE to dev
Rewrite using ALL BY NAME
Compare results with original
Benchmark performance differences
Review with team
Phase 3: Gradual Rollout
Prioritize by impact:
Start with non-critical pipelines
Monitor for issues
Expand to production incrementally
Update documentation
Train team on new syntax
Phase 4: Standardize
Update coding standards:
Prefer MERGE ALL BY NAME for new code
Refactor existing MERGE when touched
Document exceptions where old syntax preferred
Include in code reviews
Troubleshooting Common Issues
When adopting new features, watch for these issues:
MERGE ALL BY NAME Not Working
Problem: “Column count mismatch”
Solution:Ensure exact column name matches:
sql
-- Check column names match
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'TARGET_TABLE'
MINUS
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'SOURCE_TABLE';
UNION BY NAME NULL Handling
Problem: Unexpected NULLs in results
Solution:Remember missing columns become NULL:
sql
-- Make NULLs explicit if needed
SELECT
COALESCE(column_name, 'DEFAULT_VALUE') AS column_name,
...
FROM table1
UNION ALL BY NAME
SELECT * FROM table2;
Cortex AISQL Performance
Problem: AI functions running slowly
Solution:Filter data before AI processing:
sql
-- Reduce data volume first
WITH filtered AS (
SELECT * FROM large_table
WHERE conditions_to_reduce_rows
)
SELECT AI_CLASSIFY(text, categories)
FROM filtered;
Future SQL Improvements on Snowflake Roadmap
Based on community feedback and Snowflake’s direction, expect these future enhancements:
2026 Predicted Features:
More AI functions in Cortex AISQL
Enhanced MERGE with more flexible conditions
Additional higher-order functions
Improved query optimization for new syntax
Extended lambda capabilities
Community Requests:
MERGE NOT MATCHED BY SOURCE (like SQL Server)
More flexible PIVOT syntax
Additional string manipulation functions
Graph query capabilities
Conclusion: Embracing Modern SQL in Snowflake
This Snowflake SQL tutorial has covered the revolutionary 2025 improvements represent a significant leap forward in data engineering productivity. MERGE ALL BY NAME alone can save data engineers hours per week by eliminating tedious column mapping.
The key benefits:
Less boilerplate code
Fewer errors from typos
Easier maintenance as schemas evolve
More time for valuable work
For data engineers, these features mean spending less time fighting SQL syntax and more time solving business problems. The tools are more intelligent, the syntax more intuitive, and the results more reliable.
Start today by identifying one MERGE statement you can simplify with ALL BY NAME. Experience the difference these modern SQL features make in your daily work.
The future of SQL is here—and it’s dramatically simpler.
Key Takeaways
MERGE ALL BY NAME automatically matches columns by name, eliminating manual mapping
Announced September 29, 2025, this feature reduces MERGE statements from 50+ lines to 5 lines
UNION BY NAME combines data from sources with different column orders and schemas
Revolutionary Performance Without Lifting a Finger
On October 8, 2025, Snowflake unveiled Snowflake Optima—a groundbreaking optimization engine that fundamentally changes how data warehouses handle performance. Unlike traditional optimization that requires manual tuning, configuration, and ongoing maintenance, Snowflake Optima analyzes your workload patterns in real-time and automatically implements optimizations that deliver dramatically faster queries.
Here’s what makes this revolutionary:
15x performance improvements in real-world customer workloads
Zero additional cost—no extra compute or storage charges
Zero configuration—no knobs to turn, no indexes to manage
Zero maintenance—continuous automatic optimization in the background
For example, an automotive customer experienced queries dropping from 17.36 seconds to just 1.17 seconds after Snowflake Optima automatically kicked in. That’s a 15x acceleration without changing a single line of code or adjusting any settings.
Moreover, this isn’t just about faster queries—it’s about effortless performance. Snowflake Optima represents a paradigm shift where speed is simply an outcome of using Snowflake, not a goal that requires constant engineering effort.
What is Snowflake Optima?
Snowflake Optima is an intelligent optimization engine built directly into the Snowflake platform that continuously analyzes SQL workload patterns and automatically implements the most effective performance strategies. Specifically, it eliminates the traditional burden of manual query tuning, index management, and performance monitoring.
The Core Innovation of Optima:
Traditionally, database optimization requires:
First, DBAs analyzing slow queries
Second, determining which indexes to create
Third, managing index storage and maintenance
Fourth, monitoring for performance degradation
Finally, repeating this cycle continuously
With Optima, however, all of this happens automatically. Instead of requiring human intervention, Snowflake Optima:
Intelligently creates hidden indexes when beneficial
Seamlessly maintains and updates optimizations
Transparently improves performance without user action
Key Principles Behind Snowflake Optima
Fundamentally, Snowflake Optima operates on three design principles:
Performance First:Every query should run as fast as possible without requiring optimization expertise
Simplicity Always:Zero configuration, zero maintenance, zero complexity
Cost Efficiency:No additional charges for compute, storage, or the optimization service itself
Snowflake Optima Indexing: The Breakthrough Feature
At the heart of Snowflake Optima is Optima Indexing—an intelligent feature built on top of Snowflake’s Search Optimization Service. However, unlike traditional search optimization that requires manual configuration, Optima Indexing works completely automatically.
How Snowflake Optima Indexing Works
Specifically, Snowflake Optima Indexing continuously analyzes your SQL workloads to detect patterns and opportunities. When it identifies repetitive operations—such as frequent point-lookup queries on specific tables—it automatically generates hidden indexes designed to accelerate exactly those workload patterns.
For instance:
First, Optima monitors queries running on your Gen2 warehouses
Then, it identifies recurring point-lookup queries with high selectivity
Next, it analyzes whether an index would provide significant benefit
Subsequently, it automatically creates a search index if worthwhile
Finally, it maintains the index as data and workloads evolve
Importantly, these indexes operate on a best-effort basis, meaning Snowflake manages them intelligently based on actual usage patterns and performance benefits. Unlike manually created indexes, they appear and disappear as workload patterns change, ensuring optimization remains relevant.
Real-World Snowflake Optima Performance Gains
Let’s examine actual customer results to understand Snowflake Optima’s impact:
User experience: Slow dashboards, delayed analytics
After Snowflake Optima:
Average query time: 1.17 seconds (15x faster)
Partition pruning rate: 96% of micro-partitions skipped
Warehouse efficiency: Reduced resource contention
User experience: Lightning-fast dashboards, real-time insights
Notably, the improvement wasn’t limited to the directly optimized queries. Because Snowflake Optima reduced resource contention on the warehouse, even queries that weren’t directly accelerated saw a 46% improvement in runtime—almost 2x faster.
Furthermore, average job runtime on the entire warehouse improved from 2.63 seconds to 1.15 seconds—more than 2x faster overall.
The Magic of Micro-Partition Pruning
To understand Snowflake Optima’s power, you need to understand micro-partition pruning:
Snowflake stores data in compressed micro-partitions (typically 50-500 MB). When you run a query, Snowflake first determines which micro-partitions contain relevant data through partition pruning.
Snowflake Optima is exclusively available on Snowflake Generation 2 (Gen2) standard warehouses. Therefore, ensure your infrastructure meets this requirement before expecting Optima benefits.
To check your warehouse generation:
sql
SHOW WAREHOUSES;
-- Look for TYPE column: STANDARD warehouses on Gen2
If needed, migrate to Gen2 warehouses through Snowflake’s upgrade process.
Best-Effort Optimization Model
Unlike manually applied search optimization that guarantees index creation, Snowflake Optima operates on a best-effort basis:
What this means:
Optima creates indexes when it determines they’re beneficial
Indexes may appear and disappear as workloads evolve
Optimization adapts to changing query patterns
Performance improves automatically but variably
When to use manual search optimization instead:
For specialized workloads requiring guaranteed performance—such as:
Emergency response systems (reliability non-negotiable)
In these cases, manually applying search optimization provides consistent index freshness and predictable performance characteristics.
Monitoring Optima Performance
Transparency is crucial for understanding optimization effectiveness. Fortunately, Snowflake provides comprehensive monitoring capabilities through the Query Profile tab in Snowsight.
Query Insights Pane
The Query Insights pane displays detected optimization insights for each query:
What you’ll see:
Each type of insight detected for a query
Every instance of that insight type
Explicit notation when “Snowflake Optima used”
Details about which optimizations were applied
To access:
Navigate to Query History in Snowsight
Select a query to examine
Open the Query Profile tab
Review the Query Insights pane
When Snowflake Optima has optimized a query, you’ll see “Snowflake Optima used” clearly indicated with specifics about the optimization applied.
Statistics Pane: Pruning Metrics
The Statistics pane quantifies Snowflake Optima’s impact through partition pruning metrics:
Key metric: “Partitions pruned by Snowflake Optima”
What it shows:
Number of partitions skipped during query execution
Percentage of total partitions pruned
Improvement in data scanning efficiency
Direct correlation to performance gains
For example:
Total partitions: 10,389
Pruned by Snowflake Optima: 8,343 (80%)
Total pruning rate: 96%
Result: 15x faster query execution
This metric directly correlates to:
Faster query completion times
Reduced compute costs
Lower resource contention
Better overall warehouse efficiency
Use Cases
Let’s explore specific scenarios where Optima delivers exceptional value:
Use Case 1: E-Commerce Analytics
A large retail chain analyzes customer behavior across e-commerce and in-store platforms.
Challenge:
Billions of rows across multiple tables
Frequent point-lookups on customer IDs
Filter-heavy queries on product SKUs
Time-sensitive queries on timestamps
Before Optima:
Dashboard queries: 8-12 seconds average
Ad-hoc analysis: Extremely slow
User experience: Frustrated analysts
Business impact: Delayed decision-making
With Snowflake Optima:
Dashboard queries: Under 1 second
Ad-hoc analysis: Lightning fast
User experience: Delighted analysts
Business impact: Real-time insights driving revenue
Result:10x performance improvement enabling real-time personalization and dynamic pricing strategies.
Use Case 2: Financial Services Risk Analysis
A global bank runs complex risk calculations across portfolio data.
Challenge:
Massive datasets with billions of transactions
Regulatory requirements for rapid risk assessment
Recurring queries on account numbers and counterparties
Performance critical for compliance
Before Snowflake Optima:
Risk calculations: 15-20 minutes
Compliance reporting: Hours to complete
Warehouse costs: High due to long-running queries
Regulatory risk: Potential delays
With Snowflake Optima:
Risk calculations: 2-3 minutes
Compliance reporting: Real-time available
Warehouse costs: 40% reduction through efficiency
Regulatory risk: Eliminated through speed
Result:8x faster risk assessment ensuring regulatory compliance and enabling more sophisticated risk modeling.
Use Case 3: IoT Sensor Data Analysis
A manufacturing company analyzes sensor data from factory equipment.
Challenge:
High-frequency sensor readings (millions per hour)
Integration with other Snowflake intelligent features
Long-term (2027+):
AI-powered optimization using machine learning
Autonomous database management capabilities
Self-healing performance issues automatically
Cognitive optimization understanding business context
Getting Started with Snowflake Optima
The beauty of Snowflake Optima is that getting started requires virtually no effort:
Step 1: Verify Gen2 Warehouses
Check if you’re running Generation 2 warehouses:
sql
SHOW WAREHOUSES;
Look for:
TYPE column: Should show STANDARD
Generation: Contact Snowflake if unsure
If needed:
Contact Snowflake support for Gen2 upgrade
Migration is typically seamless and fast
Step 2: Run Your Normal Workloads
Simply continue running your existing queries:
No configuration needed:
Snowflake Optima monitors automatically
Optimizations apply in the background
Performance improves without intervention
No changes required:
Keep existing query patterns
Maintain current warehouse configurations
Continue normal operations
Step 3: Monitor the Impact
After a few days or weeks, review the results:
In Snowsight:
Go to Query History
Select queries to examine
Open Query Profile tab
Look for “Snowflake Optima used”
Review partition pruning statistics
Key metrics:
Query duration improvements
Partition pruning percentages
Warehouse efficiency gains
Step 4: Share the Success
Document and communicate Snowflake Optima benefits:
For stakeholders:
Performance improvements (X times faster)
Cost savings (reduced compute consumption)
User satisfaction (faster dashboards, better experience)
For technical teams:
Pruning statistics (data scanning reduction)
Workload patterns (which queries optimized)
Best practices (maximizing Optima effectiveness)
Snowflake Optima FAQs
What is Snowflake Optima?
Snowflake Optima is an intelligent optimization engine that automatically analyzes SQL workload patterns and implements performance optimizations without requiring configuration or maintenance. It delivers dramatically faster queries at zero additional cost.
How much does Snowflake Optima cost?
Zero. Snowflake Optima comes at no additional charge beyond your standard Snowflake costs. There are no compute charges, storage charges, or service charges for using Snowflake Optima.
What are the requirements for Snowflake Optima?
Snowflake Optima requires Generation 2 (Gen2) standard warehouses. It’s automatically enabled on qualifying warehouses without any configuration needed.
How does Snowflake Optima compare to manual Search Optimization Service?
Snowflake Optima operates automatically without configuration and at zero cost, while manual Search Optimization Service requires configuration and incurs compute and storage charges. For most workloads, Snowflake Optima is the better choice. However, mission-critical workloads requiring guaranteed performance may still benefit from manual optimization.
How do I monitor Snowflake Optima performance?
Use the Query Profile tab in Snowsight to monitor Snowflake Optima. The Query Insights pane shows when Snowflake Optima was used, and the Statistics pane displays partition pruning metrics showing performance impact.
Can I disable Snowflake Optima?
No, Snowflake Optima cannot be disabled on Gen2 warehouses. However, it operates on a best-effort basis and only creates optimizations when beneficial, so there’s no downside to having it active.
What types of queries benefit from Snowflake Optima?
Snowflake Optima is most effective for point-lookup queries with highly selective filters on large tables, especially recurring query patterns. Queries returning small percentages of rows see the biggest improvements.
Conclusion: The Dawn of Effortless Performance
Snowflake Optima marks a fundamental shift in how organizations approach database performance. For decades, achieving fast query performance required dedicated DBAs, constant tuning, and careful optimization. With Snowflake Optima, however, speed is simply an outcome of using Snowflake.
The results speak for themselves:
15x performance improvements in real-world workloads
Zero additional cost or configuration required
Zero maintenance burden on teams
Continuous improvement as workloads evolve
More importantly, Snowflake Optima represents a strategic advantage for organizations managing complex data operations. By removing the burden of manual optimization, your team can focus on deriving insights rather than tuning infrastructure.
The self-adapting nature of Snowflake Optima means your data warehouse becomes smarter over time, learning from usage patterns and continuously improving without human intervention. This creates a virtuous cycle where performance naturally improves as your workloads evolve and grow.
Snowflake Optima streamlines optimization for data engineers, saving countless hours. Analysts benefit from accelerated insights and smoother user experiences. Meanwhile, executives see improved ROI — all without added investment.
The future of database performance isn’t about smarter DBAs or better optimization tools—it’s about intelligent systems that optimize themselves. Optima is that future, available today.
Are you ready to experience effortless performance?
Key Takeaways
Snowflake Optima delivers automatic query optimization without configuration or cost
Announced October 8, 2025, currently available on Gen2 standard warehouses
Real customers achieve 15x performance improvements automatically
Optima Indexing continuously monitors workloads and creates hidden indexes intelligently
Zero additional charges for compute, storage, or the optimization service
Partition pruning improvements from 30% to 96% drive dramatic speed increases
Best-effort optimization adapts to changing workload patterns automatically
Monitoring available through Query Profile tab in Snowsight
Mission-critical workloads can still use manual search optimization for guaranteed performance
Future roadmap includes AI-powered optimization and autonomous database management
Breaking: Tech Giants Unite to Solve AI’s Biggest Bottleneck
The Open Semantic Interchange was announced by Snowflake in their official blog On September 23, 2025, something unprecedented happened in the data industry. Open Semantic Interchange (OSI), a groundbreaking initiative led by Snowflake, Salesforce, BlackRock, and dbt Labs, was announced to solve AI’s biggest problem. These 15+ technology companies would give away their data secrets—collaboratively creating the Open Semantic Interchange as an open, vendor-neutral standard for how business data is defined across all platforms.
This isn’t just another tech announcement. It’s the industry admitting that the emperor has no clothes.
For decades, every software vendor has defined business metrics differently. Your data warehouse calls it “revenue.” Your BI tool calls it “total sales.” Your CRM calls it “booking amount.” Your AI model? It has no idea they’re the same thing.
This semantic chaos has created what VentureBeat calls “the $1 trillion AI problem“—the massive hidden cost of data preparation, reconciliation, and the manual labor required before any AI project can begin.
Enter the Open Semantic Interchang (OSI)—a groundbreaking initiative that could become as fundamental to AI as SQL was to databases or HTTP was to the web.
What is Open Semantic Interchange (OSI)? Understanding the Semantic Standard
Open Semantic Interchange is an open-source initiative that creates a universal, vendor-neutral specification for defining and sharing semantic metadata across data platforms, BI tools, and AI applications.
The Simple Explanation of Open Semantic Interchange
Think of OSI as a Rosetta Stone for business data. Just as the ancient Rosetta Stone allowed scholars to translate between Egyptian hieroglyphics, Greek, and Demotic script, OSI allows different software systems to understand each other’s data definitions.
When your data warehouse, BI dashboard, and AI model all speak the same semantic language, magic happens:
No more weeks reconciling conflicting definitions
No more “which revenue number is correct?”
No more AI models trained on misunderstood data
No more rebuilding logic across every tool
Open Semantic Interchange Technical Definition
OSI provides a standardized specification for semantic models that includes:
Business Metrics: Calculations, aggregations, and KPIs (revenue, customer lifetime value, churn rate)
Dimensions: Attributes for slicing data (time, geography, product category)
Hierarchies: Relationships between data elements (country → state → city)
Business Rules: Logic and constraints governing data interpretation
Context & Metadata: Descriptions, ownership, lineage, and governance policies
Built on familiar formats like YAML and compatible with RDF and OWL, this specification stands out by being tailored specifically for modern analytics and AI workloads.
The $1 Trillion Problem: Why Open Semantic Interchange Matters Now
The Hidden Tax: Why Semantic Interchange is Critical for AI Projects
Every AI initiative begins the same way. Data scientists don’t start building models—they start reconciling data.
Week 1-2: “Wait, why are there three different revenue numbers?”
Week 3-4: “Which customer definition should we use?”
Week 5-6: “These date fields don’t match across systems.”
Week 7-8: “We need to rebuild this logic because BI and ML define margins differently.”
According to industry research, data preparation consumes 60-80% of data science time. For enterprises spending millions on AI, this represents a staggering hidden cost.
Real-World Horror Stories Without Semantic Interchange
Fortune 500 Retailer: Spent 9 months building a customer lifetime value model. When deployment came, marketing and finance disagreed on the “customer” definition. Project scrapped.
Global Bank: Built fraud detection across 12 regions. Each region’s “transaction” definition differed. Model accuracy varied 35% between regions due to semantic inconsistency.
Healthcare System: Created patient risk models using EHR data. Clinical teams rejected the model because “readmission” calculations didn’t match their operational definitions.
These aren’t edge cases—they’re the norm. The lack of semantic standards is silently killing AI ROI across every industry.
Why Open Semantic Interchange Now? The AI Inflection Point
Generative AI has accelerated the crisis. When you ask ChatGPT or Claude to “analyze Q3 revenue by region,” the AI needs to understand:
What “revenue” means in your business
How “regions” are defined
Which “Q3” you’re referring to
What calculations to apply
Without semantic standards, AI agents give inconsistent, untrustworthy answers. As enterprises move from AI pilots to production at scale, semantic fragmentation has become the primary blocker to AI adoption.
The Founding Coalition: Who’s Behind OSI
OSI isn’t a single-vendor initiative—rather it’s an unprecedented collaboration across the data ecosystem.
Companies Leading the Open Semantic Interchange Initiative
Snowflake: The AI Data Cloud company spearheading the initiative, contributing engineering resources and governance infrastructure
Salesforce (Tableau): Co-leading with Snowflake, bringing BI perspective and Tableau’s semantic layer expertise
dbt Labs:Furthermore,contributing the dbt Semantic Layer framework as a foundational technology
BlackRock:Moreover, representing financial services with the Aladdin platform, ensuring real-world enterprise requirements
RelationalAI:Finally, bringing knowledge graph and reasoning capabilities for complex semantic relationships
This coalition represents competitors agreeing to open-source their competitive advantage for the greater good of the industry.
Why Competitors Are Collaborating on Semantic Interchange
As Christian Kleinerman, EVP Product at Snowflake, explains: “The biggest barrier our customers face when it comes to ROI from AI isn’t a competitor—it’s data fragmentation.”
Indeed, this observation highlights a critical industry truth. Rather than competing against other vendors, organizations are actually fighting against their own internal data inconsistencies. Moreover, this fragmentation costs enterprises millions annually in lost productivity and delayed AI initiatives.
Similarly, Southard Jones, CPO at Tableau, emphasizes the collaborative nature: “This initiative is transformative because it’s not about one company owning the standard—it’s about the industry coming together.”
In other words, the traditional competitive dynamics are being reimagined. Instead of proprietary lock-in strategies, therefore, the industry is choosing open collaboration. Consequently, this shift benefits everyone—vendors, enterprises, and end users alike.
Ryan Segar, CPO at dbt Labs: “Data and analytics engineers will now be able to work with the confidence that their work will be leverageable across the data ecosystem.”
The message is clear: Standardization isn’t a commoditizer—it’s a catalyst. Like USB-C didn’t hurt device makers, OSI won’t hurt data platforms. It shifts competition from data definitions to innovation in user experience and AI capabilities.
How Open Semantic Interchange (OSI) Works: Technical Deep Dive
The Open Semantic Interchange Specification Structure
OSI defines semantic models in a structured, machine-readable format. Here’s what a simplified OSI specification looks like:
Metrics Definition:
Name, description, and business owner
Calculation formula with explicit dependencies
Aggregation rules (sum, average, count distinct)
Filters and conditions
Temporal considerations (point-in-time vs. accumulated)
Compilation: Engines that translate OSI specs into platform-specific code (SQL, Python, APIs)
Transport: REST APIs and file-based exchange
Validation: Schema validation and semantic correctness checking
Extension: Plugin architecture for domain-specific semantics
Integration Patterns
Organizations can adopt OSI through multiple approaches:
Native Integration: Platforms like Snowflake directly support OSI specifications
Translation Layer: Tools convert between proprietary formats and OSI
Dual-Write: Systems maintain both proprietary and OSI formats
Federation: Central OSI registry with distributed consumption
Real-World Use Cases: Open Semantic Interchange in Action
Use Case 1: Open Semantic Interchange for Multi-Cloud Analytics
Challenge: A global retailer runs analytics on Snowflake but visualizations in Tableau, with data science in Databricks. Each platform defined “sales” differently.
Before OSI:
Data team spent 40 hours/month reconciling definitions
Business users saw conflicting dashboards
ML models trained on inconsistent logic
Trust in analytics eroded
With OSI:
Single OSI specification defines “sales” once
All platforms consume the same semantic model
Dashboards, notebooks, and AI agents align
Data team focuses on new insights, not reconciliation
Impact: 90% reduction in semantic reconciliation time, 35% increase in analytics trust scores
Use Case 2: Semantic Interchange for M&A Integration
Challenge: A financial services company acquired three competitors, each with distinct data definitions for “customer,” “account,” and “portfolio value.”
Before OSI:
18-month integration timeline
$12M spent on data mapping consultants
Incomplete semantic alignment at launch
Ongoing reconciliation needed
With OSI:
Each company publishes OSI specifications
Automated mapping identifies overlaps and conflicts
Human review focuses only on genuine business rule differences
Use Case 3: Open Semantic Interchange Improves AI Agent Trust
Challenge: An insurance company deployed AI agents for claims processing. Agents gave inconsistent answers because “claim amount,” “deductible,” and “coverage” had multiple definitions.
Before OSI:
Customer service agents stopped using AI tools
45% of AI answers flagged as incorrect
Manual verification required for all AI outputs
AI initiative considered a failure
With OSI:
All insurance concepts defined in OSI specification
AI agents query consistent semantic layer
Answers align with operational systems
Audit trails show which definitions were used
Impact: 92% accuracy rate, 70% reduction in manual verification, AI adoption rate increased to 85%
Use Case 4: Semantic Interchange for Regulatory Compliance
Challenge: A bank needed consistent risk reporting across Basel III, IFRS 9, and CECL requirements. Each framework defined “exposure,” “risk-weighted assets,” and “provisions” slightly differently.
Before OSI:
Separate data pipelines for each framework
Manual reconciliation of differences
Audit findings on inconsistent definitions
High cost of compliance
With OSI:
Regulatory definitions captured in domain-specific OSI extensions
Semantic models as reusable as open-source libraries
Cross-industry semantic model marketplace
AI agents natively understanding OSI specifications
Open Semantic Interchange Benefits for Different Stakeholders
Data Engineers
Before OSI:
Rebuild semantic logic for each new tool
Debug definition mismatches
Manual data reconciliation pipelines
With OSI:
Define business logic once
Automatic propagation to all tools
Focus on data quality, not definition mapping
Time Savings: 40-60% reduction in pipeline development time
Data Analysts
Before OSI:
Verify metric definitions before trusting reports
Recreate calculations in each BI tool
Reconcile conflicting dashboards
With OSI:
Trust that all tools use same definitions
Self-service analytics with confidence
Focus on insights, not validation
Productivity Gain: 3x increase in analysis output
Open Semantic Interchange Benefits for Data Scientists
Before OSI:
Spend weeks understanding data semantics
Build custom feature engineering for each project
Models fail in production due to definition drift
With OSI:
Leverage pre-defined semantic features
Reuse feature engineering logic
Production models aligned with business systems
Impact: 5-10x faster model development
How Semantic Interchange Empowers Business Users
Before OSI:
Receive conflicting reports from different teams
Unsure which numbers to trust
Can’t ask AI agents confidently
With OSI:
Consistent numbers across all reports
Trust AI-generated insights
Self-service analytics without IT
Trust Increase: 50-70% higher confidence in data-driven decisions
Open Semantic Interchange Value for IT Leadership
Before OSI:
Vendor lock-in through proprietary semantics
High cost of platform switching
Difficult to evaluate best-of-breed tools
With OSI:
Freedom to choose best tools for each use case
Lower switching costs and negotiating leverage
Faster time-to-value for new platforms
Strategic Flexibility: 60% reduction in platform lock-in risk
Challenges and Considerations
Challenge 1: Organizational Change for Semantic Interchange
Issue: OSI requires organizations to agree on single source of truth definitions—politically challenging when different departments define metrics differently.
Solution:
Start with uncontroversial definitions
Use OSI to make conflicts visible and force resolution
Establish data governance councils
Frame as risk reduction, not turf battle
Challenge 2: Integrating Legacy Systems with Semantic Interchange
Issue: Older systems may lack APIs or semantic metadata capabilities.
Solution:
Build translation layers
Gradually migrate legacy definitions to OSI
Focus on high-value use cases first
Use OSI for new systems, translate for old
Challenge 3: Specification Evolution
Issue: Business definitions change—how does OSI handle versioning and migration?
Solution:
Built-in versioning in OSI specification
Deprecation policies and timelines
Automated impact analysis tools
Backward compatibility guidelines
Challenge 4: Domain-Specific Complexity
Issue: Some industries have extremely complex semantic models (e.g., derivatives trading, clinical research).
Solution:
Domain-specific OSI extensions
Industry working groups
Pluggable architecture for specialized needs
Start simple, expand complexity gradually
Challenge 5: Governance and Ownership
Issue: Who owns the semantic definitions? Who can change them?
Solution:
Clear ownership model in OSI metadata
Approval workflows for definition changes
Audit trails and change logs
Role-based access control
How Open Semantic Interchange Shifts the Competitive Landscape
Vendors competed by locking in data semantics. Moving from Platform A to Platform B meant rebuilding all your business logic.
This created:
High switching costs
Vendor power imbalance
Slow innovation (vendors focused on lock-in, not features)
Customer resentment
After OSI: The Innovation Era
With semantic portability, vendors must compete on:
User experience and interface design
AI capabilities and intelligence
Performance and scalability
Integration breadth and ease
Support and services
Southard Jones (Tableau): “Standardization isn’t a commoditizer—it’s a catalyst. Think of it like a standard electrical outlet: the outlet itself isn’t the innovation, it’s what you plug into it.”
This shift benefits customers through:
Better products (vendors focus on innovation)
Lower costs (competition increases)
Flexibility (easy to switch or multi-source)
Faster AI adoption (semantic consistency enables trust)
How to Get Started with Open Semantic Interchange (OSI)
For Enterprises
Step 1: Assess Current State (1-2 weeks)
Inventory your data platforms and BI tools
Document how metrics are currently defined
Identify semantic conflicts and pain points
Estimate time spent on definition reconciliation
Step 2: Pilot Use Case (1-2 months)
Choose a high-impact but manageable scope (e.g., revenue metrics)
Define OSI specification for selected metrics
Implement in 2-3 key tools
Measure impact on reconciliation time and trust
Step 3: Expand Gradually (6-12 months)
Add more metrics and dimensions
Integrate additional platforms
Establish governance processes
Train teams on OSI practices
Step 4: Operationalize (Ongoing)
Make Open semantic interchange part of standard data modeling
Integrate into data governance framework
Participate in community to influence roadmap
Share learnings and semantic models
For Technology Vendors
Kickoff Phase: Evaluate Strategic Fit (Immediate)
Review Open semantic interchange specification
Assess compatibility with your platform
Identify required engineering work
Estimate go-to-market impact
Next : Join the Initiative (Q4 2025)
Become an Open semantic interchange partner
Participate in working groups
Contribute to specification development
Collaborate on reference implementations
Strenghthen the core: Implement Support (2026)
Add OSI import/export capabilities
Provide migration tools from proprietary formats
Update documentation and training
Certify OSI compliance
Finally: Differentiate (Ongoing)
Build value-added services on top of OSI
Focus innovation on user experience
Lead with interoperability messaging
Partner with ecosystem for joint solutions
The Future: What’s Next for Open Semantic Interchange
2025-2026: Specification & Early Adoption
Initial specification published (Q4 2025)
Reference implementations released
Major vendors announce support
First enterprise pilot programs
Community formation and governance
2027-2028: Mainstream Adoption
OSI becomes default for new projects
Translation tools for legacy systems mature
Domain-specific extensions proliferate
Marketplace for shared semantic models emerges
Analyst recognition as emerging standard
2029-2030: Industry Standard Status
International standards body adoption
Regulatory recognition in financial services
Built into enterprise procurement requirements
University curricula include Open semantic interchange
Semantic models as common as APIs
Long-Term Vision
The Semantic Web Realized: Open semantic interchange could finally deliver on the promise of the Semantic Web—not through abstract ontologies, but through practical, business-focused semantic standards.
AI Agent Economy: When AI agents understand semantics consistently, they can collaborate across organizational boundaries, creating a true agentic AI ecosystem.
Data Product Marketplace: Open semantic interchange enables data products with embedded semantics, making them immediately usable without integration work.
Cross-Industry Innovation: Semantic models from one industry (e.g., supply chain optimization) could be adapted to others (e.g., healthcare logistics) through shared Open semantic interchange definitions.
Conclusion: The Rosetta Stone Moment for AI
Conclusion: The Rosetta Stone Moment for AI
The launch of Open Semantic Interchange marks a watershed moment in the data industry. For the first time, fierce competitors have set aside proprietary advantages to solve a problem that affects everyone: semantic fragmentation.
However, this isn’t just about technical standards—rather, it’s about unlocking a trillion dollars in trapped AI value.
Specifically, when every platform speaks the same semantic language, AI can finally deliver on its promise:
First, trustworthy insights that business users believe
Second, fast time-to-value without months of data prep
Third, flexible tool choices without vendor lock-in
Finally, scalable AI adoption across the enterprise
Importantly, the biggest winners will be organizations that adopt early. While others struggle with semantic reconciliation, early adopters will be deploying AI agents, building sophisticated analytics, and making data-driven decisions with confidence.
Ultimately, the question isn’t whether Open Semantic Interchange will become the standard—instead, it’s how quickly you’ll adopt it to stay competitive.
The revolution has begun. Indeed, the Rosetta Stone for business data is here.
So, are you ready to speak the universal language of AI?
The world of data analytics is changing. For years, accessing insights required writing complex SQL queries. However, the industry is now shifting towards a more intuitive, conversational approach. At the forefront of this revolution is agentic AI—intelligent systems that can understand human language, reason, plan, and automate complex tasks.
Snowflake is leading this charge by transforming its platform into an intelligent and conversational AI Data Cloud. With the recent introduction of Snowflake Cortex Agents, they have provided a powerful tool for developers and data teams to build their own custom AI assistants.
This guide will walk you through, step-by-step, how to build your very first AI data agent. You will learn how to create an agent that can answer complex questions by pulling information from both your database tables and your unstructured documents, all using simple, natural language.
What is a Snowflake Cortex Agent and Why Does it Matter?
First and foremost, a Snowflake Cortex Agent is an AI-powered assistant that you can build on top of your own data. Think of it as a chatbot that has expert knowledge of your business. It understands your data landscape and can perform complex analytical tasks based on simple, conversational prompts.
This is a game-changer for several reasons:
It Democratizes Data: Business users no longer need to know SQL. Instead, they can ask questions like, “What were our top-selling products in the last quarter?” and get immediate, accurate answers.
It Automates Analysis: Consequently, data teams are freed from writing repetitive, ad-hoc queries. They can now focus on more strategic initiatives while the agent handles routine data exploration.
It Provides Unified Insights: Most importantly, a Cortex Agent can synthesize information from multiple sources. It can query your structured sales data from a table and cross-reference it with strategic goals mentioned in a PDF document, all in a single response.
The Blueprint: How a Cortex Agent Works
Under the hood, a Cortex Agent uses a simple yet powerful workflow to answer your questions. It orchestrates several of Snowflake’s Cortex AI features to deliver a comprehensive answer.
Planning: The agent first analyzes your natural language question to understand your intent. It figures out what information you need and where it might be located.
Tool Use: Next, it intelligently chooses the right tool for the job. If it needs to query structured data, it uses Cortex Analyst to generate and run SQL. If it needs to find information in your documents, it uses Cortex Search.
Reflection: Finally, after gathering the data, the agent evaluates the results. It might ask for clarification, refine its approach, or synthesize the information into a clear, concise answer before presenting it to you.
Step-by-Step Tutorial: Building a Sales Analysis Agent
Now, let’s get hands-on. We will build a simple yet powerful sales analysis agent. This agent will be able to answer questions about sales figures from a table and also reference goals from a quarterly business review (QBR) document.
Prerequisites
A Snowflake account with ACCOUNTADMIN privileges.
A warehouse to run the queries.
Step 1: Prepare Your Data
First, we need some data to work with. Let’s create two simple tables for sales and products, and then upload a sample PDF document.
Run the following SQL in a Snowflake worksheet:
-- Create our database and schema
CREATE DATABASE IF NOT EXISTS AGENT_DEMO;
CREATE SCHEMA IF NOT EXISTS AGENT_DEMO.SALES;
USE SCHEMA AGENT_DEMO.SALES;
-- Create a products table
CREATE OR REPLACE TABLE PRODUCTS (
product_id INT,
product_name VARCHAR,
category VARCHAR
);
INSERT INTO PRODUCTS (product_id, product_name, category) VALUES
(101, 'Quantum Laptop', 'Electronics'),
(102, 'Nebula Smartphone', 'Electronics'),
(103, 'Stardust Keyboard', 'Accessories');
-- Create a sales table
CREATE OR REPLACE TABLE SALES (
sale_id INT,
product_id INT,
sale_date DATE,
sale_amount DECIMAL(10, 2)
);
INSERT INTO SALES (sale_id, product_id, sale_date, sale_amount) VALUES
(1, 101, '2025-09-01', 1200.00),
(2, 102, '2025-09-05', 800.00),
(3, 101, '2025-09-15', 1250.00),
(4, 103, '2025-09-20', 150.00);
-- Create a stage for our unstructured documents
CREATE OR REPLACE STAGE qbr_documents;
Now, create a simple text file named QBR_Report_Q3.txt on your local machine with the following content and upload it to the qbr_documents stage using the Snowsight UI.
Quarterly Business Review – Q3 2025 Summary
Our primary strategic goal for Q3 was to drive the adoption of our new flagship product, the ‘Quantum Laptop’. We aimed for a sales target of over $2,000 for this product. Secondary goals included expanding our market share in the accessories category.
Next, we need to teach the agent about our structured data. We do this by creating a Semantic Model. This is a YAML file that defines our tables, columns, and how they relate to each other.
# semantic_model.yaml
model:
name: sales_insights_model
tables:
- name: SALES
columns:
- name: sale_id
type: INT
- name: product_id
type: INT
- name: sale_date
type: DATE
- name: sale_amount
type: DECIMAL
- name: PRODUCTS
columns:
- name: product_id
type: INT
- name: product_name
type: VARCHAR
- name: category
type: VARCHAR
joins:
- from: SALES
to: PRODUCTS
on: SALES.product_id = PRODUCTS.product_id
Save this as semantic_model.yaml and upload it to the @qbr_documents stage.
Now, let’s make our PDF document searchable. We create a Cortex Search Service on the stage where we uploaded our file.
CREATE OR REPLACE CORTEX SEARCH SERVICE sales_qbr_service
ON @qbr_documents
TARGET_LAG = '0 seconds'
WAREHOUSE = 'COMPUTE_WH';
Step 4: Combine Them into a Cortex Agent
With all the pieces in place, we can now create our agent. This single SQL statement brings together our semantic model (for SQL queries) and our search service (for document queries).
CREATE OR REPLACE CORTEX AGENT sales_agent
MODEL = 'mistral-large',
CORTEX_SEARCH_SERVICES = [sales_qbr_service],
SEMANTIC_MODELS = ['@qbr_documents/semantic_model.yaml'];
Step 5: Ask Your Agent Questions!
The agent is now ready! You can interact with it using the CALL command. Let’s try a few questions.
First up: A simple structured data query.
CALL sales_agent('What were our total sales?');
Next: A more complex query involving joins.
CALL sales_agent('Which product had the highest revenue?');
Then comes: A question for our unstructured document.
CALL sales_agent('Summarize our strategic goals from the latest QBR report.');
Finally , the magic: The magic! A question that combines both.
CALL sales_agent('Did we meet our sales target for the Quantum Laptop as mentioned in the QBR?');
This final query demonstrates the true power of a Snowflake Cortex Agent. It will first query the SALES and PRODUCTS tables to calculate the total sales for the “Quantum Laptop.” Then, it will use Cortex Search to find the sales target mentioned in the QBR document. Finally, it will compare the two and give you a complete, synthesized answer.
Conclusion: The Future is Conversational
You have just built a powerful AI data agent in a matter of minutes. This is a fundamental shift in how we interact with data. By combining natural language processing with the power to query both structured and unstructured data, Snowflake Cortex Agents are paving the way for a future where data-driven insights are accessible to everyone in an organization.
As Snowflake continues to innovate with features like Adaptive Compute and Gen-2 Warehouses, running these AI workloads will only become faster and more efficient. The era of conversational analytics has arrived, and it’s built on the Snowflake AI Data Cloud.
In the realm of data warehousing, choosing the right schema design is crucial for efficient data management, querying, and analysis. Two of the most popular multidimensional schemas are the star schema and the snowflake schema. These schemas organize data into fact tables (containing measurable metrics) and dimension tables (providing context like who, what, when, and where). Understanding star schema vs snowflake schema helps data engineers, analysts, and architects build scalable systems that support business intelligence (BI) tools and advanced analytics.
This comprehensive guide delves into their structures, pros, cons, when to use each, real-world examples, and which one dominates in modern data practices as of 2025. We’ll also include visual illustrations to make concepts clearer, along with references to authoritative sources for deeper reading.
What is a Star Schema?
A star schema is a denormalized data model resembling a star, with a central fact table surrounded by dimension tables. The fact table holds quantitative data (e.g., sales amounts, quantities) and foreign keys linking to dimensions. Dimension tables store descriptive attributes (e.g., product names, customer details) and are not further normalized.
Advantages of Star Schema:
Simplicity and Ease of Use: Fewer tables mean simpler queries with minimal joins, making it intuitive for end-users and BI tools like Tableau or Power BI.
Faster Query Performance: Denormalization reduces join operations, leading to quicker aggregations and reports, especially on large datasets.
Better for Reporting: Ideal for OLAP (Online Analytical Processing) where speed is prioritized over storage efficiency.
Disadvantages of Star Schema:
Data Redundancy: Denormalization can lead to duplicated data in dimension tables, increasing storage needs and risking inconsistencies during updates.
Limited Flexibility for Complex Hierarchies: It struggles with intricate relationships, such as multi-level product categories.
In practice, star schemas are favored in environments where query speed trumps everything else. For instance, in a retail data warehouse, the fact table might record daily sales metrics, while dimensions cover products, customers, stores, and dates. This setup allows quick answers to questions like “What were the total sales by product category last quarter?”
What is a Snowflake Schema?
A snowflake schema is an extension of the star schema but with normalized dimension tables. Here, dimensions are broken down into sub-dimension tables to eliminate redundancy, creating a structure that branches out like a snowflake. The fact table remains central, but dimensions are hierarchical and normalized to third normal form (3NF).
Advantages of Snowflake Schema:
Storage Efficiency: Normalization reduces data duplication, saving disk space—crucial for massive datasets in cloud environments like AWS or Snowflake (the data warehouse platform).
Improved Data Integrity: By minimizing redundancy, updates are easier and less error-prone, maintaining consistency across the warehouse.
Handles Complex Relationships: Better suited for detailed hierarchies, such as product categories subdivided into brands, suppliers, and regions.
Disadvantages of Snowflake Schema:
Slower Query Performance: More joins are required, which can slow down queries on large volumes of data.
Increased Complexity: The normalized structure is harder to understand and maintain, potentially complicating BI tool integrations.
For example, in the same retail scenario, a snowflake schema might normalize the product dimension into separate tables for products, categories, and suppliers. This allows precise queries like “Sales by supplier region” without redundant storage, but at the cost of additional joins.
Key Differences Between Star Schema and Snowflake Schema
To highlight star schema vs snowflake schema, here’s a comparison table:
Aspect
Star Schema
Snowflake Schema
Normalization
Denormalized (1NF or 2NF)
Normalized (3NF)
Structure
Central fact table with direct dimension tables
Fact table with hierarchical sub-dimensions
Joins
Fewer joins, faster queries
More joins, potentially slower
Storage
Higher due to redundancy
Lower, more efficient
Complexity
Simple and user-friendly
More complex, better for integrity
Query Speed
High
Moderate to low
Data Redundancy
High
Low
These differences stem from their design philosophies: star focuses on performance, while snowflake emphasizes efficiency and accuracy.
When to Use Star Schema vs Snowflake Schema
Use Star Schema When:
Speed is critical (e.g., real-time dashboards).
Data models are simple without deep hierarchies.
Storage cost isn’t a concern with cheap cloud options.
Example: An e-commerce firm uses star schema for rapid sales trend analysis.
Example: A healthcare provider uses snowflake to manage patient and provider hierarchies.
Hybrid approaches exist, but pure star schemas are often preferred for balance.
Which is Used Most in 2025?
As of 2025, the star schema remains the most commonly used in data warehousing. Its simplicity aligns with the rise of self-service BI tools and cloud platforms like Snowflake and BigQuery, where query optimization mitigates some denormalization drawbacks. Surveys and industry reports indicate that over 70% of data warehouses favor star schemas for their performance advantages, especially in agile environments. Snowflake schemas, while efficient, are more niche—used in about 20-30% of cases where normalization is essential, such as regulated industries like finance or healthcare.
However, with advancements in columnar storage and indexing, the performance gap is narrowing, making snowflake viable for more use cases.
Solid Examples in Action
Consider a healthcare analytics warehouse:
Star Schema Example: Fact table tracks patient visits (metrics: visit count, cost). Dimensions: Patient (ID, name, age), Doctor (ID, specialty), Date (year, month), Location (hospital, city). Queries like “Average cost per doctor specialty in 2024” run swiftly with simple joins.
Snowflake Schema Example: Normalize the Doctor dimension into Doctor (ID, name), Specialty (ID, type, department), and Department (ID, head). This reduces redundancy if specialties change often, but requires extra joins for the same query.
In a financial reporting system, star might aggregate transaction data quickly for dashboards, while snowflake ensures normalized account hierarchies for compliance audits.
Best Practices and References
To implement effectively:
Start with business requirements: Prioritize speed or efficiency?
In conclusion, while star schema vs snowflake schema both serve data warehousing, star’s dominance in 2025 underscores the value of simplicity in a fast-paced data landscape. Choose based on your workload—performance for star, efficiency for snowflake—and watch your analytics thrive.
The financial services industry is in the midst of a technological revolution. At the heart of this change lies Artificial Intelligence. Consequently, financial institutions are constantly seeking new ways to innovate and enhance security. They also want to deliver personalized customer experiences. However, they face a significant hurdle: navigating fragmented data while adhering to strict compliance and governance requirements. To solve this, Snowflake has introduced Cortex AI for Financial Services, a groundbreaking suite of tools designed to unlock the full potential of AI in the sector.
What is Snowflake Cortex AI for Financial Services?
First and foremost, Snowflake Cortex AI is a comprehensive suite of AI capabilities. It empowers financial organizations to unify their data and securely deploy AI models, applications, and agents. By bringing AI directly to the data, Snowflake eliminates the need to move sensitive information. As a result, security and governance are greatly enhanced. This approach allows institutions to leverage their own proprietary data alongside third-party sources and cutting-edge large language models (LLMs). Ultimately, this helps them automate complex tasks and derive faster, more accurate insights.
Key Capabilities Driving the Transformation
Cortex AI for Financial Services is built on a foundation of powerful features. These are specifically designed to accelerate AI adoption within the financial industry.
Snowflake Data Science Agent: This AI-powered coding assistant automates many time-consuming tasks for data scientists. For instance, it handles data cleaning, feature engineering, and model prototyping. This, in turn, accelerates the development of crucial workflows like risk modeling and fraud detection.
Cortex AISQL: With its AI-powered functions, Cortex AISQL allows users to process and analyze unstructured data at scale. This includes market research, earnings call transcripts, and transaction details. Therefore, it transforms workflows in customer service, investment analytics, and claims processing.
Snowflake Intelligence: Furthermore, this feature provides business users with an intuitive, conversational interface. They can query both structured and unstructured data using natural language. This “democratization” of data access means even non-technical users can gain valuable insights without writing complex SQL.
Managed Model Context Protocol (MCP) Server: The MCP Server is a true game-changer. It securely connects proprietary data with third-party data from partners like FactSet and MSCI. In addition, it provides a standardized method for LLMs to integrate with data APIs, which eliminates the need for custom work and speeds up the delivery of AI applications.
Use Cases: Putting Cortex AI to Work in Finance
The practical applications of Snowflake Cortex AI in the financial services industry are vast and transformative:
Fraud Detection and Prevention: By training models on historical transaction data, institutions can identify suspicious patterns in real time. Consequently, this proactive approach helps minimize losses and protect customers.
Credit Risk Analysis: Cortex Analyst, a key feature, can analyze vast amounts of transaction data to assess credit risk. By building a semantic model, for example, financial institutions can enable more accurate and nuanced risk assessments.
Algorithmic Trading Support:While not a trading platform itself, Snowflake’s infrastructure supports algorithmic strategies. Specifically, Cortex AI provides powerful tools for data analysis, pattern identification, and model development..
Enhanced Customer Service: Moreover, AI agents powered by Cortex AI can create sophisticated customer support systems. These agents can analyze customer data to provide personalized assistance and automate tasks, leading to improved satisfaction.
Market and Investment Analysis: Cortex AI can also analyze a wide range of data sources, from earnings calls to market news. This provides real-time insights that are crucial for making informed and timely investment decisions.
The Benefits of a Unified AI and Data Strategy
By adopting Snowflake Cortex AI, financial institutions can realize a multitude of benefits:
Enhanced Security and Governance: By bringing AI to the data, sensitive financial information remains within Snowflake’s secure and governed environment.
Faster Innovation: Automating data science tasks allows for the rapid development and deployment of new products.
Democratization of Data: Natural language interfaces empower more users to access and analyze data directly.
Reduced Operational Costs: Finally, the automation of complex tasks leads to significant cost savings and increased efficiency.
Getting Started with Snowflake Cortex AI
For institutions ready to begin their AI journey, the path is clear. The Snowflake Quickstarts offer a wealth of tutorials and guides. These resources provide step-by-step instructions on how to set up the environment, create models, and build powerful applications.
The Future of Finance is Here
In conclusion, Snowflake Cortex AI for Financial Services represents a pivotal moment for the industry. By providing a secure, scalable, and unified platform, Snowflake is empowering financial institutions to seize the opportunities of tomorrow. The ability to seamlessly integrate data with the latest AI technology will undoubtedly be a key differentiator in the competitive landscape of finance.