XML查询问题 - 在一台服务器上性能不错,另一台服务器性能很差

问题描述:

我有7秒钟内运行的查询,在本地SQL Server 2008 R2实例上(非快速)生成12,094条记录。但是,Sql Server Express实例需要38秒。这可能只是本地8GB Hyper-V机器和具有一半内存的远程GoGrid机器之间的区别。XML查询问题 - 在一台服务器上性能不错,另一台服务器性能很差

我的问题是我在做什么明显效率低下?

查询:

declare @FromTimestamp datetime = '2012-02-01' 
declare @ToTimestamp datetime = '2012-02-22' 
DECLARE @to datetime = DATEADD(dd, 1, @ToTimestamp) 
SELECT 
    Data.value('(/LendingTreeAffiliateRequest/Request/@AppID)[1]', 'varchar(50)') AS AppID, 
    Data.value('(/LendingTreeAffiliateRequest/Request/@type)[1]', 'varchar(50)') AS [Type], 
    [Timestamp], 
    Data.value('(/LendingTreeAffiliateRequest/@affid)[1]', 'varchar(50)') AS CDNumber, 
    Data.value('(/LendingTreeAffiliateRequest/Request/SourceOfRequest/VisitorIPAddress)[1]', 'varchar(50)') AS IP, 
    Data.value('(/LendingTreeAffiliateRequest/Request/SourceOfRequest/LendingTreeAffiliateEsourceID)[1]', 'varchar(50)') AS ESourceID, 
    Data.value('(/LendingTreeAffiliateRequest/Request/Applicant/State)[1]', 'char(2)') AS [State], 
    Data.value('(/LendingTreeAffiliateRequest/Request/Applicant/DateOfBirth)[1]', 'varchar(20)') AS DateOfBirth, 
    Data.value('(/LendingTreeAffiliateRequest/Request/Applicant/EmailAddress)[1]', 'varchar(255)') AS Email, 
    Data.value('(/LendingTreeAffiliateRequest/Request/Applicant/IsVeteran)[1]', 'char(1)') AS IsVeteran, 
    Data.value('(/LendingTreeAffiliateRequest/Request/Applicant/CreditHistory/CreditSelfRating)[1]', 'varchar(50)') AS Credit 
FROM 
    WebLogEntry wle 
    INNER JOIN EventType et on wle.EventTypeId=et.Id 
    INNER JOIN [EventData] ed on wle.EventDataId=ed.Id 
WHERE 
    (et.Id=2) 
     AND (Data.exist('/LendingTreeAffiliateRequest/Request/@AppID')=1) 
     AND ([Timestamp] BETWEEN @FromTimestamp AND @to) 
+0

你比较了执行计划吗? – 2012-02-23 23:41:34

+0

感谢您的建议。它看起来像是所有的XML ..没有什么,但其他地方0%​​。我也注意到sql server express机器没有超过25%cpu ... – 2012-02-23 23:51:10

我看不出有什么明显的错误以外的事实,SQL服务器将不得不翻腾对非常多的XQuery的。您可能希望尝试完整返回数据字段,然后在代码中解析它,以查看特定实现的速度是否更快。测量这两种方法的时间,并采取更快的方法。

如果你有一个可预测的数据结构,你最好将它存储在一个表中而不是XML blob中,因为这会显着加快速度。

+0

你似乎是正确的,虽然我不是阅读这些执行计划的专家。我觉得我应该能够做一些事实,这些记录很少编辑..如果我基于我的查询在一个由触发器填充的表上也许,所以xquery只发生过一次。我对我的服务器逻辑的简单性感到非常兴奋,只是插入一个XML blob :) – 2012-02-23 23:54:23

+0

@Gabriel如果你有一个可预测的数据结构,你最好将它存储在一个表中,而不是XML blob,因为这会加快速度显著。 – 2012-02-24 00:07:06

+0

我似乎正在学习这种困难的方式,谢谢。 – 2012-02-24 00:08:19