【问题标题】:What would be the most optimized way to store really large number of rows in SQL Server?在 SQL Server 中存储大量行的最优化方法是什么?
【发布时间】:2021-12-06 15:20:45
【问题描述】:

我有这个用例:

3 个表:CustomersUsersContacts。 每个客户可能有大约 10.000 个用户。

每个用户将有大约 15,000 个联系人。 我想为每个用户在 Contacts 表中存储他们的 15.000 个联系人。但是,只有一个客户,这使我达到了 1.5 亿行。如果我有 100 个客户怎么办?

我知道分区表可能会有所帮助,但有更好的选择吗? 存储这些数据量并使其在之后可用(选择、插入要优化的查询)的最佳解决方案是什么。

谢谢!

【问题讨论】:

  • 是什么让你相信这是大量的行?
  • 1.5 亿行应该不是问题吗?
  • 150M 行不是大量行。分区可能是管理大量数据的最简单方法——它对应用程序完全透明。如果您的客户实际上是租户,则沿 CustomerId 进行分区实际上会将单个客户的数据保存在一起。 A better option根据什么标准比较好?
  • 这确实是一个数据库管理问题,最好在dba.stackexchange.com 提出,但在您提出这个问题之前,您还应该了解更多细节,因为它无法以您提出的一般方式回答。您需要的具体信息包括估计的总大小、可用配置、预算、预期使用情况、性能目标等。
  • @DougCoats,这是给 1 位客户的。如果我有 100 个呢?这使我达到了 15 亿行。这绝对是个问题。

标签: sql sql-server optimization query-optimization sql-optimization


【解决方案1】:

您提到的行数不需要任何特殊的表格设计。

为了保持良好的性能,请避免使用 TEXT、LONGTEXT 等大对象列数据类型,除非您绝对需要它们。而是使用 NVARCHAR(255) 或在您的应用程序中最有意义的任何内容。

您的表需要正确的索引才能获得最佳性能。要查找这些索引,一旦您用至少一些数据填充了表,就可以使用 SSMS:在 SSMS 中运行查询之前,右键单击查询面板并选择显示实际执行计划。然后运行查询。 SSMS 有时会在执行计划的顶部为查询建议一个索引。

如果不知道您最常用的查询是什么,就不可能猜出正确的索引。有一件事是肯定的:在很多列上添加单列索引可能没有帮助。

随着 SQL 应用程序(如您的应用程序)的增长和添加用户,表也会增长。而且,表在增长时需要新索引是很常见的。为生产中的应用程序添加或更改索引是完全正常的。以 100K 行重新访问您的索引,然后以 100 万行、1000 万行等再次访问。

【讨论】:

  • 感谢您的回答。所以,如果我有 100 个客户,那么我的行数就是 1.5B。那还可以吗?知道我的表只有 4 列:Id、CustomerId (int)、UserId (int)、ContactId (int)、Status (Int)。我还是觉得应该分区。
  • 是的,1.5 gigarows 完全在 SQL Server 的能力范围内。在这个阶段保持简单。从应用上线到拥有100家企业级客户,每家拥有1万用户,是一条漫长而曲折的道路。我来之不易的经验告诉我,你还无法想象那些企业客户的实际使用模式。我强烈建议您将时间和金钱花在使您的应用程序非常有用上,而不是尝试构建您不需要的功能。严重地。另外,除非您的查询模式与您的分区方案完全匹配,否则分区会减慢速度。
  • 感谢您的反馈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多