【发布时间】:2012-09-28 12:35:55
【问题描述】:
我有两张桌子,XMLtable 和 filterTable。
我需要来自XMLtable 的所有XMLtable.ID 值,其中Col_X 中的数据包含MyElement,其内容与filterTable 中的filterColumn 匹配。
Col_X 中每一行的 XML 可能包含多个 MyElement,我希望 ID 以防这些元素中的任何一个与 filterColumn 中的任何值匹配。
问题在于这些列实际上是varchar(max) 数据类型,并且表本身很大(例如50GB 巨大)。所以这个查询需要尽可能的优化。
这是我现在所在位置的示例,它仅返回第一个匹配元素等于我正在寻找的元素之一的行。由于过多的不同错误消息,我似乎无法更改它以与我想要的所有相同命名的元素进行比较。
SELECT ID,
CAST(Col_X AS XML).value('(//*[local-name()=''MyElement''])', N'varchar(25)')
FROM XMLtable
...然后将结果与filterTable 进行比较。这已经需要 5 多分钟了。
我想要达到的目标是:
SELECT ID
FROM XMLtable
WHERE CAST(Col_X AS XML).query('(//*[local-name()=''MyElement''])')
IN (SELECT filterColumn FROM filterTable)
我目前能做到这一点的唯一方法是使用 LIKE 运算符,这需要大约一千倍的时间。
现在,显然不能开始更改列的数据类型或其他任何内容。这是我必须处理的。 :)
【问题讨论】:
-
你能给我们展示一个示例 XML 并解释你想从中提取什么吗?
-
我必须编一个,因为很明显我不能在这里给出真正的 XML。它是从几十到几百行各种元素的任何地方,其中 MyElement 可能出现在 0 到 X 次之间。我想找到它出现的行的 ID,并且这些出现的实例中的任何一个都包含另一个表中的任何值。
标签: sql-server xml tsql xpath sqlxml