【发布时间】:2017-11-29 03:45:30
【问题描述】:
我正在尝试改进一个需要一些时间的查询(可能找错了地方,但我知道 XML 是一个很好的起点,所以这就是我现在要做的)。
XML 看起来像这样;
<BlockModels>
<BlockModel id="1"></BlockModel>
</BlockModels>
很简单,不幸的是我无法控制。它是固定格式/定义。
SQL 语句如下所示:
SELECT bm.Name, b.BlockModel.value('(./@id)[1]', 'INT')
FROM @iBlockModels.nodes('/BlockModels/BlockModel') AS b(BlockMOdel)
INNER JOIN BlockModel AS bm
ON (bm.Block_Model_Id = b.BlockModel.value('(./@id)[1]', 'INT'))
我已遵循此文档; https://docs.microsoft.com/en-us/sql/t-sql/xml/value-method-xml-data-type,这是我从中获得静态类型 ([1]) 语法的地方。不过,性能似乎没有太大提升。
在上述文档中,D 点提到使用exist() 而不是value(),但该示例不包括两个表之间的连接。我怀疑这是不可能的,我尝试将上面的内容转换为类似示例的内容导致它失败了。任何人都可以协助转换吗?或者指出我可以做些什么来帮助提高性能?
【问题讨论】:
-
它为您提供了如何执行此操作的示例。在
sql:column部分中,您只需输入列名。例如INNER JOIN BlockModel AS bm ON b.BlockModel.exist('.[@id=sql:column("bm.Block_Model_Id")') = 1 -
啊,好的,感谢您的澄清,我对方括号/根部分感到困惑。遗憾的是没有性能提升。
-
就性能而言,它可能在很大程度上取决于 blockmodel 表中的 block_model_id 列上是否有索引(假设没有 - 如果有并且您仍然遇到性能问题那么根据您提供的查询,我看不到明显的原因)。您也可能通过加入的价值方法获得更好的性能。
-
是的,它们看起来一样,也许这就是最好的。鉴于它只需要 ID,也许我可以将它(它们)拉出来用于
IN语句? -
如果您在列列表中获取
bm.Block_Model_Id而不是再次从 XML 中获取值,您的原始查询可能会好得多。
标签: sql-server xml