最快的SQL 2005选择ASP .NET表分页查询?

时间:2009-06-02 14:04:40

标签: sql-server-2005

使用SQL 2005,从4.200.000到4.200.050选择一系列行的最快方法是什么?假设我有1000万行。

在我自己的项目中,我使用以下方法,但我不确定这是否是最佳实践

select * from
(
    select 
        Column1, Column2, Column3
        RowNumber = row_number() over (order by ID asc) 
    from 
        tblLogs
    where
        Column4 = @Column4 and Column5 = @Column5
    ) as tempTable
where tempTable.RowNumber >= @StartIndex and tempTable.RowNumber <= @EndIndex

根据上面的代码,我很想说 tempTable 将是一个包含所有ID的列的大表。

有什么更快的吗?

不要考虑使用ID列进行一些变通办法,这不起作用,我从该表中删除行,所以我的ID不是连续的数字。

4 个答案:

答案 0 :(得分:2)

SQLServerCentral上的这篇文章很棒:
SQL Server 2005 Paging – The Holy Grail

答案 1 :(得分:1)

我注意到你有很多行,在Column4上添加索引,如果还没有添加,Column5会大大提高性能。

我发现以下文章很有趣:Ranking Functions and Performance in SQL Server 2005

如果可能的话,我会让你弄清楚如何根据文章改进它。我自己测试了他们的解决方案并且有效。

如果您在ASP.NET中期待分页,我还发现Scott Mitchell的以下文章非常有趣:Custom Paging in ASP.NET 2.0 with SQL Server 2005

它在我的代码中使用了他们的方法,它工作得很好。以下是TSQL代码示例:

    SELECT ROWNUM, COLUMN1, COLUMN2, COLUMN3
    FROM (
    SELECT COLUMN1, COLUMN2, COLUMN3,
    ROW_NUMBER() OVER(ORDER BY ID) AS ROWNUM
            FROM TABLE1
    WHERE COLUMN4 = @X AND COLUMN5 = @Y
    ) AS TABLE2
WHERE ROWNUM BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1

我建议阅读4guysfromrolla的文章以获取更多信息。

祝你好运

答案 2 :(得分:0)

如果你是分页,你可以传入第一个和;当前页面的最后一个键,并限制派生的“临时表”,使其返回更少的行,从而更快。

答案 3 :(得分:0)

确定。这是我对这个问题的最终想法。

对于大项目,对于包含1000万行或更多行的表,我将使用这种方法:

  select * from
  (
        select 
        myTable.*, 
        RowNumber = row_number() over (order by myTable.ID asc) 
    from 
        myTable
        where
                myCondition
  ) as tempTable
  where tempTable.RowNumber >= @StartIndex and tempTable.RowNumber <= @EndIndex
  • 对于ASP .NET分页我将使用下面的SELECT,对于前100,000行,10.000页,10行/页,非常快,但从页面10.000到无穷大,查询将工作得越来越慢,要慢得多。没有人会想要浏览页面10.001 !!

  • 为了从上面的SELECT中计算满足myCondition的页数和行数,我将创建一个只有一行和一列的特殊TABLE,在此列中我将存储的数量为行。 每次我在myTable中添加,修改或删除一行时,我都会根据myCondition通过添加或减少值为1来更新此冒号。这样做的目的是快速选择满足myCondition并显示的行数给我的用户我有多少页。