Sql-Server
當輸入 udtt 計數 > 1 時加入 LIKE
此查詢接受使用者定義的表類型變數,然後將其與表連接。如果輸入是單個記錄,我希望連接是
LIKE '%'+input+'%'
,否則應該是=input
。這基本上就是我現在所擁有的,但是對於較大的輸入來說它很慢(測試大約 500 大約需要 5 分鐘)。DECLARE @inputCount INT = ( SELECT COUNT(*) FROM @inputUDTT ) SELECT b.* FROM @inputUDTT a INNER JOIN Tabl b ON (@inputCount>1 AND b.name = a.val) OR (@inputCount<2 AND b.name like '%' + a.val+ '%')
我也嘗試過
SELECT COUNT(*)
直接在連接中並將條件格式化為CASE WHEN
開關,但都沒有幫助。我知道我可以將其更改為動態查詢,但這對於看起來應該可以用更簡單的方法修復的東西來說似乎太過分了。
我將首先打破這一點,以更好地了解哪個部分慢。這應該總體上闡明執行計劃。
從那裡您可以開始整理其他技術,例如臨時表、重新編譯提示、索引等。
DECLARE @inputCount INT = ( SELECT COUNT(*) FROM @inputUDTT ) SELECT b.* FROM @inputUDTT a INNER JOIN Tabl b ON (@inputCount > 1 AND b.name = a.val) UNION ALL SELECT b.* FROM @inputUDTT a INNER JOIN Tabl b ON (@inputCount < 2 AND b.name like '%' + a.val+ '%')
例如,在您有相等謂詞的第一個查詢中,優化器可以選擇不同的連接類型(儘管它可能只選擇嵌套循環,因為表變數的行估計值較低。在第二個查詢中,唯一的連接類型沒有相等謂詞可用的是嵌套循環。
希望這可以幫助!
您可以將其分解為兩個單獨的查詢,例如:
IF @inputCount = 1 <run LIKE query> ELSE <run equals query>
或者你可以試試
OPTION (RECOMPILE)
。一個問題是表變數沒有統計資訊,這會導致優化器悲痛——使用OPTION(RECOMPILE)
可以經常解決這個問題。另一個典型的解決方法是將表變數具體化為本地臨時表(它確實支持統計資訊)並改用它。
查詢計劃的範例(嵌套循環連接更改為雜湊連接)可以在Matteo Lorini 的使用表變數時提高 SQL Server 性能中找到。