2012-02-07 3 views
0

enter image description here私は6,00,000のレコードを持っていますが、グリッドに10レコードしか表示しません。私のストアドプロシージャが正常に動作しているとき、行番号が増加すると実行時間が増加する1〜10000 EG(500-510)の間にレコードをフェッチします。EGレコードをフェッチすると、1,00,000-1,00,010かかります実行する時間が増えましたSQLストアドプロシージャを実行するには時間がかかりますが、レコードを増やすには時間がかかります。

私はROW_NUMBER()を使用して番号行番号を取得し、データの取得に使用しました。私は6,00,000レコードを持っている

以下に示すよう

は、レコード

ストアドプロシージャは、SQLクエリをcreatsを得るために最適化された方法をお願いし、私は私が表示したいと彼らから10件のレコードを取得したいですグリッド内の10個のレコードのみが正常に動作しています.1〜10000 EG(500〜510)の間にレコードをフェッチした後、行数が増えると実行時間が長くなります。EGレコードをフェッチすると、1,00,000 -1000010実行に時間がかかります

ROW_NUMBER()を使用してください番号の行番号を取得し、データの取得に使用します。

SELECT FuelClaimId from 

    ( SELECT fc.FuelClaimId,ROW_NUMBER() OVER (order by fc.FuelClaimId) AS RowNum 
    from FuelClaims fc 

     INNER JOIN Vehicles v on fc.VehicleId =v.VehicleId  

     INNER JOIN Drivers d on d.DriverId =v.OfficialID 

     INNER JOIN Departments de on de.DepartmentId =d.DepartmentId 

     INNER JOIN Provinces p on de.ProvinceId =p.ProvinceId 

     INNER JOIN FuelRates f on f.FuelRateId =fc.FuelRateId 

     INNER JOIN FuelClaimStatuses fs on fs.FuelClaimStatusId= fc.statusid 

     INNER JOIN LogsheetMonths l on l.LogsheetMonthId =f.LogsheetMonthId 

     Where fc.IsDeleted = 0) AS MyDerivedTable WHERE MyDerivedTable.RowNum BETWEEN 
    600000 And 600010 
+1

プロシージャ定義を指定する必要があります。 – vikky

答えて

1

代わりにこれを試してみてください:10〜20は、実際に10が10,11,12,13,14,15,16,17,18,19及び20ので、11行を返すないので、包括的であるとの間にも

SELECT TOP 10 fc.FuelClaimId 
FROM FuelClaims fc 
    INNER JOIN Vehicles v ON fc.VehicleId = v.VehicleId  
    INNER JOIN Drivers d ON d.DriverId = v.OfficialID 
    INNER JOIN Departments de ON de.DepartmentId = d.DepartmentId 
    INNER JOIN Provinces p ON de.ProvinceId = p.ProvinceId 
    INNER JOIN FuelRates f ON f.FuelRateId = fc.FuelRateId 
    INNER JOIN FuelClaimStatuses fs ON fs.FuelClaimStatusId = fc.statusid 
    INNER JOIN LogsheetMonths l ON l.LogsheetMonthId = f.LogsheetMonthId 
WHERE fc.IsDeleted = 0 AND fc.FuelClaimId BETWEEN 600001 AND 600010 
ORDER BY fc.FuelClaimId 

を同一性値は通常1から始まりますので、実際にはBETWEEN 11 AND 20(したがって上記の600001)が必要です

上記のクエリは、より広い範囲のアイテムをクエリする際にパフォーマンスが低下する問題を解決するはずです。 @LastMaxFuelClaimIdは、前のクエリの実行から返されていた以前のMAX FuelClaimIdある

WHERE fc.IsDeleted = 0 AND fc.FuelClaimId > @LastMaxFuelClaimId 

それは常に10を返しませんが、そのための修正がある記録されます。

編集:それが遅くなっていく理由は、次のチャンクを読むためにテーブルをますます読みとる必要があるからです。最初の600,000レコードを読み飛ばすことはなく、次の10はあなたがこれまでのすべての過去のレコードを全部読むことを照会するたびに、上記は同じ問題を抱えません。

+0

これは、 'FuelClaimId'が連続しているが、そうでない場合に有効です。 –

+0

@Lieven私はそれを書いた後、 'FuelClaimId'が連続していないときにうまくいく解決法で私の答えを更新したことに気付きました。 – Seph

+0

+1確かに、rownumbersを使った(ab)よりも優れた解決策です。 –

0

以下に示すように、SQLクエリを作成するには、実行計画を投稿する必要があり

ストアドプロシージャをレコードを取得するために最適化された方法を与えることなく、パフォーマンスの問題の原因は不十分だろうか、してくださいインデックスの欠如。

あなたは

  • すべての外部キー関係にインデックス
  • あなたが取得フィールド上の被覆指数と
  • インデックス

    をカバー

から選択していることを確認します

CREATE INDEX IX_FUELCLAIMS_FUELCLAIMID_ISDELETED ON dbo.FuelClaims (FuelClaimId, VehicleID, IsDeleted) 
+0

プライマリキーとしてすべての外部キーを使用しているので、インデックスはプライマリキーで自動的に作成されます。 –

+0

@ Smith.Patel - Trueですが、「外部キー」には自動的にはありません。実行計画を投稿することはできますか? –

+0

@ Smith.Patel - カバーリングインデックスを追加して、もう一度やり直して新しい実行計画を投稿できますか? –

関連する問題