web-dev-qa-db-ja.com

多くのアドホッククエリがサーバーに影響を与える

アドホックステートメントを大量に生成するサードパーティのアプリケーションがあります(サーバーには16 GBのメモリがあり、キャッシュには140000のアドホッククエリが存在します)。クエリキャッシュは肥大化しません。サプライヤーに問い合わせの調整を依頼しましたが、彼はそれらを変更したくありません。

私の質問は、多くのアドホッククエリがサーバーにどのような影響を与える可能性があるかです。私の最初の考えは多くのコンパイルです。

クエリごとに複数の実行プランが保存される可能性があります。クエリテキストの構造化方法(キャリッジリターンの位置など)のわずかな変更は、エンジンによって異なる解釈が行われ、別のクエリと見なされます。

このリンクには、複数のプランを検索するためのスクリプトがあります。 https://www.brentozar.com/blitzcache/multiple-plans/

クエリは、この問題があまり目立たないようにパラメータ化されるのが理想的です。

これは、キャッシュされたプランに利用可能なスペースの量に影響し(プランキャッシュの膨張により)、最適ではないプランが選択される可能性があるため、クエリのランタイムに大きな差異が生じる可能性があります。プランがキャッシュにない場合の再コンパイルは、他の要因になる可能性があります

0
Peter

使用可能なメモリの量に影響を与える可能性があります。各クエリプランは、SQL Serverから少しメモリを奪います。

また、計画を作成する必要があるたびに、SQL Serverはそれをコンパイルする必要があります。つまり、他のプロセスに使用できるCPUを使用します。 CPUの競合が高い場合は、それが問題になる可能性があります。

このクエリは、クエリプランの実際の大きさを確認するのに役立ちます。

SELECT TOP 1000
    st.text ,
    cp.cacheobjtype ,
    cp.objtype ,
    cp.refcounts ,
    cp.usecounts ,
    cp.size_in_bytes ,
    cp.bucketid ,
    cp.plan_handle
FROM    sys.dm_exec_cached_plans cp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE   cp.cacheobjtype = 'Compiled Plan'
    AND cp.objtype = 'Prepared'
ORDER BY cp.usecounts DESC;
1
SQLStad