2

15 列と 650 万レコードのテーブルがあります。ページングを使用して、C# 側からこのテーブルにアクセスする必要があります。SP を作成しましたが、データの取得に約 1.30 分かかります。これが私のストアドプロシージャです-

Create Proc demo
(
@startRowIndex int,
@maximumRows int
)
AS

DECLARE @first_id int, @startRow int

SET @startRowIndex =  (@startRowIndex - 1)  * @maximumRows

IF @startRowIndex = 0 
SET @startRowIndex = 1

SET ROWCOUNT @startRowIndex

SELECT @first_id = RecordID FROM edd_business_listings_05282009 ORDER BY RecordID

PRINT @first_id

SET ROWCOUNT @maximumRows

SELECT * FROM edd_business_listings_05282009 WHERE 
RecordID >= @first_id 
ORDER BY RecordID

SET ROWCOUNT 0

これをより速く実行する方法を知っている人はいますか。

4

6 に答える 6

2

アプリケーションは最後の RecordID を送信できますか?

フロントエンドの作業をより難しくします。

Proc デモの作成 ( @startRowID int、@maximumRows int ) AS

SET ROWCOUNT @maximumRows

SELECT * FROM edd_business_listings_05282009 WHERE RecordID > @startRowID ORDER BY RecordID

SET ROWCOUNT 0

于 2009-06-09T23:31:01.863 に答える
1

SQL 2005でROW_NUMBERを使用してみてください:http ://www.4guysfromrolla.com/webtech/010406-1.shtml

このような手順は次のように役立ちます。

CREATE PROCEDURE dbo.GetListingPaged
(
    @StartRowIndex int,
    @MaximumRows int
)
AS
    SELECT
        RecordID,
        Field2 -- Not *
    FROM
    (
    SELECT
        RecordID,
        Field2 -- Not *
        ROW_NUMBER() OVER (ORDER BY RecordID) AS RowRank
    FROM edd_business_listings_05282009
    ) AS ListingWithRowNumbers
    WHERE
        RowRank > @StartRowIndex
    AND
        RowRank <= (@StartRowIndex + @MaximumRows)

GO
于 2009-06-09T23:43:20.467 に答える
1

OK、確かに、これも私の推測です:

Create Proc demo ( @startRowIndex int, @maximumRows int ) AS
DECLARE @first_id int, @startRow int
SET @startRowIndex = (@startRowIndex - 1) * @maximumRows

IF @startRowIndex = 0 SET @startRowIndex = 1

SELECT TOP (@maximuRows)
 {'all columns except N'}
 FROM (
    Select *, ROW_NUMBER() Over(Order by RecordID) as N
     from edd_business_listings_05282009
    ) As t
 WHERE N >= @startRowIndex
 ORDER BY RecordID
于 2009-06-09T23:44:41.790 に答える
1

最善の解決策は、

1.データが変更される頻度

2. sproc が呼び出される頻度と、ユーザーが通常どのくらいの深さでページと

3.最新の注文で許容できる待ち時間(ある場合)。

多くの場合、Web サイトのバックエンドでは、ユーザーは最初の数ページしか使用しませんが、Google ボットは深いページを非難し、CPU を非難する可能性があります。通常、このライブ順序付けを特定の時点までのみサポートし (たとえば、最初の数百行または数千行に row_number() を使用)、その後、一定の間隔 (おそらく 1 時間ごと) で更新される順序付けの非正規化リストに切り替えます。

于 2009-06-10T00:23:49.543 に答える
0

RecordId列にインデックスを付けてみてください。私が起こっていると思うのは、行数が設定される前にテーブル全体のスキャンを実行して、SQLがすべてを注文できるようにすることです。すでにインデックスを持っている場合は、他の何かが問題になります。レコード数が2倍のテーブルでこれと同じクエリを実行しましたが、実行時間が2秒を超えることはありませんでした。

ROWCOUNTまたはRow_Number()を使用すると、技術的には同じことをパフォーマンス的に達成できますが、Row_Number()を使用します。これは、これを行うためのより新しい方法であり、行数の設定には、Row_Number()よりもはるかに複雑な方法があります。入る。

于 2009-06-09T23:40:24.137 に答える
0

SQL Server 2005 を使用している場合は、試すことができます

SELECT  field1, field2, fieldN
FROM     (SELECT ROW_NUMBER() OVER (ORDER BY RecordID) AS Row,
             field1, field2, fieldN FROM edd_business_listings_05282009)
            AS ListingsWithRowNumbers
WHERE  Row >= @startRowIndex AND Row <= @startRowIndex + @maximumRows

とにかく、このアーキテクチャを再考してみてください。UI で何百万ものレコード (ページ化されている場合も含む) を表示するのは何の用途ですか? レコードの数を制限して、最初にサブセットのみをクエリすることもできます...

于 2009-06-09T23:33:26.587 に答える