在sql 2005中通过大表进行分页

时间:2009-06-09 23:22:05

标签: c# sql-server paging

我有一个包含15列和650万条记录的表。 我需要在分页的帮助下从C#端访问此表。我写了一个SP但是需要大约1.30分钟来检索数据。 这是我的存储过程 -

Create Proc demo
(
@startRowIndex int,
@maximumRows int
)
AS

DECLARE @first_id int, @startRow int

SET @startRowIndex =  (@startRowIndex - 1)  * @maximumRows

IF @startRowIndex = 0 
SET @startRowIndex = 1

SET ROWCOUNT @startRowIndex

SELECT @first_id = RecordID FROM edd_business_listings_05282009 ORDER BY RecordID

PRINT @first_id

SET ROWCOUNT @maximumRows

SELECT * FROM edd_business_listings_05282009 WHERE 
RecordID >= @first_id 
ORDER BY RecordID

SET ROWCOUNT 0

有没有人知道让这种运行更快的方法。

6 个答案:

答案 0 :(得分:2)

你的应用程序可以发送最后一个RecordID吗?

让前端更加努力。

创建Proc演示(@startRowID int,@ maximumRows int)AS

SET ROWCOUNT @maximumRows

SELECT * FROM edd_business_listings_05282009 WHERE RecordID> @startRowID ORDER BY RecordID

SET ROWCOUNT 0

答案 1 :(得分:1)

尝试在SQL 2005中使用ROW_NUMBER:http://www.4guysfromrolla.com/webtech/010406-1.shtml

这样的程序会有所帮助:

CREATE PROCEDURE dbo.GetListingPaged
(
    @StartRowIndex int,
    @MaximumRows int
)
AS
    SELECT
        RecordID,
        Field2 -- Not *
    FROM
    (
    SELECT
        RecordID,
        Field2 -- Not *
        ROW_NUMBER() OVER (ORDER BY RecordID) AS RowRank
    FROM edd_business_listings_05282009
    ) AS ListingWithRowNumbers
    WHERE
        RowRank > @StartRowIndex
    AND
        RowRank <= (@StartRowIndex + @MaximumRows)

GO

答案 2 :(得分:1)

好的,当然,这也是我的猜测:

Create Proc demo ( @startRowIndex int, @maximumRows int ) AS
DECLARE @first_id int, @startRow int
SET @startRowIndex = (@startRowIndex - 1) * @maximumRows

IF @startRowIndex = 0 SET @startRowIndex = 1

SELECT TOP (@maximuRows)
 {'all columns except N'}
 FROM (
    Select *, ROW_NUMBER() Over(Order by RecordID) as N
     from edd_business_listings_05282009
    ) As t
 WHERE N >= @startRowIndex
 ORDER BY RecordID

答案 3 :(得分:1)

最佳解决方案将严重依赖

1.数据经常变化

2.通常情况下,调用sproc以及用户典型页面的深度和

3.在订购是最新的时候,您可以接受多少延迟(如果有的话)。

通常在网站后端,您的用户只会使用前几页,但谷歌机器人可以抨击您的深层页面,因此抨击您的CPU。支持这种实时排序通常只能达到某一点(例如,对前几百或几千行使用row_number())然后切换到在某个时间间隔(可能是每小时)刷新的非规范化排序列表。 / p>

答案 4 :(得分:0)

如果您使用SQL Server 2005,则可以尝试

SELECT  field1, field2, fieldN
FROM     (SELECT ROW_NUMBER() OVER (ORDER BY RecordID) AS Row,
             field1, field2, fieldN FROM edd_business_listings_05282009)
            AS ListingsWithRowNumbers
WHERE  Row >= @startRowIndex AND Row <= @startRowIndex + @maximumRows

但无论如何,试着重新思考这个架构。在UI中显示数百万条记录(甚至是分页)有什么用?您可以尝试限制记录数量,并且最初仅查询子集...

答案 5 :(得分:0)

尝试在RecordId列上放置一个索引。我认为正在发生的是你在rowcount到位之前进行整个表扫描所以Sql可以命令一切。如果你已经有一个索引而不是其他问题。我已经对记录数量为两倍的表进行了相同的查询,我的执行时间从未超过2秒。

使用ROWCOUNT或Row_Number()在技术上应该在性能方面完成同样的事情,但我会使用Row_Number(),因为它是一种更现代的方式,并且设置rowcount比Row_Number()更复杂不会进入。