在 SQL Server 中,我有一个带有 XML 类型临时变量的存储过程,我正在对该变量执行删除操作。当我在具有 4 个内核和 6 GB RAM 的本地 VM 中运行此存储过程时,执行需要 24 秒。但是,当我在具有 40 个内核和 128 GB RAM 的服务器中运行相同的存储过程时,此删除语句的执行时间超过 38 分钟。整个存储过程在此删除语句处被挂起 38 分钟。注释掉delete语句后,存储过程在服务器上执行8秒。我该如何解决这个性能问题。 SQL 服务器配置有问题吗?
DECLARE @PaymentData AS XML
SET @PaymentData = .....(Main XML Query)
SET @PaymentData.modify('delete //*[not(node())]')
@Mikael:以下是在服务器(具有 40 个内核和 128 GB RAM)上分解成行解决方案的执行计划
下面是我本地 VM 中的执行计划(具有 4 个内核和 6 GB RAM):
最佳答案
在我的机器上,删除花费了 1 小时 25 分钟,并给了我这个不太漂亮的查询计划。
该计划找到所有空节点(要删除的节点)并将它们存储在表假脱机中。然后对于整个文档中的每个节点,检查该节点是否存在于假脱机中(嵌套循环(左半连接))以及是否从最终结果中排除该节点(合并连接(左反半连接) ).然后从 UDX 运算符中的节点重建 xml 并将其分配给变量。表假脱机没有索引,因此对于需要检查的每个节点,将扫描整个假脱机(或直到找到匹配项)。
这基本上意味着该算法的性能是 O(n*d),其中 n 是节点总数,d 是总数或删除的节点。
有几个可能的解决方法。
首先,也许最好的办法是修改 XML 查询,使其首先不生成空节点。如果您使用 for xml 创建 XML,则完全有可能;如果您已经将部分 XML 存储在表中,则可能不可能。
另一种选择是分解 Row 上的 XML(参见下面的示例 XML),将结果放入表变量中,修改表变量中的 XML,然后重新创建组合的 XML。
declare @T table(PaymentData xml);
insert into @T
select T.X.query('.')
from @PaymentData.nodes('Row') as T(X);
update @T
set PaymentData.modify('delete //*[not(node())]');
select T.PaymentData as '*'
from @T as T
for xml path('');
这将为您提供 O(n*s*d) 的性能特征,其中 n 是 row 节点的数量,s 是每个 row 节点的子节点数,d 是每个 row 节点的删除行数。
我真正不推荐的第三个选项是使用一个未记录的跟踪标志,它可以在计划中删除假脱机的使用。您可以在测试中试用它,或者您可以捕获生成的计划并在计划指南中使用它。
declare @T table(PaymentData xml);
insert into @T values(@PaymentData);
update @T
set PaymentData.modify('delete //*[not(node())]')
option (querytraceon 8690);
select @PaymentData = PaymentData
from @T;
带有跟踪标志的查询计划:
这个版本在我的电脑上用了 4 秒,而不是 1 小时 25 分钟。
将 XML 分解为多行到表变量总共需要 6 秒来执行。
完全不必删除任何行当然是最快的。
示例数据,12000 个节点和 32 个子节点,如果您想在家尝试,其中 2 个为空。
declare @PaymentData as xml;
set @PaymentData = (
select top(12000)
1 as N1, 1 as N2, 1 as N3, 1 as N4, 1 as N5, 1 as N6, 1 as N7, 1 as N8, 1 as N9, 1 as N10,
1 as N11, 1 as N12, 1 as N13, 1 as N14, 1 as N15, 1 as N16, 1 as N17, 1 as N18, 1 as N19, 1 as N20,
1 as N21, 1 as N22, 1 as N23, 1 as N24, 1 as N25, 1 as N26, 1 as N27, 1 as N28, 1 as N29, 1 as N30,
'' as N31,
'' as N32
from sys.columns as c1, sys.columns as c2
for xml path('Row')
);
注意:我不知道为什么在你们的一台服务器上执行只需要 24 秒。我建议您重新检查 XML 实际上是否相同。或者为什么不使用我为您提供的 XML 示例进行测试。
更新:
对于粉碎版本,删除查询中假脱机的问题可以转移到粉碎查询,而不是让你有同样糟糕的性能。然而,这并不总是正确的。我见过没有线轴的计划和有线轴的计划,但我不知道为什么有时有线轴,为什么有时没有。
我还发现,如果您使用临时表而不是insert ... into,我不会在分解查询中得到假脱机。
select T.X.query('.') as PaymentData
into #T
from @PaymentData.nodes('Row') as T(X);
update #T
set PaymentData.modify('delete //*[not(node())]');
关于sql-server - 在 SQL Server 中,使用 .modify() XQuery 删除节点需要 38 分钟才能执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30024042/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po