2012-03-06 11 views
1

私はより良い習慣であるか、そして/またはより速いのか疑問に思っていました。以下では、customer_idが主キーです。プライマリキーでグループ化し、他の5つのフィールドと一緒にグループ化するか、プライマリキーでグループ化してから、他のフィールドを取得するために結合します。またはこれは「それは依存している」質問ですか?SQLのパフォーマンス - 多くのフィールドでグルーピング

select customer_id, customer_name, customer_address, 5 other description fields.., 
    SalesAmount 
from 
(
    select customer_id, 
    sum(amount) as SalesAmount 
    from customer c 
    inner join orders o 
    on o.customer_id = c.customer_id 
    group by customer_id 
) t 
inner join customer c 
    on c.customer_id = t.customer_id 
+0

実行計画には何が表示されますか? – Lamak

答えて

2

これは依存する質問です。後者のバリアントはもう1回結合を行いますが、これは潜在的に遅くなります。しかし、この結合から得られる追加データが大きい場合は、グループ化操作ですべてのデータをシャッフルする必要がないため、処理が高速になります。

このように、両方のバリアントの方が速いシナリオがあります。あなたは測定する必要があります。

私の推測によれば、実際のデータとクエリでは、最初の変種は通常より高速です。

0

select customer_id, customer_name, customer_address, 5 other description fields.., 
    sum(amount) as SalesAmount 
from customer c 
inner join orders o 
on o.customer_id = c.customer_id 
group by customer_id, customer_name, customer_address, 5 other description fields.. 

私は親指のルールは文体的な理由のために何もない場合は、可能な場合、サブクエリを回避するために(およびクエリオプティマイザは、あなたが話しているのかを理解しますチャンスを改善することにある一般的だと思います約)。
しかし、SQLのパフォーマンスに関する質問には、正しい答えが1つしかありません。データで自分で試してみてください。

0

私は、最初のコードは読みやすく、物事のやり方を選択するときの出発点であると思います。

あなたはそれを自分で推測しています。これは理論的には答えられない、「それに依存する」質問です。あなたは実際のデータでそれを少し調べなければなりません。

  1. パフォーマンスは問題ですか?
  2. コードを実行し、ボトルネックのクエリ実行計画を確認しましたか?
  3. インデックスを追加しましたか?
0

データベースクエリのパフォーマンスは常に依存します。

現実的なデータセットを持つプロファイラまたはテストの代替品を使用してください。

+0

役に立たなかった..... – usr

関連する問題