Query optimization XML查询问题-一台服务器上的性能正常,另一台服务器上的性能超慢

Query optimization XML查询问题-一台服务器上的性能正常,另一台服务器上的性能超慢,query-optimization,sql-server-2008-r2,Query Optimization,Sql Server 2008 R2,我的查询在7秒内运行,在本地SQL Server 2008 R2实例(非express)上生成12094条记录。但是,在SQLServerExpress实例上需要38秒。这可能只是本地8gb Hyper-V机器和内存只有一半的远程GoGrid机器之间的区别 我的问题是,我在这里是否做了一些明显低效的事情 查询: declare @FromTimestamp datetime = '2012-02-01' declare @ToTimestamp datetime = '2012-02-22' D

我的查询在7秒内运行,在本地SQL Server 2008 R2实例(非express)上生成12094条记录。但是,在SQLServerExpress实例上需要38秒。这可能只是本地8gb Hyper-V机器和内存只有一半的远程GoGrid机器之间的区别

我的问题是,我在这里是否做了一些明显低效的事情

查询:

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)

除了SQL server将不得不大量使用xquery这一事实之外,我没有看到任何明显的错误。您可能希望尝试完整地返回数据字段,然后在代码中对其进行解析,以查看使用特定实现是否更快。测量这两种方法的时间,并使用更快的方法


如果您有一个可预测的数据结构,那么最好将其存储在一个表中,而不是XML blob中,因为这将大大加快速度。

除了SQL server将不得不大量使用xquery这一事实之外,我没有看到任何明显的错误。您可能希望尝试完整地返回数据字段,然后在代码中对其进行解析,以查看使用特定实现是否更快。测量这两种方法的时间,并使用更快的方法


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

您比较了执行计划吗?谢谢您的建议。看起来都在xml中。。在其他任何地方都只占0%。我还注意到sql server express机器的cpu占用率没有超过25%…您比较了执行计划了吗?谢谢您的建议。看起来都在xml中。。在其他任何地方都只占0%。我还注意到sql server express机器的cpu占用率没有超过25%……您似乎是对的,尽管我不是阅读这些执行计划的专家。我觉得我应该能够做点什么,因为这些记录很少被编辑。。如果我的查询基于一个可能由触发器填充的表,那么xquery只发生一次。我对我的服务器逻辑的简单性感到非常兴奋,除了插入一个XML blob之外什么也不做:)@Gabriel如果你有一个可预测的数据结构,你最好将它存储在一个表中,而不是XML blob,因为这将大大加快速度。你似乎是正确的,尽管我不是阅读这些执行计划的专家。我觉得我应该能够做点什么,因为这些记录很少被编辑。。如果我的查询基于一个可能由触发器填充的表,那么xquery只发生一次。我对我的服务器逻辑的简单性感到非常兴奋,除了插入一个XML blob之外什么也不做:)@Gabriel如果您有一个可预测的数据结构,那么最好将其存储在一个表中,而不是XML blob中,因为这将大大加快速度。