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

时间:2012-11-22 13:53:57

标签: sql sql-server sql-server-2012

我使用SQL Server 2012.我有一个巨大的表(30Gb)和一个非常基本的PC用于这个数据量。我在这个表中有一个列(我们将它命名为COL1),每个列只有一个唯一值。我想首先将这些重复数据移动到单独的表中,其中只存储唯一值。现在的问题是如何以最快的方式做到这一点。为COL1的每个列分组选择不同值的计数花了我大约5个小时,现在我知道需要将哪些列从表中移开,但是不想再等待6-8个小时来完成。我在COL1上有一个非聚集索引,在记录ID上有一个主键,请告诉我你的解决方案是否能更好地与其他一些索引一起使用。

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

我找不到一种方法来为每个COL1值获取TOP 1元素。我想其他选项需要更长的时间来执行。

我能想到的查询示例:

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

假设您的数据是非变量的,那么您可以循环WHILE并插入N * 1000和(N + 1)* 1000 -1之间的值

添加任何有助于返回数据的其他索引