SQL Server 中非常大的表

2023-11-22

我们有一个非常大的表(> 77M 记录并且还在不断增长)在 SQL Server 2005 64 位标准版上运行,并且我们发现了一些性能问题。每天添加多达十万条记录。

有谁知道SQL Server标准版可以处理的记录数量是否有限制?应该考虑转向企业版还是有一些我们可以使用的技巧?

附加信息:

所讨论的表非常扁平(14 列),有一个包含 6 个字段的聚集索引,还有两个针对单个字段的索引。

我们使用一个问题查询中的选择中的 3 个字段添加了第四个索引,并且在估计性能方面没有看到任何差异(该查询是必须在非工作时间运行的流程的一部分,因此我们没有指标然而)。这些字段是聚集索引的一部分。


同意上面 Marc 和 Unkown 的观点...聚集索引中的 6 个索引太多了,尤其是在只有 14 列的表上。你不应该超过 3 或 4 个,如果是的话,我会说 1 或可能 2。你可能知道聚集索引是磁盘上的实际表,所以当插入一条记录时,数据库引擎必须对其进行排序并将其放在磁盘上已排序的组织位置中。非聚集索引则不然,它们支持查找“表”。我的 VLDB 根据下面的第一点布置在磁盘上(聚集索引)。

  1. 将聚集索引减少到 1 或 2。最好的字段选择是 IDENTITY (INT)(如果有)、日期字段(其中的字段将添加到数据库)或其他一些自然排序的字段。您的数据如何添加到数据库中。关键是您试图将这些数据保留在表的底部......或者将其以您将读取记录的最佳方式(90%+)放置在磁盘上。这样就不会发生重组,或者只需要一次点击即可将数据放在正确的位置以实现最佳读取。请务必将删除的字段放入非聚集索引中,这样就不会失去查找功效。我从来没有在 VLDB 上放置超过 4 个字段。如果您有经常更新的字段并且它们包含在聚集索引中,哎呀,这将重新组织磁盘上的记录并导致代价高昂的碎片。
  2. 检查索引上的填充因子。填充因子数字 (100) 越大,数据页和索引页就越满。关于您拥有的记录数以及要插入的记录数,您将更改非聚集索引的填充因子#(+或-),以在插入记录时留出填充空间。如果将聚集索引更改为顺序数据字段,那么这对于聚集索引来说就不那么重要了。根据经验(IMO),高写入的填充因子为 60-70,中等写入的填充因子为 70-90,高读取/低写入的填充因子为 90-100。将填充因子降低到 70 意味着页面上每 100 条记录写入 70 条记录,这将为新记录或重组记录留下 30 条记录的可用空间。占用更多空间,但它肯定比每晚必须进行碎片整理(参见下面的 4)
  3. 确保统计信息存在于表中。如果你想使用“sp_createstats 'indexonly'”扫描数据库来创建统计信息,那么SQL Server将在引擎累积的所有索引上创建所有统计信息作为需要统计信息。但不要忽略“indexonly”属性,否则您将为每个字段添加统计信息,这样就不好了。
  4. 使用 DBCC SHOWCONTIG 检查表/索引,以查看哪些索引碎片最多。我不会在这里详细介绍,只需知道您需要这样做即可。然后根据该信息,根据索引正在经历的变化以及变化的速度(随着时间的推移)向上或向下更改填充因子。
  5. 设置一个作业计划,对各个索引执行联机 (DBCC INDEXDEFRAG) 或脱机 (DBCC DBREINDEX) 操作以对其进行碎片整理。警告:如果不在维护期间,请勿在这么大的表上执行 DBCC DBREINDEX,因为它会导致应用程序崩溃……尤其是在聚集索引上。你已被警告过。测试并测试这部分。
  6. 使用执行计划查看存在哪些 SCANS 和 FAT PIPES 并调整索引,然后整理碎片并重写存储过程以消除这些热点。如果您在执行计划中看到红色对象,那是因为该字段没有统计信息。那很糟。这一步更像是“艺术而不是科学”。
  7. 在非高峰时间,运行 UPDATE STATISTICS WITH FULLSCAN 为查询引擎提供尽可能多的有关数据分布的信息。否则,在工作日晚上或更频繁地在表上执行标准 UPDATE STATISTICS(使用标准 10% 扫描),只要您认为符合您的观察结果,即可确保引擎拥有有关数据分布的更多信息,以便高效地检索数据。

抱歉,这篇文章太长了,但这非常重要。我在这里只向您提供最少的信息,但会有很大帮助。这些要点所使用的策略涉及一些直觉和观察,需要您的时间和测试。

无需转到企业版。我这样做是为了获得前面提到的分区功能。但我特别是为了拥有更好的多线程功能,包括搜索、在线碎片整理和维护……在企业版中,它对 VLDB 来说更好、更友好。标准版也不处理对在线数据库执行 DBCC INDEXDEFRAG。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 中非常大的表 的相关文章

