再コンパイルが約 50 ~ 60% のデータベースがあります。その値は、[SQL Compilations/sec] と [Batch Requests/sec] を組み合わせたものです。
その値は少し高いと思います
このクエリを見ると:
SELECT TOP 150
qs.plan_generation_num,
qs.execution_count,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE qs.plan_generation_num > 1
ORDER BY plan_generation_num DESC
実行回数と比較すると、plan_generation_num は多くありません。私たちが持っているのは使い捨てのオブジェクトがたくさんありますが、その理由を理解しようとしていますか?
私たちのアプリケーションは ASP.NET で構築されており、常にパラメーター化されたクエリを使用しています。アプリケーションでは SP と SQL ステートメントの両方を使用しますが、常にパラメーター化されています。
このデータベースに対して実行される Web ページは、毎日約 500 000 ページビュー、毎分約 10 000 リクエストのかなり大きな Web サイトです。
長時間実行されているクエリとインデックスはなく、統計は順調です。これは、最適化する最後のものの 1 つです。
CPU は平均 15%、RAM は約 100 GB で、もちろん SQL サーバーによって使い果たされます。SQL Server 2014 Enterprise を使用しています。
気になり始めたことが一つ。このようなSQLステートメントがある場合
SELECT doors, windows, seats from cars where Wheels = @Wheels AND Active = 1
このパーツにパラメーターを設定していないため、このプランは再利用されません: **AND アクティブ = 1 **
使い捨てが多い理由を理解する方法はありますか? キャッシュされたプランのカウントは約 20,000 です。比較すると、アプリには約 700 個の sp があり、さらに多くのクエリがあります。