使用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不是连续的数字。
答案 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并显示的行数给我的用户我有多少页。