如果我這樣做,CTE與選項重新編譯後沒有工作
declare @Q varchar(10) = 'ab1';
SELECT *
FROM MyTable
WHERE EXISTS(SELECT TOP 1 't' InnerTable O WHERE O.TId = P.Id)
AND (P.Name_EngLIKE @Per_Name + '%' OR P.PER_NAME_ARB LIKE @Per_Name +'%')
然後查詢變得非常緩慢。如果我評論EXISTS(SELECT TOP 1 't' InnerTable O WHERE O.TId = P.Id)
那麼它會很快,或者如果我添加OPTION(RECOMPILE)
那麼它會很快。問題是,我使用CTE這個SQL(公用表表達式)不容許我把OPTION(RECOMPILE)
編輯: 這裏是我的CTE,
WITH CTEPage AS
(
SELECT Top(@PageSize * @PageIndex)
ROW_NUMBER() OVER (ORDER BY P.Id) AS RowNumber
FROM MyTable(NOLOCK) AS P
WHERE EXISTS(SELECT TOP 1 't' FROM OtherTable O WHERE O.PId = P.Id)
AND (@Name IS NULL OR @Name = '' OR P.NAME_ENG LIKE @Name + '%' OR P.NAME_ARB LIKE @Name + '%')
)
SELECT TOP(@PageSize)
*
FROM CTEPage AS P
WHERE P.[RowNumber] > (@PageIndex - 1) * @PageSize
ORDER BY P.[RowNumber] ASC;
更新: CTE工作。問題是@Name是的NVarChar而NAME_ENG和NAME_ARB類型爲VARCHAR
您需要在整個語句結束時重新編譯選項。你剛剛在CTE的最後? –
我想把它放在CTE中。在CTE之後加入SELECT不會影響性能。 – user960567
也許問題不在於重新編譯選項,而在於如何使用CTE。也許是溫度。表將是一個更好的解決方案。沒有像完整的SQL,表和索引結構和查詢計劃這樣的細節,一切都只是猜測。 –