6

SQL Server 2008 では、XML パーサーがクラッシュする前に、単一の XML ノードが持つことができる属性の最大数に関して壁にぶつかりました。

表示されるエラーは次のとおりです。

Msg 6303, Level 16, State 1, Line 1
XML parsing: Document parsing required too much memory

これは少し誤解を招きます。文字列を XML データ型 (またはテーブル列) に変換するときに問題が発生します。

SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2="b" XXXXX /></DataNode>')

XXXXXは、実際は別の 8191 属性です。

合計で、データセットには最初から 10,066 の属性が含まれていました。属性の数を 8,192 まで減らすと、問題なく動作します。ただし、8,193 個の属性がクラッシュします。

データのサイズとは特に関係がないようです (100MB か 60KB かは関係ありません - 属性カウントに基づいて同じ失敗/成功が得られます)。

では、この制限を変更するために SQL サーバーでできることはありますか?

私たちの C# アプリケーションにはこの制限がないため、C# の完全に有効な XML ドキュメントを SQL サーバーの XML データ列に格納することはできません。

誰でも提供できるヘルプは大歓迎です。数百のコンポーネントを含むアプリケーション フレームワーク全体のデータ処理機能を書き直す必要があるため、この時点でデータ構造を変更することはできません。

PS: アプリケーションがデータをツリーとしてではなく、単一ノードの属性として保存する状況がいかにばかげているかについて、私はすでに管理者にアドバイスしましたが、これは私が取り組まなければならないことです :-(

編集: 2 GB RAM のサーバーと 32 GB RAM のサーバー上の SQL Server 2008 32 および 64 ビット バージョンでこれを試しました。すべてのバージョンと環境で同じ問題が発生します。

アップデート:

SQL Server 2012 でこれを試しましたが、8,193 個の属性があり、文字列の長さも指定されたサイズ (テスト文字列の長さは 833K) を超えている場合は失敗しますが、同じ長さの文字列にのみある場合は機能します8,192 の属性。

ただし、12,000 の属性を持つはるかに短い文字列 (193K) があり、SQL Server 2012 および SQL Server 2008 で動作します)

したがって、キャストされる文字列が特定のサイズを超えると、属性の数の組み合わせのように見えます。これはもっと面白くなります!

これまでのフィードバックに感謝します!

更新 2:

より小さな文字列 (270K) でさらにテストした後、16,384 の属性制限にまだ達しています... 16,385 属性は失敗します! というわけで、文字列の長さの組み合わせ次第で8K属性単位で確実に発生!!

4

1 に答える 1