2016-02-11 66 views
2

我有一個包含九個長文本字段的表(Data)。它目前有100萬條記錄,並且正在增長,所以我想加快一點。將多個交叉應用合併爲一個查詢

我使用的一個表值正則表達式函數(master.dbo.RegExMatches),以解析出從這些九個字段字並把那些到具有記錄ID的表(DataWordFullMap)(Id在下面的例子中),字(wordtoadd ),列名(第一個查詢中的DE87,第二個中的DE150)和列中的起始字符位置(MatchIndex)。

功能master.dbo.RegExMatches取參數regex, column name, options。當前的設置必須爲每個字段掃描一次表(每個字段位於單獨的查詢中),而不是在一次掃描中將該函數應用於九列中的每一列。

將這些CROSS APPLY語句合併到一個查詢中有效嗎?也許可以通過在CROSS APPLY結果中添加一個附加列來獲得正則表達式函數中使用的列的名稱?其中一些列主要是NULL,其他一些沒有NULL值,所以對9個分區中的每個分區進行全面掃描看起來很浪費,因爲這些分區中的一些在大部分掃描中都沒有結果。

下面的代碼片段顯示了兩個涉及九個查詢:

INSERT INTO DataWordFullMap 
SELECT Id , 
     CAST (Match AS nvarchar(255)) AS wordtoadd , 
     'DE87' , 
     MatchIndex 
    FROM 
     Data CROSS APPLY master.dbo.RegExMatches('[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?' , DE87 , master.dbo.RegExOptionEnumeration(0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0)); 

INSERT INTO DataWordFullMap 
SELECT Id , 
     CAST (Match AS nvarchar(255)) AS wordtoadd , 
     'DE150' , 
     MatchIndex 
    FROM 
     Data CROSS APPLY master.dbo.RegExMatches('[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?' , DE150 , master.dbo.RegExOptionEnumeration(0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0)); 

回答

0
INSERT INTO datawordfullmap(
    -- ... 
) 
SELECT 
    d.id, 
    rems.wordtoadd 
    rems.cn, 
    rems.matchindex 
FROM 
    data AS d 
    CROSS APPLY (
     SELECT 
      cn='DE87', 
      wordtoadd=CAST(rem.match AS NVARCHAR(255)), 
      rem.matchindex 
     FROM 
      master.dbo.RegExMatches (
       '[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?', 
       d.DE87, 
       master.dbo.RegExOptionEnumeration(0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0) 
      ) AS rem 
     UNION ALL 
     SELECT 
      cn='DE150', 
      wordtoadd=CAST(rem.match AS NVARCHAR(255)), 
      rem.matchindex 
     FROM 
      master.dbo.RegExMatches (
       '[\w-[0-9ÿ_]]{2,}(-[\w-[0-9ÿ_]]{2,})?(''[\w-[0-9ÿ_]])?', 
       d.DE150, 
       master.dbo.RegExOptionEnumeration(0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0) 
      ) AS rem 
     -- UNION ALL 
     -- ... 
    ) AS rems; 
+0

謝謝!這樣可行。但是,當我比較原始版本和編輯版本時,我感到非常驚訝。原文耗時107秒,綜合版耗時1046秒。當我查看服務器的性能監視器時,磁盤系統似乎受到了最大的打擊(它使用SSD),寫入以每秒110 MB的速度寫入,其中數據庫日誌文件的寫入速度爲100 MB /秒。記憶似乎沒有問題。數據庫設置爲簡單恢復模式日誌記錄。 – rsjaffe

+0

@RoryJaffe Ouch,這不好... –

+0

@RoryJaffe我想知道整合版本的執行計劃是什麼樣的。我沒有安裝這個'master.dbo.RegExOptionEnumeration',我沒有樣本數據,所以我不能說真正的原因。 –