web-dev-qa-db-ja.com

SQL Serverで新しいトレースフラグを見つける方法

そこには多くのトレースフラグがあります。一部は十分に文書化されており、一部はそうではありません。また、2016年のリリースでデフォルトの動作ステータスに移行する方法が見つかったものもあります。公式サポートチャネル、マイクロソフトの従業員などの他に、新しいトレースフラグを見つける方法は何ですか?

Aaron Bertrand herehere による最近の投稿をいくつか読みましたが、新しいトレースフラグについては何も見つかりませんでした。

Mssqlsystemresourceのデータとログファイルを新しい場所にコピーし、通常のデータベースのように添付してシステムテーブルとビューを突き抜けましたが、すぐには何も見つかりませんでした。既知のトレースフラグのリストを取得し、そのリストにない番号をループして、DBCC TRACEONが許可するものを確認することを検討しましたが、まずここで質問したいと思いました。

それらを有効にするDBCCコマンドが、トレースフラグが有効であることを確認するために、いくつかのリソースでチェックインする必要があると仮定すると、どこに到達しますか?リストを保持する.dllまたはその他のシステムファイルはありますか?

私は質問が幅広いネットを投げかけることを知っていますが、これに拍車をかけたのは、記述された効果を持たなかった2016年の新機能とともに特定の意図された動作を伴うトレースフラグについて読んでいたことです。私の最初の考えは、おそらく7129が7219になるように、数値が何らかの方法で転置されたということでした。順列を探すために、たとえば7000〜7999の範囲内の有効なトレースフラグのリストを取得したいと考えていました。 DBCC TRACEONフラグと起動パラメーターの両方としてそれらをすべてテストすることは、機能の動作に対する結果をテストすることと組み合わせると、かなり厄介なことになります。

38
Erik Darling

リストを見つけるには、質問するか、投稿/スライドデッキなどからピックアップするしかありません。リストは、コード内、ヘッダーファイル内にのみ存在します。ヘッダーファイルでは、有効なトレースフラグ番号がC++コードの大きな列挙型の名前にマップされ、その後、残りのコードで名前が使用されます。

Aaronが言ったように、任意のトレースフラグ番号を有効にすることができ、何もしない場合、またはトレースフラグが関連する機能を実行しない場合は、動作の違いに気付くことはありません。

DBCC TRACEONは何もチェックしません-どの番号が有効かどうかのランタイムリストがないため、その接続/グローバルに設定されているフラグのビットマップでトレースフラグ番号を有効にするだけです。

有効性チェックの問題は、どのトレースフラグが有効であるかを明らかにして、それらを発見できるようにすることです。このようにして、「有効なリスト」は事実上難読化されます。これがSQLチームが望んでいることです。

SQL Serverがselect * from sys.available_trace_flagsを持つべきであるというコメントでのKinの提案について-はい、いいえ。パフォーマンスに非常に有害であり、製品サポートからのガイダンスに基づく問題のデバッグにのみ必要なトレースフラグは多数ありますが、SQL Serverは「安全な」フラグをリストすることができます。

42
Paul S. Randal

新しいトレースフラグを見つける方法は何ですか?

ほとんどの場合、それはそれらを探すために費やす時間と感情的なリソースを持つことです。

確かに、可能性のあるトレースフラグ番号をループしてその影響を分析するスクリプトを作成することは可能ですが、これが常に効果的であるとは限りません。これには多くの理由がありますが、一般的なフラストレーションには、一部のトレースフラグが他のフラグとの組み合わせでのみ有効である、起動時に_-T_でのみ機能する、または_DBCC TRACEON_で使用した場合にのみ機能する、などがあります。 OPTION (QUERYTRACEON)。文書化されていないコマンド、コマンド拡張、または特定の機能を有効にするために必要なものもあります。エフェクトを探す場所がわかっている場合にのみ、エフェクトを生成するものもあります。などなど...非常に...など。

とはいえ、おそらく最も効果的な手法は、特定のクエリまたはコマンドの実行を、デバッガーまたはその他のプロファイリングツールを使用して段階的に実行し、トレースフラグのオンとオフで行われるパスを比較することです。これが時間がかかるように思える場合、それはそれが理由です。

私にとっては、何かが潜在的に非常に興味深いものであるか、現実世界の問題に関連していて、私がそれに取り掛かることさえ考えられるより良い解決策がなければなりません。また、このプロセスを数百回または数千回実行したことがある場合は、探している種類のトレースフラグの範囲が最も効果的である可能性が高く、どの部分がコードベースの興味深いものになります。

_CSessionTraceFlags::CheckSessionTraceInternal_にブレークポイントを設定し、edxレジスターの値をチェックする(どのトレースフラグがチェックされているかを確認する)ことは、単純な場合に役立ちますが、興味深いケースは多くの場合単純ではありません。すべてのトレースフラグが、実行されるコードパスに影響を与えるポイントでチェックされるわけではありません。

公式トレースフラグ のかなり小さなリストがあります。これらは完全にテストされたフラグであり、CSSおよび最終的には製品開発者によってサポートされます(サポートされる予定です)。それらはまた、文書化する価値がある共通の十分なユースケースを持つフラグです。

あなたが見つけた他のトレースフラグは、さまざまな状況(異なるビルド、SKU、セキュリティ設定、さまざまな機能など、他に考えられるか考えられないもの)で予期しない影響を与える可能性がある好奇心です。これらは、たとえあったとしても、それらについて書いた人によってのみ「サポート」されます。

いくつかの非公式リストがありますが、私が知っている最高のリストは、Aaron Morelliによる SQL Serverフラグのトピックコレクション です(現在、v6、2016年4月)。

そうは言っても、Microsoft CSSは(最終的に)すべてのトレースフラグにアクセスできるため、公式リストに載っていない場合でも、遭遇したものについてアドバイスを提供できる場合があります。もちろん、彼らは何も言わないことを選ぶかもしれません、そして、料金が含まれるかもしれません。私は自分でそのルートを行ったことがないので、本当にわかりません。

41
Paul White 9

Githubでトレースフラグのコレクションを維持します(現在599トレースフラグ):

Microsoft SQL Serverトレースフラグ

また、Brent Ozarが彼の素晴らしい記事 Bad Idea Jeans:Finding Undocumented Trace Flags とJoe Obbishがこの素晴らしい記事で説明した非常に優れたテクニック A Trace Method to Find Trace Flags

14