sid*_*rth 5 sql-server indexing partitioning sql-server-2016
我有一张由40亿+行和50列组成的大表,其中大多数是datetime或numeric除少数几个以外varchar。
数据将每周(约2000万行)插入表中。
我期望在某些datetime列以及几个列上使用where子句进行查询varchar。表中没有主键。
没有索引,也不对表进行分区。我正在使用SQL Server 2016。
我知道我需要对表进行分区或建立索引,但是我不确定采用哪种方法或实际上两种方法都可以。
由于表很大,我应该首先创建索引还是应该首先创建分区?如果我确实创建了索引然后又创建了分区,那么我应该怎么做以每周提供新数据来维护这些索引。
编辑:此外,表上的最小更新和删除预计
我知道我需要对表进行分区或索引
您需要了解从分区中获得什么。SQL Server 需要对大表进行分区才能充分发挥作用,这完全不是情况。SQL Server 可扩展到任意表大小,没有任何固有问题。
分区的常见好处是:
有时在特殊情况下(例如列存储),分区可以帮助作为加速查询的策略。通常,索引对此更好。
本质上,分区将表物理拆分为多个子表。大多数情况下,这会对查询计划产生负面影响。索引完全有能力限制需要接触的数据集。分区更糟。
大多数查询将过滤日期时间列和某些 varchar 列。例如,获取某个实体的某个日期范围的数据。对于索引,由于新插入和重建/重新组织索引也将消耗大量时间,因此会产生很多碎片。我可以做到,但又不确定哪种方法。
看来你最好通过索引来解决这个问题:
由于表很大,我应该先创建索引还是应该先创建分区?
首先设置分区对象。然后,在新的分区方案上创建或重建聚集索引。如果可能,首先删除其他索引,然后重新创建它们(由于可用性限制,可能无法正常工作)。
我应该怎么做才能用每周出现的新数据来维护这些。
你有什么顾虑?新数据将自动存储在适当的分区中。确保在加载数据之前创建新分区。提前 2 周准备好分区。最新的分区必须始终为空,以避免代价高昂的拆分。
表中没有主键。
大多数情况下,这不是一个好的设计。大多数表应该有一个主键和一个聚集索引。如果没有自然键,请使用人工键,例如bigint identity.
你绝对可以应用分区,但我的感觉是它不会让你得到你所期望的。但它会迫使您承担额外的维护负担,可能会降低性能,并且存在犯下威胁可用性的错误的风险。简单很重要。
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |