Free tool Databricks Cost X-Ray

X-ray your Databricks spend before your renewal

Run three read-only queries on your system tables, drop the CSVs here, and get a 90-day cost report you can take into the renewal conversation. Every figure is labelled Measured or Estimated.

Start with my data

Runs entirely in your browser. Your CSVs are never uploaded. There is no server, no analytics and no third-party script on this page.

How it works

Three queries. Three files. One report.

  1. 01

    Run the queries

    Paste each query into the Databricks SQL editor or a notebook. They only SELECT from system tables and change nothing.

  2. 02

    Download as CSV

    Use the download button on each result. You can open the files first and check exactly what they contain: aggregated costs, no row-level data.

  3. 03

    Drop them here

    Drop all three at once. The tool works out which file is which, parses them in this tab and draws the report. Any subset works.

Step 1

Copy the read-only queries

Needs Unity Catalog with system tables enabled, and SELECT on system.billing, system.lakeflow and system.compute. An account admin can grant these. Costs are at Databricks list price (pricing.effective_list.default), before contract discounts, for the last 90 days.

What it returns: 90-day list cost and DBUs by billing product and SKU, split by whether the usage is traced to a job run and whether a list price matched.

Reads system.billing.usage, system.billing.list_prices

query-1-spend-summary.sql
-- BigHammer Cost X-Ray | Query 1 of 3: spend summary
-- Read-only. Last 90 days, priced at Databricks list price.
SELECT
  u.billing_origin_product,
  u.sku_name,
  u.usage_metadata.job_run_id IS NOT NULL AS traced_to_job,
  lp.sku_name IS NOT NULL                 AS priced,
  MAX(lp.currency_code)                   AS currency_code,
  ROUND(SUM(IF(u.usage_unit = 'DBU', u.usage_quantity, 0)), 2) AS dbus,
  ROUND(SUM(u.usage_quantity *
        COALESCE(lp.pricing.effective_list.default, lp.pricing.default)), 2) AS list_cost
FROM system.billing.usage AS u
LEFT JOIN system.billing.list_prices AS lp
  ON  u.sku_name   = lp.sku_name
  AND u.cloud      = lp.cloud
  AND u.usage_unit = lp.usage_unit
  AND u.usage_start_time >= lp.price_start_time
  AND (lp.price_end_time IS NULL OR u.usage_start_time < lp.price_end_time)
WHERE u.usage_date >= date_sub(current_date(), 90)
GROUP BY 1, 2, 3, 4
ORDER BY list_cost DESC NULLS LAST

Downloading: in the SQL editor use the download icon on the results and choose CSV. In a notebook, use the table's download menu and pick the full results. Keep the column names as they are; column order does not matter.

Step 2

Drop your CSVs

Drop all three together or one at a time. Files are read with your browser's File API and stay in this tab. Close the tab and they are gone.

  • 1
    Spend summaryWaiting for file
  • 2
    Cost per jobWaiting for file
  • 3
    Cluster CPUWaiting for file

Built for security review

Your cost data stays on your machine

We built this so a security team can approve it in minutes. The page is static HTML, CSS and JavaScript served from GitHub Pages. It talks to no other website, and nothing you drop into it is ever sent anywhere.

  • No upload, no server. CSVs are parsed with JavaScript inside this browser tab.
  • No tracking. No analytics, cookies, fonts or scripts from third parties. Fonts and code are served with the page.
  • Aggregated inputs. The queries return totals per product, job and cluster. No user names, query text or table data.
  • Check it yourself. Open your browser's developer tools, watch the Network tab while you drop a file, or load the page and switch off Wi-Fi first. The source is public on GitHub.

FAQ

Good questions

Why list price and not what we actually pay?

System tables expose list prices, not your negotiated rates. List price is a consistent baseline for comparing workloads. If you have a committed-use discount, your invoice will be lower, but the proportions in this report still hold.

Does it include cloud VM costs?

No. Databricks system tables record DBUs, not the EC2, Azure VM or GCE charges for classic compute. On classic clusters the cloud bill can be as large as the DBU bill, so the true cost of an idle cluster is usually higher than shown here.

What does "untraced" mean?

Usage with no job run attached: interactive notebooks, SQL warehouses, pipelines, model serving and similar. It is not waste. It is spend this report cannot attribute to a job, which makes it a visibility gap to close before anyone can judge it.

How are the savings estimated?

Two transparent rules, shown next to each figure. Moving scheduled jobs off All-Purpose compute uses the price ratio between Jobs and All-Purpose compute. Right-sizing under-used clusters assumes you could shrink a cluster until its 95th percentile CPU reaches 60%, capped at half its cost. The two are applied in sequence so no dollar is counted twice.

Which clouds does it work on?

AWS, Azure and Google Cloud. The tables and columns are the same. Only the default price ratio differs slightly by cloud, tier and region, and you can edit it in the report.

A query failed. What now?

Most failures are permissions: ask an account admin to grant SELECT on the system schemas. If system.lakeflow or system.compute is not available in your account, run the queries you can. The report renders with any subset of the three files.