web-dev-qa-db-ja.com

SSMS-Openrowsetの最大ファイルサイズ

これが他の場所で回答されていて申し訳ありませんが、ここでもオンラインでも何も見つかりませんでした。

Openrowsetにはファイルサイズの制限がありますか?ストアドプロシージャを記述しようとしています。その一部は、ファイル内に特定の文字が存在するかどうかをチェックし、存在する場合は、ストアドプロシージャの次のセクションにスキップする必要があります。これまでのところ、ファイル全体を1列のテーブルに一括挿入してから、次のようにしました。

IF(SELECT COUNT(*) FROM #fulltable WHERE fulltable LIKE '%}%')>0 GOTO NEXTSECTION
IF(SELECT COUNT(*) FROM #fulltable WHERE fulltable LIKE '%~%')>0 GOTO NEXTSECTION
IF(SELECT COUNT(*) FROM #fulltable WHERE fulltable LIKE '%#%')>0 GOTO NEXTSECTION

信頼性は高いですが、大きなファイル(場合によっては10 GBを超える)を処理するときは非常に遅くなります。以下のクエリは大きなファイルの方が速いと思います

DECLARE @FILE NVARCHAR(MAX)
select @FILE = BULKCOLUMN from (
select * from openrowset(BULK N'filpath', single_clob) [a]
)a

IF(SELECT IIF(@FILE LIKE '%{%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%}%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%~%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%@%',1,0)) = 1 GOTO NEXTSECTION
IF(SELECT IIF(@FILE LIKE '%£%',1,0)) = 1 GOTO NEXTSECTION

ただし、一括挿入は信頼性が高く、OPENROWSETを使用すると、ファイルサイズの制限がある場合にファイルが切り捨てられる危険を冒したくありません。

この件についてのアドバイスはいただければ幸いです。

2
Anonymous

私はOPENROWSETに制限があるとは思いません。少なくとも、私が遭遇した制限はありません。文書化されているものもないので、その質問に答えてください。いいえ。

ただし、SSMSは32ビットアプリケーションであるため、64ビットOSのメモリは4 GBに制限されていると思います。これは、インポートできる最大ファイルが4GBであることを意味するものではありませんが、使用可能なRAMを使用してアプリケーションを介してストリーミングします。

また、ラップトップ/クライアントSSMSでリモートサーバーにOPENROWSETを実行している場合も、速度が低下します。サーバーでOPENROWSETを実行することを検討してください。クライアントではなくサーバーで作業を行うことにより、速度が大幅に向上しました。

マイクロソフトから:-

注SSMSは32ビットプロセスです。したがって、2 GBのメモリに制限されます。 ( https://support.Microsoft.com/en-za/help/28749

0
gareth

それがあなたの主な質問ではないことは知っていますが、パフォーマンスの低下について言及しました。より大きな文字列内に特定の文字または部分文字列が存在するかどうかを確認するときは、LIKE '%x%'ではなくCHARINDEX( 'x'、strColumn)を使用してみてください。これにより、パフォーマンスが大幅に向上します。検索語を囲む%でLIKEを使用すると、非常に時間がかかり、コストがかかります。

2
samwise_a2