{"id":22456,"date":"2025-05-22T16:37:44","date_gmt":"2025-05-22T14:37:44","guid":{"rendered":"https:\/\/chartmogul.com\/blog\/?p=22456"},"modified":"2025-05-22T16:37:46","modified_gmt":"2025-05-22T14:37:46","slug":"how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide","status":"publish","type":"post","link":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/","title":{"rendered":"How we reduced Snowflake costs by 70%: a practical optimization guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management. Without active monitoring and optimization, usage can grow unpredictably and lead to substantial expenses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In a previous post, we shared <a href=\"https:\/\/chartmogul.com\/blog\/building-a-data-engineering-stack-that-boosts-scalability\/\">how our modern data stack enables analysts to build visualizations<\/a>, deliver customer insights, and support SaaS reporting. We are also using Snowflake to power certain ChartMogul platform features such as <a href=\"https:\/\/help.chartmogul.com\/hc\/en-us\/articles\/9850274548380-Getting-started-with-destinations\">Destinations<\/a> and <a href=\"https:\/\/chartmogul.com\/blog\/compare-your-performance-to-the-market-with-chartmogul-benchmarks\/\">Benchmarks<\/a>. However, as usage grew, so did our Snowflake spend. This is the story of how we&nbsp;systematically analyzed, debugged, and optimized our Snowflake workloads, ultimately reducing our weekly costs by&nbsp;70%, while maintaining both performance and data freshness.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this guide, we\u2019ll walk through&nbsp;how we identified cost drivers, the&nbsp;practical optimization techniques we implemented, and the&nbsp;dbt-specific strategies&nbsp;that had the greatest impact.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Diagnosing where Snowflake credits are spent<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Before optimizing, we had to understand&nbsp;where our credits were actually going.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Sorting-by-warehouse\">Sorting by warehouse &amp; consumed credits<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The first step was to check&nbsp;credit consumption by warehouse&nbsp;to see which workloads were the heaviest hitters. You should always try to identify:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Warehouses that are&nbsp;over-provisioned&nbsp;(too large for their actual workload).<\/li>\n\n\n\n<li>ETL pipelines running on the same warehouse as BI queries, causing contention.<\/li>\n\n\n\n<li>Warehouses with&nbsp;long idle times&nbsp;but no auto-suspend configured.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">None of these applied to our case as we have already done some heavy work in the past to separate warehouses per usage type, as well as properly size, scale and configure them. However, this step will also give you some valuable insights on the usage type which will allow you to take appropriate measures later on. In our case:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>80% of credits were consumed for transformation purposes, hence this is where we had to focus in order to reduce our spend.<\/li>\n\n\n\n<li>a tiny percentage of credits was consumed for live queries and we also checked that specific dashboards were queried more than others, hence allowed us to apply proper materialization to certain models exposed to Superset, Jupyter Notebooks, HEX and other tools in <a href=\"https:\/\/chartmogul.com\/blog\/saas-revenue-operations-101\/\">our RevOps stack<\/a>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Sorting queries by duration &amp; execution time<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The next step was to dive into the&nbsp;Query History&nbsp;in Snowflake and&nbsp;sort daily queries by total execution time. You should focus on the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Identify the long-running ones:\n<ul class=\"wp-block-list\">\n<li>if the majority of their duration is spent on execution, mark them as candidates for optimization.<\/li>\n\n\n\n<li>if you notice lots of queueing then you might need to see whether they execute at the same time as other heavy queries, hence you need to try to optimize those. Otherwise, you might need to increase the warehouse size to run all of them or even adjust their scaling strategy.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Identify the type of long-running queries. Is it mostly <code>INSERT<\/code>, <code>MERGE<\/code>, <code>DELETE<\/code>, <code>SELECT<\/code>, <code>COPY<\/code> or <code>CREATE<\/code> table queries? If it\u2019s mostly any of the first 3 then it might be tough to optimize anything within Snowflake, but you could investigate improvements on ingestion side. Otherwise there is always room for improvements in <code>SELECT<\/code>, <code>COPY<\/code> or <code>CREATE<\/code> queries using some of the tips below.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Analyzing Query Profiles<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For the top offenders, we analyzed the&nbsp;Query Profiles&nbsp;in detail. This helped us pinpoint:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Queries where &gt;70% of the execution time was spent just scanning data.<\/li>\n\n\n\n<li>Expensive and even incorrect joins with data skew and network shuffling.<\/li>\n\n\n\n<li>Expensive table creations with tens or hundred of columns being read and materialized.<\/li>\n\n\n\n<li>Unnecessary deduplications and dataset ordering.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This level of profiling gave us a prioritized list of where optimization efforts would have the highest return.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Optimization techniques that delivered results<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Given the sorted list of inefficient queries, we audited all SQL queries and found various inefficiencies.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Minimizing table scans with targeted materializations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">One of our most impactful changes was addressing&nbsp;inefficient table scans for a few <code>COPY<\/code> queries. ChartMogul\u2019s Destinations feature is currently built on top of Snowflake. Initially we only implemented views for certain destination datasets, assuming that Snowflake would be \u201csmart\u201d enough to scan only the needed micro-partitions for every account subscribed per dataset. However that was not the case. Snowflake was scanning the whole underlying table on every query leading to <code>COPY<\/code> duration times of 30-50 minutes for certain datasets of our largest accounts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We initially tested <a href=\"https:\/\/docs.snowflake.com\/en\/user-guide\/tables-clustering-keys\">clustering keys<\/a> to these large tables, however performance improvement was not noticeable and all table partitions were still scanned.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix was even simpler, we implemented materialized tables per destination dataset, keeping only the data of the accounts subscribed to that dataset.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Before (View on top of full table):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>create view data_destination_invoices as \nselect * from invoices;\n\n-- data destinations query\nselect * from data_destination_invoices where account_id = X;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>After (Materialized table):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>create table data_destination_invoices as \nselect * from invoices \nwhere account_id in (\n\tselect account_id from data_destinations where dataset == 'invoices'\n);\n\n-- data destinations query\nselect * from data_destination_invoices where account_id = X;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of scanning 1 billion row tables daily, we would query tables of a few tens of million records. This dramatically reduced the scan footprint and improved <code>COPY<\/code> latency to &lt;1 minute!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reducing the number of columns materialized<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An important optimization that significantly contributed to reducing our Snowflake costs was minimizing the number of columns materialized in our tables. In several cases, we identified dbt models that joined multiple upstream tables and materialized all available columns into the final dataset. This practice resulted in tables containing&nbsp;70 to 100 columns, many of which had little to no downstream usage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Through analysis of&nbsp;Query Profiles, we observed that a substantial portion of query execution time was spent on materializing these excessive columns. This was more prominent on models containing large text columns or custom attributes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To address this, we assessed how each table was consumed by BI tools, analytics workflows, and downstream models. Columns, and even custom attributes, that were not actively used were removed from materialization. By reducing the number of columns, execution times for affected queries were reduced by&nbsp;30-50%.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This optimization highlighted the importance of&nbsp;intentional data modeling. Simply joining tables and materializing all available columns may seem convenient initially, but it can become a hidden driver of escalating Snowflake costs over time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Replacing joins with&nbsp;<code>IN<\/code>&nbsp;filters when columns are unused<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It is common to see joins in queries that do not actually use any columns from the joined table. These joins often exist purely for filtering purposes, but they come with additional overhead such as join condition evaluations, data shuffling, and scan costs on both tables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In such cases, replacing these joins with a&nbsp;simple&nbsp;<code>WHERE ... IN (subquery)<\/code>&nbsp;filter&nbsp;achieves the same functional result with less computational effort.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Before (Inefficient join):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>select m.id, m.customer_id, m.date\nfrom mrr_movements m\ninner join active_customers c on m.customer_id = c.id\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>After (Optimized filter using&nbsp;<code>IN<\/code>):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>select m.id, m.customer_id, m.date\nfrom mrr_movements m\nwhere m.customer_id in (select id from active_customers)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">By eliminating the join, we reduced data shuffling and allowed Snowflake to leverage more efficient filter pushdowns and optimize certain queries\u2019 execution times by 30%.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Removing-unnecessary-ordering-from-dbt-models\">Removing unnecessary ordering from dbt models<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ordering data is an expensive operation, especially on large datasets. While dbt models sometimes include&nbsp;<code>ORDER BY<\/code>clauses for perceived neatness or convenience, this is rarely necessary at the data warehouse level. Most downstream BI tools can apply ordering dynamically as needed. Removing these&nbsp;<code>ORDER BY<\/code>&nbsp;clauses from dbt models can result in substantial compute savings, particularly in large transformations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By doing so, we eliminated a costly sort step from our model builds without affecting end-user functionality.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Replacing-dynamic-range-generation-with-a-materialized-table\">Replacing dynamic range generation with a materialized table<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Another optimization involved replacing\u00a0on-the-fly date range generation\u00a0(commonly used in time-series reports and metrics tables) with a\u00a0pre-materialized calendar table. Generating date ranges dynamically within queries not only adds compute overhead but also increases the number of processed rows unnecessarily.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By maintaining a materialized dates table and joining to it as needed, we reduced computation and simplified query logic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Before (Dynamic date generation in query):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>with dates as (\n\tselect dateadd(day, seq4(), '2010-01-01') as date\n\tfrom table(generator(rowcount =&gt; 10000))\n)\n\nselect d.date, m.mrr\nfrom dates as d\nleft join movements as m\non d.date = m.date\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>After (Joining pre-materialized dates table):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>create table materialized_dates as \nselect dateadd(day, seq4(), '2010-01-01') as date\nfrom table(generator(rowcount =&gt; 10000))\n\nselect d.date, m.mrr\nfrom materialized_dates as d\nleft join movements as m\non d.date = m.date\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Beyond performance improvements, this approach also ensured consistency in date-related calculations across models and reports. We applied the same technique for CTEs using generators, and we also observed significant performance gains tuning the generator size. Don\u2019t put large values, e.g. 1_000_000 that you don\u2019t need, assuming that Snowflake will somehow skip them in later steps of the query.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Additional small improvements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Beyond larger optimizations, small SQL improvements had a noticeable impact on Snowflake performance and costs. These quick wins helped prevent unnecessary compute consumption:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Filter datasets early: There were a few models which were joining multiple tables only for our account data, however Snowflake query optimizer was pushing the filtering condition on the last step. Execution time reduced dramatically by just adding <code>tenant_id = X<\/code> on every CTE before joining.<\/li>\n\n\n\n<li>Remove unnecessary window functions: We often saw window functions used for deduplication where upstream models could have provided unique records. By deduplicating earlier, we avoided costly per-row operations.<\/li>\n\n\n\n<li>Fix incorrect joins: Query profiles revealed exponential row growth caused by missing join conditions. Ensuring complete and correct join logic prevented accidental Cartesian products.<\/li>\n\n\n\n<li>Minimize <code>SELECT *<\/code>: Explicitly selecting only needed columns reduced I\/O and materialization overhead, especially for wide tables.<\/li>\n\n\n\n<li>Use clustering only when justified: Clustering improved performance for large, frequently filtered tables but added overhead elsewhere. We applied it selectively based on query patterns and table size.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">These targeted SQL adjustments, while simple, collectively contributed to reducing query runtimes and Snowflake credit usage.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">A dbt checklist for Snowflake cost optimization<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Given that dbt was a major part of our data transformation layer, optimizing our&nbsp;dbt workflows&nbsp;was crucial for sustained cost efficiency. Here\u2019s what we did:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pruning unused &amp; legacy models<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An audit revealed several dbt models that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Were no longer used downstream.<\/li>\n\n\n\n<li>Were built for one-off analyses.<\/li>\n\n\n\n<li>Introduced redundant models into the Directed Acyclic Graph (DAG).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">We tagged these models as deprecated or completely removed them, reducing both runtime and complexity.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Incremental materializations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The most effective change was applying&nbsp;incremental materializations&nbsp;for any model dealing with large, append-only, or slowly-changing datasets. By using dbt&#8217;s incremental configuration, we ensured only new or modified data was processed.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{{ config(materialized='incremental') }}\n\nselect ...\nfrom source_table\n{% if is_incremental() %}\nwhere updated_at &gt; (select max(updated_at) from {{ this }})\n{% endif %}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This simple pattern cut down our warehouse compute time dramatically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Incremental strategy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">As part of our dbt optimizations, we revisited the choice of incremental strategies used in table builds. While dbt defaults to using&nbsp;<code>merge<\/code>&nbsp;for incremental models, we observed that this approach became inefficient for&nbsp;wide tables with many columns.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The reason is straightforward:&nbsp;<code>merge<\/code>&nbsp;performs row-by-row comparisons, matching keys and updating all columns involved. For tables with dozens of columns, this added significant computational overhead, slowing down builds and increasing warehouse credits consumed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In cases where updates could be isolated to specific partitions, we achieved better performance by switching to a&nbsp;<code>delete + insert<\/code>&nbsp;strategy, which first, deletes existing rows for the affected key(s) and then, inserts the refreshed data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Before (MERGE strategy, implicit in dbt incremental models):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{{ config(\n\tmaterialized='incremental', \n\tunique_key='id') \n}}\nselect * from source_table \nwhere updated_at &gt;= (select max(updated_at) from {{ this }})\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This would generate a&nbsp;<code>MERGE<\/code>&nbsp;statement under the hood.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>After (DELETE + INSERT strategy):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{{ config(\n\tmaterialized='incremental', \n\tunique_key='id', \n\tincremental_strategy='delete+insert') \n}}\nselect * from source_table \nwhere updated_at &gt;= (select max(updated_at) from {{ this }})\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With this small change, dbt will issue a\u00a0<code>DELETE<\/code>\u00a0for affected keys followed by a bulk\u00a0<code>INSERT<\/code>, avoiding the costly merge logic. In our case, we reduced model execution times by\u00a020%.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Materialization strategy review<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">We assessed each model based on its purpose and usage pattern, applying a more deliberate approach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tables&nbsp;were used for:\n<ul class=\"wp-block-list\">\n<li>Large, compute-intensive transformations.<\/li>\n\n\n\n<li>Models reused in multiple downstream models.<\/li>\n\n\n\n<li>Datasets supporting frequently accessed BI dashboards where query performance was critical.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Incremental tables&nbsp;were adopted wherever feasible, especially for large datasets with append-only or easily isolated update patterns, to reduce unnecessary recomputation.<\/li>\n\n\n\n<li>Views&nbsp;were preferred for:\n<ul class=\"wp-block-list\">\n<li>Lightweight data abstractions.<\/li>\n\n\n\n<li>Datasets serving infrequently accessed reports or exploratory analysis, where real-time freshness outweighed the need for materialization.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Frequency &amp; scheduling optimization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In parallel, we&nbsp;re-evaluated the run frequency of each model, introducing dbt tags and orchestrating schedules based on actual business needs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Daily&nbsp;schedules for critical, operational data models.<\/li>\n\n\n\n<li>Weekly or monthly&nbsp;refreshes for slower-moving datasets, non-critical metrics and datasets that are only needed the 1st day of each month. One such example is our Benchmarks datasets which are powered by Snowflake and are updated only the 1st day of each month.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This allowed us to&nbsp;prioritize warehouse resources&nbsp;for high-impact workloads while avoiding unnecessary daily recomputation of static or slow-changing data.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">By combining&nbsp;Snowflake query profiling,&nbsp;targeted table materializations,&nbsp;incremental dbt models, and&nbsp;warehouse optimizations, we reduced our Snowflake spend by 70%.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The key principles behind this improvement were:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Diagnose before optimizing: Use query history, profiles, and warehouse metrics to identify the real cost drivers.<\/li>\n\n\n\n<li>Audit all dbt models and SQL logic: Fix joins, minimize columns, check for logic duplicated in multiple models. Filter early, replace expensive joins, window functions, and unnecessary sorts.<\/li>\n\n\n\n<li>Be intentional with materializations: Assess actual model usage and materialize only what\u2019s needed, use incremental strategies wisely, and avoid unnecessary recomputations.<\/li>\n\n\n\n<li>Right-size model schedules: Refresh data only as frequently as business needs dictate.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management. Without active monitoring and optimization, usage can grow unpredictably and lead to substantial expenses. In a previous post, we shared how our modern data stack enables analysts to build visualizations, deliver customer insights, &hellip;<\/p>\n","protected":false},"author":91,"featured_media":22478,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-22456","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-we-build"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How we reduced Snowflake costs by 70% | ChartMogul<\/title>\n<meta name=\"description\" content=\"Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management.\" \/>\n<meta name=\"robots\" content=\"index, follow\" \/>\n<link rel=\"canonical\" href=\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How we reduced Snowflake costs by 70% | ChartMogul\" \/>\n<meta property=\"og:description\" content=\"Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"ChartMogul\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/chartmogul\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-22T14:37:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-22T14:37:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1067\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"George Petropoulos\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@chartmogul\" \/>\n<meta name=\"twitter:site\" content=\"@chartmogul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"George Petropoulos\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/\"},\"author\":{\"name\":\"George Petropoulos\",\"@id\":\"https:\/\/chartmogul.com\/blog\/#\/schema\/person\/46ce2f3d9e5d1a1d703c889ef43220f6\"},\"headline\":\"How we reduced Snowflake costs by 70%: a practical optimization guide\",\"datePublished\":\"2025-05-22T14:37:44+00:00\",\"dateModified\":\"2025-05-22T14:37:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/\"},\"wordCount\":2097,\"publisher\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png\",\"articleSection\":[\"How we Build\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/\",\"url\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/\",\"name\":\"How we reduced Snowflake costs by 70% | ChartMogul\",\"isPartOf\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png\",\"datePublished\":\"2025-05-22T14:37:44+00:00\",\"dateModified\":\"2025-05-22T14:37:46+00:00\",\"description\":\"Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management.\",\"breadcrumb\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage\",\"url\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png\",\"contentUrl\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png\",\"width\":2560,\"height\":1067,\"caption\":\"(blog)_How_we_reduced_Snowflake_costs_by_70_\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/chartmogul.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How we reduced Snowflake costs by 70%: a practical optimization guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/chartmogul.com\/blog\/#website\",\"url\":\"https:\/\/chartmogul.com\/blog\/\",\"name\":\"ChartMogul\",\"description\":\"Get all your SaaS &amp; Subscription Metrics with a Single Click! MRR, churn, LTV and much more.\",\"publisher\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/chartmogul.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/chartmogul.com\/blog\/#organization\",\"name\":\"ChartMogul\",\"url\":\"https:\/\/chartmogul.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/chartmogul.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2019\/05\/ChartMogul-Logo.png\",\"contentUrl\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2019\/05\/ChartMogul-Logo.png\",\"width\":278,\"height\":52,\"caption\":\"ChartMogul\"},\"image\":{\"@id\":\"https:\/\/chartmogul.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/chartmogul\",\"https:\/\/x.com\/chartmogul\",\"https:\/\/www.linkedin.com\/company\/chartmogul\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/chartmogul.com\/blog\/#\/schema\/person\/46ce2f3d9e5d1a1d703c889ef43220f6\",\"name\":\"George Petropoulos\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/chartmogul.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2023\/07\/george-petropoulos.png\",\"contentUrl\":\"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2023\/07\/george-petropoulos.png\",\"caption\":\"George Petropoulos\"},\"description\":\"Engineering Manager\",\"url\":\"https:\/\/chartmogul.com\/blog\/author\/georgechartmogul-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How we reduced Snowflake costs by 70% | ChartMogul","description":"Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management.","robots":{"index":"index","follow":"follow"},"canonical":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/","og_locale":"en_US","og_type":"article","og_title":"How we reduced Snowflake costs by 70% | ChartMogul","og_description":"Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management.","og_url":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/","og_site_name":"ChartMogul","article_publisher":"https:\/\/www.facebook.com\/chartmogul","article_published_time":"2025-05-22T14:37:44+00:00","article_modified_time":"2025-05-22T14:37:46+00:00","og_image":[{"width":2560,"height":1067,"url":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png","type":"image\/png"}],"author":"George Petropoulos","twitter_card":"summary_large_image","twitter_creator":"@chartmogul","twitter_site":"@chartmogul","twitter_misc":{"Written by":"George Petropoulos","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#article","isPartOf":{"@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/"},"author":{"name":"George Petropoulos","@id":"https:\/\/chartmogul.com\/blog\/#\/schema\/person\/46ce2f3d9e5d1a1d703c889ef43220f6"},"headline":"How we reduced Snowflake costs by 70%: a practical optimization guide","datePublished":"2025-05-22T14:37:44+00:00","dateModified":"2025-05-22T14:37:46+00:00","mainEntityOfPage":{"@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/"},"wordCount":2097,"publisher":{"@id":"https:\/\/chartmogul.com\/blog\/#organization"},"image":{"@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png","articleSection":["How we Build"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/","url":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/","name":"How we reduced Snowflake costs by 70% | ChartMogul","isPartOf":{"@id":"https:\/\/chartmogul.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage"},"image":{"@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png","datePublished":"2025-05-22T14:37:44+00:00","dateModified":"2025-05-22T14:37:46+00:00","description":"Snowflake is a powerful data platform known for its scalability and ease of use, but its consumption-based pricing requires careful cost management.","breadcrumb":{"@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#primaryimage","url":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png","contentUrl":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2025\/05\/blog_How_we_reduced_Snowflake_costs_by_70_-scaled.png","width":2560,"height":1067,"caption":"(blog)_How_we_reduced_Snowflake_costs_by_70_"},{"@type":"BreadcrumbList","@id":"https:\/\/chartmogul.com\/blog\/how-we-reduced-snowflake-costs-by-70-a-practical-optimization-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/chartmogul.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How we reduced Snowflake costs by 70%: a practical optimization guide"}]},{"@type":"WebSite","@id":"https:\/\/chartmogul.com\/blog\/#website","url":"https:\/\/chartmogul.com\/blog\/","name":"ChartMogul","description":"Get all your SaaS &amp; Subscription Metrics with a Single Click! MRR, churn, LTV and much more.","publisher":{"@id":"https:\/\/chartmogul.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/chartmogul.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/chartmogul.com\/blog\/#organization","name":"ChartMogul","url":"https:\/\/chartmogul.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/chartmogul.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2019\/05\/ChartMogul-Logo.png","contentUrl":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2019\/05\/ChartMogul-Logo.png","width":278,"height":52,"caption":"ChartMogul"},"image":{"@id":"https:\/\/chartmogul.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/chartmogul","https:\/\/x.com\/chartmogul","https:\/\/www.linkedin.com\/company\/chartmogul\/"]},{"@type":"Person","@id":"https:\/\/chartmogul.com\/blog\/#\/schema\/person\/46ce2f3d9e5d1a1d703c889ef43220f6","name":"George Petropoulos","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/chartmogul.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2023\/07\/george-petropoulos.png","contentUrl":"https:\/\/chartmogul.com\/blog\/wp-content\/uploads\/2023\/07\/george-petropoulos.png","caption":"George Petropoulos"},"description":"Engineering Manager","url":"https:\/\/chartmogul.com\/blog\/author\/georgechartmogul-com\/"}]}},"_links":{"self":[{"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/posts\/22456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/users\/91"}],"replies":[{"embeddable":true,"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/comments?post=22456"}],"version-history":[{"count":0,"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/posts\/22456\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/media\/22478"}],"wp:attachment":[{"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/media?parent=22456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/categories?post=22456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chartmogul.com\/blog\/wp-json\/wp\/v2\/tags?post=22456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}