【问题标题】:SQL Server not using XML Indexes for querying XML rowsetSQL Server 不使用 XML 索引来查询 XML 行集
【发布时间】:2017-03-24 14:33:27
【问题描述】:

希望有人可以帮助解决这个问题。

我们需要从 SQL 中的行集 XML 列返回一个数据字段。该例程有效,但不使用任何已创建的 XML 索引(值/路径/属性上的主要 + 次要索引,但没有选择性 XML 索引)。由于 XML 的数量,查询引擎的不断分解大大降低了查询速度。关于如何让 SQL Server (2012) 实际使用 XML 列上的 XML 索引的任何想法?

关闭或打开 XML 索引没有速度差异、数据读取或计划差异,因此它绝对没有使用它们。

示例查询(@Field 是必需的字段名称,@XmlData 是 XML)。

@XmlData.value(
      'declare namespace rs="urn:schemas-microsoft-com:rowset";
      declare namespace z="#RowsetSchema";
      (/xml/rs:data/rs:insert/z:row[@fm_field=sql:variable("@Field")]/@fm_data)[1]','nvarchar(255)')

示例 XML sn-p...

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
  <s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly" rs:updatable="true">
      <s:AttributeType name="fm_field" rs:number="1" rs:write="true">
        <s:datatype dt:type="string" dt:maxLength="255" rs:precision="0" rs:fixedlength="true" rs:maybenull="false" />
      </s:AttributeType>
      <s:AttributeType name="fm_data" rs:number="2" rs:write="true">
        <s:datatype dt:type="string" dt:maxLength="255" rs:precision="0" rs:fixedlength="true" rs:maybenull="false" />
      </s:AttributeType>
      <s:extends type="rs:rowbase" />
    </s:ElementType>
  </s:Schema>
  <rs:data>
    <rs:insert>
      <z:row fm_field="ABSOLVELIA" fm_data="No" />
      <z:row fm_field="ADJNO" fm_data="" />
      <z:row fm_field="AIRPORTS" fm_data="No" />

【问题讨论】:

    标签: sql-server xml performance indexing


    【解决方案1】:

    我知道原来的帖子有点含糊,但时间有点稀疏,所以现在需要更多信息来澄清......

    可能存在大量(ist)XML 数据(每条记录平均约 15K,记录集数以百万计),每个可能有一些 TB 大小的数据库(大多数较小,只有几百 GB,因此它们更易于管理)。

    它占用了所有单核 CPU(由于 SQL 用于解析它的较低级别的进程,XML 在 SQL 引擎中被处理为单核),因此对 XML 信息的任何解析都将永远持续下去,没有办法抛出更多内核在它上面(我们正在使用现代 3GHz+ VM 服务器场)。

    为了加快报告速度,我为客户添加了一个索引视图,其中包含他们希望为数据挖掘报告的 400 多个 XML 字段属性,该索引是从备份构建的(他们不希望实时数据库更改或有任何东西)这会减慢插入速度或有任何东西复制它或实际上是 HA 等。因此索引视图是从备份构建的)。

    XML 格式不可更改,因此保存在属性中的数据(行集格式字段/数据)正在阻止 SQL 使用任何类型的 XML 索引(我知道 XML 索引是 cr@p 从过去的经验来看,所以我紧抓不放)吸管)。

    我希望至少有某种方法可以让它使用主索引,这样碎片开销就会减少,但无济于事。选择性索引也失败了。从我自己的跟踪来看,很明显,对于这种格式的 XML,我们被困在 XML 数据上的索引视图的单一核心构建中。

    我可以在 C# 中编写一个多线程预粉碎器来获得速度和核心使用,但希望 SQL 有一个我错过的可行答案。

    感谢您抽出宝贵时间来看看。

    【讨论】:

      【解决方案2】:

      您可能会read this。 XML 索引在极少数情况下会有所帮助...有些情况甚至会变得更糟...

      在一个场景中,XML 索引会有所帮助:想象一个带有 XML 列的数据表。有很多行。每行都带有一个巨大的 XML。此 XML 中的某处是产品具有“abc”类别的信息。现在您要过滤所有表格行,您将在其中找到具有此给定类别的产品。

      如果没有索引,引擎将不得不查看每一个 XML,而索引可能(但仅在少数情况下!)提供更直接的访问。

      如果我很好地理解了您的示例,则没有查询,甚至可以认为 XML 索引很有帮助。

      您没有提供足够的信息...

      • 您的示例显示了一个 XML 变量:此 XML 来自哪里?
      • 是否只有一个 XML,或者您是否从文件中读取了许多 XML,或者这些 XML 是否存在于一个表中?
      • &lt;rs:insert&gt; 节点有很多还是只有一个?
      • 性能瓶颈在哪里?读取一个微小的 XML 不会很慢...

      我的魔法水晶球告诉我,你的问题出在其他地方。阅读XY-Problem

      如果您需要帮助,您应该提供一个测试场景。请阅读How to ask a good SQL questionHow to create a MCVE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 2019-05-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多