2015-04-23 56 views
0

那加入[docSVsys]爲[docSVsysReturn]是殺害查詢
三個條件聯接是殺死它 - 它變成一個循環連接
它需要2分鐘
如果我拿出我嘗試了合併和散列連接,但他們(或者[docSVsysReturn]。[sParID] = [coreCTE]。[sParID]和[docSVsysReturn]。[sParID] = [docSVsysReturn]。[sID])它在1秒鐘內運行s 不允許
涉及的列被索引
[sID]是PK和[sParID]是必需的,FK是[sID]
有關如何修復性能的任何想法?緩慢加入多個條件

; WITH coreCTE AS (
    select [docSVsysAuth].[sID], [docSVsysAuth].[sParID] 
    from [docSVsys] as [docSVsysAuth] with (nolock) 
    join [docSVtext] as [Table] with (nolock) 
     on [Table].[sID] = [docSVsysAuth].[sID] 
    and [docSVsysAuth].[visibility] in (0) 
    and [Table].[fieldID] = '108' 
    where [table].[value] = 'Andy Wipper<[email protected]>' 
) 
,  [cteFinal] AS (
select distinct [docSVsysReturn].[sID], [docSVsysReturn].[sParID] 
    from [coreCTE] 
    join [docSVsys] as [docSVsysReturn] with (nolock) 
    on ([docSVsysReturn].[sID] = [coreCTE].[sID] 
      or 
     ([docSVsysReturn].[sParID] = [coreCTE].[sParID] and [docSVsysReturn].[sParID] = [docSVsysReturn].[sID]) 
     ) 
    and [docSVsysReturn].[visibility] in (0) 
) 
select [cteFinal].[sID], [cteFinal].[sParID] 
    from [cteFinal] 
order by [cteFinal].[sID], cteFinal.[sParID] 

這有助於有點

on ([docSVsysReturn].[sID] = [coreCTE].[sID] 
     or 
    ([docSVsysReturn].[sID] <> [coreCTE].[sID] and [docSVsysReturn].[sParID] = [coreCTE].[sParID] and [docSVsysReturn].[sParID] = [docSVsysReturn].[sID]) 
    ) 

回答

0

在從不同的角度去固定它
基本上把OR在後面的比賽

; WITH coreCTE AS (
    select distinct [docSVsysAuth].[sID], [docSVsysAuth].[sParID] 
    from [docSVsys] as [docSVsysAuth] with (nolock) 
    join [docSVtext] as [Table] with (nolock) 
    on [Table].[sID] = [docSVsysAuth].[sID] 
    and [docSVsysAuth].[visibility] in (0) 
    and [Table].[fieldID] = '108' 
    where (( [table].[value] = 'Andy Wipper<[email protected]>') 
) 
) 
,  [cteFinal] AS (
select distinct [docSVsysReturn].[sID], [docSVsysReturn].[sParID] 
    from [coreCTE] 
    join [docSVsys] as [docSVsysReturn] with (nolock) 
    on ([docSVsysReturn].[sParID] = [coreCTE].[sParID] 
     and 
     ( [docSVsysReturn].[sID] = [coreCTE].[sID] -- the document 
      or (  [docSVsysReturn].[sParID] = [docSVsysReturn].[sID] -- it is a parent 
        and [coreCTE].[sParID] <> [coreCTE].[sID] -- already have the parent 
        and [docSVsysReturn].[visibility] in (0) 
       ) -- or the parent 
     ) 
     ) 
) 
select [cteFinal].[sID], [cteFinal].[sParID] -- ,bulkUpField 
    from [cteFinal] 
order by [cteFinal].[sID], cteFinal.[sParID] 
1

我建議你嘗試寫一個UNION,而不是查詢。試試看。

select [docSVsysReturn].[sID], [docSVsysReturn].[sParID] 
    from [coreCTE] 
    join [docSVsys] as [docSVsysReturn] with (nolock) 
    on [docSVsysReturn].[sID] = [coreCTE].[sID] 
    and [docSVsysReturn].[visibility] in (0) 

UNION 

select [docSVsysReturn].[sID], [docSVsysReturn].[sParID] 
    from [coreCTE] 
    join [docSVsys] as [docSVsysReturn] with (nolock) 
    on [docSVsysReturn].[sParID] = [coreCTE].[sParID] 
    and [docSVsysReturn].[sParID] = [docSVsysReturn].[sID] 
    and [docSVsysReturn].[visibility] in (0) 
+0

這個工作,但我建立查詢了一個程序,並有許多其他條件和UNION只是很多工作 – Paparazzi

+0

'或'在加入是很難優化。可能通過向所涉及的列添加各種索引來優化計劃。否則,你可能會堅持走'聯盟'的路。 – Magnus

+0

每列都編入索引。查詢計劃中只有索引尋找。看到我的修復。 – Paparazzi