欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > asp.net >内容正文

asp.net

sql server xml性能优化(best practices) -凯发k8官方网

发布时间:2024/10/8 asp.net 0 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 sql server xml性能优化(best practices) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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> 凯发k8官方网 copyright © 2002-2030 <a href="/">生活随笔</a> 凯发k8官方网的版权所有 <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>

网站地图