使用XML字段提高性能 - 是否可能?

时间:2015-10-16 11:47:28

标签: sql-server xml tsql

对于个人项目,出于性能和安全性的原因,我尝试在主表的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毫秒,而第二个平均时间为38毫秒。 这两项测试都是使用相同的数据完成的,这并不是很多,因为我试图决定使用哪种数据模型。

我的问题是:是否可以重写xml / xml查询以使其更符合常规内部联接?

感谢。

1 个答案:

答案 0 :(得分:0)

首先,SQL Server是关系数据库

关系数据库的重点是normalization

第一范式:

  

如果数据库满足以下条件,则该数据库处于第一范式:

     

仅包含原子值

     

没有重复的小组

     

原子值是一个无法分割的值。

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