使用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
更昂贵。所以第一种方法更好。