この記事を読んでいるなら、おそらく、あなたはすでにSQLに精通しているでしょう。あなたは基本的なSQLクエリを書く方法を知っています。 SQLクエリを実行して、データベースで目的の結果を得る方法はたくさんあります。
ただし、すべてのSQLクエリが同じように作成されるわけではありません。ほとんどは、SQLクエリのベストプラクティスに従うように最適化できます。この記事では、SQLクエリの最適化に関する9つのヒントに焦点を当てています。読んだ後は、SQLクエリを作成する際の注意事項と注意事項をすべて理解できます。
1。 SELECTアスタリスク(SELECT *)の使用を避ける
これは、SQLの最も重要なベストプラクティスの1つです。 SELECT *クエリは、テーブルのすべての列からレコードを返します。場合によっては役立ちますが、このクエリは多くの場合、多くの問題を引き起こします。
- すべての列を取得する必要がない場合があります。ただし、SELECT *はそれらすべてを返すため、ネットワーク経由でクエリを実行するために過剰な帯域幅を消費します。
- テーブルの列名を変更または削除したり、新しい列を追加したりできます。したがって、SELECT*クエリに対して予期しない結果が発生する可能性があります。列名を指定することをお勧めします。
- SELECT *は、SELECT列名よりも低速です。これは、SELECT列名が列インデックスを使用してデータを返すことができるためです。
- SELECT*によって返される列の順序は制御できません。ただし、列名を指定するときに目的の順序を定義します。
2。 WHERE句とHAVING句を正確に使用する
SQLのWHERE句とHAVING句の機能は異なります。したがって、それらを別の方法で使用する必要があります。 WHEREとHAVINGの3つの主なユースケースは次のとおりです。
- WHEREは、CRUDクエリ(SELECT、INSERT、UPDATE、DELETE)で使用できます。一方、HAVINGはSELECTステートメントでのみ使用できます。
- WHEREは、GROUPBYなどの集計操作の前にデータをフィルタリングします。そうすれば、集計関数なしで使用できます。集計後にHAVINGを使用する必要があります。
- HAVING句を使用して、SUM、MIN、MAXCOUNTなどの集計関数を使用できます。 WHERE句では、この句がHAVING句に含まれるサブクエリの一部でない限り、集計関数を使用できません。
3。 テーブルを結合するためのWHERE句の代わりにINNERJOINクエリを使用する
JOINクエリは、おそらく最も有用なSQLクエリの1つです。複数のテーブルからデータを選択できます。 WHERE句を使用して2つのテーブルから集計データを取得することはできますが、WHERE句は非常に非効率的です。
WHERE句は、両方の列のレコードのデカルト積であるCROSSJOINを返します。たとえば、テーブルAに1,000レコードがあり、テーブルBに同じ数のレコードがある場合、WHERE句は1,000 x 1,000=1,000,000レコードのCROSSJOINを作成します。
WHERE句に含まれるテーブルAとBの列に共通の値が1,000しかない場合、WHERE句はデカルト積によって作成された最初の1,000,000レコードから1,000レコードを返します。
INNER JOIN句は、テーブルAとBの両方の列に共通の値がある1,000レコードのみを返します。この場合、INNERJOINの作業量はWHERE句の1,000分の1です。
一部のデータベースは、JOINクエリのWHERE句をバックグラウンドでINNERJOIN句に変換します。ただし、SQLコーディングのベストプラクティスに従うには、WHERE句ではなくINNERJOINを明示的に使用することを常にお勧めします。
4。 INおよびNOTINの代わりにEXISTS、NOTEXISTSを使用する SQLで
特定のテーブルに値が存在することを確認する場合は、常にIN句に対してEXISTを使用してください。
EXISTS句を実行するプロセスは、テーブルで必要な値が見つかるとすぐに停止します。一方、INクエリは、必要な値を見つけた後でもすべてをスキャンします。
同様に、テーブルに存在しない値を検索する場合は、NOTINではなくNOTEXISTSを常に使用する必要があります。
5。 LIKEの代わりにEquals演算子(=)を使用する SQLの演算子
=演算子とLIKE演算子の両方を使用して、文字列を照合できます。 2つの主な違いは、LIKE演算子は、%などのワイルドカードを部分文字列の検索に一致させるために使用されるのに対し、equals演算子「=」は完全一致を検索することです。
2つから選択する必要がある場合は、インデックス付きの列を使用するため、常に等号演算子(“ =”)を使用してください。したがって、LIKE句よりも高速です。
6。 LIMIT句を使用して検索結果を減らします
複数のテーブルまたは列からデータを返す必要がある場合は、LIMIT句(TOP句とも呼ばれます)を使用してクエリ結果を減らします。数千の列がある場合、またはテーブルでのみデータがどのように表示されるかを確認したい場合は、すべての行を返す必要はありません。代わりに、LIMIT句と組み合わせてSELECTクエリによって返される行数を制限してください。
7。 複数のテーブルをクエリするときにテーブルエイリアスを使用する
混乱を避け、データベースが属するテーブルを検索するときに列名を解析しないようにするには、常にテーブルエイリアスを使用してください。
複数のテーブルに同じ列名がある場合は、すでにテーブル名/エイリアスを使用する必要があるため、ワークロードが増加することはありません。
8。 ストアドプロシージャの前に「sp_」を付けることは避けてください
ストアドプロシージャを使用している場合は、ほとんどの場合、ストアドプロシージャ名の前に「sp_」を付けています。これは最高ではありません。
SQL Serverは、他の場所での検索に進む前に、マスターデータベースで名前の先頭に「sp_」が付いたストアドプロシージャを探すことから始めます。
したがって、ストアドプロシージャの前に「sp_」を付けないことで、時間を大幅に節約できます。その後、マスターデータベースでストアドプロシージャを検索する代わりに、SQLサーバーはストアドプロシージャの所有者としてdboを直接チェックします。
>9。優れたクエリライティングスタイリングを採用する
SQLクエリを作成するときは、優れたスタイリングプラクティスなどのSQLクエリのベストプラクティスに従うことが不可欠です。クエリの記述スタイルを改善するために、以下の推奨事項に注意してください。
- SQLクエリには常にコメントを追加してください。コメントは、他のチームメンバーがあなたの質問をよりよく理解するのに役立つだけでなく、あなたが過去に自分で何をしていたかを思い出させるのにも役立ちます。
- わかりやすい命名規則を使用します。データベース、テーブル、列名、一時テーブル、およびその他の変数名は、100%読み取り可能で明確である必要があります。
- 可能な限りクエリをインデントします。内部クエリは、左から1タブインデントする必要があります。テーブル内の列名とタイプもインデントする必要があります。インデントにより、見た目がすっきりし、クエリの読みやすさが向上します。これは、クエリのSQLServerのベストプラクティスに反映されています。
結論
SQLは非常に柔軟な言語であり、データベースで目的のタスクを実行するためのさまざまな方法を提供します。アプリケーションをより効率的かつ生産的にし、データベースの長期的な問題を回避するには、最新のSQLクエリ最適化のベストプラクティスを適用してクエリを記述します。これらのメソッドは、SQLでのパフォーマンスの調整を加速し、不要なルーチンを排除し、すべての作業をより簡潔で透過的にするのに役立ちます。
また読む
クエリをワープスピードする22の気の利いたSQLインデックスの例