2009-06-09 7 views
2

私は15の列と6.5百万のレコードを持つテーブルを持っています。 ページングの助けを借りてC#側からこのテーブルにアクセスする必要があります。私はSPを書いたが、データを検索するのに約1.30分かかる。SQL 2005の大きなテーブルからのページング

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 

は、誰もが速く、この実行を作る方法を知ってい - は、ここに私のストアドプロシージャです。

+1

テーブル定義(CREATE TABLE、please)、キーとインデックスなしで推測するだけです。 – RBarryYoung

+0

すでにクラスター化されたインデックスであっても、RecordIDの非クラスター化インデックスは、SELECT @ first_id = RecordID ....を助けます。 –

+0

RecordIDがシーケンシャルなクラスター化インデックスより良い。 – jfar

答えて

2

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

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

PROCデモを作成します(@startRowID int型、@maximumRows int型)

ASのSET ROWCOUNTの@maximumRows edd_business_listings_05282009レコードID BYレコードID> @startRowID ORDER

のSET ROWCOUNT 0

FROM

SELECT *

+0

@jfar:SET ROWCOUNT @maximumRowsは、それが存在する場合、20のすべての後続の行を確実に戻します。いいえ? –

+0

右のSET ROWCOUNTはレコードの欠落の影響を受けません。 –

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に表示するのは何ですか?レコードの数を制限し、最初にサブセットのみを照会しようとする可能性があります。

+0

これは@startRowIndex> @maximumRowsのレコードの最初のページを過ぎても動作しません。 –

+0

oops。 が間違ったバージョンをコピーしました。 TOP句を削除します。 –

0

RecordId列に索引を入れてみてください。私が考えているのは、Sqlがすべてを注文できるように、rowcountが適所にある前にテーブル全体をスキャンすることです。すでに何か他のものよりも索引がある場合は問題です。レコードの数が2倍のテーブルでこの同じクエリを実行し、実行時間が2秒を超えることはありませんでした。

ROWCOUNTまたはRow_Number()を使用すると、技術的に同じ性能が得られるはずですが、Row_Number()を使用する方が現代的な方法であり、Row Countを設定するとRow_Number()よりもはるかに複雑です。私は入りません。

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 
+0

このアプローチでは、応答時間とページング深度を確認したいと思います。 –

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 
1

最適なソリューションをされます

1.頻繁にデータが変更されるSPROCが呼び出される2.howしばしば とどのように深いユーザーがtypicallするページと

3.howくらいのレイテンシー(もしあれば)あなたは順序が最新のもので受け入れることができます。

ウェブサイトのバックエンドでは、最初の数ページしか使用しない場合がありますが、Googleのボットは深いページを壊してCPUを壊す可能性があります。通常は、この生の順序付けを特定のポイントまでサポートすることができます(たとえば、最初の数百または千の行に対してrow_number()を使用)し、その後、ある時間間隔(おそらく時間単位)で更新される順序の非正規化リストに切り替えます。

関連する問題