1. xml数据模型 xml存储与处理查询的性能取决于数据库的设计与xml数据的结构与粒度。是否要使用xml数据模型,看你
是不是有半结构化的数据,需要保留文档结构与层次结构的标记语言数据,或可变的结构。
1.1 标记 markups 同样的数据可以以不同的方式来标记,视内容(element值)与元数据信息(attribute值)。越具体的
element名越易于阅读,且对生成有效的查询计划有帮助。冗长的标记会增加存储的成本。例如: a. writing secure code the godfather 如果要查询book,需要写为:/item[@type = "book"] b. writing secure code the godfather
如果要查询book,只需要写:/book ,这样效率更高也看起来更简单,而且减少了primary xml index(
主xml索引)的层数(少了item层)。这就是具体标记(specific markups)相对一般标记(generic
markups)的优点。
对于被类型化的的xml(typed xml),还可以缩减到两层:
像the godfather 这种格式,称为element-centric markup,查询格式
为/dvd[title = "the godfather"] 像这种格式,attribute-centric markup,查询格式为/dvd[@title =
"the godfather"] ,可以减少一个join。
1.2 typed 和 untyped xml(类型化与非类型化的xml) 非类型化的xml(untyped xml,没有以xml schema来表示)在sql server内部以unicode字符串的形式存
储。对他们的操作需要数据转换到相应的类型。例如 (/book/price)[1] > 19.99,会有转换为
decimal的过程。大量类似的比较就会非常耗资源,这就引出了xml schema中类型信息的重要性。 类型信息在以下几个方面起作用: a. 插入更新的xml数据先被验证是否符合schema,然后以二进制形式存储,方便更快地转换 b. 类型化的值被存储在xml索引中 c. 类型化的数据还可以减少范围扫描,例如(/book/price)[1]中的序数[1]在xml schema规定了
为单值时就是不必要的。
1.3 属性 可以使用udf(用户自定义函数)来获得计算列(computed column)。可以在计算列上添加索引。由于计算列是预计算好的,查询速度更快。 范例: 书籍都有isbn号,把isbn单独作为计算列的过程如下 a. 定义获取isbn号的函数 create function udf_get_book_isbn (@xdata xml) returns varchar(20) with schemabinding begin return @xdata.value('(/book/@isbn)[1]', 'varchar(20)') end b. 添加计算列 create table docs (id int primary key, xcol xml) alter table docs add isbn as dbo.udf_get_book_isbn(xcol) c. 添加非聚类索引 create index computed_idx on docs (isbn) d. 写查询 如果不使用isbn列,查询如下: select xcol from docs where xcol.exist ('/book/@isbn[. = "0-2016-3361-2"]') = 1 如果使用isbn列 select xcol from docs where isbn = '0-2016-3361-2'
还可以建立属性表(property table)
2. 批量载入xml数据 --可以使用bcp in,bulk insert和openrowset方法,因为和这次的case无关暂且略过。
3. xml索引 3.1 普通索引 推荐创建初级xml索引(primary xml index),实际上是创建了一个b 树。还可以对于path,property,value创建次级xml索引(secondary xml indexes)。 a. path索引 适用于有类似/book[@isbn = "0-2016-3361-2"]的路径表达式,路径越长越有效 b. property索引 适用于xml中的多properties查询 c. value索引 适用于存在子轴(//操作符)和通配符(类似(/book[@* = "novel"]))的查询 维护索引的开销也是需要整体考虑的。
--关于xml部分更新和这次的case无关暂且略过。 --关于xml全文索引和这次的case无关暂且略过。
4. 查询优化 4.1 使用exist()方法来检测是否存在 尽可能使用exist()来代替value() 比如如下的查询: select * from docs where xcol.exist('(/book/title/text())[.="writing secure code"]') = 1 比 select * from docs where xcol.value('(/book/title)[1]', 'varchar(50)') = 'writing secure code'
4.2 优化xml blobs(二进制xml) 更多的tempdb文件可以提供更好的可扩展性。 减少额外的xml数据类型转换
4.3 指定singleton elements(单件元素) 对于类型化的xml,默认是singleton的 非类型化的xml,需要加[1],xcol.query ('/book/title')会被自动转换为xcol.query ('(/book/title)[1]')。
4.4 对于非类型化的xml的text聚合 (/book/title[.="writing secure code"])[1]需要聚合
下所有的text节点<br />如果<title> element只有一个text节点,那么可以使用(/book/title/text())[1][. = "writing secure code"]更有效。</p> <p>4.5 将xquery和xml dml表达式参数化<br />xquery和xml dml不会自动参数化,最好使用sql:column() 或sql:variable() 。</p> <p>4.6 序数和预计的优化<br />减少语句的分支,如/book[@isbn = "1-8610-0157-6"]/author/first-name,最好使用/book[author/first-name = "davis"]这样的格式。<br />把序数移到路径的最后,/book[1]/title[1]等同于 (/book/title)[1]<br />使用context node(上下文节点)<br />如下的范例:<br />select *<br />from docs<br />where xcol.exist ('/book[@subject = "security"]') = 1<br />分别对/book和/book/@subject进行了评估,并检测了后者是否包含了值“security”<br />如果使用如下表达:<br />select *<br />from docs<br />where xcol.exist ('/book/@subject[. = "security"]') = 1<br />只会对/book/@subject 进行评估</p> <p>动态查询与本次的case无关暂且略过。</p> <p>具体案例等我做完这个case再详细阐述。</p> <p>参考资料:<br />performance optimizations for the xml data type in sql server 2005<br />http://technet.microsoft.com/en-us/library/ms345118.aspx<br />xml best practices for microsoft sql server 2005<br />http://technet.microsoft.com/en-us/library/ms345115.aspx</p>
<p>转载于:https://www.cnblogs.com/galaxyyao/archive/2009/04/23/1442417.html</p>
<h2>总结</h2>
<p>
以上是<a href="/">生活随笔</a>为你收集整理的<a title="sql server xml性能优化(best practices)" href="/content/1807473.html">sql server xml性能优化(best practices)</a>的全部内容,希望文章能够帮你解决所遇到的问题。
</p>
<p>
如果觉得<a href="/">生活随笔</a>网站内容还不错,欢迎将<a href="/">生活随笔</a>推荐给好友。
</p>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js"></script>
<script>hljs.highlightall();</script>
<script src="/fedozstyle/js/copycode.js"></script>
</div>
<div class="keywords">
<ul>
<li><a target="_blank" title="xml" href="/tag/2317">xml</a></li>
<li><a target="_blank" title="server" href="/tag/2606">server</a></li>
<li><a target="_blank" title="性能" href="/tag/2708">性能</a></li>
<li><a target="_blank" title="practices" href="/tag/119974">practices</a></li>
</ul>
</div>
<div class="clear"></div>
<div class="share" id="down">
<img src="/fedozstyle/images/wx.png" />
<div class="share-text">
<p>欢迎分享!</p>
<p>转载请说明来源于"生活随笔",并保留原作者的名字。</p>
<p>本文地址:<a title="sql server xml性能优化(best practices)" href="/content/1807473.html">sql server xml性能优化(best practi</a></p>
</div>
</div>
<div class="clear"></div>
<div class="info-pre-next">
<ul>
<li>
上一篇:<a title="网络图片爬虫程序" href="/content/1807472.html">
网络图片爬虫程序
</a>
</li>
<li>
下一篇:<a title="office sharepoint server 2007 规划和体系结构2" href="/content/1807474.html">
office sharepoint se
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="ad ad-big">
<div style="border: #eb3d41 1px dashed; ">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3420692030265175"
crossorigin="anonymous"></script>
<ins class="adsbygoogle"
style="display:block; text-align:center;"
data-ad-layout="in-article"
data-ad-format="fluid"
data-ad-client="ca-pub-3420692030265175"
data-ad-slot="5682038375"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</div>
</div>
<aside class="side-section right-box">
<div class="whitebg paihang">
<h2 class="side-title">最新发布</h2>
<ul>
<li><i></i><a title="asp.net获取客户端、服务器端基础信息集合" target="_blank" href="/content/1807796.html">asp.net获取客户端、服务器端基础信息集合</a></li>
<li><i></i><a title="asp.net mvc3 技术(二) webgrid 的使用方法" target="_blank" href="/content/1807748.html">asp.net mvc3 技术(二) webgrid 的使用方法</a></li>
<li><i></i><a title="[map 3d开发实战系列] map resource explorer 之四-- map3d开发中的wpf" target="_blank" href="/content/1807658.html">[map 3d开发实战系列] map resource explorer 之四-- map3d开发中的wpf</a></li>
<li><i></i><a title="xml常用方法" target="_blank" href="/content/1807650.html">xml常用方法</a></li>
<li><i></i><a title="关于大型asp.net 应用系统的架构 —— 如何做到高性能高可伸缩性[转]" target="_blank" href="/content/1807639.html">关于大型asp.net 应用系统的架构 —— 如何做到高性能高可伸缩性[转]</a></li>
</ul>
</div>
<div class="ad ad-small">
<div style="border:#1487f4 1px dashed; ">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3420692030265175"
crossorigin="anonymous"></script>
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-3420692030265175"
data-ad-slot="3139024105"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</div>
<div class="whitebg suiji">
<h2 class="side-title">热门推荐</h2>
<ul>
<li><a title="wpf中的鼠标事件详解" target="_blank" href="/content/745398.html">wpf中的鼠标事件详解</a></li>
<li><a title=".net8 blazor 尝鲜" target="_blank" href="/content/96291.html">.net8 blazor 尝鲜</a></li>
<li><a title="一个基于.net7的开源dns服务 dnsserver 的部署使用经验分享" target="_blank" href="/content/96136.html">一个基于.net7的开源dns服务 dnsserver 的部署使用经验分享</a></li>
<li><a title="wpf之无法触发keydown或者keyup键盘事件" target="_blank" href="/content/986176.html">wpf之无法触发keydown或者keyup键盘事件</a></li>
<li><a title="lucene.net学习" target="_blank" href="/content/1621299.html">lucene.net学习</a></li>
</ul>
</div>
<div class="ad ad-small">
<div style="border:#1487f4 1px dashed; ">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3420692030265175"
crossorigin="anonymous"></script>
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-3420692030265175"
data-ad-slot="1599323135"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</div>
<div class="whitebg cloud">
<h2 class="side-title">标签云</h2>
<ul>
<li><a target="_blank" title="连接数据库" href="/tag/3027">连接数据库</a></li>
<li><a target="_blank" title="单元格" href="/tag/3020">单元格</a></li>
<li><a target="_blank" title="蓝牙耳机" href="/tag/3010">蓝牙耳机</a></li>
<li><a target="_blank" title="程序语言" href="/tag/2172">程序语言</a></li>
<li><a target="_blank" title="微信游戏" href="/tag/2169">微信游戏</a></li>
<li><a target="_blank" title="软件安装" href="/tag/2158">软件安装</a></li>
<li><a target="_blank" title="双系统" href="/tag/2140">双系统</a></li>
<li><a target="_blank" title="游戏开发者" href="/tag/2136">游戏开发者</a></li>
<li><a target="_blank" title="设计理念" href="/tag/2100">设计理念</a></li>
<li><a target="_blank" title="计算机资源" href="/tag/2095">计算机资源</a></li>
<li><a target="_blank" title="中南海" href="/tag/13696">中南海</a></li>
<li><a target="_blank" title="极强" href="/tag/23721">极强</a></li>
<li><a target="_blank" title="settimeout" href="/tag/47794">settimeout</a></li>
<li><a target="_blank" title="奥图码" href="/tag/14464">奥图码</a></li>
<li><a target="_blank" title="假象" href="/tag/3760">假象</a></li>
<li><a target="_blank" title="劳斯莱斯" href="/tag/23889">劳斯莱斯</a></li>
<li><a target="_blank" title="骚味很重" href="/tag/25629">骚味很重</a></li>
<li><a target="_blank" title="坦言" href="/tag/31039">坦言</a></li>
<li><a target="_blank" title="政委" href="/tag/8703">政委</a></li>
<li><a target="_blank" title="销售情况" href="/tag/45902">销售情况</a></li>
</ul>
</div>
</aside></article>
<div class="clear blank"></div>
<footer>
<div class="footer box">
<div class="endnav">
<p>
尊龙游戏旗舰厅官网 copyright © 2002-2030 <a href="/">生活随笔</a> 尊龙游戏旗舰厅官网的版权所有
<a href="http://www.beian.gov.cn/portal/registersysteminfo?recordcode=41010202003143" target="_blank" rel="nofollow">豫公网安备 41010202003143号</a>
<a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">豫icp备2022013113号-1</a>
<a target="_blank" href="/sitemap/index.xml">sitemap</a>
</p>
</div>
</div>
</footer>
<a href="#" title="返回顶部" class="icon-top"></a>
<script charset="utf-8" id="la_collect" src="//sdk.51.la/js-sdk-pro.min.js"></script>
<script>la.init({id: "jejnhuftwnsvvact",ck: "jejnhuftwnsvvact"})</script> <script src="/fedozstyle/js/hc-sticky.js"></script>
<script src="/fedozstyle/js/aside-sticky.js"></script>
</body>
</html>