SQLクエリのパフォーマンスチューニング - 速いクエリを作成する方法

以下からの翻訳https://mode.com/sql-tutorial/sql-performance-tuning

ここからスタート?これは、SQLのチュートリアルを使用して、データ解析の一部であり、チュートリアルの最初を参照してください

 

サブクエリ我々は同じ結果セットを取得するためのステートメントを実行することで高速化を実現することができますレッスン。このレッスンでは、クエリの最適化ポイントを認識するために、どのように最適化する方法を学習します。

 

クエリ時間の背後にある理論

 

それは、ハードウェアを扱うことができる情報の最大量は、それが最大の情報量を扱うことができる、である - すべてのソフトウェア、同じ「天井」で制限速度のように、コンピュータ上で実行されているデータベースソフトウェアです。より速く実行クエリが処理されなければならない計算ソフトウェア(すなわち、ハードウェア)の数を減らすことであることを確認してください。あなたはSQLの計算方法を理解する必要がある必要は計算量を減らすために。まず、私たちはいくつかのクエリ時間の表面に影響を与える順番に多くの要因の計算に影響を与えるとしましょう:

  • テーブルサイズ:クエリを設計する場合1つ以上のシートは、パフォーマンスに影響を与える可能性があること、行またはテーブルの複数の行数百万を持っています。
  • マージ:あなたは2つのテーブルをマージする場合は、結果の行の合計数が大幅に増加するように設定し、クエリが遅いかもしれません。サブクエリコースそこにその一例です。
  • 重合:重合は、単にこれらの線は、より多くの計算を必要とし得るよりも行結果を複数生成します。

問合せ時間もデータベース自体に関連する何かに依存して、これらのものは制御できません。

  • 与えられた時間内に、より多くを処理するデータベース、すべてのクエリは、より遅くなり、より多くの同時データベースクエリ:他のユーザーは、クエリを実行します。特に、人々はこのような状況のいくつかのクエリのリソースの多くを取るを満たすために実行し、クエリの速度は特に悪くなります。
  • データベース・ソフトウェアと最適化:これはおそらく、あなたがコントロールすることはできませんが、あなたが使用するソフトウェア・システムに精通している場合、あなたはあなたのクエリをより効率的にするために、それを最大限に活用することができます。

さて、あなたが注目を制御することができ、あなたがコントロールすることができないことを無視してみましょう。

 

テーブルの行数を減らします

 

あなただけ大幅にクエリの速度を向上させることができ、データをフィルタリングする必要があります。データをフィルタリングするためにどのように完全にあなたが解決したい問題に依存します。あなたは時間フィールドのデータを持っている場合たとえば、制限時間の小さなウィンドウがあなたのクエリははるかに高速に実行することができます。

SELECT *
  FROM benn.sample_event_table
 WHERE event_date >= '2014-03-01'
   AND event_date <  '2014-04-01'

あなたは、最終的なクエリを完了するために、データセット全体で実行するために、制限を削除し、データの探索的分析の第1のサブセットで完了できることを覚えておいてください。最後のクエリは、長い時間のために実行したいかもしれませんが、少なくともあなたはすぐに中間ステップを実行することができます。

制限モードのデフォルトの句を使用すると、分析のどのような次のステップを決定するための十分な--100の行を追加した理由です、それはより速い速度を結果を返します。

そうLIMITを使用した場合、重合制限機能と一緒に使用される場合、機能は、重合が完了し実行し、結果セットが指定された行数を制限されて返すために、効果は上記の例と同じではない、それは意味をなさない。行は集計関数の使用の結果を得るために、ときに、このようなあなたはすべて、以下の場合はクエリの速度がスピードアップしないように、LIMIT 100は、効果がありません。

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100

あなたは(クエリを高速化するために)カウント機能を実行する前に、データセットを制限したい場合は、サブクエリに制限しよう:

SELECT COUNT(*)
  FROM (
    SELECT *
      FROM benn.sample_event_table LIMIT 100 ) sub

 注意:あなたはありませんがそのように使用される実際の結果を得るために、クエリのロジックをテストするためにそれを使用する必要がありますので、完全にあなたの結果を変更します。このLIMITを使用してください。

サブクエリを使用する場合、一般的に、あなたは声明の中で、あなたが、実装の始まりを制限する場合、データの量が認識されている制限する必要があります。ことではなく、外部のクエリよりもサブクエリでLIMITを、意味。ここでも、ちょうどクエリの速度を作るために、あなたが最終的な結果を得るためではなく、ロジックをテストすることができます。

 

共同問い合わせの簡素化

 

一部では、これは拡張前の勧告です。リミットデータの量に実行される以前の文のように、テーブルのサイズは、合併前に制限する方が良いだろう。この場合には、以下の例を参照してください、共同で名前フィールドの大学と大学のスポーツチームや選手、テーブル情報テーブル:

SELECT teams.conference AS conference,
       players.school_name,
       COUNT(1) AS players
  FROM benn.college_football_players players
  JOIN benn.college_football_teams teams ON teams.school_name = players.school_name GROUP BY 1,2 

benn.college_football_players表中有26,298行。那就意味着对于另一张表的每一行,26,298行都要进行计算比较进行匹配。但是如果事先对benn.college_football_players这张表进行聚合,你可以减少需要匹配的行数。首先,让我们看一下这个聚合操作:

SELECT players.school_name,
       COUNT(*) AS players
  FROM benn.college_football_players players
 GROUP BY 1

上記のクエリは、252件の結果を返しました。そうクエリに一致するように、再度上記サブクエリにクエリし、大幅外層にマッチの消費を減少させます。

SELECT teams.conference,
       sub.*
  FROM (
        SELECT players.school_name,
               COUNT(*) AS players
          FROM benn.college_football_players players
         GROUP BY 1
       ) sub
  JOIN benn.college_football_teams teams
  ON teams.school_name = sub.school_name 

それらに対処するためのデータベース30,000行は難しいことではありませんので、この場合は、あなたは、大きな違いを見つけることができません。それは何百万、数百、あるいはそれ以上の列である場合でも、試合前の重合操作の後、あなたは大幅な改善が表示されます。あなたは、クエリロジックの妥当性を確保するためにサブクエリを使用しないとき - 最初の作業の精度を考慮して、スピードを実行することを検討します。

 

EXPLAIN

 

あなたはクエリ時間がかかるの推定値を得ることができ、任意の(有効な)クエリの前にEXPLAIN追加することができます。それは絶対に正確ではありませんが、それは便利なツールです。次のステートメントを実行してみてください:

EXPLAIN
SELECT *
  FROM benn.sample_event_table
 WHERE event_date >= '2014-03-01' AND event_date < '2014-04-01' LIMIT 100

あなたはこの出力を取得します。これは、クエリプランと呼ばれています、それはあなたに(他のテーブルと、同じ文)クエリの実行の順序を示しています。

リストの一番下にある一つが実行される最初です。そこで、我々は、WHERE句の範囲が最初に実行されます上記の日付制限を実証する予定。その後、データベース600は、(これはおおよその数字です)ラインをスキャンします。あなたは消費する次の行の数を見ることができます - より多くの長い実行時間を意味します。これらはむしろ絶対的に正確な結果よりも、単に参照、です。これは、[開く]をEXPLAIN権利である:ファイル名を指定して実行を説明した後、高価なステップのコストを変更し、消費が低減されるかどうかを観察するために、再びEXPLAIN実行します。最後に、LIMIT最後の文が実行され、消費量が非常に少ないです。

詳細についてを参照してくださいPostgresのドキュメント

おすすめ

転載: www.cnblogs.com/heisenburg/p/11600847.html