【发布时间】:2019-09-27 02:52:21
【问题描述】:
我有一个包含 40 亿多行和 50 列的大表,其中大部分是 datetime 或 numeric,除了少数是 varchar。
数据将每周插入到表中(大约 2000 万行)。
我希望在某些 datetime 列和几个 varchar 列上使用 where 子句进行查询。表中没有主键。
没有索引,表也没有分区。我正在使用 SQL Server 2016。
我知道我需要对表进行分区或索引,但实际上我不确定采用哪种方法或两者兼而有之。
既然表很大,是先创建索引还是先创建分区?如果我确实创建了索引然后创建了分区,我应该如何维护这些以每周都有新数据。
编辑:此外,预计表上的更新和删除最少
【问题讨论】:
-
分区和索引是出于非常不同的目的。索引更常见,我会首先查看需要快速的查询并创建索引来支持它们。
-
感谢@VladimirBaranov。大多数查询将在 datetime 列和一些 varchar 列上进行过滤。例如,获取某个实体的某个日期范围的数据。使用索引,由于新的插入,它将被大量碎片化,并且重建/重组索引也会消耗大量时间。我可以做到,但再次不确定哪种方法。
-
There are no indexes,这是个大问题。查询性能取决于索引。没有它们,服务器必须扫描整个 4B 行。分区是一种数据管理特性,不是一种性能特性。如果要按日期搜索,请索引日期列。 -
另一种选择是创建clustered columnstore index,在压缩数据的同时有效地索引所有列。由于压缩、内存处理和列存储,列存储可以为数据仓库/星型模式场景提供 100 倍的加速。
-
@siddharth 这个表是干什么用的?是事实表吗?它是如何在没有索引的情况下增长到 4B 行的?如果您描述实际的用例/问题,您可能会得到更好的答案。
标签: sql-server indexing sql-server-2016 partitioning