0

私はオラクルに非常に慣れていません。そして、ここにテーブルといくつかのクエリがあります:

http://sqlfiddle.com/#!4/a7b7c/1

クエリがどのようになっているのだろうか:

select distinct name,id from test;

select name,id from test group by name,id;

同じ出力を生成します。上記のクエリが実行される順序をオラクルでどのように見つけることができますか? データごとにランダムですか?または、すべてのデータセットに対して実行する方法があります。

4

4 に答える 4

1

通常、パフォーマンスをデバッグする場合は、次のような説明計画を使用します。

EXPLAIN PLAN FOR SELECT DISTINCT NAME, ID FROM TEST;

EXPLAIN PLAN FOR SELECT NAME, ID FROM TEST GROUP BY (NAME,ID);

クエリ オプティマイザーが最適と考える処理の種類が表示されます。常に同じプランが得られることを保証することはできません。たとえば、インデックスを追加するとプランが変更される可能性があります。ヒントを使用することはできますが、私はそうは思いません。実際に使われているのを見たことがある

于 2013-04-28T12:16:02.840 に答える
1

上記のクエリが実行される順序をオラクルでどのように見つけることができますか? データごとにランダムですか?または、すべてのデータセットに対して実行する方法があります。

SQL では、句を使用して明示的に要求しない限り、行が決定される順序は指定されていません。order by(そうでない場合は、クエリに一致することがわかった順序で行が取得され、クエリ プランによって異なります。)

[クエリは]同じ出力を生成します。

これは、そこにIDがあるためです。おそらく、それらはすべて別個のものであり、実際のスキーマでは主キーとしてマークされています。

distinct、ところで、group byすべての意図と目的のためにすべて取得されたフィールドです。

とにかく、行を一貫して並べたい場合は、 のようなものが必要ですorder by name, id

于 2013-04-28T13:39:30.330 に答える
1

すべてのクエリが同じ結果を生成する理由は、テーブルに一意の値があるためです。

この場合、「group by」を使用しても意味がありません。カウントまたは合計 (またはその他の数学演算) を行う場合は、「group by」を使用します。以下にその例を示します。

select name, count(*) ct from test group by name

これにより、名前とその名前がテーブルに表示される回数が表示されます。

出力の順序について: Oracle は、指示されるまでランダムな順序で行を返します。したがって、特定の順序を指定するには、「order by」句を次のように使用します。

select name,id from test order by name, id; 

そうすれば、名前でソートされた結果が返されることが保証されます。名前が複数回表示される場合は、ID 順になります。

于 2013-04-28T13:16:52.537 に答える