2015-10-16 61 views
0

對於一個個人項目,爲了提高性能和安全性,我試圖在主表的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查詢來使這個更高性能,然後常規內部聯接?

謝謝。

回答

0

首先,SQL Server是關係數據庫

關係數據庫的關鍵點是normalization

第一範式:

數據庫是在第一正常形式如果它滿足以下條件:

只包含原子值

沒有重複基團

原子值是一個值那是不能分開的。

使用XML列插入非原子數據。然後在檢索數據期間,您需要解析它以獲取特定值。解析幾乎總是比簡單的JOIN更昂貴。所以第一種方法更好。