SQL server 2008 XML数据类型是否存在性能问题
嗨,我需要在数据库中以XML的形式存储数百个甚至数千个元素。我不会为XML字段中的任何内容编制索引。我将简单地选择xml中的某些元素。我想知道简单地选择XML中的字段是否会导致性能下降。下面是将存储在数据库中的示例XMLSQL server 2008 XML数据类型是否存在性能问题,sql,sql-server,xml,sql-server-2008,Sql,Sql Server,Xml,Sql Server 2008,嗨,我需要在数据库中以XML的形式存储数百个甚至数千个元素。我不会为XML字段中的任何内容编制索引。我将简单地选择xml中的某些元素。我想知道简单地选择XML中的字段是否会导致性能下降。下面是将存储在数据库中的示例XML <fields> <field name="FirstName" type="text" value="Gary" sort="2" /> <field name="LastName" type="text" value="Smit
<fields>
<field name="FirstName" type="text" value="Gary" sort="2" />
<field name="LastName" type="text" value="Smith" sort="3" />
<field name="City" type="text" value="Los Angeles" sort="4" />
<field name="Age" type="number" value="12" sort="6" />
<field name="Address" type="text" sort="2">
<streetnumber value="1234" />
<streetname value="sail" />
</field>
</fields>
我可能在一个记录中有3000多个字段标记。我只想在一个查询中得到10个字段。我将在表上有一个主键,并将根据主键选择记录,但将从XML列获取字段。我担心我在XML中添加的字段元素越多,会影响性能。仅仅从XML列中选择10个或更多字段会有性能损失吗?另外,我不会在where子句中使用xml列,我将在where子句中使用主列,然后从xml列中选择字段。会不会有性能处罚 [开始编辑]
jbl对您的问题的直接回答,以及恐怖。Blade关于“XML优于NVARCHARMAX”的回答都是有道理的,我比他们高得多:
我的经验是没有在SQL Server中存储XML模式。Blade的提示,也没有为jbl提供最多的索引,这是。。。但是我留下我的答案,因为我认为我的链接会非常有用。。。这仍然是最坏情况的一个例子;
[结束编辑]
根据经验,我会说XML数据类型的加载很快,但对于使用它,我发现加载速度很慢,但我想到的个人示例涉及更新和使用xQuery,而这些可能是我速度减慢的原因。
在该示例中,仅处理127861行需要1HR55分钟。
Blade在SQL Server中存储XML模式的技巧和jbl的链接与共享XML索引听起来都非常流畅;并可能解决这一减速问题
相关的:
下面是一些在SQL中优化XML的技巧。。。尽管其中一些仅在您可以控制XML格式时适用:
如果您使用的是xQuery,请查看以下文档:
如果您使用的是SqLXMLBulkLoad,请考虑使用溢出字段,以捕获在架构中未定义的任何内容。在这个与此相关的技术说明中有一些有用的提示:
HTH.[开始编辑] jbl对您的问题的直接回答,以及恐怖。Blade关于“XML优于NVARCHARMAX”的回答都是有道理的,我比他们高得多: 我的经验是没有在SQL Server中存储XML模式。Blade的提示,也没有为jbl提供最多的索引,这是。。。但是我留下我的答案,因为我认为我的链接会非常有用。。。这仍然是最坏情况的一个例子; [结束编辑] 根据经验,我会说XML数据类型的加载很快,但对于使用它,我发现加载速度很慢,但我想到的个人示例涉及更新和使用xQuery,而这些可能是我速度减慢的原因。 在该示例中,仅处理127861行需要1HR55分钟。 Blade在SQL Server中存储XML模式的技巧和jbl的链接与共享XML索引听起来都非常流畅;并可能解决这一减速问题 相关的: 下面是一些在SQL中优化XML的技巧。。。尽管其中一些仅在您可以控制XML格式时适用: 如果您使用的是xQuery,请查看以下文档:如果您使用的是SqLXMLBulkLoad,请考虑使用溢出字段,以捕获在架构中未定义的任何内容。在这个与此相关的技术说明中有一些有用的提示:
HTH.基于我在SQL Server XML数据类型中使用XML的经验,整个部分值得深入阅读 如果只选择10个或更多,是否会受到性能惩罚 XML列中的字段 是的,因为XML文档存储为blob。如果没有主XML索引,则需要分解此blob以进行查询处理、筛选和投影 至于XML,索引可以看作是文档的关系表示形式,它预先分解了blob 在没有索引的情况下,这些二进制大对象在运行时被分解以评估查询。这种切碎可能很耗时 至于你的第二个问题 另外,我不会在where子句中使用xml列,我将在where子句中使用主列,然后从xml中选择字段 柱会不会有性能处罚 如果您打算在3000个字段标记之间进行项目,您可能会受益于第二个XML索引,尽管我不确定是哪一个。房地产二级指数似乎适合预测,但似乎适用于价值调用。法语文档似乎暗示的不仅仅是价值调用,但这可能是一些翻译错误 就我而言,我最终在3月3日的XML列1百万文档上设置了三种二级索引
0个不同的模式,每个模式50-100个元素,但我的应用程序需要比投影更多的过滤。基于我在SQL Server XML数据类型中对XML的经验,整个部分值得深入阅读 如果只选择10个或更多,是否会受到性能惩罚 XML列中的字段 是的,因为XML文档存储为blob。如果没有主XML索引,则需要分解此blob以进行查询处理、筛选和投影 至于XML,索引可以看作是文档的关系表示形式,它预先分解了blob 在没有索引的情况下,这些二进制大对象在运行时被分解以评估查询。这种切碎可能很耗时 至于你的第二个问题 另外,我不会在where子句中使用xml列,我将在where子句中使用主列,然后从xml中选择字段 柱会不会有性能处罚 如果您打算在3000个字段标记之间进行项目,您可能会受益于第二个XML索引,尽管我不确定是哪一个。房地产二级指数似乎适合预测,但似乎适用于价值调用。法语文档似乎暗示的不仅仅是价值调用,但这可能是一些翻译错误
就我而言,我最终在我的XML列上设置了三种二级索引:100万个文档,30个不同的模式,每个模式50-100个元素,但我的应用程序需要比投影多得多的过滤。我意识到这并不是对OP问题的直接回答,尽管它与此相关,但我认为这确实可以帮助许多人,他们被重定向到这里,想知道如何处理SQL Server上XML数据类型的低性能。经过多年与这个问题的斗争,我终于找到了一个解决方案,出于某种原因,它不是那么容易得到: SXI-从SQL 2008开始的选择性XML索引 MS文档链接:
在我的本地测试中,使用包含3MM+记录的表格,它运行得非常好 我意识到这并不是对OP问题的直接回答,尽管它与此相关,但我认为这确实可以帮助许多被重定向到这里的人了解如何处理SQL Server上XML数据类型的低性能。经过多年与这个问题的斗争,我终于找到了一个解决方案,出于某种原因,它不是那么容易得到: SXI-从SQL 2008开始的选择性XML索引 MS文档链接:
在我的本地测试中,使用包含3MM+记录的表格,它运行得非常好 @Luke101对于我来说,这个答案似乎是目前为止最好的,因为我直接回答了这些问题。谢谢你,我已经证实了这一点。我创建了一个包含100K元素的xml文档,然后将其存储在服务器上的xml列中。然后我尝试访问第90000个元素。在我的电脑上,访问元素花了14秒。我在mongoDB中创建了相同的场景,并访问了他们文档数据库中的第90000个令牌。这是即时的。考虑到MongoDB几乎可以即时访问BSON中的任何令牌,MongoDB是正确的选择。谢谢你的回答。而且,所有这些测试都不包括索引。很抱歉,这篇文章太旧了,但这个例子和我的问题有关。假设用户表和地址表有一对多的关系。比如说,在计划A中,我创建的地址表每个都有单独的列,并且没有这样的xml列。这样,我就有了数百万条记录。现在在计划B中,我不创建单独的表。在表1中添加一个额外的列地址xml类型和存储以类似的方式评估。这样我的记录比计划A少4倍。那么哪个计划的表现会更好?@Luke101对于我来说,这个答案似乎是目前为止最好的,因为我直接回答了这些问题。谢谢,我已经证实了这一点。我创建了一个包含100K元素的xml文档,然后将其存储在服务器上的xml列中。然后我尝试访问第90000个元素。在我的电脑上,访问元素花了14秒。我在mongoDB中创建了相同的场景,并访问了他们文档数据库中的第90000个令牌。这是即时的。考虑到MongoDB几乎可以即时访问BSON中的任何令牌,MongoDB是正确的选择。谢谢你的回答。而且,所有这些测试都不包括索引。很抱歉,这篇文章太旧了,但这个例子和我的问题有关。假设用户表和地址表有一对多的关系。比如说,在计划A中,我创建的地址表每个都有单独的列,并且没有这样的xml列。这样,我就有了数百万条记录。现在在计划B中,我不创建单独的表。在表1中添加一个额外的列地址xml类型和存储以类似的方式评估。这样我的记录比计划A少4倍。那么哪个计划的表现会更好?