1

現在、クエリの実行に時間がかかっている古いジョブのトラブルシューティングに取り組んでいます。古いジョブは最初のクエリを使用していますが、私は 2 番目のクエリを使用してテストしています。

間の違い:

Select Max(Cl1) as Tab,
       Max(Cl2) as Tb,
       Customer
From TableA
group by Customer

Select Customer,
       Tab,
       tb
From 
(Select Customer,
         Tab,
         tb,
         Rank() over (partition by Customer order by Cl1 desc) rk1,
         Rank() over (partition by Customer order by Cl2 desc) rk2
  From TableA) X
 Where X.rk1 = 1 and X.rk2 = 1

Tab Tb 顧客

A45845 100052 シン

A45845 100053 シン

A45845 100054 悪臭

テーブルは、Tab 列と Tb 列の両方に常に値 (NULL または空白値なし) を持ちます。タブは特定の顧客に固有のものではありません。Tb は、連続して増加する整数であり、重複することはありません (一意)。顧客の最新のタブ値には、最新の Tb も含まれます。

結果は同じですが、この場合、クエリを変更するときに考慮しないことがありますか?

編集: 例を作成し、実際の列またはテーブル名を使用しない場合の 2 番目のクエリのエラーを修正しました。シナリオについても解説。更新された情報と元の投稿の修正についての謝罪は、再確認する前に呼び出されました.

4

3 に答える 3

0

最初のクエリはTabとの値を返しTb、2 番目のクエリは常に 2 つの列に対して 1 と 1 を返します (where句のため)。

2 番目は、CL1 と Cl2 の両方で最初の行がある顧客のみを返します。1 つ目は、すべての顧客の行を返します。

複数の行が特定の顧客の 2 つの順序条件を満たしている場合、2 番目は重複を返します。最初の例では、顧客ごとに 1 行のみが返されます。

2 番目には構文エラーがあるため、実行されません ( の後のコンマrk2)。最初のものは有効な SQL 構文のようです。

最初のものはより単純で理解しやすいようです。しかし、私の最初の点が最大の違いだと思います。(列の順序が異なるという事実は無視しています。)

于 2013-01-16T15:28:53.097 に答える
0

これは同等のクエリになりますが、より効率的であるとは思えません。@Damien_The_Unbeliever また間違っていたら教えてください。(同じ値を持つ複数の Cl1 および Cl2 行があるシナリオ用に個別に追加されました。主キーが顧客、Cl1 および Cl2 にまたがっている場合、これは削除できます。)

Select  Distinct Customer,
        X.Cl1 as Tab,
        X2.Cl2 as tb
From   (Select  Customer,
                Rank() over (partition by Customer order by Cl1 desc) rk1, 
                Cl1
        From    TableA) X
Join   (Select  Customer,         
                Rank() over (partition by Customer order by Cl2 desc) rk2, 
                Cl2
        From    TableA) X2
        On  X.Customer = X2.Customer
Where   X.rk1 = 1 
And     X2.rk2 = 1
于 2013-01-16T15:37:10.133 に答える
0

ランクが速くなることを真剣に疑っています。

ランクが必要になるのは、CL1 が最大である行の CL2 の値が必要な場合です。

顧客、CL1、および CL2 にインデックスはありますか?
断片化をチェックします。
実行計画を確認します。

そして、それらが同じ結果を返すことは決してありません。

于 2013-01-16T17:11:59.753 に答える