C# 分页SQL查询
在winform的datagrid中,我显示了从DB中选择的大约100k行。显示所有这些记录需要很多时间。有没有办法使select查询更快,或者加载前200条记录。然后,如果用户单击“下一步”按钮,将显示接下来的200条记录。这可能吗?我知道mysql有限制,但我需要一些东西来为sql server 2008工作。有几种方法可以做到这一点,通常使用CTE或嵌套查询和C# 分页SQL查询,c#,winforms,sql-server-2008,C#,Winforms,Sql Server 2008,在winform的datagrid中,我显示了从DB中选择的大约100k行。显示所有这些记录需要很多时间。有没有办法使select查询更快,或者加载前200条记录。然后,如果用户单击“下一步”按钮,将显示接下来的200条记录。这可能吗?我知道mysql有限制,但我需要一些东西来为sql server 2008工作。有几种方法可以做到这一点,通常使用CTE或嵌套查询和行号()。 见例。 在SQL 2012中,现在终于可以在单个查询中实现这一点,即偏移量xxx行仅获取下一个xxx行-请参见有一个方
行号()。
见例。
在SQL 2012中,现在终于可以在单个查询中实现这一点,即偏移量xxx行仅获取下一个xxx行
-请参见有一个方法可以实现它,但它并不漂亮。如果您使用的是实体框架,则可以编写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
存储过程
除了上述存储过程外,您还可以实现索引
以加快搜索速度,或者使用SQL Profiler检查执行时间延迟的原因。您可以使用带有行数排序功能的通用表表达式。以下是一个例子:
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
您将获得201到300条记录顺便说一句,我在很多方面都喜欢这种技术-了解Microsoft如何在其框架中使用SQL Profiler for SQL或用于托管代码的反汇编程序来实现这一点,您可能已经找到了最有效的方法,因为他们已经花了很多时间从他们的流程中挤出每一盎司的效率。你可能的重复也应该投票给最能回答你问题的答案。这将有助于搜索相同问题的用户
Test 1, 3
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