MarkLogicサーバーには、10個の組み込み関数で提供される非常に優れたプロファイリング機能があります。 それらはすべてネームスペース「http://marklogic.com/xdmp/profile」にあり、接頭辞「 prof: 」でアクセスできます。
prof:eval( $xquery as xs:string, [$vars as item()*], [$options as node()?] ) as item()*
この関数は、テストする価値のあるテキスト文字列としてXQueryに渡されます。
prof:eval( "1 + 1" )
prof:evalの戻り値はシーケンス(<XML with report>、<XQuery execution result>)です。 レポートには、XQueryの実行に関するかなり詳細な情報が含まれています。
例
<prof:metadata> <prof:overall-elapsed>PT0S</prof:overall-elapsed> <prof:created>2013-09-13T00:00:00.000+04:00</prof:created> <prof:server-version>6.0-3</prof:server-version> </prof:metadata> <prof:histogram> <prof:expression> <prof:expr-id>13367197075475374717</prof:expr-id> <prof:expr-source>1 + 1</prof:expr-source> <prof:uri/> <prof:line>1</prof:line> <prof:column>33</prof:column> <prof:count>1</prof:count> <prof:shallow-time>PT0S</prof:shallow-time> <prof:deep-time>PT0S</prof:deep-time> </prof:expression> </prof:histogram> </prof:report>, 2
この方法で渡されたXQueryは、 prof:evalが実行されるコンテキストに関連付けられていないことに注意してください。 デバッグされたXQueryにパラメーターを渡すために、 $ varsパラメーターを使用できます。これは、フォーム(QName、<value>)内の変数のシーケンスです。 例
prof:eval( "declare variable $a external; $a + 1", (fn:QName("", "a"), 1) )
かそこら
prof:eval( "declare variable $a external; declare variable $b external; $a + $b", (fn:QName("", "a"), 1, fn:QName("", "b"), 1) )
XQueryの実行中にエラーが発生した場合、 prof:evalはPROF-PROFILEALLOW例外をスローします 。
次の関数については、 prof:evalに似ていると言えますが、テキスト文字列としてXQueryではなく、XQueryモジュールへのパスを受け取るという唯一の例外があります。
prof:invoke( $path as xs:string, [$vars as item()*], [$options as node()?] ) as item()*
XQueryモジュールはライブラリである必要はなく、「メイン」実行可能モジュールである必要があります。 モジュールへのパスは、アプリケーションサーバーのルートを基準にして解決されます。 それ以外の場合、 prof:invokeは prof:eval と完全に類似しています。
MarkLogicサーバーを使用すると、 prof:evalおよびprof:invoke関数に渡されるXQueryだけでなく、プログラムモジュールに直接配置されている命令のプロファイルを作成できます。 さらに、プロファイリングは特定のプログラムコードではなく、サーバーによって処理されるリクエストに関連付けられています。 これにより、現在のリクエストのコードをデバッグできるだけでなく、IDを知っていてアプリケーションコードに干渉しないリクエストを分析することもできます。これは、本番環境でアプリケーションを分析する場合に非常に役立ちます。
実行に関する情報の収集を開始するには、関数を呼び出す必要があります
prof:enable( $request-id as xs:unsignedLong ) as empty-sequence()
$ request-idは、プロファイリングを開始するリクエスト識別子です。
xdmp:request()関数を使用して、現在のリクエストのIDを取得できます。
情報の収集を停止するには、関数を使用する必要があります
prof:disable( $request-id as xs:unsignedLong ) as empty-sequence()
上記から次のように、現在のリクエストに対してプロファイリングが実行される場合、または現在のリクエストの分析が実行されない場合にこれらの関数が呼び出された時間の間に、 prof:enableおよびprof:disable関数の呼び出し間で処理されるコードをプロファイルできます。
プロファイラーを使用しようとすると、次のユーザー権限がチェックされます
「Http://marklogic.com/xdmp/privileges/profile-my-requests」-リクエストをプロファイルする
「Http://marklogic.com/xdmp/privileges/profile-any-requests」-リクエストをプロファイルする
もちろん、小さな例外があります-現在のリクエスト(プロファイリング機能があるリクエスト)のプロファイリングには、特別なゴーストは必要ありません。 「profile-my-requests」は、現在のユーザーのすべての(現在を除く)リクエストをプロファイリングする権利を与えます。
特定のリクエストでプロファイリングが利用可能かどうかを確認するには、次の関数を使用できます
prof:allowed( $request-id as xs:unsignedLong ) as xs:boolean
リクエストの実行について収集された情報を取得するには、関数を使用する必要があります
prof:report( $request-id as xs:unsignedLong ) as element(prof:report)?
レポートとXQueryの結果を返すprof:evalとは異なり、prof:レポート関数はレポートのみを返します。
教授の例:レポート
let $e as empty-sequence() := prof:enable( xdmp:request() ) let $r as xs:string := fn:string( 1 + 2 ) return prof:report( xdmp:request() )
蓄積された情報を削除して、再度レポートを開始する必要がある場合があり、このために機能が使用されます
prof:reset( $request-id as xs:unsignedLong ) as empty-sequence()
次の関数はprof:eval関数と似ていますが、それとは異なり、 prof:valueは指定されたXQueryの実行時にコンテキストを継承します。
prof:value( $expr as xs:string ) as item()*
profによるコンテキストの継承:値関数を使用すると、このようなコードを記述できます
let $a := 1 let $b := 2 return prof:value('$a + $b')
さらに2つの興味深い機能があります。
prof:xslt-eval( $stylesheet as element(), $input as node()?, [$params as map:map?], [$options as node()?] ) as item()*
prof:xslt-invoke( $path as xs:string, $input as node()?, [$params as map:map?], [$options as node()?] ) as item()*
$ inputは、XSLTプロセッサで処理されたXMLドキュメントです。
これらの関数の名前から、これらがprof:evalおよびprof:invoke関数に似ていることは明らかですが、MarkLogicサーバー開発者が製品に慎重に組み込んだプロセッサであるXSLTのプロファイルに使用されます。
MarkLogiServerは、パフォーマンス分析のための強力なツールを提供します。 このメカニズムを使用すると、さまざまなタスク用の複雑なプロファイラーを作成できます。 同時に、MarkLogiServerの統合コンソールにはグラフィカルなプロファイラーが搭載されているため、小さなタスクや開発プロセスで分析プロセスがより簡単で便利になります。