2017-01-18 6 views
3

このクエリを最適化するのに役立ちますか?パフォーマンスがひどいので、サブクエリを削除する必要があります。クエリの最適化(サブクエリの削除)

select LICENSE, 
     (select top 1 SERVICE_KEY 
     from SERVICES 
     where SERVICES.LICENSE = VEHICLE.LICENSE 
     order by DATE desc, HOUR desc) 
from VEHICLE 

問題は、私は同じ日時に2つのサービスを持つことができるということですので、私は、サブクエリを回避同等のSQLをコーディングすることができていません。

クエリは、メタデータを変更できないレガシーデータベース上で実行され、インデックスはまったくありません。これが、相関クエリを回避できる解決策を探す理由です。

ありがとうございます。

+2

実際の実行計画を共有します。 –

+1

ライセンス列にインデックスがありますか? – mortb

+1

DDLとインデックスとテーブルサイズを共有してください –

答えて

4

相関サブクエリを使用せずに、ROW_NUMBER()を使用してクエリを表すことができます。次のクエリを試してみて、パフォーマンス比較がどのように参照してください。

SELECT t.LICENSE, t.SERVICE_KEY 
FROM 
(
    SELECT t1.LICENSE, t1.SERVICE_KEY 
      ROW_NUMBER() OVER (PARTITION BY t1.LICENSE 
          ORDER BY t2.DATE DESC, t2.HOUR DESC) rn 
    FROM VEHICLE t1 
    INNER JOIN SERVICES t2 
     ON t1.LICENSE = t2.LICENSE 
) t 
WHERE t.rn = 1 

このクエリのパフォーマンスがあなたの二つのテーブルの結合列にインデックスを持つには、とりわけ、依存することになります。