SQL_statement SQL_statement. LifeKeeper for Linux を使ったOracle 19c DataBase HAクラスター化の手順紹介, 【実践】LifeKeeper for Windowsを使ってのOracleDBクラスター構成ガイド, SQL Server 2016時代のSANLess Clustersの価値とは? 〜制約無くシンプルで、コストパフォーマンスの高いSQL Serverの冗長化手法〜, AWS上で、障害発生時にも超短時間で回復が可能なデータベースシステムを実現するには?, PostgreSQL Streaming Replicationの運用を一段階引き上げる方法. 推定コストは、ある特定の条件の端末(使用している端末に似通った条件だが、端末の情報が100%取得できる訳ではないので、あくまで推定の条件)でクエリ実行した場合のコスト … -SQL Database では、SQL Server の DMV のフルセットの利用はできないため、参照可能な情報が多少制限される, サーバーのパフォーマンスを全体的に監視するための方法として、サーバーがどのような事象により待機されているかを評価することがある, 待機統計は sys.dm_os_wait_stats (SQL Database については、sys.dm_db_wait_stats) に集計され、アクティブなセッションの待機情報については、sys.dm_exec_session_wait_stats から追跡することができる, クエリをチューニングするための最も一般的 (最も効果的) な方法は、インデックスを評価して調整すること, データがインデックスに挿入 / 更新 / 削除されると、インデックス内の論理的な順序が、インデックスを構成するページの内部やページ間の物理的な順序と一致しなくなる, 時間の経過とともにデータの変更が行われると、データベース内にデータが散らばる / 断片化する可能性もある, 断片化の状態を検出するための DMV が提供されており、その情報から断片化の状態を確認できる, インデックスのメンテナンスには、再構成 (再編成) と再構築の 2 種類のオプションがある, クラスター化列ストアインデックスと非クラスター化列ストアインデックスの 2 種類がある, SQL Sever 2016 以降では、列ストアインデックスと行ストアインデックスを組み合わせて使用することができる, 102,400 行 (約 10 万行) 以上の一括挿入 (Bulk Insert) を実行する場合に最適化されたロードパスがある, COMPRESS_ALL_ROW_GROUPS を使用してインデックスを再構成することで、強制的に行ストアを格納しているデルタストアを列ストアインデックスに圧縮することもできる. メモリが多くなければ、過去に行ったコストの高いクエリがキャッシュから削除されている可能性もあるので、定期的にこの抽出を行えば、コストの高いクエリを特定できる可能性が高くなると思われます。 Subscribe to comments with RSS SQL Serverの高可用性を実現するなら、SQL Serverの機能であるAlwaysOn Availability Group(以後、AlwaysOn 可用性グループ)、またはAlwaysOn Failover Cluster Instance(以後、AlwaysOn FCI)のいずれかの利用を検討することになるでしょう。, さらに、AlwaysOn FCIを使用する場合には、サイオスのレプリケーション・ソフトウェア DataKeeper Cluster Edition(以後、DKCE)と組み合わせることで、更に多様な機能・コスト面でのニーズに対応することができるようになります。, ここでは、3つの構成パターンを、7つのポイントで比較していきます。ニーズに合わせた方法をご検討ください。, データレプリケーション機能を持ち、共有ディスクを必要としないクラスター環境の構築が可能です。, レプリケーション機能は含まれず、クラスターを構成するには共有ディスクが必要となります。, この場合、Always On FCIでも共有ディスクを必要とせずにクラスター環境の構成が可能となります。その結果、コスト面や柔軟性で多くのメリットが生まれます。, パターン1,2,3いずれの場合も、クラスターウエアとしてはWindows Server Failover Clustering(以降、WSFC)を利用可能です。, まずコスト面に直結するライセンス費用の比較ですが、AlwaysOn可用性グループを利用するには、高価なSQL Server Enterprise Editionが必要です。 一方でAlwaysOn FCIはSQL ServerのStandard Editionでも利用することが可能なため、ソフトウエアライセンスの費用を抑えることが可能です。 AlwaysOn FCIにDKCEを組み合わせる場合も、SQL ServerはStandard Editionの利用が可能なため、ソフトウエアライセンスの費用は抑えられます。, AlwaysOn可用性グループを利用する際には、共有ディスクは不要です。 AlwaysOn FCIでクラスター構成を組む場合は共有ディスクが必要です。一般的に、共有ディスクはハードウエアの価格や管理面でのコストがかさむ要素と言えるでしょう。 AlwaysOn FCIにDKCEを組み合わせる場合には、レプリケーションされたローカルディスクを記憶域として利用でき、共有ディスクが不要となります。, AlwaysOn FCIで使用する従来の共有ストレージ(SAN)は、潜在的な単一障害点となるリスクがあります。 AlwaysOn FCIにDKCEを組み合わせる場合、共有ストレージを利用する代わりにDKCEがリアルタイム、ブロックレベルのレプリケーションでローカルストレージを同期します。(WSFCからはあたかもそこに共有ストレージがあるかのように見えます。)共有ディスクが不要となるため、そこに潜在するSPOFのリスクも解消されます。, AlwaysOn可用性グループを、高可用性実現のために必要な同期レプリケーションモードに設定する場合、アプリケーション書き込み性能が遅くなります。 マイクロソフトはそれを以下のように説明しています。 「・・・トランザクション遅延の増加を代償として、パフォーマンスより高可用性を重視する」, AlwaysOn FCIとDKCEを組み合わせれば、効率的なブロックレベルのレプリケーションにより、同期レプリケーションの性能への影響を最小化できます。また、DKCEは非同期レプリケーションもサポートしています。, AlwaysOn可用性グループはSQL Serverのデータのみを複製し、他のデータタイプはレプリケーションの対象外です。, AlwaysOn FCIとDKCEの組み合わせでは、SQL Serverのデータだけではなく、アプリケーションが利用する他のデータも同時にレプリケーションすることが可能です。, AlwaysOn可用性グループは、データベースが追加または削除されるたびに、手動での再設定が必要です。, AlwaysOn FCIなら、データベースが追加(または削除)されたとき、自動的に保護スキームにそれらを組み込むため、管理に要する時間を節約し、人的ミスのリスクを減らします。(DKCEを組み合わせた時も同様です。), AlwaysOn可用性グループは共有ディスクを必要としないため、クラウドでそのまま利用できます。 AlwaysOn FCIは、共有ディスクを必要とするため、通常はクラウドでの利用はできません。 ただし、AlwaysOn FCIにDKCEと組み合わせれば 、WSFCから共有ディスクとして認識されるため、クラウドでの利用が可能になります。, 現状のシステム資産に7つのポイントを加味して、コスト効率の良いシステムを選択していくことが大切です。, 「もっと詳しい話を聞いてみたい。」などご相談ありましたら、お気軽にお問い合わせください。, 企業の重要な業務アプリケーション環境を保護する、HAクラスターソフトウェアを開発・提供しています, ポイント1)  SQL Server Standard Editionでの利用可否, 日本ヒューレット・パッカード株式会社タイアップホワイトペーパー 『SQL Server環境の高可用性と高速化を低コストで実現するソリューション』, SQL Server を「Microsoft Azure」上に移行する際の課題と方法。そしてAzure上でのデータベースの可用性をさらに高めるLifeKeeper/DataKeeper, 実践!! SQL Server 2005で1つのステートメントで2つのテーブルを更新する方法 見方 最新のコストの高いクエリ 利用状況モニターはサーバー 利用状況モニター 利用状況モニタ 出力 ロック ログ テーブルの再作成を必要とする変更を保存できないようにする タスクの状態 に対してクエリを実行できません suspended sqlserver sql-server database editor 私は2つの異なるクエリの相対的なパフォーマンスを判断しようとしていますが、これを測定する2つの方法があります: 1。両方を実行し、各クエリを実行します 2。両方を実行し、実際の実行計画から「クエリコスト」を取得します, 実行時間の結果はクエリコストの結果と直接矛盾しますが、「クエリコスト」が実際に何を意味するかを判断するのは困難です。私の最良の推測は、読み取り/書き込み/ CPU_Time /などの集合であるため、いくつか質問があると思います。, 他にどのような「クエリパフォーマンス」の指標が使用されていますか?また、それらの相対的なメリットは何ですか?, これは中規模のSQL Serverであり、複数のプロセッサと100人以上の同時ユーザーを備えたMS Server 2003 Enterprise EditionでMS SQL Server 2005を実行していることに注意することが重要です。, 面倒な後、私はそのSQL Serverでプロファイラーアクセスを取得し、追加情報を提供できます(実行時間自体ではなく、システムリソースに関連するクエリコストをサポートしています...), より多くの読み取りでより多くのCPUを使用するのにかかる時間が短くなることは印象的です:), クエリBは並列処理を使用しています:CPU>期間。たとえば、クエリは2つのCPUを使用し、それぞれ平均1.15秒, これにより、バッチに関連するコストが説明されます。シンプルな非並列クエリプランの17%です。, オプティマイザーは、クエリBの方が余分な労力を必要としますが、クエリBの方が高価であり、並列処理の恩恵を受けることがわかります。, ただし、クエリBは2 CPUの100%(4 CPUの場合は50%)を1秒程度使用することに注意してください。クエリAは、1つのCPUの100%を1.5秒間使用します。. EXPLAIN を実行する SQL SQL ステートメントです。 The SQL SQL statement on which EXPLAIN will run. Why not register and get more from Qiita? or a great SQL server, 新しいバージョンでは、処理時間(ウィールクロック)ではなく、内部の測定時間に基づいて計測され、単位は不明です。, ただし、クエリを単独で実行した際のサブツリーの推定コストの総合計と、処理時間がほぼ同じなため、秒として考えても良いと思われます。, コスト単位は、ウォール クロック時間ではなく、内部測定時間に基づいています。 コスト単位は、プランの相対コストを他のプランと比較して決定するために使用されます。, 2に関しては、例えば実行端末のCPUが強力であれば、CPUの推定コストよりも実際のCPUのコストが小さくなり、結果として処理時間が推定と変わります。, あるいは、ディスクの断片化率やテーブルロック等の他の要素も影響し、推定コストと異なる結果を生み出します。, そのため、厳密に処理時間が短いクエリを選びたい場合は、本番サーバーで処理時間を比較した方が良いです。, しかし、開発段階で本番サーバーを使えない場合もあるので、簡便な物差しとして推定コストを利用した比較を実施するのはありだと思います。, SQLのスキルを高めるには、学校の試験勉強と同じように多くの問題を解いてみるのが効率的です。, 『スッキリわかるSQL入門 第2版 ドリル222問付き! そのため、様々なケースで利用することが可能な、チューニング方法の基礎知識 (一般論) はとても重要です。, 本投稿で、確認を行った「SQL Server でクエリのパフォーマンスを最適化する 」は、チューニングに対しての体系的な考え方を無償で学ぶのには適しているコンテンツではないかと思いました。, チューニング系の講義は様々なノウハウが絡みますので有償が多く、ノウハウがない状態で体系立てて学習するのは少し難しいのではないでしょうか。, 本投稿で紹介した Microsoft Learn の内容で、基礎知識を体系立てて学習し、気になった点をさらに自助努力で探求していくことで、チューニングスキルは大きく向上すると思います。, という記載がありますので、近日、日本語のコンテンツとしても公開されるのではないでしょうか。 SQL Serverで実行プランを確認すると「推定コスト」という言葉が出てきます。, ※実行プランの確認は、「SQL Server | 実行プランの確認方法」をご覧ください。, 推定コストは、ある特定の条件の端末(使用している端末に似通った条件だが、端末の情報が100%取得できる訳ではないので、あくまで推定の条件)でクエリ実行した場合のコストを表します。, 古いバージョンでは、あるSQL Server開発者の端末で実行した場合の秒数を記載していたようですが、, what “estimated subtree cost = 1” means ? 細かな内容については、本投稿ではなく、原文を確認していただいたほうが良いと思います。, 割とボリュームのある投稿にすることができ、普遍的なチューニングのアプローチが含まれていますので、小出しにメンテナンスしていこうかと思います。(きっと、たぶん。。。), ちなみに、SE の雑記 でなく、Qiita で書いた理由は、ブログで書いた場合と Qiita で書いた場合にどれくらいアクセス傾向が変わるのかを、確認できるかなと、ふと思ったからです。, プランが存在しない場合、クエリオプティマイザは、コストベースのオプティマイザを使用して、クエリで使用される列 / テーブル / インデックスについての統計情報に基づいて、いくつかの実行プランを生成, プランキャッシュから取得されたプランまたは、上述のステップで出力されたプランを使用して実行される, この生成の中には、Join / Sort で使用するために必要となるメモリ (ワークスペースメモリ) についても決定される, プランの中には、データベースの互換性レベル / クエリの並列度 / パラメーター化されているクエリの場合はパラメーター等が格納されている, SQL Server 2014 SP2 / SQL Server 2016 で最初に導入され SQL Server 2016 SP1 以降で機能が強化された, SQL Server 2019/ SQL Database / Managed Instance では、デフォルトで有効になっている, テーブル値関数 (TVF) / マルチステートメントテーブル値関数 (MSTVF) を使用した場合も、SQL Server 2017 以前では問題のある実行計画を生成する可能性があった, RDBMS における SARGable という用語は、クエリの実行を高速化するためにインデックスを活用できる、特定の形式の述語 (WHERE 句) を指す, SARG / 検索引数は、効率の良いクエリには非常に重要となるが、述語の選択肢が高く、インデックスがサポートされていたとしても、インデックスが使用されることを保証するものではない, データベース開発のアンチパターンとして、データベースをデータストアではなくサービスとして取り扱うものがある, もっとも一般的なパフォーマンスの問題は、有用なインデックスが不足しているため、クエリの結果を返すために、必要以上に多くのページを読み込むことに起因している, 欠落しているインデックスや実行プラン内の警告は、クエリのチューニングを実施する際の出発点としてのみ使用する, クエリオプティマイザにとって、列とインデックスの統計情報は適切な実行プランを選択するために重要となる, SQL Server / SQL Database / Managed Instance では、統計情報の自動更新がデフォルトで有効になっている, sys.dm_db_stats_properties から、統計情報が最後に更新された時間 / 更新後に変更された行数を確認することができ、手動で更新が必要な統計情報の特定に活用できる, コストベースのオプティマイザーであり、すべてのパターンを網羅して実行プランを生成しているわけではないため、クエリ実行に影響のあるプランを生成する可能性がある, これらに対処する方法として、クエリヒント / トレースフラグ / 実行プランの強制 を行うといった、いくつかの調整方法がある, SQL Server は将来的に使用するためのクエリの実行計画をキャッシュして再利用する, 実行計画がキャッシュされているかについては、クエリのハッシュ値に基づき行われるため、クエリテキストの同一性が求められる, ストアドプロシージャや sp_executesql を使用することでクエリのパラメター化を行い、再利用効率を上昇させることができる, パラメーター化されたクエリは、パラメーターの初期値に応じてクエリの最適化が行われる, SQL Server では数百の動的管理オブジェクトが用意されており、これらのオブジェクト含まれているシステム情報か次のようなことを実現できる, 動的管理ビュー (DMV) / 動的管理関数 (DMF) から、データベースやインスタンスの状態に関しての内部データを取得することができる, SQL Server 2016 以降ではクエリストアを使用することができるが、古いバージョンでは、次の DMV を組み合わせて情報の確認を行う。, DMV で情報を取得した場合、クエリストアと異なり、クエリで使用されているプランの変化を辿ることはできない 使用される可能性のある全プランを評価するのではなく、ヒューリスティックにパフォーマンスの良いプランを決定し、そのプランの中で最もコストの低いプランを選択する, 急激なデータの変化が発生した場合は、統計情報の自動更新のタイミングでは情報が更新されず、統計情報が不適切な可能性があることを考慮, 構文の解析ツリーは、バインディングのため Algebrizer というデータベースエンジンコンポーネントヘの入力として使用される, クエリ内のオブジェクトと列が存在するかを検証し与えられたクエリに対して、処理されるデータ型を特定, 列の存在等が確認できた後に、クエリ用のハッシュ値を生成し、一致するハッシュ値がプランキャッシュ上に存在するかを確認する, メモリが不足すると、RESOURCE_SEMAPHORE による待ちが発生する可能性がある, クエリのコストの 25 倍の秒を待機してから再度実行するようになっており、最大で 24 時間待機することができる, クエリを実行する際に使用可能なメモリが十分でない場合は、データが tempdb で処理されるため、メモリと比較すると低速となる, クエリオプティマイザによって生成された実行計画 (プランキャッシュに格納されている実行計画はこのタイプになる), メタデータ / Memory Grant Size はクエリのコンパイル時にデータベースに存在する統計情報からの推定値に基づいたものとなる, 統計情報をベースにして、実行プランを生成しているため、実際の実行は行わず高速に、使用される「可能性のある」プランを確認することができる, 「推定」であるため、実際のデータ操作の際には、異なるプランが生成される可能性がある, 推定実行プランと同等であるが、クエリの実際の実行コンテキストが含まれており、推定行数と実際の行数、実行の警告、実際の並列度、実行中の経過時間と CPU 時間が含まれる, 推定実行プランと実際の実行プランを組み合わせ、進捗状況を 1 秒単位で更新されるアニメーションで確認できる, 大量にデータを取得されている処理 / どこが処理のブロッカーになっているのかが把握しやすくなる (データの流れが止まっている = クエリ内のブロッカー要素), 推定値と実際に処理された行数を比較することで、統計情報と実際に処理されたデータ件数で大きな乖離が発生していないかを確認することができる, SSMS / 拡張イベントを使用して実行プランをキャプチャするとオーバーヘッドが大きい可能性がある, 負荷としては数 % の上昇かもしれないが、個々のクエリのパフォーマンスを大幅に低下させる可能性がある, 実行回数の少ないクエリで負荷が上昇した場合は大きな問題にはならない可能性が高いが、頻繁に実行されるクエリについては、数 % の負荷増が、サーバー全体のパフォーマンスに大きく影響を与える可能性がある, query_thread_profile の拡張イベントで、クエリ内の各演算子のデータを検査できるようになった, ヒントが設定されていると、query_plan_profile 拡張イベントが生成される, ライブクエリ統計の GUI ではなく、DMV で参照することにより取得ができると、既に実行が行われたクエリの情報を柔軟に取得することができる, プランキャッシュからは確認できない、最後に実行されたクエリの実際の処理行数を確認できる, TF2451 を有効化または、LAST_QUERY_PLAN_STATS のデータベーススコープオプションを有効化, ハードウェアリソースの制限 / 最適ではないクエリの構造 / データベースの互換性レベル / インデックスの欠落 / クエリオプティマイザで効率の悪いプランが生成されている, リリース当初から性能が出ていない / データが増加したことにより性能が劣化しているというような可能性がある, 一貫して性能が出ていない場合は、テストが実施しやすい (再現性が確認しやすい) ため、Try & Error で改善点を見つけられる可能性がある, パラメーター化されたクエリでデータの偏りがあり、特定の実行では効率の悪いプランが生成された, ストアドプロシージャ / パラメーター化クエリを使用していて、コンパイルが発生するタイミングで指定されたパラメーターにより生成された実行プランが、他のパラメーターには適しておらず、安定した性能が発揮できない, テーブルアクセス時に他のクエリの完了を待つブロッキング / ハードウェアリソースの競合, ロック競合のような論理的な待機の発生 / 複数のクエリ実行による、過度な CPU 負荷 / ディスク I/O の発生により、ハードウェアリソースへのアクセスが競合している可能性, 単一のクエリ実行では発生しにくいが、負荷が発生し、CPU スレッドや、クエリ間で共有されるメモリのサイズが限定されている場合にハードウェアの制約が明らかになってくる, ハードウェアパフォーマンスは、比較的簡単に確認できるため、トラブルシューティングの早期の段階で確認を行う, 非効率なクエリが実行されていることでハードウェアに過度な負荷が発生しているかを確認する, インデックスが存在せず、クエリの処理に必要となるデータの取得のために CPU / ストレージ / メモリを圧迫している, ハードウェアの問題の対処 (ハードウェア性能の向上) の前に、最適でないクエリのチューニングの実施を検討する, クエリのチューニングを実施しないと、ハードウェア性能を変更しても同様の事象が発生し、スペックを増強した効果が出ない可能性がある, クエリのチューニングを適切に実施することで、ハードウェアスペックを増強しなくても、現状のスペックで対応できる可能性も考えられる, パフォーマンスモニター : Disk Seconds/Read / Disk Seconds/Write, INSERT / UPDATE / DELETE / SELECT を実行し、値のセットに対して作業を行う, セットベースの代わりに、カーソルや While ループを使用し、行ベースの処理を実行することもできるが、処理対象の行の数に応じて、コストが処理対象の行の数に応じて、直線的に増加するため、アプリケーションのデータ量の影響を受けやすくなる, どちらの TVF も動的に行が生成されるため、クエリプランのコストを見積もる際に固定の行数を使用していた, 正しい形式の述語は「検索引数 (Serch Argument)」または SARG と呼ばれる, SQL Server で SARG を使用する = オプティマイザがインデックス (またはテーブル) 全体をスキャンして情報を取得するのではなく、SARG で参照している列の非クラスター化インデックスを使用して SEEK 操作を評価することを意味する, 検索時に列に対して、関数を設定した場合は、非SARGable となり、オプティマイザがインデックスシークを評価できなくなる, データを JSON に変換し、文字列の操作を行う / 複雑な計算を行うためにデータベースを使用する, このようなケースの場合、CPU を過剰に使用してレイテンシーが増加数r可能性がある, すべてのレコードを取得してデータベース内で計算を実行しようとするクエリは過剰な IO / CPU 負荷を発生させる可能性がある, データアクセスの操作と、集計のような処理に最適化されたデータベースを構築することを考慮する, インデックスもリソースを消費するものとなる (書き込みパフォーマンスとストレージサイズに影響を与える) が、インデックスにより提供されるパフォーマンスの向上は、追加のリソースコストを何倍にもわたって相殺することができる, パフォーマンスに問題を持つ実行計画は、クエリ演算子が、Clusterd Index Scan / NonClustered Index Scan + Keylookup の組み合わせ (インデックスだけで処理が完了していない) による特定できるケースがある, データベースエンジンは、実行計画で欠落しているインデックスの報告を行うことで適切なインデックスがないことに対しての問題の解決を行おうとする, 情報が必ずしも有益ということもなく、問題を解決するために主要なクエリはどれなのかを理解し、そのクエリをサポートするためのインデックスを構築することが重要, SQL Server 2016 より前の自動更新のデフォルトの動作は、インデックス内の列への変更が、テーブル内の行数の約 20% になるまで統計情報の更新を行わないというものであった, 上記以降のバージョンでは、自動更新の閾値の動的な設定についてはデフォルトで有効になっている, 互換性レベル 130 以上では、データベースエンジンによって制御されるため、TF の効果はない, パラメーター化されたクエリにより、クエリの再利用効率が上昇することで、クエリのコンパイルに関しての全体的な作業をサーバー上で削減することができる, データの偏り (Skew) がある場合は、パラメーターの初期値でコンパイルされたクエリは、すべてのパターンで最適というわけではないため、データの選択度によってはパフォーマンスに影響を与える可能性がある, クエリ / ストアドプロシージャが実行されるたびに再コンパイルされるため、CPU 使用率が上昇するが、常に現状のパラメーターが使用される, クエリヒントを使用することで、パラメータースニッフィングを使用するのではなく、統計情報のヒストグラムと値を比較するようになる, 実行時のパラメーターに適した最高のプランを得ることはできないが、一貫した実行プランの選択を可能とする, パラメーターによって、動的にクエリを生成し (ここで示す動的なクエリはすべての文字列を結合したアドホックなクエリだけをさすのではなく、パラメーター化クエリの動的な生成についても考慮)、パラメーターによって「OPTION (RECOMPILE)」 のヒントを追加したクエリの生成を行い、実行する, SQL Server では、待機時間を追跡することができるシステムが実装されており、実行中の各スレッドの状態を監視し、スレッドで発生している待機リソースをログに記録している, ワーカースレッドがアイドル状態で、作業が割り当てられるのを待っているときに発生する, 例としては、クライアントアプリケーションに大きな結果セットを返した際の、ネットワーク待機がある, これらの待機統計から、DBA はサーバーのパフォーマンスの全体的な概要を把握し、設定やハードウェアに問題があるかを特定することができる, データはインスタンスの起動時から保持されているが、必要に応じて、データをクリアして変化を観察することもできる, 全体の待機状態から該当の待機状態の比率を算出することで、サーバー内でどの待機事象の発生が多いのかを確認することもできる, 単純に待機時間の降順で集計した場合は、通常時が待機状態のタスクの情報が上位に来てしまうため、ノイズとなる情報を除去することは意識する, メモリが利用可能になるのを待機しており、一部のクエリでメモリが過剰に確保されている可能性がある, 通常、長い実行時間のクエリ / 長時間実行に伴うクエリタイムアウトが発生している可能性が考えられる, 古い統計情報 / インデックスの欠落による不適切な実行プランの生成 / 過剰なクエリの同時実行により発生する可能性がある, 大量のデータをスキャンしているために、インデックスに問題がある (または、効果的なインデックスが不足している) 可能性がある, 待機事象の発生回数が少なくても、待機時間が長い場合には、ストレージのパフォーマンスに問題がある可能性がある, wait_tasks_count と wait_time_ms から平均待機時間を計算することでこの問題の調査を行うことができる, 待機が高い場合、並列クエリの並列度が高い (不適切な構成) になっている可能性がある, SQL Server では、MAXDOP が 0 (すべての CPU を使用) するように設定されており、並列処理のコスト閾値 (Cost Threshold for Parallelism : CTfP) の設定はデフォルトで 5 に設定されている, CXPACKET が発生しているということは、並列クエリが実行されていることを示すため、CPU 使用率が高いことを示す可能性もある, インデックスチューニングで適切なクエリが実行されるようになると、SOS_SCHEDULER_YIELD / CXPACKET が低下し、パフォーマンスが向上する可能性もある, データページ 2:1:1 (DBID = 2 / File ID = 1 / Page ID = 1) の競合が発生している場合は、tempdb の Page Free Space (PFS) の競合が発生している可能性が考えられる, CPU のコアごとに 1 つのデータファイルを追加し、最大で 8 ファイルとして設定を行う, べてのデータファイルのサイズ / 自動拡張サイズを均等に設定し、ファイルが均一に利用されるようにする, SQL Server 2016 以降は tempdb のデータファイルは同時に拡張が行われ、一貫したサイズを提供できる, それより前のバージョンではTF1117 を利用することで、同様の動作とすることができる, DMV と同様の粒度ではないため、精度は低くなるが、クエリがどのような要因により待機しているかを確認するための重要な情報として活用できる, 適切にインデックスが設定されたデータベースは、クエリの結果を返すために実行される I/O が少なく、これにより、I/O とストレージシステムの両方にかかる負荷を軽減することができる, Read と比較して、Write のワークロードが多い場合は、インデックスを追加することで、行の更新のコストが多くなり、インデックス追加のメリットが低い可能性がある, Write でも更新を実行している場合、インデックスの追加により、Lookup 操作を最適化し、インデックス追加のメリットを受けることができる可能性がある, 毎日使用されているのではなく、月次/四半期/年次で実行される処理で使用されている可能性を考慮する, インデックスの削除後に処理を実行し、定期的なスケジューリング処理に影響がないことを確認することも検討する, 非本番環境でインデックスを作成し、クエリ実行とパフォーマンスをテストし、パフォーマンスの変化を観察する, 本番と非本番環境でメモリサイズ / CPU 数が異なる場合、実行計画に影響を与える可能性があるため、ハードウェアに違いがあるかを認識しておく, インデックス列の先頭の項目が、通常オプティマイザが該当インデックスを使用するかどうかの決定に大きく影響を与える, インデックスの列の先頭の項目が選択的であり、多くのクエリの WHERE 句で使用されるのが望ましい, インデックス作成についてもソース管理の配下に置いておくことで、インデックス変更によるパフォーマンス影響が発生した場合に、以前のインデックスを素早く作成することにつながる, 断片化は、データベースエンジンが、必要なデータを見つけるため、追加のページを読む必要がある場合、クエリパフォーマンスを低下させる可能性がある, SQL Server 2017 以降では、再開可能なインデックスのオンラインメンテナンス機能が追加されている