2016-04-27 2 views
0

XMLファイル(db内)に格納されている情報を抽出する必要があるSQLサーバーデータベースがあります。XMLファイルに対する要求の実行

私はテーブルを持っている:と呼ばれるデータ型はnvarcharのフィールドが含まれているmc_report

:original_xml

私はテーブルが潜在的に数百(またはが含まれている可能性があることを知っ

select id from mc_report where original_xml like '%mytext%'; 

のような何かをしたいです何千ものレコードがあり、各XMLファイルの行数が数百であることを確認してください。

xmlファイルの形式は次のとおりです。私はペーストビン

<entry name="serial" type="string">Z4MDPDAVT</entry> 

にシリアル

ライン242によってフィルタリングする

は、それが高速であることを行っていますか?それとも永遠にかかるだろうか?

高速でない場合は、私が持っている他のオプションは何ですか?

+1

*どうぞ* XMLはデータ型 'XML'で格納されているのか、それとも文字列として格納されていますか?あなたのXMLの構造を表示すると、1つのmigyが助けてくれます... – Shnugo

+0

問題は、データベースには10個のレコードしか含まれていません。dbが大きくなると作業が必要なプロダクションで実行するコードを実装する必要があります。 – BlueMagma

+0

100%確信して、先頭の '% 'を持つ' LIKE'はビッグデータで絶対に悪い結果を出すでしょう... – Shnugo

答えて

1

あなたは、WHERE句にこれを置くかもしれませんフィッティングが見つかるまで、1つ1つのエントリをたどります。

あなたが動的に検索条件を入れたい場合は、

DECLARE @prm AS VARCHAR(100)='Z4MDPDAVT'; 
[...] 
WHERE YourXmlColumn.exist('//entry[@name="serial" and .=sql:variable("@prm")]')=1 

使用するか、またはあなたが本当にに入る場合は、

WHERE YourXmlColumn.exist('//entry[@name="serial" and .=sql:column("ColumnName")]')=1 

のように、実行中のクエリの列のコンテンツを使用することができますパフォーマンスの問題では、検索している値をインデックス付きの列に書き込むトリガについて考えるかもしれません。

XMLインデックスについても考えているかもしれませんが、私はこれを避けようとしています...

+0

これは 'NVARCHAR'として保存されています...これを変更することが許されている場合は、それを「本当の」XMLに変更してください。そうでなければ、 'YourXmlColumn'を' CAST(YourXmlColumn AS XML) 'に変更しない限り、私のコードは動作しません。 – Shnugo

+0

ありがとう、私はそれが存在するかどうかはわかりません。 – BlueMagma

+0

@BlueMagmaええ、SQLサーバーとXMLはかなり強力なカップルですが、あなたは奇跡を期待することはできません...これがあなたの問題を解決するなら、upvoteと受け入れチェックthxをクリックしてください! – Shnugo

0

mc_reportのselect idは、 '%mytext%'のような元のxmlです。

LIKE%SOMTHINGはパフォーマンス上の問題であり、XMLではありません。初心者が行うパフォーマンスの問題(「何であるか」以外)です。これは単純に拡大縮小されません。そのため、しばらくの間はSQL Serverでフルテキスト検索が行われています。

問題は今のデータベースのみ10件のレコードが含まれている、である、私は に必要なDBはbigge

を取得するときに作業する必要があり、生産で実行するコードを実装するので、より大きな上で開発データベース。初心者の開発者の問題2:適切なデータサイズを使用していません。ジェネレータを取得し、偽のデータを生成します。それからあなたはそれがどのように動作するかを知っています。あなたがより高いノードを(のようなは「sound_card」を見ると...)がわかっている場合のXQueryのdoesntがする必要があるとして、あなたは大幅に時間を短縮する可能性がある

WHERE YourXmlColumn.exist('//entry[@name="serial" and .="Z4MDPDAVT"]')=1 

+0

大きなデータベースを持っていると本当にうれしいですが、残念ながら自分で埋め尽くすことはできません。別の会社では、ツールが終了したとき(データベースにXMLが格納されているときに発生する)を検出するために、このコードを読む必要があります。私がdbを満たすために何度も何度もツールを実行していたのであれば、ツールは14時間かかります。プロダクションだけがdbを埋めることができます。 – BlueMagma

+0

いいえ、それは当てはまりません。 SQLデータベースにはランダムなデータを簡単に埋め込むことができます。パフォーマンス試験に十分です。パフォーマンスをテストすることなく、あなたはあなたの仕事をしません。 – TomTom

+0

なぜあなたはとても攻撃的でなければなりませんか?あなたは本当に役に立たない。私はすでに知っていることをテストしたくない。これは遅くなるだろう、わかった、私はばかなことではない。批判するのではなく、Shnugoのような建設的な答えを試してみてください。あなたは私が働いている状況について何も知らない。 – BlueMagma

関連する問題