【问题标题】:SQL Server - Inserting new data worsens query performanceSQL Server - 插入新数据会降低查询性能
【发布时间】:2019-02-22 22:26:19
【问题描述】:

我们有一个 4-5TB 的 SQL Server 数据库。最大的表大约 800 GB,包含 1 亿行。 4-5 个其他可比较的表是这个大小的 1/3-2/3。我们经历了创建新索引以优化性能的过程。虽然性能确实有所提高,但我们发现新插入的数据查询速度最慢。

它是一个财务报告应用程序,带有在数据库之上运行的 BI 工具。尽管大部分数据是在早上 7 点之前加载的,但数据会在早上晚些时候继续加载。用户在早上 8 点左右开始通过 BI 工具查询数据,最关心的是最新的(每日)数据。

我想知道新插入的数据是否会导致索引乱序。有什么办法可以让我们在新插入的数据上获得比旧数据更好的性能。我希望我在这里已经很好地解释了这个问题。如果缺少任何信息,请告诉我。谢谢

编辑 1

让我稍微描述一下架构。 我有一个以 Date,id 作为聚集索引的基表(我们称之为 Base)。 它有大约 50 列 然后我们有 5 个派生表 (Derived1, Derived2,...) ,根据不同的度量类型,它们也有 Date,Id 作为聚集索引和基表上的外键约束。

Derived1 和 Derived2 表有 350 多列。 Derived3,4,5 大约有 100-200 列。由于 BI 工具的限制,创建了一个大视图来连接所有数据表。日期,ID 是所有表的连接列,以形成视图(因此我在这些列上创建了聚集索引)。主要关注的是关于 BI 工具的性能。 BI 工具总是使用视图并且通常会向服务器发送类似的查询。

在其他过滤列上还有其他索引。 主要问题仍然存在 - 如何防止性能恶化。 另外我想知道

  1. 如果 NCI 在 Date,ID 上,除了在 date,ID 上的聚集索引之外,所有表上的结果都会更好。
  2. 在派生表的 NCI 中包含 150 列是否有意义?

【问题讨论】:

    标签: sql-server indexing sql-server-2012 left-join batch-processing


    【解决方案1】:

    这是一个广泛的问题,尤其是在不了解您的系统的情况下。但是我会尝试的一件事是在完成加载数据后手动更新索引/表上的统计信息。对于这么大的表,您不太可能操纵足够多的行来触发自动更新。如果没有干净的统计数据,SQL Server 将无法获得准确的数据直方图。

    接下来,深入研究您的执行计划,看看哪些运算符的成本最高。

    【讨论】:

    • 感谢您的回复。我会尝试在加载数据后安排更新统计信息,看看它是如何工作的。
    【解决方案2】:

    您有大约 1 亿行,每天都在增加新部分,并且通常会选择这些新部分。我应该使用带有这些数字的分区索引而不是常规索引。 您在 sql server 中的解决方案是分区。看一下sql partitioning,看看能不能采纳。分区是一种集群形式,其中数据组共享一个物理块。例如,如果使用年和月,所有 2018-09 记录将共享相同的物理空间并且易于查找。因此,如果您使用这些过滤器(以及更多)选择记录,则该表的大小就像 2018-09 记录一样。这并不完全准确,但很像。注意分区的数据值 - 与每个值都是唯一的标准 PK 集群相反,分区列应该产生一组很好的不同的唯一组合,从而进行分区。

    如果您不能使用分区,您必须使用常规索引自己创建“分区”。这将需要一些实验。基本思想是数据(一个数字?),例如一波或一组导入数据。就像今天和下一个导入的数据一样,例如10 天将是第 1 波。接下来的 10 天将是“2”,依此类推。过滤最新的,例如10 波,您在最近 100 天的工作导入有效地跳过了所有其余数据。粗略地说,如果您将现有的 1 亿行划分为 100 个波并从第 101 波开始并搜索第 90 波或更大的波,那么如果 SQL 被正确放置以首先使用新索引(最终会这样做),那么您将有 1000 万行要搜索

    【讨论】:

    • 我在表和索引上实现了分区、压缩。我看到更新统计信息 FULLSCAN 的结果很好。但是,这需要每天进行。向您和@dfundako 提问 - 应该多久更新一次统计信息以及需要多长时间。长期运行的更新统计数据是否表明设计存在问题?
    • 通常在大量数据修改后。有几个指标可以帮助您自动决定是否这样做。实际上,您也可以增加到每两天一次,然后每三天一次等等,以查看实际性能如何下降。长时间更新统计信息与执行的数据和语句有关,而不是模式设计。 “坏”架构会间接影响统计可信度,因为优化器做出决策的统计可信度会降低,因为无论执行计划不同,许多语句都会延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 2011-09-15
    相关资源
    最近更新 更多