2017-05-30 3 views
0

内部結合を使用するクエリを最適化しようとしていますが、2つの非常によく似たクエリ間のパフォーマンスの違いに戸惑います。2つの内部結合クエリ間の動作の違いを理解しようとしています

私はこれについていくつかの光を放つことを望みます。

テーブルは次のようになります。

集約:

+-recid(key)-+-avg---+ 
+------------+-------+ 

歴史:

+-recid(key)-+-value-+ 
+------------+-------+ 

目的は、与えられたキーのために、取得することです(のは1234年を想定してみましょう)、平均と値。

私は、私にとって非常に似ているようだ2つのクエリを試してみました:

SELECT a.avg, b.value FROM aggregates a, history b 
WHERE a.recid = b.recid 
AND a.recid = 1234 

は1秒未満で

しかし、

SELECT a.avg, b.value FROM aggregates a, history b 
WHERE a.recid = 1234 
AND b.recid = 1234 

ランを実行する5秒かかります。

これらの2つのクエリは同じ結果を示します。私は、パフォーマンスに大きな違いを理解したいと思います

+0

使用しているdbmsにタグを付けます。異なる製品は異なる方法で最適化されます。 – jarlh

+1

ところで、2つのクエリを別の順序で何度も実行していますか? (冷/ホットデータ) – jarlh

+0

はい、私はそれを試みました、それは非常にreproductible、1つは一貫して他のよりも5倍遅い – Maxime

答えて

0

まず、使用することを学ぶ適切な明示的なJOIN構文(より良く理解され、エンドゲームは、このクエリのパフォーマンスを向上するために!):

SELECT a.avg, h.value 
FROM aggregates a JOIN 
    history h 
    ON a.recid = h.recid 
WHERE a.recid = 1234; 

これはパフォーマンスには影響しませんが、正しい、最新の構文です。

インデックスがaggregates(recid)history(recid)であると仮定すると、2つのバージョンは、私が考えることができるほぼすべてのデータベースで非常に似た実行計画を持つ必要があります。これらの2つのインデックスは、このようなクエリに推奨されます。

1つの可能性は、冷たい対暖かいキャッシュです。クエリを初めて実行するときには、データをメモリにロードする必要があります。それはもっと長くかかります。適切なタイミングを得るには、これを考慮する必要があります。

最後に、違いを理解したい場合は、実行計画を確認する必要があります。ほとんどのデータベースは、クエリの実行方法を「説明する」簡単な方法を提供します。

0

確かにわかりませんが、2番目のクエリ実行計画が既にキャッシュされている可能性があります。そのため、DBオプティマイザはキャッシュを必要としませんでした。ところで、あなたの最初のクエリは、ANSIスタイルは、それは非常に古いでなければならないであろうけれども

SELECT a.avg, b.value FROM aggregates a 
JOIN history b ON a.recid = b.recid 
WHERE a.recid = 1234 
0

2番目のクエリが結果にクロス参加その後、フィルタリングをを実行される可能性がありますJOIN構文を使用するには、以下のように変更する必要がありますそのオマージュになるためのオラクルのバージョン。しかし、クエリプランを調べて調べる必要があります。彼らが一貫して異なるパフォーマンスを示すなら、私はクエリプランが異なることを保証します。

関連する問題