2017-03-16 79 views
0

下面的示例查詢是我主要查詢的一部分。我在下面的查詢中發現SORT操作符消耗了30%的成本。在T-SQL中避免排序

爲了避免SORT,需要創建索引。有沒有其他的方法來優化這段代碼。

SELECT TOP 1 CONVERT(DATE, T_Date) AS T_Date 
FROM TableA 
WHERE ID = r.ID 
AND Status = 3 
AND TableA_ID >ISNULL((
         SELECT TOP 1 TableA_ID 
         FROM TableA 
         WHERE ID = r.ID 
          AND Status <> 3 
         ORDER BY T_Date DESC 
         ), 0) 
ORDER BY T_Date ASC 
+0

將索引添加到'T_Date'? – Siyual

+1

哪裏是「r」表? – Lamak

+0

@Lamak - 此代碼生成Select列的結果(子查詢生成Select域中使用的單個值)。 – par181

回答

0

試試這個:

SELECT TOP 1 CONVERT(DATE, T_Date) AS T_Date 
FROM TableA a1 
LEFT JOIN (
    SELECT ID, MAX(TableA_ID) AS MaxAID 
    FROM TableA 
    WHERE Status <> 3 
    GROUP BY ID 
) a2 ON a2.ID = a1.ID AND a1.TableA_ID > coalesce(a2.MAXAID,0) 
WHERE a1.ID = r.ID AND a1.Status = 3 
ORDER BY T_Date ASC 

的組合使用的TOP 1與不明原因r別名關心我。幾乎肯定有一種更好的方法可以將這些數據存入您的結果中,而不需要在子查詢中執行此操作(除非這用於APPLY操作)。

1

看起來你可以使用not exists而不是種類。我想你可能會通過使用CTE或派生表而不是標量子查詢來獲得更好的性能提升。

select * 
from r ... left outer join 
(
    select ID, min(t_date) as min_date from TableA t1 
    where status = 3 and not exists (
     select 1 from TableA t2 
     where t2.ID = t1.ID 
      and t2.status <> 3 and t2.t_date > t1.t_date 
    ) 
    group by ID 
) as md on md.ID = r.ID ... 

select * 
from r ... left outer join 
(
    select t1.ID, min(t1.t_date) as min_date 
    from TableA t1 left outer join TableA t2 
     on t2.ID = t1.ID and t2.status <> 3 
    where t1.status = 3 and t1.t_date < t2.t_date 
    group by t1.ID 
    having count(t2.ID) = 0 
) as md on md.ID = r.ID ... 

它也可能是您所依靠的標識列,但目前還不清楚是什麼這些值的含義。我基本上忽略它,並使用日期列。