4

私のアプリケーションは、SQL Server データベースに対してクエリを実行します。

多くの場合、実行計画のメリットを実感できます。たとえば、ボタンを初めてクリックすると、

SELECT * from Tasks
WHERE IdUser = 24 AND
  DATE < '12/12/2010' and DATE > '01/01/2010'

最初は 15 秒、次は 8 秒かかります。

編集: パラメータ化されたクエリを使用します。

したがって、2回目で7秒の改善があります。

ここで、アプリケーションを再度実行すると (新しいデータベース接続を行うため)、最初は 15 秒、2 回目は 7 秒かかります...

少なくとも同じ日の実行計画を記憶するために、SQL Server に実行計画を保存するように指示するにはどうすればよいでしょうか? または、すでに計算された実行計画の利点を得るにはどうすればよいですか? 異なるユーザーが同じクエリを実行する場合、おそらく IdUser が異なる場合でも、同じ実行プランを使用するのに十分なほどスマートであることを SQL Server に伝える方法です。

ソフトウェアにはいくつかのパラメーターがあるため、次のクエリの実行では MinDate と MaxDate が異なる可能性がありますが、これはクエリ プランに影響しますか?

4

3 に答える 3

2

パラメータ化されたクエリを使用して、プランがキャッシュされる可能性を最大化します

SELECT * from MYTasks 
WHERE IdUser = @UserId AND DATE < @enddate and DATE > @startdate

SQL Server は自動パラメータ化を行いますが、これについては非常に保守的です。

以下から、計画の再利用についての洞察を得ることができます

SELECT usecounts, cacheobjtype, objtype, text, query_plan, value as set_options
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) 
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
where text like '%MYTasks%' and attribute='set_options'
于 2010-09-02T16:05:42.633 に答える
2

SQL Server がこれを行います。使用可能なスペースがある限り、すべての実行プランが保存されます。

ただし、実行計画が保存されて再利用される可能性を高めるために、多くのことができます。注意が必要なのは、同一の SQL クエリを作成することです。余分なスペースに至るまで、SQL Server は 2 つのクエリを異なるものと見なす可能性があります。既存のクエリ プランを再利用しないでください。

したがって、次のようになります。

  • クエリで一貫性を保つ - 常に同じ方法で綴ります (大文字/小文字、空白、dbo.接頭辞などに注意してください)。

  • リテラル値の代わりにパラメーターを使用します。リテラル値を使用すると、クエリ プランが再利用されず、プラン キャッシュが不必要にいっぱいになります。

  • これは、クエリ オプティマイザーのオプションが少ないことを意味しますSELECT *。すべての列が必要なため、通常はクラスター化インデックスでスキャンを実行する必要があります。本当に必要な 3、5、6 列を指定すると、クエリをカバーする (関心のあるすべての列を含む) インデックスが存在する可能性があるため、クエリ分析はそのインデックスを使用して、その上でインデックススキャン/インデックスシーク(およびその計画を再利用)。

したがって、SQL の代わりに、代わりにこれを使用します。

SELECT (list of fields)
FROM dbo.MYTasks 
WHERE DATE < @EndDate and DATE > @StartDate

これにより、クエリ プランの再利用が大幅に増加するはずです。

于 2010-09-02T16:06:10.097 に答える
0

SQL Serverプロファイラーを実行しましたか?もしそうなら、ステートメントのコンパイルと実行計画の生成に余分な時間がかかると確信していますか?

問題の説明から、データベースへの初期接続をセットアップするために、さらに7秒かかる可能性があります。多分あなたはすでにこれを除外しました。知らない。

追加の懸念事項はデータキャッシュです。初めてデータにアクセスするとき、SQLServerはデータをキャッシュにロードします。これにより、後続のクエリの時間を短縮できます(すべてのデータを保持できると想定)。

于 2010-09-02T16:28:50.930 に答える