運用アプリケーション(SQL Server 2014 Standardと通信するC#)には、以下のようなクエリがあります。ほとんどの場合、ミリ秒単位で実行されます。ただし、(特定の値の場合@Id
)場合によっては非常に時間がかかり、1分ほどかかります。これはアプリのタイムアウトよりも長いため、ユーザーにとってアプリは失敗します。
"goes nuts"の場合、返される結果セットは他のすべてではないが多くの場合にそうであるように、正しく空です。
幸いなことに、これは実稼働環境と開発環境の両方で再現可能です。
開発者は、クエリから「TOP 1」を削除し、アプリが結果セットの余分な行を消費することを確認して、パフォーマンスの問題を解決すると言います。
クエリプランナーは、インデックスTOP 1
が存在する場合はインデックスを提案しません。(開発中)。
クエリの変更とアプリの修正が進行中です。ロールアウトには時間がかかります。
私の質問:アプリが新しいクエリで変更される前に、この問題を克服するために、運用SQL Serverインスタンスをチューニングまたは微調整するDBAアクセス可能な方法はありますか?
SELECT TOP 1
subscription_id
FROM subscription AS sub
JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id
JOIN person_group AS apg ON apg.person_id = bi.person_id
JOIN pplan ON pplan.plan_id = sub.plan_id
JOIN product ON product.product_id = [plan].product_id
JOIN product_attribute ON product_attribute.product_id = product.product_id
WHERE apg.group_id = @Id
AND apg.start_date < GETDATE()
AND (apg.end_date IS NULL OR apg.end_date > GETDATE())
AND (sub.end_date IS NULL OR sub.end_date > GETDATE())
AND product_attribute.attribute_type = 'special feature'
AND product_attribute.attribute_data = '1'
ORDER BY sub.start_date ASC;
@ID
常に「気違い」になりますか?その場合、それらの値のいずれかを使用してテストし、実際のクエリプランをキャプチャします。それは何が悪いのかを教えてくれます。「悪い」値に一貫性がない場合、これはパラメータースニッフィング(解決策については@MartinSmithの回答を参照)であるか、クライアントが実際に結果セットを要求して消費する方法に関係するロックの問題である可能性があります。