-1

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

表有 5000 万行和大约 100 列。大约 40 列包含许多公司的时间序列数据,大约 60 列包含每个公司的描述性数据,这些都是重复的。COL1 是公司的唯一标识。因此,我想将时间序列数据与公司描述数据分开,这样公司描述将在一个单独的表中,并且每个公司有 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

谢谢!

4

1 回答 1

0

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

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

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

于 2012-11-22T14:21:56.577 回答