いくつかのリレーショナル列と、かなり大きなデータのチャンクを保持する 1 つの XML 列を含むテーブルがあります。データベースを使用する単純な Web サービスもあります。XML 列内の特定の要素のすべてのインスタンス、特定の要素のすべての個別の値のリストなどについてレポートできる必要があります。
要素の個別の値すべてのリストを取得できましたが、それ以上のことはできませんでした。C# では非常に単純に見えることを実行するために、非常に複雑な T-SQL コードを作成することになりました。つまり、このテーブルのすべての行を調べて、これ ( XPath | XQuery | XSLT ) を XML 列に適用します。リレーショナル列をフィルター処理してデータ量を減らすことができますが、一部のクエリでは依然として大量のデータです。
私の計画は、SQL Server (私は 2008 SP2 を使用しています) にアセンブリを埋め込み、特定のクエリに対してその場でインデックス付きビューを作成することでした (このビューをクリーンアップする他のロジックが必要です)。これにより、ネットワーク トラフィックを抑えることができ、Excel や MSRS レポートなどのツールを安価なユーザー インターフェイスとして使用できる可能性もありますが、多くの人が「SQL アセンブリではなくアプリケーション ロジックを使用するだけ」と言っています。 . (私はここで間違ったツリーを完全に吠えている可能性があると思います).
大量のデータを Web サービスに取得し、そこで処理を行うことにも利点があります。SQL Server 環境による制約が少なくなり (その中に住んでいないため)、セットアップ プロセスがより簡単になります。しかし、ネットワーク経由で大量のデータを取り込み、処理中にメモリに保存し、その一部を破棄していることは確かです。
ここでアドバイスをいただければ幸いです。
ありがとう
編集:
ありがとうございます。問題は、ファイルのテーブルに行を生成していて、各ファイルが複数の結果を持つ可能性があり、特定のビルド ジョブを実行するたびにこれを行っていたことです。これをテーブル ビューにフラット化したかったのです。
このビルド ジョブを実行するたびに、数千のファイルのいくつかの属性がチェックされ、場合によっては、これらの各テストで数千の結果が生成されていました (MSIVAL テストが最悪の原因でした)。
答えは (当たり前!) 、データベースに入る前にフラット化することです! あなたのフィードバックに基づいて、各ファイルの各テストの各結果の行を作成してみることにしました。XML にはその 1 つの結果の詳細のみが含まれていました。これにより、クエリがはるかに簡単になりました。もちろん、このツールを実行するたびに数十万行になりますが、パフォーマンスははるかに優れています。ビルド ジョブによって出力される結果のクラスの 1 つのフラット化されたバージョンを作成するビューができました。これは、200,000 を超えて返され、5 秒未満かかります。これまでの同等の (複雑な) クエリの場合は約 3 分でした。よりフラットなルートで、古い (データベースではない) バージョンの XML ファイル処理に 10 ~ 30 分かかります。
現在、接続回数に問題がありますが、それを修正する方法について考えています。
再度、感謝します!+1 のすべてのラウンド