如果我尝试一次性获取数据,我有数百万的数据。得到相同的东西需要很多时间。是否有可能将值分解为前100个值,然后我想看到101到200个值。我们可以在SQL中使用该选项来编写该查询吗?
答案 0 :(得分:0)
如果我理解正确,您似乎想要获取n行,这些行不一定在任何特定顺序的开头或结尾,而是在中间某处。这也是“寻呼”的基础 - 例如获取N行,然后接下来的N行,依此类推。你可以用CTE和ROW_NUMBER()
这样做:
DECLARE @Start INT = 101;
DECLARE @End INT = 200;
WITH cte AS
(
SELECT Column1, Column2, Column3, ROW_NUMBER() OVER(ORDER BY <some criteria>) AS RowNumber
FROM YourTable
)
SELECT Column1, Column2, Column3
FROM cte
WHERE RowNumber > @Start
AND RowNumber < @End
如果你想把它变成一个存储过程,你可以传入我在顶部声明的变量等等 - 显然你会传递1和100来获得前100行,101和200来获得下一个100等等(您可能需要调整底部的范围标准,具体取决于您是否希望在一个结束范围内具有独占/包含性)。
答案 1 :(得分:0)
这通常称为pagination
或paging
。正如Bridge在回答中指出的那样,你可以通过ROW_NUMBER()
实现这一点,但是还有其他各种机制。
我非常喜欢Remus Rusanu的keyset solution here,它建议它比基于行数的解决方案更快,因为“...因为他们(rowcount)总是要计算记录以定位自己,而不是直接寻找位置作为键集可以。“
我没有看到任何比较这两种机制的硬数据和快速数据,但也许您可以在解决方案中调查和报告;)