在項目中動態拼接sql語句,使用union all連接結果集,每個查詢語句都使用了in(幾百個數值)。語句如:
SELECT AA FROM T1 WHERE aa IN(1,2,3,4..............................) UNION ALL SELECT AA FROM T2 WHERE aa IN(1,2,3,4..............................)
當in和union all 很多時執行就會發生異常
”查詢處理器用盡了內部資源,無法生成查詢計划。這種情況很少出現,只有在查詢極其復雜或引用了大量表或分區時才會出現。請簡化查詢。如果您認為該消息的出現純屬錯誤,請與客戶支持服務部門聯系,了解詳細信息。“
解決方法:
使用臨時表把in語句改成EXISTS語句
CREATE TABLE #temp(id nvarchar(50)) INSERT INTO #temp(id) select 1 union select 2 union select 3 union select 4union select 5 SELECT AA FROM T1 WHERE EXISTS (SELECT 0 FROM #temp WHERE id=T1.aa) UNION ALL SELECT AA FROM T2 WHERE EXISTS (SELECT 0 FROM #temp WHERE id=T1.aa) DROP TABLE #temp;
性能改善:
修改前執行57秒報錯,修改后14秒出結果,效果還是很明顯的.