3

MS SQL Server (2008R2) で定義されたテーブルは次のように定義されています。

create table stagefm.dbo.article (id nvarchar(10));

dbexpress (dbxmss.dll) を介して、簡単な挿入ステートメントを MS SQL Server に送信します。

Q.SQL.Text:= 'INSERT into stagefm.dbo.article (id) values (':id')';
Q.Prepared:= true;
Q.ParamByName('id').AsString:= 'test';
Q.ExecSQL;

SQL Profiler を使用すると、サーバーで次の SQL が実行されていることがわかります。

exec sp_executesql N'INSERT INTO stagefm.dbo.artikelstamm (id) values (@P1)', 
N'@P1 nvarchar(4000)',
N'test'

サード パーティの dbexpress ドライバー (DevArt dbxsda40.dll) を使用すると、ドライバーがネイティブ クライアント ドライバー (vendorlib=sqlncli) を使用するように指示された場合と同じ動作が見られます。標準の Delphi ドライバーもネイティブ クライアント (sqlncli10.dll) を使用していると思います。

DevArt ドライバーに sqloledb をベンダー ライブラリとして使用するように指示すると、SQL プロファイラーで次のように表示されます。

exec sp_executesql N'INSERT INTO stagefm.dbo.artikelstamm (id) values (@P1)', 
N'@P1 nvarchar(10)',
N'test'

ネイティブ クライアント SQL にもこのコードを期待していましたが、ネイティブ クライアントは単純な nvarchar(1) または char(3) フィールドに対しても常に nvarchar(4000) 変数を生成するようです。

ネイティブ クライアントの SQL 処理も最適化できますか?

4

0 に答える 0