1

データをvarbinary(max)列に格納しており、クライアントのパフォーマンス上の理由から、SQL Server 2005を使用して「.WRITE()」関数を使用して書き込みをチャンク化しています。これはうまく機能しますが、副作用があるため、避けたいと思います。各追加中に動的にサイズ設定されるvarbinary列。

私がやりたいのは、varbinary列を希望のサイズに事前に割り当てることによってこれを最適化することです。たとえば、2MBを列にドロップする場合は、最初に列を「割り当て」、次にオフセット/長さパラメーターを使用して実際のデータを書き込みます。

ここで私を助けることができるSQLの何かがありますか?明らかに、SQLサーバーにヌルバイト配列を送信したくありません。これは、.WRITE最適化の目的を部分的に無効にするためです。

4

2 に答える 2

2

(MAX) データ型を使用している場合、8K を超えるものはすべて、ページ内ストレージではなく、行オーバーフロー ストレージに入ります。したがって、行の 8K まで取得するのに十分なデータを入力するだけで、行のページ内割り当てが占有され、残りはとにかく行オーバーフロー ストレージに入ります。ここにいくつかあります。

行オーバーフロー データを含むすべてを事前に割り当てたい場合は、次のようなものを使用できます (例では 10000 バイトを実行します)。

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), '0'), 10000))
于 2010-02-02T01:38:25.100 に答える
1

まず、提供された回答に対する称賛 - これは大きな助けになりました! ただし、考慮すべきわずかな変更が 1 つあります。上記のコードは実際には、変換されたゼロ文字 (16 進コード 0x30) で varbinary フィールドを割り当てます。これは、特に後でフィールドに対してバイナリ操作を実行する場合は、実際には必要ない場合があります。私がより便利だと思うのは、デフォルトですべてのビットがオフになるように、フィールドに NUL 値 (16 進コード 0x00) を割り当てることです。これを行うには、次の修正を行うだけです。

SELECT CONVERT([varbinary](MAX), REPLICATE(CONVERT(varchar(MAX), CHAR(0)), 10000))

于 2014-06-17T19:47:16.443 に答える