いくつかのことがクエリのコストに影響を与えます。
まず、使用する適切なインデックスがありますか。結合で使用されるフィールドはほとんどの場合インデックス化する必要があり、外部キーは既定ではインデックス化されないため、データベースの設計者が作成する必要があります。where クラスで使用されるフィールドには、多くの場合、インデックスも必要です。
次に、where 句は検索可能ですか。つまり、正しいインデックスを持っていても、インデックスを使用できますか? 不適切な where 句は、結合や余分な列よりもはるかにクエリに悪影響を与える可能性があります。次のようなインデックスの使用を防止する構文を使用すると、テーブル スキャン以外は取得できません。
LIKE '%test'
次に、必要以上のデータを返していますか? 必要以上の列を返すべきではありません。select * は、列を検索するための追加の作業があり、構造が時間とともに変化するにつれて非常に壊れやすく、悪いバグが発生する可能性があるため、運用コードで使用しないでください。
参加する必要のないテーブルに参加していますか? テーブルがselectで列を返さず、whereで使用されず、結合が削除されてもレコードを除外しない場合、不要な結合があり、削除できます。多くのビューを使用している場合、特に他のビューからビューを呼び出すのを間違えた場合 (これは多くの理由でバグのパフォーマンス キラーです)、不必要な結合が特に蔓延しています。他のビューを呼び出すこれらのビューをトレースすると、ビューを使用する代わりにゼロからクエリを作成した場合は必要なかったのに、同じテーブルが複数回結合されていることがわかります。
必要以上のデータを返すと、SQL Server の負荷が高くなるだけでなく、結果をメモリに保持している場合、クエリがネットワーク リソースと Web サーバーのメモリをさらに消費することになります。それはあらゆる面で悪い選択です。
最後に、パフォーマンスの低い既知の手法を使用していますか?より良い手法が利用可能です。これには、セットベースの代替手段が優れている場合のカーソルの使用、結合が優れている場合の相関サブクエリの使用、スカラー ユーザー定義関数の使用、他のビューを呼び出すビューの使用 (特にネストした場合) が含まれます。複数のレベル. これらの貧弱な手法のほとんどは、行ごとに処理することを伴います.これは、データベースでは一般的に最悪の選択です. データベースを適切にクエリするには、一度に1行ずつ処理するのではなく、データセットの観点から考える必要があります. .
クエリとデータベースのパフォーマンスに影響を与えるものは他にもたくさんあります。この問題を真に理解するには、この問題に関する本を何冊か読む必要があります。これは、メッセージ ボードで十分に議論するにはあまりにも複雑なテーマです。