我正在使用我的查询获取大约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...
答案 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)