我有一個包含九個長文本字段的表(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));
謝謝!這樣可行。但是,當我比較原始版本和編輯版本時,我感到非常驚訝。原文耗時107秒,綜合版耗時1046秒。當我查看服務器的性能監視器時,磁盤系統似乎受到了最大的打擊(它使用SSD),寫入以每秒110 MB的速度寫入,其中數據庫日誌文件的寫入速度爲100 MB /秒。記憶似乎沒有問題。數據庫設置爲簡單恢復模式日誌記錄。 – rsjaffe
@RoryJaffe Ouch,這不好... –
@RoryJaffe我想知道整合版本的執行計劃是什麼樣的。我沒有安裝這個'master.dbo.RegExOptionEnumeration',我沒有樣本數據,所以我不能說真正的原因。 –