2017-03-24 11 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')) 

これはSQL Serverよりもはるかに高速です。また、トップ1がoracleからrownum = 1と等しいかどうかを確かめたい。 感謝:)

+0

パフォーマンスのヘルプを求める質問には、実行計画、関連する表のスキーマ、テストのための詳細などが含まれている必要があります。https://support.microsoft.com/en-us/help/914288/how-to-generate-a-必要なスクリプトのデータベースの作成メタデータから統計のみのデータベースのSQLサーバ – TheGameiswar

+1

複数の要件により、同じ構造を持つクエリが生成されることがあります。* intuit *このクエリの背後にある意図は、おそらく*説明することができます*。サンプルデータと期待される結果は、大いに役立ちます。 –

+2

これはOracleでは高速ではありません。完全に異なるデータベースで、異なるインデックスを使用した全く異なるクエリです。インデックスが異なる場合、クエリのテキスト形状は重要ではありません。 –

答えて

0

私はあなたが最初のサブクエリで最小STARTDATEを必要と仮定しているので、私はこれを働い:

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 

あなたはしかし、[午後]別名に外部参照を追加する必要があり、あなたの質問にその部分は与えられていないので、私はちょうどこれのようにそれを仕上げました。