1

SQL Server と GORM (Grails / Hibernate) を使用しています。

最近、DBA から、データベース内の特定のクリティカル パス テーブルで、通常の Hibernate プリペアド ステートメントの代わりにストアド プロシージャを使用できるかどうか尋ねられました。彼はパフォーマンスなどについては気にしていませんが、Hibernate の準備済みステートメントをプロファイリングするのは非常に難しいと説明しました。準備されたステートメントの exec を取得するだけです。本番システムでこの 2 つを調整することはほぼ不可能です。」

もちろん、準備されたステートメントを手動で構築/実行するよりも、アプリケーションで通常の挿入/更新/削除の動作でドメインクラスを使用することをお勧めします。そこで、次の 2 つの質問が頭に浮かびます。

  1. Hibernate の準備済みステートメントのプロファイリングを容易にするために、SQL Server プロファイラーを何らかの方法で構成できますか、または何らかの手法がありますか? そうでなければ...
  2. Hibernate / Grails アプリで通常どおりにドメイン クラスを使用できるが、バックエンドのコード生成を変更できる非侵入型のカスタマイズはありますか (わからない、おそらく Hibernate Intercepts を使用して...おそらく特定の挿入/更新/削除操作の準備済みステートメントの代わりに使用するSP...または、プロファイリングセッションでDBAが識別できるようにするために、準備済みステートメントに固定の「名前」を付ける必要があることを示すことができます... )。

アップデート

SQL Server プロファイラー セッションから取得した例:

--sp_prepare on first execute
declare @p1 int
set @p1=8
exec sp_prepare @p1 output,N'@P0 int',N'select <columns> from <table> where <primary key> = @P0 ',1
select @p1
go

--sp_execute thereafter
exec sp_execute 8,1
go
4

1 に答える 1

2

の場合は、次のように休止状態の構成でオフにできるsp_prepareという記事が SQL Server Centralにあります。

<property name='prepare_sql'>false</property>

この設定をオフにして、Hibernate がパラメーター化されたクエリを送信するようです。これにより、SQL Server は準備されたクエリとまったく同じようにプランをキャッシュできます。

prepare_sqlただし、一部の記事では、 がないと Hibernate がstring のパラメータ サイズを変えることを示唆しています。これにより、SQL Server のプラン キャッシュが役に立たなくなります。さらに調査する必要があるかもしれません。

于 2013-06-06T16:47:40.903 に答える