2012-02-22 32 views
-1

データベースにはC#/ VB.Netで使用されるクラスを表すため、フィールドはXMLです。問題は最初の操作の後で、操作のすべてではなく、ほとんどがSQL Serverで行われます。つまり、XMLフィールドはオンザフライで変換されます。SQL ServerでのXMLの高速化 - テーブルへの変換?

フィールドとレコードが増えているので、この操作は遅くなります。私は、遅いのは、すべてのフィールドを他のデータ型に変換することだと思います。

ので、それをスピードアップするために、私はいくつかの方法を考えていた:

は、XMLデータの異なる部分を表すテーブルのセットを持っています。これらのテーブルは、Insert/Updateのトリガを使用してのみ読み込み、変更を拒否します。 XMLを更新したときのXMLを含む私の「メイン」テーブルは、トリガーをオフにし、新しい値でテーブルを更新し、トリガーを元に戻します。

私たちがXMLを使用する唯一の理由は、C#/ VB.Netのクラスに変換するのが本当に簡単だからです。しかし、私はすべてのビットとピースを取り、それをクラスに変換するルーチンと、逆に進む関数(クラス - >テーブル)を書くことになるかも知れないポイントを得ています。

これを行うには誰かより良いアイデアを提供できますか?私はXML構造を使用するというアイディアに縛られていません。私の関心事は、SQL処理を高速化するためにテーブルを別に用意し、誰かがそのテーブルのフィールドの値を変更して、XMLが更新されていることを確認する必要がある場合です。または、人にそれを更新させないでください。

TIA - Jeff。

+2

C#クラスを表すこと自体が、リレーショナルテーブルの代わりにXMLを使用する特別な理由ではありません。 –

+0

sqlでクラス表現を操作する場合、それはもはや信頼できる表現ではなく、したがって完全な空間の無駄です。あなたが「間違っている」ことを認め、xmlを捨て、クラスをテーブルデータからロードさせてください。 –

答えて

0

保存するオブジェクトの目的は何ですか?状態の持続性以外の何かがあれば、あなたは何も好意的ではなく、懸念を適切に分離していません。永続性が維持されている場合は、少なくとも、プロパティとフィールドから列を削除します(再構成時に値を設定する内部メソッドを使用している限り、プライベートを含めることができます)。

0

あなたがしていることの叡智を無視して、XMLインデックスを作成することができます。 http://msdn.microsoft.com/en-us/library/ms345121%28v=sql.90%29.aspx

基本的な考え方は、適切なインデックスがXMLを「プレシュレッド」し、自動的に「手動で」行うことを考えているテーブルを構築できるということです。欠点は、たくさんのXMLを保管している場合、これが実際にストレージ要件を爆発させる可能性があることです。

+0

代わりにテーブルに変換しなければならないと思います。 – user1226859

+0

実際の問題は、XMLテーブルを 'unxml'する必要があるレコードをプルするときだと思います。そこには私たちが頻繁に必要とするものがたくさんあるので、私たちはそれを変換するために多くの時間を費やしています。私はいつもどこを失っているのかと推測しています。 – user1226859

+0

XMLインデックスはXML列を事前にunxmlできます。私がリンクした記事はそれをかなりうまく説明しています。ビューを介してXMLにアクセスしている場合は、SQLエンジンより圧倒され、状況が悪化する可能性があります。 – Andrew

関連する問題