作为DB规范化过程的一部分,分离一半表列的最快查询



我使用SQL Server 2012。我有一个巨大的表(30Gb)和一台相当基本的PC来处理这么多数据。我在这个表中有一列(让我们把它命名为COL1),对于它,每很多列只有一个唯一的值。我想从将这些重复的数据移动到单独的表开始,在那里只存储唯一的值。现在的问题是如何以最快的方式做到这一点。通过COL1为每个列分组选择不同值的计数花了我大约5个小时,现在我知道哪些列需要从表中移开,但不想再等6-8个小时。我对COL1有一个非聚集索引,对记录id有一个主键,请告诉我您的解决方案是否可以更好地使用创建的其他一些索引。

表有5000万行和约100列。大约40列包含许多公司的时间序列数据,大约60列包含每个公司的描述性数据,这些数据是重复的。COL1是公司的唯一id。因此,我想将时间序列数据与公司描述数据分开,这样公司描述将在一个单独的表中,每个公司将有一行。数据集中大约有22000个独特的公司ID。大多数公司描述列都是varchar。

我找不到为每个COL1值取TOP1元素的方法。我想其他选项需要更长的时间才能执行。

我能想到的查询示例:

select distinct tbl.COL1, tbl.add1, tbl.add2, other columns with duplicates...
into newtable
from tbl
select COL1, min(add1), min(add2), min of other columns with duplicates...
into newtable
from tbl
group by COL1

谢谢!

在Col1上创建一个聚集索引-如果您没有clusterd索引,那么您的表就是一个堆,每个查询都将涉及一个表扫描。对要返回的行创建覆盖索引。选择DISTINCT(不包括col1)应该会产生您想要的结果。仅按首选排序顺序插入到具有聚集索引的表中。

假设你的数据是不变的,你可以循环WHILE并插入你取值在N*1000和(N+1)*1000-1 之间的地方

添加任何有助于返回数据的进一步索引

最新更新