对于个人项目,出于性能和安全性的原因,我尝试在主表的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查询以使其更符合常规内部联接?
感谢。
答案 0 :(得分:0)
首先,SQL Server是关系数据库。
关系数据库的重点是normalization
。
第一范式:
如果数据库满足以下条件,则该数据库处于第一范式:
仅包含原子值
没有重复的小组
原子值是一个无法分割的值。
使用XML列插入非原子数据。然后在检索数据期间,您需要解析它以获取特定值。解析几乎总是比简单JOIN
更昂贵。所以第一种方法更好。