別のメモリー・コンシューマーの数の名について
(メモリーの助成金を)許可されたものをメモリあなたは今まで疑問に思っていますか?
何が(予定)メモリ(QE予約)クエリの実行を予約されていますか?
そして、クエリ実行メモリ(クエリ実行メモリ)?
ワークスペースメモリ(ワークスペースメモリ)、及び記憶保持(翻訳者注:多くの場所は予約が「予約済み」と訳されます、個人的に私は、「予約」と所定の代名詞の下に、理解しやすい「スケジュールされた」時間として翻訳と思います)
同じ単語での短期で多くのものの生活、など:名前が同じSQL Serverのメモリ消費者を指しているので、
並べ替えたりするために、問い合わせ中(一括コピー、およびインデックスの作成、などを含む)のハッシュ演算メモリの割り当ては
、私は、クエリの実行時に大きな話題から生じるために許可してください、クエリは異なる「バケット」または店員からメモリを割り当てることができる、(アプリケーションのさまざまな部分からの差)はアプリケーションに依存します行うために使用されるメモリ。
たとえば、クエリが解析され、最初にコンパイルされ、彼は、コンパイルやメモリ消費を最適化する必要があります。クエリがコンパイルされると、彼は、リリースされるアプリケーションのメモリ
に対応するクエリ実行プランがキャッシュされている間、この計画の実施のためには、プロシージャキャッシュのメモリを消費することになり、このメモリが占有されているサーバーが再起動されるまで、またはメモリ圧力は、クエリを実行する準備ができて、この時に発生します。
注文や問い合わせが発生(または接続の組み合わせ)をハッシュする場合、それが結果やハッシュバケット格納するための所定のメモリストレージの(結果)を達成するために使用することが好ましく、
メモリのこの部分は、クエリの実行中に発生し、それが特定の多くを伴うだろうメモリの名前。
用語およびトラブルシューティングツール
私たちはあなたが発生する可能性があり、この人物に異なるカテゴリーのメモリ消費量をリコールしてみましょう。
同様に、これらの全ては、同一のメモリ割り当てに関連する概念について説明します。
クエリ実行メモリ(QEメモリ):
この1は、クエリの実行中に、この事実を使用するために、ソート/ハッシュメモリを強調するために使用され、クエリは、実行中の最大メモリ消費の一部です。
スケジュール設定やメモリーブッククエリメモリ(QE):
クエリは、動作準備のメモリをハッシュ/ソートする必要がある場合、実行時に、彼はベースとなるときは、オリジナルのクエリプランのソートやハッシュ演算、メモリ予約要求(メモリ予約要求の実装が含まれます)、
その後、クエリは、SQLServerのは、使用可能なメモリサーバに主に依存、クエリの一部またはメモリ要求のすべてを許可する一方で彼は、メモリを要求し、実行を開始した
メモリのこの部分を維持するために、MEMORYCLERK_SQLQERESERVATIONSメモリ店員を呼び出したメモリカウンタをケースの割り当て。
翻訳者注------------------------------ ----------------- ----------------
このメモリは、以下のサーバーのスクリーンショットでMEMORYCLERK_SQLQERESERVATIONS割り当ては、サーバー負荷が存在している、sys.dm_os_memory_clerksから照会することができる
メモリのこの部分はまだ小さくないことを示します、そこに4ギガバイトMEMORYCLERK_SQLQERESERVATIONS(サーバ・メモリ32ギガバイト)以上のもの
サーバはメモリ使用量が非常に低い場合ロードされない場合、あるいは0
-------------------------------------------------- ------------------------
メモリ許可(メモリー補助金):
メモリの要求を許可するための要求へのSQL Serverは、メモリ許可が発生すると呼ばれた場合、
パフォーマンスカウンタがある多くのメモリを保持するメモリの要求を許可されています。メモリ助成卓越したを
別のカウンタは、その存在を示していますメモリ助成金は保留中:クエリの実行はメモリが不足しているため、どのように多くのお問い合わせは、ソート/ハッシュメモリを要求したが、国家のために待っていた
これらの二つのメモリカウンタを受賞メモリとメモリ助成金の欠如を示し、つまり、単一のクエリこれは、並べ替えを実行するために4GBのメモリを消費することができるが、いずれの場合にも反映されません
翻訳者注------------------------------ ----------------- ----------------
このメモリは、より多くのリクエストをリアルタイムメモリ、SQL Serverのリアルタイム要求、より大きなメモリのこの部分、として理解することができる
ように同時に実行するために必要なメモリのセッション20メガバイトなど動作は、200メガバイトセッション10、100実行セッションの2000メガバイトの必要性を必要とする、当然のことながら、各セッションではない同じメモリ(メモリ許可)を実行する必要があり、単なる例のために本明細書
sys.dm_os_memory_clerksから照会することができ、次のスクリーンショットでありますサーバの負荷のMEMORYCLERK_SQLQERESERVATIONS分布、サーバが存在する
メモリのこの部分は小さくないことを示す、4ギガバイトMEMORYCLERK_SQLQERESERVATIONS(サーバメモリ32ギガバイト)よりも多く存在する
メモリ使用量が非常に低い場合、サーバがロードされない場合であっても、 0することができ
、メモリは優れたセッションは、待機状態のメモリで、そのアプリケーションメモリの特定することはできません許可し
、通常、SQL Serverは自己制御(セルフチューニング)エンジンであり、このメモリは、一般的には十分に確保されます メモリ不足が理由の場合は、SQLの待ちが発生していない実行する
すべてのものに明確な優先順位が必要な同じメモリに分割され、選択科目要求された、スコア、そこにデータをキャッシュするためにメモリを占有しない、リアルタイムでさえ、ここですることはできませんそれに応答します。
不適切な例を与えるために、関係なく、車なしで家を購入することはできませんどのように貧しい人々 、合計がそれを食べるために十分なお金を残していません。
メモリは(すぐにメモリ不足に置き換えることができるようにデータキャッシュのような)圧力の別の場所に存在するかもしれないが、対応するメモリ要求リアルタイム、SQL Serverのの顔は、かなり十分なままめったに見られないので、個人的なメモリのとセッションを実行するために待つことができません状況。
しかし言葉は、オンにすることはできません何のメモリー補助金保留中と言うことはできません、それはメモリの圧力を意味しません。
-------------------------------------------------- --------------------------
彼らは適用されている個々の要求やメモリを観察するために、あなたは、DMV sys.dm_exec_query_memory_grantsチェックすることができ
、このDMVは、現在ではなく、歴史的な状況よりも、クエリメモリ許可の状況を実行している示し
代わりに、あなたは彼らについてお問い合わせ、実際のクエリ実行プランをキャプチャすることができますXMLクエリプランは、ノードと呼ばれ、それはメモリ許可サイズが含まれ、
以下の例:
「。8" <クエリ実行計画DegreeOfParallelism = MemoryGrant = 『2009216』が
別のgranted_query_memoryカラムユニットと呼ばれる8キロバイトを含む、sys.dm_exec_requests DMVであります、
このようなメモリ許可の8000キロバイト1000 *の8キロバイトを意味し、またはである、1000の値として
ワークスペースメモリ(ワークスペースメモリ):
それは、別のメモリは、同じ項目を記述している
あなたは、多くの場合、すべての並べ替え/ハッシュ演算のための現在のメモリ使用量を反映ワークスペースメモリ(KB)付与されたこの技術分野のパフォーマンスを見ることができます
(最大ワークスペースのメモリ(最大ワークスペースメモリーをKB))が最大のワークスペースメモリの開始以来、SQL Serverの数です。
私の意見では、このプロジェクトは、SQLServer2000をsqlserver7.0メモリ割り当ての遺産を記述するために使用される作業用のメモリ空間は、SQLServer2005後にキャンセルされたされました
リソースセマフォ(リソースセマフォ):
より多くの複雑さを追加するには、このコンセプトためには、SQL Serverは、スレッド同期オブジェクトを使用するには、メモリを付与されているどのように多くのトラックを維持するためにセマフォ(セマフォ)と呼ばれます。
あなたはSQLServerのワークスペースメモリ/ QEメモリが不足した場合、メモリ不足エラーの代わりに使用するクエリの実行に失敗しました(直接ではないフィードバッククエリは失敗したが、メモリを待っている):アイデアはこうです
、それは、クエリの待機可能なメモリにつながると(使用可能なメモリを取得した後)に再実行することができます
このプロセスでは、パフォーマンスカウンタの保留メモリの補助金は、理解するために開始します。
だから、timeout_sec、granted_memory_kb = NULLでsys.dm_exec_query_memory_grantsでwait_time_ms、生成され
たメモリを待っている二つのメモリを実行します、道を、そしてこれは、メモリ不足の状況で、SQL Serverでのみコンパイラのメモリです。
他の例では、クエリが失敗し、701エラーに直接報告-メモリが足りません。
また、SQL Serverのタイプに待機している別のクエリが--RESOURCE_SEMAPHOREメモリ助成金を待っていることを示す
文書に記載されているように、これはたまたま、クエリメモリは、他の同時クエリの実行にすぐに付与することはできません。
頻繁に待ち時間や時間があまりにも多くの同時クエリ、または過度のメモリ許可量を示している可能性があり待ちます。
あなたはこのDMWでセッション・レベルの待機sys.dm_exec_requestsを観察することができます
なぜ我々は、メモリ補助金やワークスペースメモリーまたはクエリ実行メモリまたはあなたがそれを呼び出すどんなにに焦点を当てる必要があります。
過去数年間、パフォーマンスの問題の診断のために、私は、アプリケーションが非常に定期的にいくつかの単純なクエリを実行に見え、これは最も一般的なメモリ関連の問題の一つであることが判明、
しかし、実行の並べ替えやハッシュ操作の多くは多くを負っのためパフォーマンス破壊する
これらのクエリが実行中に大量のメモリを消費し、メモリを待っている他のクエリにつながることができるだけでなく、これは、パフォーマンスのボトルネックです。
私は上記のツール(DWVs、パフォーマンスカウンタ、および実際の実行計画)を使用する可能性、あなたが最適化/書き換えを検討し、その後、多くのメモリを消費しているクエリをチェックアウトすることができます
ソート/ハッシュ操作プロファイルが生成されます
ここでは、クエリー・リライトを述べたいくつかのメモリ付与された例多くにつながる可能性があります
ソート操作(含むが、以下の場合に限定されない)の原因
BY ORDER(SQL-T)
GROUP BY(SQL-T)
DISTINCT(SQL-T)
合成入力が結合され、前記結合操作は、オプティマイザによって選択されたマージそれは注文する必要があります。
(以下の例を含むがこれに限定されない)原因ハッシュ演算を一致させる
(T-SQL)を登録しよう-あなたはハッシュ操作SQLを実行することを選択した場合、一般的に高価なの欠如は、結合操作されたインデックスの合理的な結果を参加--hash、観測計画
(T-SQL)DISTINCT -ハッシュ重合は観測計画、異なる操作を実行するために使用することができる
SUM / AVG / MAX / MIN( T-SQL) - 任意のポリマーハッシュ演算重合、観察プログラム引き起こし得る
UNIONを-ハッシュ重合は、重複する項目を除去するために使用することができます
これらの一般的な原因を理解することは、メモリのSQL Serverの大量の要求を許可することも可能な限り排除するためにアプリケーション開発者を支援することができます。
いつものように、基本的なクエリのチューニングは、大規模なソートを削減または排除するために、できるだけ多くを読むためにそれらを軽減するための適切な指標があるかどうかの問合せを検討し始めます。
ここでは、参照用メモリ許可のブログがあるhttp://blogs.msdn.com/b/sqlqueryprocessing/archive/2010/02/16/understanding-sql-server-memory-grant.aspx