随机推荐

  • C# 4.0 中的方法重载与可选参数[重复]

    这个问题在这里已经有答案了 哪一个更好 乍一看 可选参数似乎更好 更少的代码 更少的 XML 文档等 但为什么大多数 MSDN 库类使用重载而不是可选参数 当您选择使用可选参数 或重载 时 有什么特别需要注意的事情吗 C 4 0 中 可选参
  • 在 Javascript 中以 50 个小块执行 100K Promise

    我有一个函数可以对服务进行 REST 调用并返回一个承诺 让我们调用该函数 Execute 该函数采用 ID 并将 ID 作为 GET 参数发送到 REST 端点 该端点将 ID 与一些附加信息一起保存在 mongoDB 数据库中 在客户端
  • ggplot 图例不适用于scale_colour_manual

    我知道之前已经有人问过同样的问题 ggplot 图例 scale colour manual 不起作用 但问题涉及的数据集比我这里的数据集稍微复杂 答案建议重组数据 然后使用重组数据 但即使使用下面的简单数据 问题仍然存在 我无法解决它 因
  • 将图像从 FileReader 传递到 Angular 6 中的表单输入

    我尝试创建一个用户界面 其中有一个带有几个文本字段的表单 一个input type file and a div您可以将图像与表单的其余部分一起上传 我的目标 逻辑 使用相同的div放置图像或单击它并打开文件夹资源管理器 例如input t
  • EF Code First,将两个导航属性映射到同一对象类型

    如果我有一个User具有以下属性的类 public Guid UserPreferenceId get set public virtual DefaultUserPreference UserPreference get set publ
  • Android 静态 Application.getInstance()

    你能帮我解决这个情况吗 我们正在使用一个类的静态实例 该类扩展了 android 中的 Application public class MyClass extends Application public static MyClass g
  • 成员名称和构造函数参数名称之间的冲突[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的成员与方法参数访问 我有一个班级 有一些成员 比如x y width and height 在它的构造函数中 我不会这样做 A A int x int y int width int heig
  • 如何在单独的文件夹中添加资源?

    当我尝试通过单击 添加现有项目 在资源设计器中添加资源时 该项目被放置在 资源 文件夹中 问题是 如果我在资源目录中创建一个新目录并将资源放在那里 我会收到编译器错误 无法找到文件 我无法将所有资源放在一个文件夹中 因为我必须添加 2500
  • C# 中的 Struct.Pack 等效吗?

    我正在构建一个连接到渲染应用程序的 C 客户端 但失败了 我通过剖析一个适用于这一行的Python客户端来缩小问题范围 def Startclient Click self sender e try s socket socket sock
  • Linux 中的 Java - root 和非 root 的不同外观类

    我注意到 Java 为 root 和非 root 用户提供了不同的外观类 我试图了解如何使 LAF 保持一致 此外 即使在用户 root 内也是不一致的 取决于用户 root 的登录方式 示例代码 编译并打包在laf jar import
  • 使用decimal.ToString("C") 和 CultureInfo 自定义货币符号和小数位

    我有一个问题decimal ToString C 覆盖 基本上我想做的是如下 CultureInfo usCulture new CultureInfo en US Thread CurrentThread CurrentCulture u
  • 远程远程端点 RDFLib / Redland 上的 SPARQL 查询

    我正在尝试查询远程端点并获取 owl sameAs 映射 我尝试了 RDFLib 和 Redland 但都不适合我 可能我没有正确处理名称空间 这是我在 RDFLib 中的尝试 import rdflib rdflib plugin reg
  • 静态方法中的 findViewById

    我有这个静态方法 public static void displayLevelUp int level Context context LayoutInflater inflater LayoutInflater context getS
  • 非阻塞文件读取

    如何以非阻塞模式读取二进制或文本文件的内容 对于二进制文件 当我open filename mode rb 我得到一个实例io BufferedReader 文档堡垒io BufferedReader read says 读取并返回 siz
  • 理解“finally”块

    我编写了七个测试用例来理解finally堵塞 背后的逻辑是什么finally works package core public class Test public static void main String args new Test
  • Zend 框架:元属性集成

    我正在尝试根据页面内容将一些元 采用以下格式 添加到页面的头部 使用headMeta gt appendName像这样 this gt view gt headMeta gt appendName og title some content
  • Huggingface 转换器模型返回字符串而不是 logits

    我正在尝试从 Huggingface 网站运行这个示例 https huggingface co transformers task summary html 模型似乎返回两个字符串而不是 logits 这会导致 torch argmax
  • 如何更新cosmos db中的子文档

    我是 Cosmos Db 的新手 想了解如何删除 更新插入文档集合中的子文档 如果我有一个文件 Id 1234 Name foo Items Id abcd Age 35 Claims Name email Value email prot
  • 使用 ftplib 连接到 FTP TLS 1.2 服务器

    我尝试连接到仅支持 TLS 1 2 的 FTP 服务器 使用Python 3 4 1 My Code import ftplib import ssl ftps ftplib FTP TLS ftps ssl version ssl PRO
  • SQL Server 中非常大的表

    我们有一个非常大的表 gt 77M 记录并且还在不断增长 在 SQL Server 2005 64 位标准版上运行 并且我们发现了一些性能问题 每天添加多达十万条记录 有谁知道SQL Server标准版可以处理的记录数量是否有限制 应该考虑