sql >> データベース >  >> RDS >> Sqlserver

クエリ オプティマイザーの演算子の選択 - ネストされたループとハッシュ マッチ (またはマージ)

    絶対。ハッシュマッチは大きな改善になります。より小さい 19,223 行のテーブルでハッシュを作成し、それからより大きい 65,991 行のテーブルでプローブすることは、1,268,544,993 行の比較を必要とするネストされたループよりもはるかに小さな操作です。

    サーバーがネストされたループを選択する唯一の理由は、関連する行数を大幅に過小評価したことです。あなたのテーブルには統計がありますか? もしそうなら、それらは定期的に更新されていますか?統計は、サーバーが適切な実行計画を選択できるようにするものです。

    統計に適切に対処しても問題が解決しない場合は、次のように強制的に HASH 結合を使用することができます:

    SELECT *
    FROM
       TableA A -- The smaller table
       LEFT HASH JOIN TableB B -- the larger table
      

    これを行うとすぐに、参加順序も強制されることに注意してください。これは、結合順序が意味を持つように、すべてのテーブルを正しく配置する必要があることを意味します。通常、サーバーが既に持っている実行計画を調べて、一致するようにクエリ内のテーブルの順序を変更します。これを行う方法に慣れていない場合、基本は、各「左」入力が最初に来て、グラフィカルな実行計画では、左入力がです。 1。多くのテーブルを含む複雑な結合では、結合を括弧内でグループ化するか、RIGHT JOIN を使用する必要がある場合があります 実行計画を最適化するため (左右の入力を交換しますが、結合順序の正しいポイントでテーブルを導入します)。

    一般に、結合ヒントを使用したり、結合順序を強制したりすることは避けるのが最善です。そのため、最初にできることはすべて実行してください。テーブルのインデックス、断片化、列サイズの縮小を調べることができます (varchar を使用するなど) nvarchar の代わりに Unicode は必要ありません)、またはクエリを部分に分割します (最初に一時テーブルに挿入してから、それに結合します)。



    1. Ruby on Rails:postgresqlのdatabase.ymlを編集するにはどうすればよいですか?

    2. PostgreSQLインデックスとInnoDBインデックス-違いを理解する

    3. 列の値を更新するPostgreSQL

    4. Macにインストールした後、ALTERUSERステートメントを使用してMySQLルートパスワードをリセットします