10年前、リレーショナルデータベースには2つのルールしかありませんでした。 "常にストアドプロシージャを使用する"と "動的SQL(アドホッククエリ)を構築しない"という2つのルールがありました。
それは次のようなアドバイスを聞くために驚くべきではありません。しかし、適切に使用されると、パフォーマンスを向上させる機能を含む多くの肯定的な属性があります。動的SQLの高いパフォーマンスのための
使用パラメータ。 ADO.NETはクライアントでsp_executeSQLというクエリを送信します。生成されたSQLはSQLプロファイラで表示できます。
ORMは、動的SQLとしてCRUDを動的に生成し、データをオブジェクトにマップして、優れたパフォーマンスで開発をスピードアップします。
SQL Serverにはsp_executesqlがあります。このストアドプロシージャは、パラメータマーカと引数の可変数のSQL文字列を使用するシステムストアドプロシージャです。
クライアントは、パラメータ化された文を実行する必要があるときはいつでも、sp_executesqlに対するRPC要求を発行します。
パラメータ化されたsp_executesqlコールは、再利用可能なキャッシュ・プランを持つ可能性が高くなります。
ストアドプロシージャは、パラメータ置換を有する動的SQLの内容は2005年
SQLサーバから起動(更新/挿入/削除)もADO.NETで生成された動的SQLのようにクエリを実行するための標準的な手順になっsp_executesqlをsp_executesqlを呼び出したバッチの実行計画とは別の実行計画としてコンパイルされて実行されます。 sp_executesqlをMSDN からsp_executesql
抜粋文にパラメータ値の変化が唯一の変化であるときのTransact-SQLステートメントを何度も実行するストアドプロシージャの代わりに使用することができます。 Transact-SQLステートメント自体は定数のままで、パラメータ値のみが変更されるため、SQL Serverクエリオプティマイザは最初に実行するために生成された実行プランを再利用する可能性があります。
動的SQLは次のように実行されます。 EXECUTE sp_executesql @SQLString、@ParmDefinition、@SalesID = @IntVariable;
ダイナミックSQLを生成してパフォーマンスの良いユーザーは誰ですか? ADOで
var ID=1;
string commandText = "select * from products WHERE productid = @ID;";
:クライアントで
は、我々は、クエリを実行した場合。NET:
生成されたクエリは次のとおりです。
exec sp_executesql N'select * from products WHERE productid = @ID;',N'@ID int',@ID=11
Dapperの(高性能ORM)
Dapperのは、マイクロORM .NET用を開発し、スタックオーバーフローのチームが使用、焦点を合わせています生のパフォーマンスを第一の目的としています。
生成されたクエリは、次のとおり
exec sp_executesql N'select * from products WHERE productid = @ID;',N'@ID int',@ID=12
EntityFramework EF 6.3
クエリ:
exec sp_executesql N'SELECT TOP (1)
[Extent1].[ProductID] AS [ProductID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[SupplierID] AS [SupplierID],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock],
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder],
[Extent1].[ReorderLevel] AS [ReorderLevel],
[Extent1].[Discontinued] AS [Discontinued]
FROM [dbo].[Products] AS [Extent1]
WHERE [Extent1].[ProductID] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=1
: var id=1;
Product p = db.Products.FirstOrDefault(t => t.ProductID == id);
動的SQLを生成します
などのツールでは、動的SQLを高性能で使用しています。
結論: 動的SQLは、それがパラメータだ場合、良好なパフォーマンスで使用すると、リレーショナルDBで-同じではありません似た - しかし、オブジェクトを格納するのに問題は非常に一般的ですsp_executesqlを
各領域ごとに異なる表が怖いです。このクエリを考えてみましょう。地域(すべての地域ですべての売上)からSUM(売上)を選択します。すべての地域が1つのテーブルにない場合は、基本的なレポートとGUIユーティリティを実行するのは難しいです。 –