在winform上,在数据网格中,我显示从数据库中选择的大约10万行。显示所有这些记录需要花费大量时间。有没有办法使选择查询更快或可能加载前200条记录。然后,如果用户单击下一个按钮,将显示接下来的200条记录。这可能吗?我知道mysql有LIMIT,但我需要为sql-server 2008工作。
答案 0 :(得分:1)
有一种方法,但它并不漂亮。如果您正在使用Entity Framework,则可以编写LINQ以对结果进行分页,例如:
var books= context.Books.OrderBy(b => b.Title).Skip(300).Take(100);
如果您在其上抛出一个SQL事件探查器,生成的SQL将类似于以下内容,您可以将其用作构建自己语句的指南:
SELECT TOP (200)
[Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title]
FROM
(
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title],
row_number() OVER (ORDER BY [Extent1].[Title] ASC) AS [row_number]
FROM [dbo].[Books] AS [Extent1]
) AS [Extent1]
WHERE
[Extent1].[row_number] > 100
ORDER BY
[Extent1].[Title] ASC
答案 1 :(得分:1)
存储过程
Alter Proc Test
@PageNumber int,
@PageSize int
as
create table #t
(
id int
)
insert into #t(id)values(1)
insert into #t(id)values(2)
insert into #t(id)values(3)
insert into #t(id)values(4)
insert into #t(id)values(5)
insert into #t(id)values(6)
insert into #t(id)values(7)
insert into #t(id)values(8)
insert into #t(id)values(9)
insert into #t(id)values(10)
declare @StartIndex int
declare @EndIndex int
declare @PageSizeIndex int
Set @StartIndex = ((@PageNumber - 1) * @PageSize) + 1
Set @EndIndex = @PageNumber * @PageSize
Select RowID, ID From
(
Select ROW_NUMBER() Over(Order by id) as RowID, ID From #t
)K
Where K.RowID >= @StartIndex and k.RowID <= @EndIndex
Drop table #t
Test 1, 3
除了上述存储过程之外,您可以实现Indexes
以快速进行搜索,或者您可以使用 SQL事件探查器 来检查延迟原因在执行时间。
答案 2 :(得分:0)
有几种方法可以做到这一点,通常使用CTE或嵌套查询和row_number()
。
参见例如
How to do pagination in SQL Server 2008
在SQL 2012中,现在可以在单个查询中执行此操作,即OFFSET xxx ROWS FETCH NEXT XXX ROWS ONLY
- 请参阅Row Offset in SQL Server
答案 3 :(得分:0)
您可以使用带有Row_Number排名功能的公用表表达式。这是一个例子:
CREATE PROCEDURE PagingSample
@PageNumber int,
@PageSize int
AS
WITH Results AS (
SELECT
ROW_NUMBER() OVER(ORDER BY MR.MRN ASC) As RowNumber,
MR.MRN
FROM
dbo.SomeTable MR WITH (NOLOCK)
)
SELECT
R.RowNumber,
R.MRN
FROM
Results R
WHERE
RowNumber > (@PageNumber * @PageSize) - @PageSize
AND RowNumber < (@PageNumber * @PageSize) + 1
现在将页码和页面大小传递给sproc,如下所示:
Exec PagingSample @PageNumber = 3, @PageSize = 100
您将获得201到300的记录