2017-03-24 39 views
0

我有這樣的子查詢需要一點點長。有沒有人有任何想法,我怎麼可以修改它,以便更快?優化一個SQL Server查詢的短邊部

ISNULL(ISNULL(
(select top 1 CONVERT(VARCHAR(11), qq.startdate , 111) 
from (select a.startdate, a.ownerid 
     from wfassignment a 
     where a.ownertable='PM' /*order by a.startdate*/)qq 
where qq.ownerid=pm.pmuid), 
(select min(w.reportdate) 
from workorder w where w.pmnum=pm.pmnum 
       and w.siteid=pm.siteid 
       and w.orgid= pm.orgid) 
),CONVERT(DATETIME,'01-02-2015 00:00:00')) 

在oracle中它比在SQL Server中快得多。我也很想知道top 1是否與oracle的rownum = 1相等。 謝謝:)

+0

問題尋求幫助的表現,應該包括像執行計劃細節,涉及表的架構和瑞普測試:HTTPS://support.microsoft.com/en-us/help/914288/how-to-generate-a-腳本的最必要的數據庫,元數據,以創建-A-統計,僅數據庫功能於SQL服務器 – TheGameiswar

+1

多種需求,最終可能具有相同的結構產生疑問 - 而不是期望是*直覺*的意圖背後的這個查詢,你可能*解釋它*。樣本數據和預期結果將有很大幫助。 –

+2

這在Oracle中並不是更快。這是一個完全不同的查詢,在完全不同的數據庫上,使用不同的索引。如果索引不同,查詢的文本形狀無關緊要。 –

回答

0

我假設你所需要的最低開始日期在你的第一個子查詢,所以我的工作了這一點:

select top 1 [sq].[pm_date] 
    from 
    (
     select convert(tinyint, 1) as [priority] 
       , min(a.startdate) as [pm_date] 
     from wfassignment a 
     where a.ownertable = 'PM' 
       and a.ownerid = pm.pmuid 

     union all 

     select 2 
       , min(w.reportdate) 
     from workorder w 
     where w.pmnum = pm.pmnum 
       and w.siteid = pm.siteid 
       and w.orgid = pm.orgid 

     union all 

     select 3 
       , convert(datetime, '2015-02-01 00:00:00') 
       /* use yyyymmdd format to avoid confusion when casting datetime values */ 
    ) as sq 
    where [sq].[pm_date] is not null 
    order by [sq].[priority] asc 

您需要外部引用添加到[PM]別名不過,但是這個部分沒有在你的問題中給出,所以我只是這樣做了。