SQL Server中的分区或索引大表

sid*_*rth 5 sql-server indexing partitioning sql-server-2016

我有一张由40亿+行和50列组成的大表,其中大多数是datetimenumeric除少数几个以外varchar

数据将每周(约2000万行)插入表中。

我期望在某些datetime列以及几个列上使用where子句进行查询varchar。表中没有主键。

没有索引,也不对表进行分区。我正在使用SQL Server 2016。

我知道我需要对表进行分区或建立索引,但是我不确定采用哪种方法或实际上两种方法都可以。

由于表很大,我应该首先创建索引还是应该首先创建分区?如果我确实创建了索引然后又创建了分区,那么我应该怎么做以每周提供新数据来维护这些索引。

编辑:此外,表上的最小更新和删除预计

usr*_*usr 6

我知道我需要对表进行分区或索引

您需要了解从分区中获得什么。SQL Server 需要对大表进行分区才能充分发挥作用,这完全不是情况。SQL Server 可扩展到任意表大小,没有任何固有问题。

分区的常见好处是:

  1. 恒定时间内批量删除
  2. 旧分区的不同存储
  3. 不备份旧分区

有时在特殊情况下(例如列存储),分区可以帮助作为加速查询的策略。通常,索引对此更好。

本质上,分区将表物理拆分为多个子表。大多数情况下,这会对查询计划产生负面影响。索引完全有能力限制需要接触的数据集。分区更糟。

大多数查询将过滤日期时间列和某些 varchar 列。例如,获取某个实体的某个日期范围的数据。对于索引,由于新插入和重建/重新组织索引也将消耗大量时间,因此会产生很多碎片。我可以做到,但又不确定哪种方法。

看来你最好通过索引来解决这个问题:

  1. 根据您期望的查询建立索引。
  2. 正确维护索引。这并不太难。例如,在每周加载后重建它们。

由于表很大,我应该先创建索引还是应该先创建分区?

首先设置分区对象。然后,在新的分区方案上创建或重建聚集索引。如果可能,首先删除其他索引,然后重新创建它们(由于可用性限制,可能无法正常工作)。

我应该怎么做才能用每周出现的新数据来维护这些。

你有什么顾虑?新数据将自动存储在适当的分区中。确保在加载数据之前创建新分区。提前 2 周准备好分区。最新的分区必须始终为空,以避免代价高昂的拆分。

表中没有主键。

大多数情况下,这不是一个好的设计。大多数表应该有一个主键和一个聚集索引。如果没有自然键,请使用人工键,例如bigint identity.


你绝对可以应用分区,但我的感觉是它不会让你得到你所期望的。但它会迫使您承担额外的维护负担,可能会降低性能,并且存在犯下威胁可用性的错误的风险。简单很重要。