0

WinFormのデータグリッドでは、DBから選択された約10万行を表示しています。これらすべてのレコードを表示するには、かなりの時間がかかります。選択クエリを高速化する方法、または最初の200レコードをロードする方法はありますか。そして、ユーザーが[次へ]ボタンをクリックすると、次の200レコードが表示されます。これは可能ですか?mysqlに制限があることは知っていますが、sql-server2008で機能するものが必要です。

4

4 に答える 4

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

上記のストアドプロシージャに加えて、検索を高速化するために実装したり、実行時間の遅延の理由を確認するためにIndexes使用したりできます。SQL Profiler

于 2012-05-16T16:05:34.683 に答える
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
于 2012-05-16T16:03:33.530 に答える
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を取得します

于 2012-05-17T06:19:08.970 に答える
0

これを行うにはいくつかの方法がありますが、通常は CTE またはネストされたクエリとrow_number(). たとえば 、SQL Server 2008 でページネーションを行う方法を参照してください。

SQL 2012 では、これを 1 つのクエリで実行できるようになりました。つまり、SQL Server の行オフセットをOFFSET xxx ROWS FETCH NEXT XXX ROWS ONLY参照してください。

于 2012-05-16T15:56:09.543 に答える