Software & TechnicalFree
Snowflake and BigQuery Cost Review
River attributes every credit to the dashboard, model or person that caused it, then names the assets still refreshing that nothing reads.
River reads the query history and the billing export together, then re-attributes the bill to the thing that caused each query. Not the warehouse it ran on, which is the only axis the console offers and the one nobody owns. A scheduled model, a dashboard tile, an ingestion job, a person. Then it runs a second join nothing in the warehouse runs for you, matching every asset that refreshes on a schedule against what has actually read it in the last ninety days.
Bramhope, a meal-kit subscription business, went from $46,100 a month to $88,400 in six months. The console split that across four warehouses, which told nobody anything. Re-attributed, 62 percent of the growth was scheduled model refreshes. The project had grown from 246 models to 412 over the same period, and the number of models anything downstream actually reads had gone from 198 to 214. One hundred and four scheduled models fed nothing at all. Retiring them is $7,900 a month and no meeting.
Built for the analytics engineer who gets the question, and for the data lead who has to answer finance in a week. Run it when the bill moves, before you renew a contract, or once a quarter. Infrastructure spend outside the warehouse is a different bill and belongs to the cloud cost analysis. What each model is for, and who owns it, comes from the data dictionary, which is also where a retirement decision gets recorded. The model's SQL style is a separate audit: the analytics code review pack.
The join the console cannot run
The data for this is already in the warehouse, unqueried. Snowflake keeps a year of object access history, and resolves each query down to the base tables it actually touched rather than the view it named. Put that beside the list of things that refresh on a schedule and the gap is the answer: assets written every hour and read by nothing but their own downstream write. No console shows you that, because it needs two datasets and the console has one.
Schedule shape costs more than query shape more often than anyone expects. Snowflake bills per second with a sixty-second minimum, charged every time a warehouse starts or resumes. Six of Bramhope's small jobs each ran eleven seconds, each on its own warehouse, each every ten minutes. Eighty-two percent of what they billed was the minimum rather than the work. Putting all six on one warehouse and one schedule took $1,296 a month down to $238. The queries were not the problem and never had been.
BigQuery charges differently and the same reasoning holds. Its pricing documentation says you pay for the data in the columns you select even when the query carries a LIMIT, with a ten megabyte minimum per table the query references. So a select-star tile with a LIMIT 100 on it costs the full column scan, and a job touching forty small lookup tables pays four hundred megabytes before it reads a row. Neither shows up as a slow query.
How it works
Export the history
A query history export covering at least ninety days, since the read check needs that window.
Add the bill
The credit consumption or billing export for the same period, so the attribution sums correctly.
Name the schedules
What refreshes on a timer and what serves a dashboard, since that is the join.
Work the register
The ranked sheet, the five changes, and the list of assets nobody reads.
What you get
- Every credit attributed to the dashboard, model, job or person that caused the query
- Scheduled refreshes matched against what has read the output in the last ninety days
- Assets still refreshing on a schedule with no consumer left, costed individually
- The repeat offenders ranked by monthly cost rather than by how slow they look
- Cost per human view on dashboards that refresh far more often than anyone opens them
- Schedule changes separated from model changes, so the free wins come first
- Spend by source over six months, so the growth has a named cause
Common questions
The console already shows spend by warehouse.
It does, and a warehouse is not a thing anyone owns. Bramhope's biggest line was $39,700 on one transform warehouse, which is true and unusable. The same money re-attributed came out as 104 orphaned models, one hourly full rebuild and a handful of schedules, which are things with owners and fixes.
How do you know nothing reads a model?
By reading the access history rather than the lineage graph. Lineage says what could read it. Access history says what did, resolved to base tables so a view does not hide the reader. A model whose only reader is its own downstream refresh, which nothing reads either, is the finding.
Some of those models exist for compliance and nobody reads them by design.
Then they come off the list with a reason attached, which is the point of listing them. The reason belongs in the pipeline documentation. What the review will not do is leave 104 rows unexamined because 6 turned out to be deliberate, since that is how the other 98 stayed on a schedule for two years.
We are on BigQuery, not Snowflake.
Same two joins, different columns. The job history carries bytes billed per query and the labels behind it, and the audit logs carry what each job read. The pricing model changes which findings matter: on-demand makes column selection the lever, and a slot commitment makes schedule shape the lever instead.
Will it tell us to buy a smaller warehouse?
Rarely, because sizing down usually runs the same work for longer at the same total credits. The changes that pay are schedule shape, work that should not run at all, and a rebuild that should be incremental. Bramhope's five changes came to $23,504 a month and none of them was a resize.
What about the dashboards people say they need?
Ask them at the refresh rate, not the dashboard. One Bramhope tile refreshed every fifteen minutes around the clock, 2,880 times in the month, and was opened forty-one times. That is $112 a view. Moving it to weekday hours saved $4,186, and a question asked four times a year is a write-up rather than a dashboard.
What comes out of it?
A sheet with spend attributed to every model, dashboard, job and user, the repeat offenders ranked, and a column for whether anything reads the output. Then a document with the five changes, split into schedule, structure and retirement. Where a model turns out to be wrong rather than idle, that is a data quality incident.
Snowflake and BigQuery Cost Review
Fill in the form and your workspace opens with the work already underway.