1

実行速度が思ったよりも遅いクエリがありますが、詳細を共有することはできません。クエリは既に正しい結果を返し、リファクタリングしましたが、十分に速く実行できません。可能な場合、述語はすでにSargable になっています。すでに適切に結合を使用しており、追加のテーブルを要求せず、速度を低下させる方法で行を不必要に複製したり、ネストされたサブクエリを使用したりしません。

私は DBA ではなく、クエリを高速化するために適切なインデックスを選択する方法をまだ知りません。テーブル構造を変更できます。データベースを担当する DBA はいません。私には、データベース サーバーに対する権限があります。

SQL クエリを最適化するために必要な手順は何ですか?

4

1 に答える 1

8

はじめに:ここで話すことはたくさんあります。SQL は複雑であるため、クエリを完全に支援することは誰にも不可能です。クエリが何であるか、テーブルがどれくらい大きいか、データベースが何であるかが重要です。使用しているシステムです。インデックスとは何か、またはその使用方法がわからない場合は、こちらを参照してください:データベースのインデックス作成はどのように機能しますか? .

予防措置:繰り返しになりますが、システムの DBA がいる場合は、特に稼働中のシステムでは、インデックスを作成する前に DBA に確認してください。あなたが彼らに親切であれば、彼らは助けることさえできます. システムが他の多くの人によって使用されている場合は、インデックスなどを変更する前に注意してください。データが複数のクエリ タイプに使用されている場合は、競合または重複する大量のインデックスを作成していないことを確認してください。

構文。標準 (SQL92) では次を使用しますCREATE INDEX [index name] ON [table name] ( [column name] )。この構文は、ほとんどすべてのシステムで機能するはずです。テーブルにインデックスが 1 つだけ必要で、クラスター化インデックスがまだない場合は、次を使用できます。CREATE [Unique] Clustered INDEX [index name] ON [table name] ( [column name] )- 同じ値を持つ複数のアイテムが存在できない場合は一意にする必要があります。これが機能しない場合は、詳細についてこの記事を参照してください:データベース列のインデックスを作成する方法.

どのテーブルにインデックスを付ける必要がありますか? 特にデータが静的であるか、新しい値のみを取得する場合は、クエリに使用されているテーブルが最適な候補です。テーブルがクエリに含まれていて、結合ステートメントがある場合、結合される列にインデックスが必要になる可能性があります。

どの列に索引を付ける必要がありますか? 最適なインデックスの選択と、データベースを適切にインデックス化する方法について書かれた完全な本があります。問題を深く掘り下げたくない場合のインデックス作成の基本的な経験則は、次の順序でインデックスを作成することです。

  1. 結合述語 ( on Table1.columnA=Table2.ColumnA and Table1.columnB=Table2.ColumnQ)
  2. フィルタされた列 ( where Table1.columnN=’Bob’ and Table1.columnS<20)
  3. 並べ替え / グループ化 / など (可能であれば、並べ替え/グループ化に使用される列はすべてインデックスに含める必要があります。)

また:

  • 意味のあるデータ型を使用してください。整数または日付の場合は、varchar として何も格納しないでください。(列幅は重要です。可能であれば、できるだけ小さいデータ型を使用してください。)
  • 結合が同じデータ型 (int から int、varchar から varchar など) であることを確認してください。
  • 可能であれば、各テーブルの各結合述語で一意の非 null インデックスを使用します。
  • 可能なすべての列がnullでないことを確認してください。(null 値を含めることができない場合は、次の構文を使用できます。

     Alter table Table1 
        alter column columnN int not null
    

これらすべてを実行すると、順調に進むことができます。しかし、このようなことが定期的に必要な場合は、それを学んでください! 本を購入し、オンラインで読み、情報を見つけます。そこにはたくさんの情報があり、それは深いトピックですが、何をしているのかを知っていれば、クエリをより良くすることができます.

于 2012-07-02T18:31:43.200 に答える