sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2005 エラー 701 - メモリ不足

    この質問は、実際にここで時々出てくるようです。 マーク は正しい (そして最も一般的に採用されている) 答えを持っていますが、これをより明確にするためにできることを追加してみましょう.

    エラー メッセージは少し誤解を招きます。 SQL Server は、実行するのに十分なメモリがないことを通知します クエリですが、実際には解析するのに十分なメモリがないことを意味します

    ランニングに関しては クエリ、SQL Server は必要なすべてを使用できます-必要に応じてギガバイト。解析は別の話です。サーバーは解析ツリーを構築する必要があり、そのために使用できるメモリの量は非常に限られています。 INSERT でいっぱいの典型的なバッチを除いて、どこにも文書化された実際の制限を見つけたことがありません ステートメントでは、一度に数 MB 以上を処理することはできません。

    申し訳ありませんが、できません SQL Server がこのスクリプトを記述どおりに実行するようにします。どんな設定を微調整しても構いません。ただし、これを回避するためのいくつかのオプションがあります:

    具体的には、次の 3 つのオプションがあります。

    <オール> <リ>

    GO を使用 ステートメント。これは、SSMS やその他のさまざまなツールでバッチ区切りとして使用されます。スクリプト全体に対して単一の解析ツリーが生成される代わりに、GO で区切られたバッチの各セグメントに対して個別の解析ツリーが生成されます。 .これはほとんどの人が行うことであり、他の人が実証したように、スクリプトをトランザクション的に安全にするのは非常に簡単です。ここでは繰り返しません。

    <リ>

    すべての行を挿入する大規模なスクリプトを生成する代わりに、データをテキスト ファイルに保存します (つまり、カンマ区切り)。 bcp ユーティリティ を使用してインポートします。 .これを「スクリプト可能」にする必要がある場合 - つまり、CREATE TABLE と同じスクリプト/トランザクションでインポートを行う必要がある場合 BULK INSERT を使用します。 代わりは。 BULK INSERT でも 信じられないかもしれませんが、ログに記録されない操作であり、 BEGIN TRAN 内に配置できます / COMMIT TRAN ブロックします。

    <リ>

    あなたが本当に、本当に INSERT が欲しいなら ログに記録された操作であり、挿入をバッチで発生させたくない場合は、 OPENROWSET テキスト ファイル、Excel ファイルなどをアドホックな「テーブル」として開き、これを新しく作成したテーブルに挿入します。通常、OPENROWSET の使用を推奨するのは嫌です。 ですが、これは明らかに管理スクリプトであるため、実際には大きな問題ではありません。

    以前のコメントは、あなたが #1 に不快感を覚えていることを示唆していますが、それは単に 1 回のトランザクションで実行できないという誤った仮定が原因である可能性があります。その場合は トーマス の答え。しかし、別の方法に行き詰っている場合は、#2 に進み、テキスト ファイルを作成して BULK INSERT を使用することをお勧めします。 . 「安全な」スクリプトの例:

    BEGIN TRAN
    
    BEGIN TRY
    
        CREATE TABLE MyTable (...)
    
        BULK INSERT  MyTable
        FROM 'C:\Scripts\Data\MyTableData.txt' 
        WITH (
            FIELDTERMINATOR = ',',
            ROWTERMINATOR = '\r\n',
            BATCHSIZE = 1000,
            MAXERRORS = 1
        )
    
        COMMIT
    
    END TRY
    
    BEGIN CATCH
    
        ROLLBACK
    
    END CATCH
    

    うまくいけば、これがあなたを正しい軌道に乗せるのに役立ちます.これは、利用可能な「ボックス内」オプションのすべてをカバーしていると確信しています-これらを超えて、実際のアプリケーションプログラムまたはシェルスクリプトを作成して作業を開始する必要があり、複雑さのレベルはそれほど高くないと思います



    1. 1つのmySQLクエリを使用してすべての結果の数値箱ひげ図データを返すにはどうすればよいですか?

    2. MySQLクエリのエラー(SQL構文のエラー)

    3. Oracleの既存のオブジェクトのソースコード

    4. PSequel GUIを使用してMac上のローカルホストPostgreSQLに接続するにはどうすればよいですか?