在sql 2005中对大表进行分页

问题描述 投票:0回答:6

我有一个包含 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

有谁知道如何让它运行得更快。

c# sql-server pagination
6个回答
2
投票

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

让前端更加努力。

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

设置行计数@maximumRows

从 edd_business_listings_05282009 中选择 *,其中 RecordID > @startRowID ORDER BY RecordID

设置行数0


1
投票

尝试在 SQL 2005 中使用 ROW_NUMBER:https://web.archive.org/web/20210512232142/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

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

1
投票

最佳解决方案很大程度上取决于

1.数据变化的频率

2.存储过程被调用的频率以及用户通常会访问多深的页面以及

3.您在最新订单中可以接受多少延迟(如果有)。

通常在网站后端,您的用户只使用前几个页面,但谷歌机器人可以猛烈攻击您的深层页面,从而猛烈攻击您的CPU。通常,只支持一定程度的实时排序(例如,对前几百或几千行使用 row_number() ),然后切换到在一定时间间隔(可能每小时)刷新的非规范化排序列表。


0
投票

尝试在 RecordId 列上放置索引。 我认为正在发生的事情是在行计数到位之前进行整个表扫描,以便 Sql 可以对所有内容进行排序。 如果您已经有了索引,那么问题就出在其他地方。 我对记录数量是两倍的表执行了相同的查询,但执行时间从未超过 2 秒。

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


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 中显示数百万条记录(甚至分页)有什么用?您可以尝试限制记录数量并最初只查询一个子集...

© www.soinside.com 2019 - 2024. All rights reserved.