使用XML字段提高性能 - 有可能吗?

问题描述:

对于一个个人项目,为了提高性能和安全性,我试图在主表的XML字段中添加显示信息。 在这种情况下,订单和订单。使用XML字段提高性能 - 有可能吗?

当前设置是:

tblOrders具有1个索引:Clustered on UID

tblOrderItems具有1个索引:Clustered on UID

tblOrder.Orderlines(XML)具有2个索引。一个primary and a secondary on PATH.

现在我想要以下2个查询:

SELECT Ord.UID 
    , Item.DomainName 
    , Item.BasicInfo 
    , Item.Base 
    , Item.Period 
FROM tblOrder Ord 
INNER JOIN tblOrderItem Item 
    ON Item.OrderID = Ord.UID 
WHERE Item.DomainName = 'domainname.com' 

SELECT 
    UID 
    , c.value('(DomainName)[1]','nvarchar(150)') AS DomainName 
    , c.value('(BasicInfo)[1]','nvarchar(150)') AS [Basic Info] 
    , c.value('(Base)[1]','float') AS [Base Price] 
    , c.value('(Period)[1]','smallint') AS Period 
FROM tblOrder 
CROSS APPLY tblOrder.OrderLines.nodes('/OrderItem/line') as t(c) 
WHERE c.value('(DomainName)[1]','nvarchar(150)') = 'domainname.com' 

第一个具有4毫秒的平均时间,而第二个有一个38MS平均时间。 这两个测试都使用相同的数据完成,这并不是很多,因为我试图决定使用哪种数据模型。

我的问题在最后:是否有可能重新编写xml/xml查询来使这个更高性能,然后常规内部联接?

谢谢。

首先,SQL Server是关系数据库

关系数据库的关键点是normalization

第一范式:

数据库是在第一正常形式如果它满足以下条件:

只包含原子值

没有重复基团

原子值是一个值那是不能分开的。

使用XML列插入非原子数据。然后在检索数据期间,您需要解析它以获取特定值。解析几乎总是比简单的JOIN更昂贵。所以第一种方法更好。