Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server 2008 XML数据类型是否存在性能问题_Sql_Sql Server_Xml_Sql Server 2008 - Fatal编程技术网

SQL server 2008 XML数据类型是否存在性能问题

SQL 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

嗨,我需要在数据库中以XML的形式存储数百个甚至数千个元素。我不会为XML字段中的任何内容编制索引。我将简单地选择xml中的某些元素。我想知道简单地选择XML中的字段是否会导致性能下降。下面是将存储在数据库中的示例XML

<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倍。那么哪个计划的表现会更好?