0

在 winform 上,在数据网格中,我显示了从数据库中选择的大约 100k 行。显示所有这些记录需要很长时间。有没有办法让选择查询更快或者加载前 200 条记录。然后如果用户单击下一步按钮,将显示接下来的 200 条记录。这可能吗?我知道 mysql 有 LIMIT,但我需要为 sql-server 2008 工作。

4

4 回答 4

1

有一个方法,但它并不漂亮。如果您使用的是实体框架,则可以编写 LINQ 对结果进行分页,例如:

var books= context.Books.OrderBy(b => b.Title).Skip(300).Take(100);

如果您在其上使用 SQL Profiler,生成的 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
于 2012-05-16T16:03:33.530 回答
1

Stored Proc

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

除了上面的Stored Proc之外,您还可以实现Indexes快速搜索,或者您可以使用它SQL Profiler来检查执行时间延迟的原因。

于 2012-05-16T16:05:34.683 回答
0

有几种方法可以做到这一点,通常使用 CTE 或嵌套查询和row_number(). 请参阅例如 如何在 SQL Server 2008 中进行分页

在 SQL 2012 中,现在终于可以在单个查询中执行此操作,即OFFSET xxx ROWS FETCH NEXT XXX ROWS ONLY- 请参阅SQL Server 中的行偏移量

于 2012-05-16T15:56:09.543 回答
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 

现在将页码和页面大小传递给存储过程,如下所示:

Exec PagingSample @PageNumber = 3, @PageSize = 100

你会得到记录 201 到 300

于 2012-05-17T06:19:08.970 回答