Module 5: Vector Database Landscape for AI Engineers
Capsule 05: Selection Costs and Trade-offs
Capsule description
Choosing a vector database is not just about comparing technical features: it's a financial decision that directly impacts your startup's runway, your team's budget, or your product's profitability. A managed provider's "list price" represents barely 30-40% of the real cost. The rest are hidden costs: engineering hours, data egress, support, future migration, and the opportunity cost of not building product.
In this capsule you'll learn to calculate the real Total Cost of Ownership (TCO) of each option, identify the hidden costs nobody mentions on pricing pages, and build cost models for three concrete scales: 10K, 100K, and 1M vectors. In the end, you'll have a replicable formula for any infrastructure decision, not just vector databases.
The goal is not to find "the cheapest", but to find the option that maximizes value delivered per dollar invested in your specific context.
The total cost formula (TCO)
Most teams make the mistake of comparing only the service price. The real TCO includes four dimensions:
TCO = Infrastructure Cost
+ Operational Cost (team hours × rate)
+ Risk Cost (incidents × probability × impact)
+ Opportunity Cost (undelivered features)
Dimension 1: Infrastructure Cost
It's the most visible but not the largest. It includes:
| Component | Self-hosted | Managed |
|---|---|---|
| Compute (server/instance) | $20-500/mo | Included |
| Storage (disk/S3) | $5-100/mo | Included or per GB |
| Network (egress) | $0.09/GB AWS | $0.05-0.12/GB |
| Backups | $5-50/mo | Included or extra |
| SSL/Domain | $0-15/mo | Included |
Dimension 2: Operational Cost
This is where the real difference appears. Calculate with this table:
# Average hourly rate per engineer
JUNIOR_RATE = 30 # USD/hr
MID_RATE = 60 # USD/hr
SENIOR_RATE = 100 # USD/hr
# Typical monthly operation hours
operation_hours = {
"chromadb_self": {
"monitoring": 4,
"updates_patches": 2,
"scaling_manual": 3,
"backups_recovery": 2,
"debugging": 3,
"total": 14 # hours/month
},
"qdrant_self": {
"monitoring": 3,
"updates_patches": 2,
"scaling_manual": 2,
"backups_recovery": 1,
"debugging": 2,
"total": 10
},
"pinecone_managed": {
"monitoring": 1,
"updates_patches": 0,
"scaling_manual": 0,
"backups_recovery": 0,
"debugging": 1,
"total": 2
},
"weaviate_cloud": {
"monitoring": 1,
"updates_patches": 0,
"scaling_manual": 0,
"backups_recovery": 0,
"debugging": 1,
"total": 2
}
}
# Monthly operational cost with a mid-level engineer
for provider, hours in operation_hours.items():
monthly_cost = hours["total"] * MID_RATE
print(f"{provider}: {hours['total']}h/month = ${monthly_cost}/month")
chromadb_self: 14h/month = $840/month
qdrant_self: 10h/month = $600/month
pinecone_managed: 2h/month = $120/month
weaviate_cloud: 2h/month = $120/month
Dimension 3: Risk Cost
Every incident has a cost. The formula:
Risk cost = Σ (probability × frequency × cost per incident)
| Incident type | Self-hosted | Managed |
|---|---|---|
| Service outage (1-4h) | 1-2/quarter | 0-1/year |
| Index corruption | 0-1/year | ~0 |
| Gradual degradation | 1-2/quarter | Rare |
| Cost per hour of downtime | $100-10,000+ | $100-10,000+ |
Concrete example:
- Self-hosted: 2 incidents/quarter × 3h average × $500/h impact = $3,000/quarter
- Managed: 0.5 incidents/quarter × 1h average × $500/h impact = $250/quarter
Dimension 4: Opportunity Cost
The hardest to calculate but frequently the largest:
# If your team spends 14h/month operating the DB instead of building features:
features_delayed_hours = 14 # hours/month redirected to operations
feature_value_per_hour = 200 # USD of product value per dev hour
opportunity_cost = features_delayed_hours * feature_value_per_hour
print(f"Opportunity cost: ${opportunity_cost}/month")
# Opportunity cost: $2,800/month
Provider pricing models
Pricing per stored vector
Pinecone uses this model. You pay for the number of vectors you have stored:
| Tier | Price | Includes |
|---|---|---|
| Starter (free) | $0 | 100K vectors, 1 index, limited dimensions |
| Standard | ~$0.08/1K vectors/mo | Multi-index, namespaces, metadata filtering |
| Enterprise | Custom | SLA, dedicated support, compliance |
Calculation for different scales:
pinecone_costs = {
"10K_vectors": {
"storage": 0, # Within the free tier
"queries": 0, # Included in starter
"monthly": 0,
"note": "Free tier covers this"
},
"100K_vectors": {
"storage": 0, # Free tier limit
"queries": 0,
"monthly": 0,
"note": "Right at the free limit. One more vector → Standard"
},
"1M_vectors": {
"storage": 80, # ~$0.08/1K × 1000
"queries": 0, # Included in Standard
"monthly": 80,
"note": "Standard tier required"
}
}
Pricing per capacity (pods/instances)
Weaviate Cloud and Qdrant Cloud use variants of this model:
| Provider | Unit | Base price | Capacity |
|---|---|---|---|
| Weaviate Cloud | Sandbox (free) | $0 | 50K vectors, ephemeral |
| Weaviate Cloud | Standard | ~$25/mo | Small cluster |
| Qdrant Cloud | Free | $0 | 1GB, 1 node |
| Qdrant Cloud | Standard | 2GB RAM, 1 vCPU |
Self-hosted pricing (infrastructure)
For ChromaDB, Milvus, Qdrant, or Weaviate self-hosted:
| Cloud Provider | Instance | RAM | Cost/mo | Vectors (1536D) |
|---|---|---|---|---|
| DigitalOcean | Basic Droplet | 2GB | $12 | ~30K |
| DigitalOcean | Regular | 4GB | $24 | ~80K |
| AWS | t3.medium | 4GB | $30 | ~80K |
| AWS | t3.large | 8GB | $60 | ~200K |
| AWS | r6g.xlarge | 32GB | $180 | ~1M |
| GCP | e2-standard-4 | 16GB | $100 | ~500K |
Hidden costs nobody mentions
1. Data egress
Every time your application reads data from the vector DB, you pay for the network traffic:
# Example: API in AWS us-east-1, DB in AWS us-west-2
queries_per_day = 10_000
avg_response_size_kb = 5 # 10 results × 500 bytes metadata
days_per_month = 30
monthly_egress_gb = (queries_per_day * avg_response_size_kb * days_per_month) / (1024 * 1024)
egress_cost = monthly_egress_gb * 0.09 # AWS inter-region
print(f"Monthly egress: {monthly_egress_gb:.2f} GB = ${egress_cost:.2f}/month")
# Monthly egress: 1.43 GB = $0.13/month (low for 10K queries)
# But with 1M queries/day:
monthly_egress_gb_high = (1_000_000 * avg_response_size_kb * 30) / (1024 * 1024)
egress_cost_high = monthly_egress_gb_high * 0.09
print(f"High egress: {monthly_egress_gb_high:.2f} GB = ${egress_cost_high:.2f}/month")
# High egress: 143.05 GB = $12.87/month
2. Embedding generation cost
Before storing vectors, you need to generate them. This cost is always forgotten:
| Model | Price/1K tokens | Tokens/doc (average) | Cost per 1M docs |
|---|---|---|---|
| OpenAI text-embedding-3-small | $0.02/1M tokens | ~500 | $10 |
| OpenAI text-embedding-3-large | $0.13/1M tokens | ~500 | $65 |
| Cohere embed-v3 | $0.10/1M tokens | ~500 | $50 |
| Local (sentence-transformers) | $0 (compute) | ~500 | $0 + GPU time |
# Re-indexing cost (when you need to re-generate embeddings)
docs = 1_000_000
tokens_per_doc = 500
price_per_million_tokens = 0.02 # text-embedding-3-small
reindex_cost = (docs * tokens_per_doc / 1_000_000) * price_per_million_tokens
print(f"Cost to re-index 1M docs: ${reindex_cost:.2f}")
# Cost to re-index 1M docs: $10.00
# But if you switch embedding models, you pay DOUBLE!
# Old model to compare + new model to migrate
3. Migration cost
Switching providers is not free:
migration_costs = {
"engineering_time": {
"hours": 40, # 1 week of a senior engineer
"rate": 100,
"cost": 4_000
},
"dual_running": {
"months": 1, # Run both providers in parallel
"extra_cost": 150, # Cost of the new provider while you migrate
"cost": 150
},
"re_embedding": {
"docs": 1_000_000,
"cost": 10 # text-embedding-3-small
},
"testing_validation": {
"hours": 20,
"rate": 100,
"cost": 2_000
},
"downtime_risk": {
"estimated_hours": 2,
"revenue_per_hour": 500,
"cost": 1_000
}
}
total = sum(item["cost"] for item in migration_costs.values())
print(f"Total migration cost: ${total:,}")
# Total migration cost: $7,160
4. Premium support
| Provider | Included support | Premium support |
|---|---|---|
| Pinecone | Community + docs | Enterprise: custom pricing |
| Weaviate | Community + Slack | Enterprise: from $2,000/mo |
| Qdrant | GitHub issues | Enterprise: custom |
| ChromaDB | GitHub issues | Not available (self-hosted) |
5. Compliance and audit cost
If your application handles regulated data (GDPR, HIPAA, SOC2):
- Self-hosted: You are responsible → audit: $5,000-20,000/year
- Managed with certification: The provider has certifications → verification: $1,000-5,000/year
- Managed without certification: Not viable → infinite cost (you can't use it)
Concrete TCO calculations by scale
Scenario A: 10,000 vectors (PoC / MVP)
Context: A startup in the validation phase, a team of 2-3 devs, limited budget.
| Item | ChromaDB Self | Pinecone Free | Qdrant Cloud Free |
|---|---|---|---|
| Infra/Service | $12/mo (DO) | $0 | $0 |
| Operations (2h × $60) | $120/mo | $60/mo (1h) | $60/mo (1h) |
| Embeddings | $0.20 (once) | $0.20 (once) | $0.20 (once) |
| Egress | ~$0 | $0 | $0 |
| Risk | $50/mo | $10/mo | $10/mo |
| Monthly TCO | $182 | $70 | $70 |
| 6-month TCO | $1,093 | $421 | $421 |
Winner: Pinecone Free or Qdrant Cloud Free At this scale, the free tiers cover everything. Self-hosted makes no sense.
Scenario B: 100,000 vectors (Product in validation)
Context: A product with initial traction, 50-200 users, a team of 3-5 devs.
| Item | ChromaDB Self | Pinecone Std | Qdrant Cloud | Weaviate Cloud |
|---|---|---|---|---|
| Infra/Service | $24/mo | $80/mo | $33/mo | $25/mo |
| Operations (hrs × $60) | $840/mo (14h) | $120/mo (2h) | $120/mo (2h) | $120/mo (2h) |
| Embeddings | $2 (once) | $2 (once) | $2 (once) | $2 (once) |
| Egress | $1/mo | Included | $1/mo | Included |
| Risk | $200/mo | $50/mo | $50/mo | $50/mo |
| Monthly TCO | $1,065 | $250 | $204 | $195 |
| 6-month TCO | $6,392 | $1,502 | $1,226 | $1,172 |
| 12-month TCO | $12,784 | $3,004 | $2,452 | $2,344 |
Winner: Weaviate Cloud or Qdrant Cloud The operational cost of self-hosted dominates. Managed is 5-6x cheaper in real TCO.
Scenario C: 1,000,000 vectors (Production at scale)
Context: An established product, 1,000+ users, a team with dedicated DevOps.
| Item | ChromaDB Self (AWS) | Pinecone Std | Qdrant Cloud | Weaviate Cloud |
|---|---|---|---|---|
| Infra/Service | $180/mo (r6g.xlarge) | $800/mo | $250/mo | $300/mo |
| Operations (hrs × $100) | $1,400/mo (14h Sr) | $200/mo (2h) | $200/mo (2h) | $200/mo (2h) |
| Embeddings | $10 (once) | $10 (once) | $10 (once) | $10 (once) |
| Egress | $15/mo | Included | $10/mo | Included |
| Backups | $50/mo | Included | Included | Included |
| Risk | $750/mo | $100/mo | $100/mo | $100/mo |
| Monthly TCO | $2,395 | $1,100 | $560 | $600 |
| 6-month TCO | $14,380 | $6,610 | $3,370 | $3,610 |
| 12-month TCO | $28,750 | $13,210 | $6,730 | $7,210 |
Winner: Qdrant Cloud or Weaviate Cloud Self-hosted wins only on direct infra, but the operational cost makes it 4x more expensive in TCO.
Exception: If your team already has infrastructure and dedicated DevOps, the operational cost of self-hosted drops significantly (from 14h to 4-6h/month), making self-hosted competitive.
Cost projection scenarios
Never decide with a single snapshot of the present. Always evaluate three scenarios:
12-month projection (starting with 100K vectors)
import matplotlib.pyplot as plt
months = list(range(1, 13))
# Conservative scenario: 5% monthly growth
conservative = [100_000 * (1.05 ** m) for m in months]
# Expected scenario: 15% monthly growth
expected = [100_000 * (1.15 ** m) for m in months]
# Aggressive scenario: 30% monthly growth
aggressive = [100_000 * (1.30 ** m) for m in months]
for i, month in enumerate(months):
print(f"Month {month:2d}: "
f"Conservative={conservative[i]:>10,.0f} | "
f"Expected={expected[i]:>10,.0f} | "
f"Aggressive={aggressive[i]:>10,.0f}")
Month 1: Conservative= 105,000 | Expected= 115,000 | Aggressive= 130,000
Month 3: Conservative= 115,763 | Expected= 152,088 | Aggressive= 219,700
Month 6: Conservative= 134,010 | Expected= 231,306 | Aggressive= 482,681
Month 9: Conservative= 155,133 | Expected= 351,788 | Aggressive= 1,060,449
Month 12: Conservative= 179,586 | Expected= 535,025 | Aggressive= 2,329,809
Key insight:
- Conservative: You stay in the same tier for 12 months
- Expected: You need a tier upgrade in month 6-8
- Aggressive: You need a provider migration in month 8-10
Cost impact of each scenario
Scenario | Month 1 | Month 6 | Month 12 | Change trigger
--------------|----------|----------|-----------|--------------------
Conservative | $250/mo | $280/mo | $320/mo | None
Expected | $250/mo | $400/mo | $800/mo | Upgrade tier month 6
Aggressive | $250/mo | $700/mo | $2,500/mo | Migrate month 8
Trade-offs you must make explicit with your team
Trade-off 1: Simplicity vs Control
SIMPLICITY ◄──────────────────────► CONTROL
Pinecone ████████░░ ░░░░░░░░████ Milvus self-hosted
Weaviate Cloud ███████░░░ ░░░░░░░████░ Qdrant self-hosted
Qdrant Cloud ██████░░░░ ░░░░░████░░ Weaviate self-hosted
░░░████░░░░ ChromaDB self-hosted
Questions for your team:
- Do we have dedicated DevOps or do the devs do everything?
- How many hours/month are we willing to invest in operations?
- Do we need to customize the index configuration?
Trade-off 2: Direct cost vs Operational cost
| Decision | Low direct cost | Low operational cost |
|---|---|---|
| Self-hosted | ✅ $20-180/mo | ❌ $600-1,400/mo in hours |
| Managed | ❌ $80-800/mo | ✅ $120-200/mo in hours |
| Key question | How much is 1 hour of your team worth? |
If your team charges >$40/hr, managed almost always wins.
Trade-off 3: Time-to-market vs Customization
Weeks to production:
ChromaDB self-hosted: ████████████████ 4-6 weeks
Qdrant self-hosted: ████████████ 3-4 weeks
Weaviate Cloud: ████████ 2-3 weeks
Qdrant Cloud: ████████ 2-3 weeks
Pinecone: ████ 1-2 weeks
Cost of each week of delay:
weekly_burn_rate = 15_000 # USD for a 5-person startup
weeks_saved_managed = 3 # fewer weeks vs self-hosted
value_of_speed = weeks_saved_managed * weekly_burn_rate
print(f"Value of going managed: ${value_of_speed:,} in saved burn rate")
# Value of going managed: $45,000 in saved burn rate
Trade-off 4: Vendor lock-in vs Speed
| Lock-in level | Provider | Estimated migration cost |
|---|---|---|
| Low | ChromaDB, Qdrant (open-source) | $2,000-5,000 |
| Medium | Weaviate Cloud | $5,000-10,000 |
| High | Pinecone (proprietary) | $7,000-15,000 |
Lock-in mitigation:
# Abstraction pattern to reduce lock-in
from abc import ABC, abstractmethod
from typing import List, Dict, Any
class VectorStore(ABC):
"""Abstract interface that decouples your code from the provider."""
@abstractmethod
def add(self, documents: List[str], embeddings: List[List[float]],
metadata: List[Dict[str, Any]]) -> List[str]:
pass
@abstractmethod
def query(self, embedding: List[float], top_k: int = 10,
filters: Dict[str, Any] = None) -> List[Dict]:
pass
@abstractmethod
def delete(self, ids: List[str]) -> None:
pass
class ChromaStore(VectorStore):
def __init__(self, collection_name: str):
import chromadb
self.client = chromadb.Client()
self.collection = self.client.get_or_create_collection(collection_name)
def add(self, documents, embeddings, metadata):
ids = [f"doc_{i}" for i in range(len(documents))]
self.collection.add(
documents=documents, embeddings=embeddings,
metadatas=metadata, ids=ids
)
return ids
def query(self, embedding, top_k=10, filters=None):
results = self.collection.query(
query_embeddings=[embedding], n_results=top_k,
where=filters
)
return results
def delete(self, ids):
self.collection.delete(ids=ids)
# Migrating to Pinecone = implement PineconeStore(VectorStore)
# Your application code does NOT change
Cost troubleshooting
1. "Self-hosted comes out cheaper on paper"
Symptom: The spreadsheet shows that self-hosted costs $50/mo vs $200/mo managed.
Diagnosis: You're only counting direct infrastructure. You're missing:
- Operation hours: 10-14h/month × the team's rate
- Incident risk: 2-4 per quarter
- Opportunity cost: undelivered features
Solution: Recalculate with the complete TCO formula. If your team charges >$40/hr, managed almost always wins in real TCO.
2. "Managed looks super expensive at first"
Symptom: $200/mo for Pinecone when you could have a $12 droplet.
Diagnosis: You're comparing service price vs infra price, not TCO vs TCO.
Solution: Calculate how many engineering hours you save. If you save 10h/month at $60/hr, managed "saves" you $400/mo net.
3. "I don't have traffic history to project"
Symptom: You don't know if you'll have 10K or 1M vectors in 6 months.
Solution: Project by ranges with three scenarios (conservative, expected, aggressive). Choose the provider that works for all three scenarios, or define an explicit migration trigger.
4. "Prices changed since I calculated"
Symptom: You chose a provider 6 months ago, the pricing changed.
Solution: Schedule a TCO review every quarter. Managed providers change prices frequently. Keep your spreadsheet updated and compare against alternatives every 3-6 months.
5. "The free tier is enough today but I don't know until when"
Symptom: You're on Pinecone Free with 80K vectors. The limit is 100K.
Solution: Calculate the estimated date you'll hit the limit at your growth rate. Have the budget ready for the next tier BEFORE hitting the limit.
current_vectors = 80_000
limit = 100_000
monthly_growth_rate = 0.15 # 15% monthly
import math
months_until_limit = math.log(limit / current_vectors) / math.log(1 + monthly_growth_rate)
print(f"Months until the limit: {months_until_limit:.1f}")
# Months until the limit: 1.6
Practical exercises
Exercise 1: Calculate your real TCO
Build a 6-month TCO table comparing two options for your Decision Tree project:
| Item | Option A: _______ | Option B: _______ |
|---|---|---|
| Infra/Service (×6) | $ | $ |
| Operations (hrs × rate × 6) | $ | $ |
| Embeddings (once) | $ | $ |
| Egress (×6) | $ | $ |
| Estimated risk (×6) | $ | $ |
| 6-month TCO | $ | $ |
Final question: Which option minimizes total risk for your current stage?
Example solution
For a project with 50K vectors, a team of 2 junior devs ($30/hr):
| Item | ChromaDB Self (DO) | Qdrant Cloud |
|---|---|---|
| Infra/Service (×6) | $144 ($24×6) | $198 ($33×6) |
| Operations (8h × $30 × 6) | $1,440 | $360 (2h × $30 × 6) |
| Embeddings | $1 | $1 |
| Egress (×6) | $3 | $3 |
| Risk (×6) | $300 | $60 |
| 6-month TCO | $1,888 | $622 |
Qdrant Cloud wins 3x in real TCO, even though the direct infra is more expensive.
Exercise 2: Growth projection
Your product has 30K vectors today and grows 20% monthly. Calculate:
- In which month do you reach 100K vectors?
- In which month do you reach 500K vectors?
- How much will month 12 cost vs month 1?
Solution
import math
current = 30_000
growth = 0.20
# 1. When do you reach 100K?
months_100k = math.log(100_000 / current) / math.log(1.20)
print(f"100K vectors in month: {months_100k:.1f}") # Month 6.6
# 2. When do you reach 500K?
months_500k = math.log(500_000 / current) / math.log(1.20)
print(f"500K vectors in month: {months_500k:.1f}") # Month 15.4
# 3. Vectors in month 12
vectors_month_12 = current * (1.20 ** 12)
print(f"Vectors month 12: {vectors_month_12:,.0f}") # 267,483
# Month 1 cost (Qdrant Cloud, 30K vectors): ~$33/mo
# Month 12 cost (Qdrant Cloud, 267K vectors): ~$100/mo
The cost grows sublinearly compared to the vectors because managed tiers have economies of scale.
Exercise 3: Break-even managed vs self-hosted
At what hourly rate for your team does managed become worth it over self-hosted?
Data:
- Self-hosted: $50/mo infra + 12h/mo operations
- Managed: $200/mo service + 2h/mo operations
Solution
# TCO self-hosted = 50 + 12 × rate
# TCO managed = 200 + 2 × rate
# Break-even: 50 + 12r = 200 + 2r
# 10r = 150
# r = $15/hr
rate_breakeven = (200 - 50) / (12 - 2)
print(f"Break-even at ${rate_breakeven:.0f}/hr")
# If your team charges > $15/hr → managed wins
# Most engineers charge $30-150/hr
# Conclusion: managed almost always wins
Exercise 4: Migration simulator
Your startup chose ChromaDB self-hosted 8 months ago. Now it has 500K vectors and the team spends 16h/mo on operations. Is it worth migrating to managed?
Solution
# Current cost (ChromaDB self-hosted, 500K vectors)
current_infra = 60 # AWS t3.large
current_ops = 16 * 80 # 16h × $80/hr mid-senior
current_risk = 400 # estimated
current_monthly = current_infra + current_ops + current_risk
# $1,740/mo
# Post-migration cost (Qdrant Cloud)
new_service = 150 # tier for 500K
new_ops = 2 * 80 # 2h × $80/hr
new_risk = 50
new_monthly = new_service + new_ops + new_risk
# $360/mo
# Migration cost (one-time)
migration_cost = 7_000 # engineering + downtime + re-embedding
# Monthly savings
monthly_savings = current_monthly - new_monthly
# $1,380/mo
# Payback period
payback = migration_cost / monthly_savings
print(f"Migration payback: {payback:.1f} months")
# Migration payback: 5.1 months
# Year 1 savings (discounting migration)
year_1_savings = (monthly_savings * 12) - migration_cost
print(f"Year 1 savings: ${year_1_savings:,.0f}")
# Year 1 savings: $9,560
Yes, it's worth migrating. The payback is ~5 months.
Exercise 5: Sensitivity analysis
How does your decision change if your team's rate is $30/hr vs $100/hr vs $150/hr?
Solution
| Rate/hr | Self-hosted TCO/mo | Managed TCO/mo | Difference | Winner |
|---|---|---|---|---|
| $30/hr | $50 + 12×$30 = $410 | $200 + 2×$30 = $260 | -$150 | Managed |
| $60/hr | $50 + 12×$60 = $770 | $200 + 2×$60 = $320 | -$450 | Managed |
| $100/hr | $50 + 12×$100 = $1,250 | $200 + 2×$100 = $400 | -$850 | Managed |
| $150/hr | $50 + 12×$150 = $1,850 | $200 + 2×$150 = $500 | -$1,350 | Managed |
At any reasonable rate (>$15/hr), managed wins. The difference amplifies with more expensive engineers.
Connection with the project: Decision Tree
In your final Decision Tree project, include a cost analysis section that applies these concepts:
- Calculate the TCO for the 2-3 finalist options from your decision matrix
- Project 12 months out with three growth scenarios
- Identify the migration trigger: at what volume or monthly cost will you re-evaluate?
- Document the hidden costs you identified for your specific case
Summary
- The list price is not the real cost. TCO includes infrastructure, operations, risk, and opportunity.
- The operational cost dominates in most cases. Engineering hours > service price.
- Managed wins in TCO for teams where an engineer's hour costs >$15/hr.
- Self-hosted wins only when you have dedicated DevOps AND need fine control of the index.
- Free tiers are excellent for PoC (10K-100K vectors), but plan the jump to the paid tier.
- Always project three scenarios: conservative, expected, and aggressive.
- The migration cost is real: $5,000-15,000, so choose well from the start.
- Review your TCO every quarter. Managed prices change, your scale grows.
Additional resources
- AWS Pricing Calculator — Official estimator for AWS infrastructure costs
- GCP Pricing Calculator — Official Google Cloud estimator
- Pinecone Pricing — Pinecone's current pricing and calculator
- Qdrant Cloud Pricing — Qdrant managed tiers and prices
- Weaviate Pricing — Weaviate Cloud pricing
- OpenAI Embeddings Pricing — Embedding generation costs
- FinOps Foundation — Framework for cloud cost management
- ANN Benchmarks — Performance benchmarks for sizing infrastructure
Estimated time: 25-35 minutes
Next: 06-when-to-choose-each-option.md