2011-07-29 15 views
2

テーブルに多数のレコードがあります。次のクエリを実行すると、時間がかかります。どのようにパフォーマンスを向上させることができますか?クエリのパフォーマンスを向上させる方法

SET ROWCOUNT 10 
SELECT StxnID 
     ,Sprovider.description as SProvider 
     ,txnID 
     ,Request 
     ,Raw 
     ,Status 
     ,txnBal 
     ,Stxn.CreatedBy 
     ,Stxn.CreatedOn 
     ,Stxn.ModifiedBy 
     ,Stxn.ModifiedOn 
     ,Stxn.isDeleted 
    FROM Stxn,Sprovider 
    WHERE Stxn.SproviderID = SProvider.Sproviderid 
    AND Stxn.SProviderid = ISNULL(@pSProviderID,Stxn.SProviderid) 
    AND Stxn.status = ISNULL(@pStatus,Stxn.status) 
    AND Stxn.CreatedOn BETWEEN ISNULL(@pStartDate,getdate()-1) and ISNULL(@pEndDate,getdate()) 
    AND Stxn.CreatedBy = ISNULL(@pSellerId,Stxn.CreatedBy) 
    ORDER BY StxnID DESC 

stxnテーブルには100,000を超えるレコードがあります。

クエリは、asp.net c#のレポートビューアから実行されます。

+5

テーブル、インデックスなどがわからなくても、ハードになるでしょう。私たちにも実行計画を見せてください。 –

+0

どのバージョンのSQL Serverですか? –

+0

私は店舗手続きを行います。私はストアドプロシージャに取得するためにデータセットを使用します。 –

答えて

0

Stxn.SproviderID、Stxn.status、Stxn.CreatedOn、Stxn.CreatedBy、Stxn.StxnID、およびSProvider.Sprovideridにすべてインデックスが定義されていることを確認してください。

(NB - あなたはすべてを必要としないかもしれませんが、それは傷つけることはできません。)私は、クエリ自体で行うことができ、その多くは表示されません

0

が、私は上で行われているものを見ることができますスキーマ:

  • SProvider.Sproviderid
  • にインデックス/ PKを作成Stxn.SproviderID
  • にインデックス/ PKを作成
StxnID、状況にCreatedOn、CREATEDBYのインデックスを作成します。
3

実行計画の使用と欠落しているインデックスの検索を検討する必要があります。また、実行にはどれくらい時間がかかりますか?何が遅いですか?

多すぎる行を返すこともできませんが、それは単なる推測です。実際には、テーブルとインデックスに実行計画を加えたものを見る必要があります。

チェックsql-tuning-tutorial

4

これは私のゴーへの記事私はオプションであるかもしれないいくつかの検索条件を持つ検索クエリをやろうとしているです。

http://www.sommarskog.se/dyn-search-2008.html

クエリの最大の問題はcolumn=ISNULL(@column, column)構文です。 MSSQLはインデックスを使用しません。 (column = @column AND @column IS NOT NULL)

3

SET ROWCOUNTの代わりにSELECT TOP()を使用してください。オプティマイザの方がはるかに良いでしょう。もう一つの提案は、古いスタイルテーブル、テーブル結合構文を使用してデカルト製品で終わるのではなく、適切な内部結合を使用することです(これはここでは当てはまりませんが、古い構文ではもっと簡単に行うことができます)。

... 
FROM Stxn INNER JOIN Sprovider 
    ON Stxn.SproviderID = SProvider.Sproviderid 
... 

そして、あなたは100K行を思えば、多くの場合、またはこのボリュームは遅さの原因であることを、あなたが痛んで間違っている:でなければなりません。ほとんどの場合、実際にインデックス作成の戦略が悪い可能性があります。おそらくいくつかのパラメータスニッフィング、おそらく暗黙的な変換などがあります。データ型、インデックス、および計画を理解しないとわかりにくいです。

3

クエリのパフォーマンスに影響を与える可能性のあることはたくさんあります。 100kレコードはそれほど多くはありませんが。(順不同)

ハードウェアを検討する

アイテム:

  1. を制約SQL Serverのメモリですか?言い換えれば、仕事をするのに十分なRAMがありますか?メモリをディスクにスワップしている場合、これはアップグレードが必要であることを示す確実な兆候です。
  2. マシンディスクが制約されていますか?言い換えれば、実行する必要があるクエリに追いつくのに十分な速さですか?メモリが制約されていると、ディスク速度がより大きな要因になります。
  3. マシンプロセッサに制約がありますか?たとえば、クエリを実行すると、プロセッサは長期間スパイクをしますか?それとも、すでに離れてあなたからのリソースを取っている実行している他のクエリがたくさんあります...

データベース構造:

  1. は、あなたのwhere句で使用する列に索引を持っていますか?テーブルにインデックスがない場合は、両方のテーブルをフルスキャンして一致するレコードを特定する必要があります。
  2. ISNULL関数呼び出しを削除します。これが直接クエリの場合は、呼び出しコードでパラメータを検証し、実行する前にデフォルト値を設定します。ストアドプロシージャ内にある場合は、s'procの上部でチェックを行います。あなたは、パラメータスニッフィングんRECOMPILEでこれを実行している場合を除き、これらの機能は、行ごとに評価する必要があります。..

ネットワーク:

  1. はあなたとサーバ間の低速なネットワークですか?引っ張られるデータの量に応じて、GBのデータをワイヤを介して引き出すことができます。私は何が "生の"列に格納されているか分かりません。ここで最初に質問する必要があるのは、「どのくらいのデータがクライアントに返されますか?」です。たとえば、各レコードのサイズが1MB以上の場合、おそらくディスクとネットワークの制約があります。一般

  1. 私はあなたの質問に何を意味するのか "遅い" わかりません。クエリが処理に約1秒かかっているか、それとも5分かかっていることを意味していますか?すべてがここで相対的です。

基本的に、あなたからの質問がたくさん出されることなく、難しい回答をすることは不可能になります。これらのすべては、クエリのプロファイルを作成し、クライアントに何がどのくらい戻ってくるかを理解し、さまざまな部分の相互作用を監視することでわかります。

最後に、クライアントに返されるデータの量によっては、ハードウェアの変更が不十分な場合のパフォーマンスを向上させる方法がない可能性があります。

0

注意事項:ROWCOUNTまたはTOPをORDER BY句とともに使用すると、結果セット全体が作成され、最初にソートされ、次に上位10個の結果が返されます。

これはOrder By節なしでどのように実行されますか?

関連する問題