3

我正在使用我的查询获取大约 500 万行(包含 10-15 列)的巨大结果集。没有 ID 列,甚至无法创建(不是我的错),所以我什至无法根据 ID 对数据进行分区,然后分段加载。更糟糕的是,这是 SQL Server 2000,因此大多数方便的 SQL 编码功能甚至可能不适用于该数据库。有什么办法我可以做类似的事情 -

Select top 10000 column_list from myTable
then, select next top 10000 column_list from myTable (ie 10001 to 20000)
and so on...
4

1 回答 1

2

如果您有一个有用的索引,您可以通过跟踪基于索引的值一次抓取 10000 行。

假设有用的索引是 LastName + FirstName

Select top 10000 column_list from MyTable 
order by LastName, FirstName

然后当你得到接下来的 10000 行时,使用查询

Select top 10000 column_list from MyTable 
where LastName >= PreviousLastname && FirstName > PreviousFirstname
order by LastName, FirstName

上面的伪代码假设组合没有重复,如果你可以有重复,最简单的方法是添加另一列(即使没有索引),这使得它是唯一的。您将需要 order by 子句中的第三列。

PreviousLastname 是上一个查询的 10,000 条记录中的值。

添加

在这种情况下,一个有用的索引是任何具有高基数的索引——主要是不同的值或至多是最少数量的非不同值。一个非常无用的索引可能是性别(M/F/null)

由于您将其用于数据加载,因此索引选择并不重要(忽略性能考虑),只要它具有高基数即可。请注意,index 和 order by 子句必须匹配,否则会给数据库带来沉重的负担。

修订——我看到附加数据 where 子句的明显错误

where LastName >= PreviousLastname && FirstName > PreviousFirstname

这应该是

where (LastName > PreviousLastname) 
   or (LastName = PreviousLastname && FirstName > PreviousFirstname) 
于 2013-11-12T19:21:49.573 回答