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

SQLServerの複雑さを軽減するためのヒント

    複雑なSQLクエリは、データベース検索を非常に具体的かつ柔軟にするのに優れていますが、理解が難しく、デバッグがほとんど不可能な場合もあります。また、それらを再利用することを忘れた方がよいでしょう。

    クエリが標準のSELECTおよびWHEREコマンドを超えると、クエリオプティマイザが長くて複雑なクエリを処理するのに問題があるため、SQLServerのパフォーマンスが低下し始める場合があります。

    SQLクエリが過剰な数の複雑な結合とサブクエリを使用し、WHERE句にクエリをネストし、多くのAND句とOR句に依存していることに気付いた場合は、一歩下がって次の方法を探すのがよいでしょう。複雑さの一部を最小限に抑えます。

    SQLServerクエリの複雑さを最小限に抑えるためのヒント

    上で述べたように、SQLServerクエリオプティマイザーは複雑なSQLクエリを好みません。クエリの複雑さを軽減して、パフォーマンスを向上させるために最適化できるようにする5つの方法を次に示します。

    1。可能な場合はOR句を削除する

    クエリの複雑さを軽減する最も簡単な方法は、可能な限りOR句を削除することです。 ORは包括的であるため、SQL Serverは句の各コンポーネントを個別に処理する必要があり、これにより操作が実際に遅くなります。

    ORを削除できない場合、次善の策は、長くて複雑なクエリをより小さなクエリに分割することです。より多くのクエリを処理する方が1つを処理するよりも速いというのは少し直感に反しているようですが、ORに関しては、複数のクエリを使用する方がよいでしょう。

    2。文字列検索を微調整する

    SQL Serverは多くのことをうまく実行しますが、ファジー文字列検索はその1つではありません。特に大きなテーブルでのワイルドカード文字列検索は、非効率的でパフォーマンスに悪影響を及ぼします。

    パフォーマンスへの影響を最小限に抑えるのに役立つ文字列検索に適用できる微調整がいくつかあります。

    • ワイルドカード検索の代わりに先頭の文字列検索を使用します(つまり、「%For%」を「For%」に変更します)
    • 文字列検索を実行する前に、日付や時刻などのフィルタをクエリに適用して、データのサイズを縮小します。
    • フルテキストインデックスを適用して、テキスト列での柔軟な文字列検索を可能にするインデックスを生成します

    3。大規模な書き込み操作に注意してください

    大規模な書き込み操作は競合を引き起こし、大量のログファイルを生成します。チェックを外したままにすると、大規模な書き込み操作によってユーザーからのリソースがブロックされ、遅延の問題が発生したり、トランザクションログや物理ストレージがいっぱいになったりする可能性があります。

    大規模な書き込み操作を常に回避できるとは限らないため、それらを実行するタイミングを認識しておくか(サーバーのビジーが少ないほど良い)、競合のリスクを最小限に抑えるために操作ごとに変更される行の数を減らしてください。

    4。インデックスのクリーンアップ

    パフォーマンスの低下に関しては、インデックスが主な原因の1つですが、複雑なSQLクエリを最適化しようとする場合、インデックスには特別な考慮が必要です。

    SQL Serverには、欠落しているインデックスがクエリのパフォーマンスに影響を与えている場合に通知するツールがいくつかあります。ただし、ジャンプしてインデックスの追加を開始する前に、追加のインデックスによってクエリが十分に改善され、努力する価値があるかどうかを判断する必要があります。たとえば、クエリが1日に100万回実行され、インデックスによって25%向上した場合、おそらくそれだけの価値があります。クエリがめったに使用されない場合は、意味がない可能性があります。

    インデックスの追加を開始する前に考慮すべき他のいくつかのことは、新しいインデックスを追加せずにこのユースケースをカバーするように既存のインデックスを調整できるかどうか、およびこのインデックスはすでに存在するがオプティマイザーが何らかの理由でそれを無視しているかどうかです。

    インデックスがクエリのパフォーマンスに影響を与える可能性のある他の方法は、インデックスが過剰または不足しているテーブルや、クラスター化インデックスまたは主キーがないテーブルです。これらの問題を解決すると、複雑なSQLクエリのパフォーマンスに役立ちます。

    5。テーブルカウントダウンを維持する

    クエリにテーブルを追加するたびに、クエリはより複雑になります。テーブルが多すぎると、クエリオプティマイザが効率的に機能しないため、実行プランが不十分になることがよくあります。

    複雑なクエリのパフォーマンスが低く、テーブルが多いことに気付いた場合は、オプティマイザの負担を軽減できるため、クエリを小さなクエリに分割するのが最適な場合の1つです。

    >

    パフォーマンス調整ツールはSQLServerの複雑さを最小限に抑えるのに役立ちます

    複雑なクエリがクエリオプティマイザを停止させると、多くの場合、非効率的な実行プランになり、パフォーマンスが低下します。上記のヒントに加えて、パフォーマンス調整ツールは、SQLServerクエリの複雑さを最小限に抑えてパフォーマンスを最適化するための貴重なリソースです。

    以下は、パフォーマンスチューニングソリューションを研究するときに探すべき機能のいくつかです。

    SQLServer実行プランの分析

    チューニングツールは、実行プランを分析し、SQLServerが操作をより効率的に実行するために何を変更する必要があるかを判断する必要があります。

    SQLServer実行プランの視覚化

    チューニングツールは、理解しやすく、実行を遅くしている操作を見つけるのに役立つ方法で実行プランを提示する必要があります。

    自動SQL最適化

    チューニングツールはSQLを分析し、実行時間が最大になるまで自動的に書き換える必要があります。

    最適化されたSQLステートメントと元のSQLステートメントの比較

    チューニングツールは、変更を展開する前に元のバージョンと最適化されたバージョンを比較できるように、SQLステートメントの変更を強調表示する必要があります。

    SQLServer実行プランの比較

    チューニングツールは、バージョン間で何が変更されたかを把握できるように、元の実行計画と最適化された実行計画の比較を提供する必要があります。

    統計的証明

    チューニングツールは、最適化されたSQLが元のSQLステートメントよりも高速に実行される理由を示すデータを提供する必要があります。

    複雑なSQLServerクエリは、システムパフォーマンスに悪影響を与える可能性があります。これらのヒントと高品質のパフォーマンスチューニングソリューションを使用して、複雑さをクリーンアップし、SQLクエリの効率を最適化します。


    1. テーブル名をplsqlパラメータとして渡す

    2. SQL同じテーブルのグループの列のSUMを更新する方法

    3. Oracle11gでのピボット

    4. Java JDBC MySQLの例外:ResultSetを閉じた後の操作は許可されません