2008-09-09 9 views
3

私の会社の「連絡先」テーブルにフィールドがあります。そのテーブルには、XML型の列があります。列には、特定の連絡先に関するその他のデータが格納されます。例えば。 contact以下SQLServer 2005のXML列のクエリ

<contact> 
<refno>123456</refno> 
<special>a piece of custom data</special> 
</contact> 

タグは、連絡先ごとに異なることができ、と私は同じテーブル内のリレーショナルデータ列と一緒にこれらのフラグメント を照会しなければなりません。

SELECT c.id AS ContactID,c.ContactName as ForeName, 
c.xmlvaluesn.value('(contact/Ref)[1]', 'VARCHAR(40)') as ref,  
INNER JOIN ParticipantContactMap pcm ON c.id=pcm.contactid 
AND pcm.participantid=2140 
WHERE xmlvaluesn.exist('/contact[Ref = "118985"]') = 1 

この方法は、[OK]を動作しますが、それはサーバーが応答するまでの時間がかかります:

私のような構造を使用していました。 また、nodes()関数を使ってXMLノードを解析し、exist()を使ってノードが検索している値を保持しているかどうかを調べました。

誰かがXML列をクエリするより良い方法を知っていますか? @pauljetteで言及したページに加えて

+0

時間がかかると、サーバーの応答時間が長くかかったり、クエリの作成に多大な労力を要したりしますか? – Espo

+0

私は、サーバーが結果を返すのに時間がかかることを意味します。 – nialljsmith

答えて

0

、このページには、良好なパフォーマンスの最適化を持っていますアドバイス:

http://msdn.microsoft.com/en-us/library/ms345118.aspx

ありますが、XMLクエリのパフォーマンスをスピードアップするために行うことができ、多くのですが、それが適切にインデックス付きのリレーショナル・データと同じくらい良いことはありません。 1つのドキュメントを選択してその中だけでクエリを実行すると、かなりうまくいくが、何かを探している類似のドキュメントをスキャンする必要がある場合、リレーショナルクエリプランのキールックアップのようなものになる(すなわち、が遅い)。

+0

コードの再訪中にこの記事を読んでいます。私はアドバイスのいくつかに従ったが、DBにできることは非常に制限されている。私は約6ヶ月前に私たちのSQLサーバを2005年に更新しました。 – nialljsmith

3

1回の書き込みと多くの読み取りを行っている場合は、書き込み時に解析ヒットし、そのデータをクエリ可能な形式にします。最初の提案は、名前/値/連絡先ID列を使用して、関連しているが別のテーブルにそれらを解析することです。

0

Xml用のXSDをお持ちの場合は、そのデータをデータベースにインポートして、Xmlデータのインデックスを作成できます。

0

この

SELECT * FROM conversionupdatelog 変換(XML、colNameに).VALUE( '(/リード/リード/ @ LeadID =' '[email protected]' ')[1]' 試してみてください、 'varchar(max)')= 'true'

関連する問題