当数据量改变一切
另有 19 种语言版本
English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Українська · Español (México) · Français (Canada) · Deutsch (Schweiz)

第 1 个模块,共 4 个,属于 Data Architect 课程第 7 章为规模而设计,也是第 2 部分的开始。每个模块都可以单独阅读。 下一篇:热点:所有权、父记录和查找倾斜
**本模块回答的问题:**数据增长时,什么会坏,什么时候坏?
A design can be perfectly reasonable at 70,000 records and completely wrong at 70 million. That’s one of the things that makes data architecture difficult. The object is the same. The fields are the same. The relationships are the same. The business requirement may even be the same. But add a few zeros and the architecture changes. ⟲
这里我们从看转向设计。在第 1 部分,我们学会了看清业务、数据模型、企业全景、治理和权威。现在我们要给这个架构加上重量。我问的第一个问题是:它会长到多大?
Built for Transactions
Section titled “Built for Transactions”Salesforce runs some of the largest CRM implementations in the world, and its core database handles “upwards of 1.1 trillion transactions per month.” Salesforce’s own architects describe that database as “optimized for high-performance transactional workloads on structured data” (The Salesforce Platform: Transformed for Tomorrow (在新标签页中打开)). It’s built for that: transactional work on structured data. And every record comes with a lot of built-in capabilities and functionality that are part of the core Salesforce platform: the object model, sharing and security, pages, reports, automation, search. All of it runs on a multitenant database, where Salesforce writes the SQL, not you. ⟲
I once taught this class at Dreamforce to a room with a lot of database administrators from Oracle and SQL Server, and of course they were asking, “Why doesn’t Salesforce act this way? Why doesn’t Salesforce do this?” By the end they were smiling, because they’d understood why. Chapter 3 described Salesforce as a multitenant, metadata-driven platform: the apartment building. We’re not tuning our own dedicated database. Salesforce’s storage, indexing, sharing, locking, query optimization and resource protections are designed for many tenants at once. That’s not bad; it’s why we get so much capability without running database infrastructure. But it means the architect needs to understand the platform’s shape. ⟲
Salesforce says it plainly in its own guide: as data sets get larger, “the time required for certain operations grows,” and the architect’s choices change that time “by several orders of magnitude” (Best Practices for Deployments with Large Data Volumes (在新标签页中打开)). That’s not a weakness. It’s the design. At small volumes you can sometimes ignore the platform’s shape. At large volumes, it reminds you it’s there, and we’ll see that very clearly with selectivity and indexes in the next chapter. That’s why the architect has to know how big this gets. ⟲
The same guide ends with the other half of the story. Salesforce is “a robust environment in which native and custom applications can scale to large volumes of data very quickly while continuing to perform well,” and it names the two ways you get there: make queries selective, and reduce the amount of active data. Millions of records can perform well on Salesforce. They perform well because somebody designed for them. That’s what this part of the course is about. ⟲
我的大数据量刻度尺
Section titled “我的大数据量刻度尺 ”When I’m teaching large data volumes, I use a rough ruler. It’s not a Salesforce limit. The numbers are general figures discussed in the community, and Salesforce itself calls a large data volume “an imprecise, elastic term”: tens of thousands of users, tens of millions of records, or hundreds of gigabytes of storage (Best Practices for Deployments with Large Data Volumes (在新标签页中打开)). And when I say records, I mean records in a single object, not across all your objects. ⟲
Like every number in this course, the ruler has a date on it. More on that in a moment. ⟲
At about 1 million records in an object, there’s just a little bit of drag as dashboards and reports show up. Not a lot, depending on how you filter. Around 10 million, there’s some effect, but it’s still performing. Heading toward 50 million, you start to notice it: list views taking two, three, four seconds, reports and dashboards taking time. Past 50 million, I like to say you’re driving a convertible with your head out the window, and your hair is blown back. Don’t stick your head out the window: past 50 million you’ve got to be streamlined, and you’ve got to know what you’re doing. And once we’re talking about 100 million records or more, I start asking a different question: should these records be here at all? I’ve heard of people running a hundred million or more in an object. But if you’re at 50 million today, you’re going to 100, 150, 200 million in the years ahead. If you’re not archiving today, when will you? If somebody tells me they have 150 million records in an object and almost nobody ever looks at the old ones, that’s not an operational object any more. That’s an audit log. ⟲
刻度尺从 100 万开始并非偶然。正如下一章所示,平台自身的查询计算在“前 100 万条记录”处也会变化。不过,具体数字不是重点。重点是:数据量会改变设计。
Every zero changes what you notice. A rule of thumb, not a limit. ⟲
The Platform Keeps Growing
Section titled “The Platform Keeps Growing”Salesforce ships three releases a year. Over time the platform grows, some limits are raised, and systems get faster. So I don’t want you to treat any number in this course as if it were permanent, including mine. Salesforce keeps every release’s edition of its guides online, which means we can do something useful: put ten years side by side. Here’s Winter ‘16, from late 2015, next to Winter ‘27, from 2026. ⟲
| Winter ‘16 (2015) | Winter ‘27 (2026) | |
|---|---|---|
| Big objects | Didn’t exist yet | “Consistent performance, whether you have 1 million records, 100 million, or even 1 billion” |
| Skinny table columns | 100 | 200 |
| Index selectivity thresholds | Capped at 1 million records (standard) and 333,333 (custom) | No published cap, and the optimizer can add an index on its own |
| Minimum data storage | 1 GB per org, or 20 MB per user | 10 GB per org, plus storage per user |
| Bulk API batches a day | 5,000 | 15,000 |
| Parent-to-child levels in one SOQL query | 1 | 5 |
| Apex heap per transaction | 6 MB (12 MB asynchronous) | 10 MB (25 MB asynchronous) |
That’s the upward direction: limits raised, caps removed, new kinds of storage, and an optimizer that now “recognizes that an index can improve performance for frequently run queries” and adds one (Working with Very Large SOQL Queries (在新标签页中打开)). ⟲
Now look at what didn’t move in those ten years. The definition of a large data volume is word for word the same: “tens of thousands of users, tens of millions of records, or hundreds of gigabytes.” The advice to avoid having any user own more than 10,000 records is the same. And an Apex transaction still gets 100 SOQL queries, 50,000 records and 10 seconds of CPU (Execution Governors and Limits (在新标签页中打开)). Those are the house rules of the apartment building, the guardrails that keep one tenant from hurting the others, and they’ve barely moved. ⟲
Salesforce is open about the pace, too. It ships three releases a year, each with a new API version, and it commits to “supporting each API version for a minimum of 3 years from the date of first release,” with at least a year’s notice before support for a version ends (SOAP API End-of-Life Policy (在新标签页中打开)). In practice versions live much longer: as I write this, version 41.0, from Winter ‘18, is still supported. If you’re new, you don’t need the history. But it does change decisions. The org you inherit was designed under older limits, and some of its workarounds may not be needed any more. The integration you build today is pinned to an API version with a clock on it. And study material written a few releases ago may still teach yesterday’s numbers. ⟲
So when you read a number in this course, read the date next to it. The specific limits will keep changing, mostly upward, and Salesforce will keep pivoting. The thinking won’t: know your Number of Zeros, keep the active data small, make your queries selective, and check the current edition of the guide before you commit to a number. That’s why I teach the ruler as a ruler, not a law. For now, it’s a good place to start. ⟲
The sources, both editions: Best Practices for Deployments with Large Data Volumes, Winter ‘16 (在新标签页中打开) (archived copy (在新标签页中打开)) and Winter ‘27 (在新标签页中打开) (archived copy (在新标签页中打开)); Salesforce Limits Quick Reference Guide, Winter ‘16 (在新标签页中打开) (archived copy (在新标签页中打开)), and Salesforce Developer Limits and Allocations Quick Reference, Winter ‘27 (在新标签页中打开) (archived copy (在新标签页中打开)); Data and File Storage Allocations (在新标签页中打开) (10 GB “starting in late March 2019”); Execution Governors and Limits (在新标签页中打开), Winter ‘27. ⟲
别问它今天有多大
Section titled “别问它今天有多大 ”One of the easiest mistakes is sizing an architecture from today’s data. Steve Trucking has about 1 million deliveries a year. If I only ask “can Salesforce handle one million deliveries?”, I’m asking the wrong question. Steve Trucking expects about 30% annual growth: 1.0 million in year one, 1.3 in year two, 1.69 in year three, about 2.2 in year four, about 2.86 in year five. That’s annual volume. If we keep all five years, we’re not designing for 2.86 million deliveries; we’re designing for roughly 9.04 million. And that’s before we ask how much history already exists. ⟲
所以我教 Steve 的“零的个数”(Steve’s Number of Zeros)。不要一开始就执着于虚假的精确。找到正确的数量级。一万、十万、一百万、一千万、一亿?每多一个零,架构都可能改变。
现在把子记录乘进去
Section titled “现在把子记录乘进去 ”The delivery isn’t the only record. Steve Trucking averages about 1.6 line items a delivery, so over five years that’s about 14.5 million work order line items. And there are around eight status changes a delivery: about 72.3 million status events. The requirement sounded like “track deliveries.” The architecture has to deal with tens of millions of related records. One million parents with eight children each is not a one-million-record problem. You have to follow the model. ⟲
还有我们没放进核心的数据
Section titled “还有我们没放进核心的数据 ”Checkpoint 1 also gave us four to five million photos a year, and FleetLink produces about 200,000 GPS readings a day: roughly 73 million a year before growth. That’s why we decided not to put every GPS reading, every photo or every status change into the Salesforce operational model. We hadn’t even started this chapter, and the Number of Zeros was already telling us something. It’s like telling the doctor, “It hurts when I raise my arm,” and the doctor says, “Then don’t raise your arm.” Sometimes the best way to solve a large-data-volume problem is don’t create it in the first place. ⟲
变慢的不只是查询
Section titled “变慢的不只是查询 ”When people hear large data volumes, they think “queries get slow.” Yes, and the next chapter is all about query and retrieval. But it’s bigger than that. As volume grows, I care about sharing calculations, ownership, record locking, parent-child relationships, list views, related lists, reports, search results, batch processing, integrations, data loads, deletes, archiving, backups and recovery. Even a harmless-looking decision gets expensive when it’s repeated millions of times. ⟲
That’s the lesson: what works today may fail tomorrow. Maybe nobody notices at 50,000 records, or at 500,000. Then growth pushes the object through several million, and an old design assumption becomes the bottleneck. The system didn’t randomly go bad. The architecture crossed the scale where that decision mattered. ⟲
干净的模型可能变成昂贵的模型
Section titled “干净的模型可能变成昂贵的模型 ”My starting position is still: design clean first, then back off when necessary. Understand the entities and relationships; don’t duplicate data because it’s convenient. But normalization is a principle, not a rule. If a report or operational query constantly has to walk several relationships across tens of millions of records to get one value, at some scale I may copy that value closer to where it’s used. That’s denormalization. ⟲
假设按合作伙伴统计工作订单行项目的报表总是需要零售合作伙伴(Retail Partner),而在干净的模型里它隔着两跳:行项目 → 工作订单 → 合作伙伴。数据量够大时,可能就有理由把合作伙伴标识符的一个受管控副本直接放到行项目上。这样我就制造了重复数据,也随之承担了责任。它怎么填充?会变吗?怎么保持准确?哪个副本是权威的?这些都是真实的成本,而为了获得业务需要的性能,我有时会接受受控的重复。**朝着规范化去设计,然后在数据量给你理由时有意识地退一步。**不要因为更容易构建就反规范化;要因为你能说清楚收益和你接受的成本才反规范化。
不要把核心 CRM 变成你的数据仓库
Section titled “不要把核心 CRM 变成你的数据仓库 ”我还看到另一个数据量错误。业务想要报表,于是不断往运营 CRM 里加历史数据,加了又加,直到理由变成“报表要用”。这时我会问:我们是不是把运营系统变成了分析系统?这是两种不同的工作负载。Steve Trucking 需要 Salesforce 来运转今天的配送:客服需要今天的状态,调度需要今天的路线,合作伙伴需要今天的进度。一位按地区、合作伙伴、卡车、天气、配送小组和配送时段比较五年配送表现、并和财务数据交叉分析的分析师,承担的是分析工作负载。Salesforce 可以对运营数据做报表。这不意味着每一个历史分析问题都属于运营存储。Steve Trucking 已经有 Snowflake 了。所以要问:**哪些问题必须由运营系统回答,哪些属于分析平台?**第 3 部分会深入讲数据仓库。
报表快照也不是数据仓库策略。拍平的报表对象、快照记录、为方便报表而复制的值:有时是正当的。它们也可能是推迟架构问题的一种方式。如果我为了能对已有的几百万条记录做报表,又创建了几百万条记录,我想知道这在哪里结束。不要因为没人愿意谈数据仓库,就不断制造运营记录。
数据量是有形状的
Section titled “数据量是有形状的 ”两个系统可能各有 2,000 万条记录,行为却非常不同。一个是 2,000 万条历史记录,几乎从不更新,通常按已知 ID 逐条读取,共享也不复杂。另一个是 2,000 万条活动记录,不断更新,所有权复杂,报表多,用户多,父子扎堆严重,集成频繁。这不是同一个问题。所以只看记录数不够。它增长多快?多久变一次?怎么被查询、共享、关联?要保持活动多久?一次会进来或变化多少?删除时会发生什么?“Salesforce 能处理 2,000 万条记录”不是答案。有意思的问题是:做什么的 2,000 万条记录?
AI 会增加更多的零
Section titled “AI 会增加更多的零 ”Agents can create data very quickly: interactions, tasks, summaries, recommendations, logs, intermediate results, events, audit information. Maybe that’s useful. But AI doesn’t make storage free, or sharing calculations, or indexing, and it certainly doesn’t make useless history valuable. If an agent creates ten records where a human process used to create one, our volume assumptions may be wrong before the business itself grows. I’m not yet seeing agents generate more records in the orgs I work with, but it’s the natural progression of more and more data being tracked. ⟲
**考试之外:AI 改变了什么。**AI 可以大幅提高系统创建和检索数据的速度。要明确地对智能体产生的数据量建模,而不是假设人工交易的历史速度能预测未来的数据量。
Steve Trucking:架构已经在变了
Section titled “Steve Trucking:架构已经在变了 ”At the end of Part 1 we made several decisions that are now reinforcing each other. The work order is central. The current status lives in the org, and the history of every status change is published to the warehouse, Snowflake. Photos live outside the core. Raw GPS stays with FleetLink. At five years of 30% growth, we’re approaching 9 million work orders, 14.5 million line items and 72.3 million status events, and hundreds of millions of GPS readings if we’d copied them all. ⟲
Was keeping raw GPS out of the operational model just an integration decision? No; it was a scale decision too. Was putting photos off-core just a storage decision? No; scale again. And the status history? It has real business value, so we keep it. But at 72.3 million events, keeping it outside the operational database is the difference between an org that carries its history and an org that’s buried by it. The question that remains for what we do keep in core: how long should those records stay active? That’s module 4. ⟲
Follow the model, and the zeros multiply. ⟲
架构师在这里决定什么
Section titled “架构师在这里决定什么 ”- 今天的“零的个数”是什么样,包括预期增长和整个保留期,而不只是今天的数据量行不行。
- 哪些干净的结构保持规范化,哪些地方数据量足以支持受控的反规范化。
- 哪些数据留在 Salesforce 的运营核心,哪些属于专门的存储、分析平台或其他系统。
- 一个报表需求是真正的运营需求,还是业务需要分析架构的信号。
- 像智能体这样的新生产者,如何在它们的记录变成明天的问题之前改变数据量假设。
Large data volume architecture isn’t about being afraid of big numbers. Salesforce runs very large implementations. One million records isn’t automatically a problem; neither is ten million or a hundred million. But every zero should make me ask another question: how will we find them, who owns them, how are they shared, what are they related to, how often do they change, how long do we need them, and where should they live? In Part 1 we learned to recognize the right entities and relationships. Now we make sure those bones can carry the weight, because what works today may fail tomorrow. ⟲
- Salesforce Help, Data and File Storage Allocations (在新标签页中打开): 10 GB of data storage since late March 2019, checked 2026-11-01. ⟲
- Salesforce, Best Practices for Deployments with Large Data Volumes, Winter ‘27 edition (在新标签页中打开) (release 264, archived copy (在新标签页中打开)), checked 2026-10-20. ⟲
- Salesforce Developers, Best Practices for Deployments with Large Data Volumes (在新标签页中打开), Winter ‘27, checked 2026-11-01. ⟲
- Salesforce Architects, The Salesforce Platform: Transformed for Tomorrow (在新标签页中打开), checked 2026-11-01. ⟲
- Salesforce, Best Practices for Deployments with Large Data Volumes, Winter ‘16 edition (在新标签页中打开) (archived copy (在新标签页中打开)) (release 198), checked 2026-10-20. ⟲
- Salesforce, Developer Limits and Allocations Quick Reference, Winter ‘16 edition (在新标签页中打开) (archived copy (在新标签页中打开)) and Winter ‘27 edition (在新标签页中打开) (archived copy (在新标签页中打开)), checked 2026-10-20. ⟲
- Salesforce Developers, SOAP API End-of-Life Policy (在新标签页中打开), checked 2026-11-01. ⟲
- Salesforce Developers, Execution Governors and Limits (在新标签页中打开), Apex Developer Guide, Winter ‘27, checked 2026-11-01. ⟲
- Salesforce Developers, Working with Very Large SOQL Queries (在新标签页中打开), Apex Developer Guide, Winter ‘27, checked 2026-11-01. ⟲
- SteveTechArc, Salesforce Documents by Release: the guides cited here, once a year from Winter ‘16 to today, each with an archived copy. ⟲
- Steve Trucking 的简介,第 4 节(数据量)。
