Snowflake charges per‑second credits on each virtual warehouse and scales out with multi‑cluster warehouses, while BigQuery bills per‑second slot‑usage and scales via flex slots or on‑demand slot sharing.
1. Define the compute unit
- Snowflake: Warehouse size (X‑SMALL=1, SMALL=2, MEDIUM=4, etc.) translates to a fixed credit‑per‑second rate.
- BigQuery: One slot equals 1 vCPU × 4 GB RAM; pricing is $0.040 per slot‑hour on‑demand (2026).
2. Enable auto‑suspend / resume
```sql
ALTER WAREHOUSE ANALYTICS SET AUTO_SUSPEND = 300, AUTO_RESUME = TRUE;
```
Snowflake stops billing after 300 s of inactivity. BigQuery has no suspend; idle slots incur no cost.
3. Configure auto‑scale
- Snowflake multi‑cluster:
```sql
ALTER WAREHOUSE ANALYTICS SET MIN_CLUSTER_COUNT = 1, MAX_CLUSTER_COUNT = 5;
```
- BigQuery flex slots (Python client):
```python
from google.cloud import bigquery_reservation_v1
client = bigquery_reservation_v1.ReservationServiceClient()
name = client.flexible_slot_path("my-project","us","my-reservation")
client.update_flex_slot(name, {"slot_capacity": 2000})
```
4. Monitor consumption
- Snowflake: SHOW WAREHOUSE METERING_HISTORY gives credits per second.
- BigQuery: bq query --format=prettyjson "SELECT * FROM region-us.INFORMATION_SCHEMA.JOBS_BY_PROJECT" shows slot‑seconds.
| Feature | Snowflake | BigQuery |
|---|---|---|
| Billing unit | Credits per second per warehouse size | Slots‑seconds; $0.040 per slot‑hour on‑demand |
| Auto‑suspend | AUTO_SUSPEND (seconds) | N/A (idle slots free) |
| Auto‑scale | Multi‑cluster MIN_CLUSTER_COUNT/MAX_CLUSTER_COUNT | Flex slots slot_capacity via reservation API |
| Concurrency | Separate warehouses per workload | Shared slot pool, queuing when saturated |
Gotcha: In Snowflake, a multi‑cluster warehouse can silently exceed its credit budget during sudden concurrency spikes; set a MAX_CLUSTER_COUNT and monitor CREDITS_USED to avoid surprise charges.