2016-05-15 24 views
0

私は同じ結果を与えるランク関数の下に2つありますが、どちらの方法がより効率的か、個人的な好みのちょうど場合であるかに関する情報を提供することができますか?ランク関数効率

1つはテーブルPKを使用し、もう1つはそのIDの最新のUpdateDateを使用します。

select Distinct 
DENSE_RANK() OVER 
(PARTITION BY a2.id ORDER BY a2.updateddate DESC) seq_LatestUpdate_Date, 
DENSE_RANK() OVER 
(PARTITION BY a2.id ORDER BY a2.cdm_id DESC) seq_LatestUpdate_ID 
+0

SHOW ESTIMATED EXECUTION PLANを使用して、2つのクエリの推定コストを確認しましたか? –

+0

最初の 'DESC'の後に') 'がありません。それ以外の場合、クエリは無効です。 – lad2025

答えて

0

まず、dense_rank()のいずれかのパフォーマンスへの影響は、おそらく完全にdistinctによって取り消されています。完全なクエリで別の質問をすると、おそらくより効率的になる可能性があります。

第2に、パフォーマンスの観点から注目すべき点は、インデックスがauthidに存在するかどうかだけです。最高のインデックスは、2番目の場合は(authid, dcm_id desc)、最初のインデックスの場合は同様のインデックスになります。

さて、注文列が第1のケースでは第2のケースよりも少し長く(すべてのタイプが単純であると仮定して)、違いがあるかもしれません。しかし実際には、このようなパフォーマンスの違いを考慮すると間違いなく時期尚早の最適化です。

0

投稿した内容に基づいて、2つのパフォーマンスに違いはありません。

原則として、原因の1つが実行計画のソートであり、もう1つがソートを必要とするものがそうでなければ、ソートを必要とするものは遅くなります。

書かれているように、並べ替えが必要です。

CREATE INDEX nc_xxx1 ON a2(id, updateddate DESC) INCLUDE (<other rows returned by your query>) 

あなたはこのインデックスたい第二の場合:最初の1のソートを防ぐために、あなたはこのインデックスたいそれは両方、を含むをカバーインデックスを作成することも可能です

CREATE INDEX nc_xxx2 ON a2(id, cdm_id DESC) INCLUDE (<other rows returned by your query>) 

をごクラスタ化インデックス。