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

5データベース監視を改善するためのSQL構文とクエリの原則

    優れたSQL構文とクエリ作成方法を採用すると、データベースの監視効率が向上し、その結果、データベース全体のパフォーマンスが向上します。構文とクエリの調整を通じてデータベースのパフォーマンスを向上させるための、実証済みの方法がいくつかあります。焦点を当てるために5つを選びました。

    1。 CASE式

    CASE式から最高のパフォーマンスを得るには、いくつかのベストプラクティスを次に示します。

    • CASE式は、古い手続き型コードを最適化できる宣言型コードに移動することでパフォーマンスを向上させます。基本的なCASE式には、最も簡単に最適化できるを使用します。拡張CASE式の場合、ハッシュやその他の手法が最も役立ちます。
    • WHEN句は左から右にテストされるため、最も可能性の高い句が最初にリストされるように句を配置するのが最適です。これにより、不要なスキャンに費やす時間が削減されます。
    • ほとんどのオプティマイザは、実行の順序を考慮して冗長なテストも除外します。 WHEN句が実行されるとすぐに、その句を再度テストする必要はありません。ただし、多くのオプティマイザはネストされたCASE式を読み取るのが苦手なので、それらを単一のレベルにフラット化するのが最善です。

    2。ダブルディッピングとウィンドウ句

    SQLでは、「ダブルディッピング」とは、同じテーブルに複数回アクセスすることを意味します。これにより、クエリの速度が低下します。理想的には、1回のテーブル訪問ですべての仕事を終わらせるようにしてください。ただし、それが不可能な場合は、パフォーマンスへの影響を軽減する方法がいくつかあります。

    同じベーステーブルを結合して構築された一時テーブルを使用することは、ダブルディッピングを回避するための最善の方法ではありません。より良い解決策は、SQLエンジンのオプティマイザを使用して、ビューを表示し、結果を作業テーブルとして共有することです。

    恒星に満たないオプティマイザに制限されている場合は、一時テーブルを使用して手動で作業を行ってください。

    上記の方法は完全に受け入れられますが、サブ句はサブクエリ機能と同様に機能するため、ダブルディッピングを回避する最善の方法はウィンドウ句を使用することです。例:

    • PARTITION BY句は、テーブルをグループに分割するローカルのGROUPBYのようなものです。
    • ORDER BY句は、ソートされた順序を課します。
    • ウィンドウフレーム(ROWまたはRANGE)は、ローカルのWHERE句のようなものです。

    次のルールに従うことで、ウィンドウ関数を最適化できます。

    • インデックスで、最初にPARTITION BY句の列で並べ替え、次にORDERBY句で使用される列で並べ替えます。
    • クエリで参照されている他の列を、インデックスの含まれている列として含めます。

    3。ストアドプロシージャを使用する

    オブジェクトリレーショナルマッパー(ORM)は、独自のコードを生成するときに多くのパフォーマンスの問題を引き起こします。 ORMを使用する必要がある場合は、パフォーマンスが低下しないように独自のストアドプロシージャを作成してください。

    ストアドプロシージャを使用してパフォーマンスを向上させる方法はたくさんあります。

    • ネットワーク全体にプッシュするデータが少ないため、トランザクションが高速になります
    • より短い通話が可能になります
    • ストアドプロシージャは、プロファイルツールで簡単に追跡できます
    • ストアドプロシージャはデータベース内の実際のオブジェクトであるため、パフォーマンス統計を取得しやすくなり、パフォーマンスの問題を見つけやすくなります。
    • 実行プランの再利用が増加します
    • エッジケースへの対処を容易にし、監査または変更ロック動作を追加します
    • ストアドプロシージャはSQLインジェクション攻撃に対して脆弱ではありません

    4。バッチでの削除と更新

    両方のステートメントが単一のトランザクションとして実行されるため、大規模なテーブルスキャンから大量のデータを削除または更新すると、大量のリソースが使用されます。トランザクションの実行中にエラーが発生し、それを停止する必要がある場合、システムはトランザクション全体をロールバックする必要があるため、これはパフォーマンスの低下につながります。大量のデータをロールバックすると、多くの時間が消費され、他のトランザクションがブロックされます。

    小さなバッチで更新と削除を行うことにより、このパフォーマンスの問題を回避できます。これらのトランザクションをバッチで実行する場合、トランザクションが強制終了された場合、ロールバックははるかに小さくなります。少量のデータをロールバックするのにそれほど時間はかからず、バッチがディスクにコミットしている間、他のトランザクションが機能する可能性があります。

    5。必要以上の列を取得しないでください

    クエリのパフォーマンスが低下する主な原因の1つは、無関係な列を取得することです。一般的に過剰な数の列を返す結果となるプラクティスは避けてください。次の点に注意してください。

    • クエリで「SELECT*」を不必要に使用すると、必要以上の列が返される可能性があります。これはリソースの浪費であり、他のユーザーからのリソースをロックします。列SQLデータベースで「SELECT*」を無差別に使用しないことが特に重要です。
    • コードを再利用するためにカットアンドペーストを実行すると、余分な列が作成される可能性があります。
    • VIEWを呼び出すと、ネストされた列が表示される場合があります。パフォーマンスの低いクエリをネスト解除して、そこにある列を確認し、不要なサイズの大きい列を取り除きます。問題があることを示す良い兆候は、条件が追加されたWHERE句と、外部結合が追加されたFROM句があることです。

    これらは、SQL構文とクエリ書き込みに注意深くアプローチすることでデータベースの監視を改善できる方法のほんの一部です。他の人を試すことを恐れないでください。高性能のデータベースは、すべての組織のビジネス目標を達成するための鍵です。


    1. 週数を日付に変換する方法は?

    2. 階層化における異種データソースの結合

    3. Access2016でリンクテーブルマネージャーを使用する方法

    4. ODP.NETマネージド-要求された.NetFrameworkデータプロバイダーが見つかりません