0

時々動作が遅くなるアプリケーションがありますが、これはデータベース カーソルに関連していると思います。

アプリケーション ソースにアクセスできないため、データベース呼び出しを制御できませんが、データベースは開いているので、必要に応じてインデックスを追加できます。

問題は、インデックスを使用してカーソルを高速化する方法を本当に知らないことです。

カーソルクエリは単純で、次のようになります

SELECT * FROM table WHERE field1=1 AND field2=2 ORDER BY field3, field4

(テーブルには約 1M 行が含まれます。左結合が 1 つある場合もあります)

SSMS でクエリを直接実行すると 1 秒もかかりませんが、アプリケーションからカーソルで実行すると、最初の行を取得するのに 30 秒かかる場合があります (sql-trace で確認)。

WHERE 句と ORDER BY 句のフィールドはすべて個別にインデックスが作成されます。

field1、field2、field3、field4 のインデックスを組み合わせると、より高速になると思います。フィールドの組み合わせと順序ごとにインデックスを作成せずに高速化する方法はありますか?

(繰り返しますが、アプリケーションがデータベースにアクセスする方法には影響しません。パフォーマンスは、インデックスを介してのみ調整できます)

4

2 に答える 2

1

私が常に (可能であれば) 行うことの 1 つは、DB Tuning Advisor を実行することです。

誤解しないでほしいのですが、私は彼のすべての規則や提案に従っているわけではありませんが、何が起こっているか、どのくらいの頻度で発生しているかなどを簡単に確認できます。数時間の (典型的な!!!) ワークロードは、何が起こっているかの基本的な「感覚」をつかむのに適しています。

その後、いくつかの提案を実装するかどうかを決定できます。そして、設計に最善を尽くしたとしても、そのようなチェックは実際に何が起こっているかを見て(常に予測できるとは限りません)、統計を忘れたり、別のインデックスが役立つかもしれません...

于 2009-09-15T07:59:18.240 に答える
0

SELECT *ではなく実際の列名を使用するようにクエリを変更してから、field1=1とfield2=2にカバーするインデックスを作成します。可能であれば、field3とfield4にクラスター化されたインデックスを配置します。

SQL 2005以降を使用している場合は、カーソルではなくCTEを確認するか、クエリをリファクタリングして一時テーブルを使用してください。

于 2009-09-15T08:10:32.657 に答える