一次只获取部分结果集?

时间:2013-11-12 19:12:42

标签: sql sql-server sql-server-2000

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

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

1 个答案:

答案 0 :(得分: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子句中的第3列。

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

ADDED

此上下文中的有用索引是高基数的任何索引 - 主要是不同的值或最多非最小数量的非不同值。一个极其无用的索引就像性别(M / F / null)

由于您使用它进行数据加载,因此只要索引选择具有较高的基数,索引选择就不重要(忽略性能考虑因素)。请注意,index和order by子句必须匹配,否则将对数据库造成沉重负担。

修订 - 我看到附加数据where

的明显错误
where LastName >= PreviousLastname && FirstName > PreviousFirstname

这应该是

where (LastName > PreviousLastname) 
   or (LastName = PreviousLastname && FirstName > PreviousFirstname)