2016-12-08 16 views
0

実行に時間がかかるクエリがあります。私は約10分待っていますが、まだ実行が完了していません。INNER JOINを使用したクエリの高速化

SELECT 
    one.ID, 
    two.NAME, 
    two.STATUS, 
    four.KEY, 
    four.VALUE, 
    count(one.ID) as num 
FROM TABLE_ONE one, TABLE_TWO two, TABLE_THREE three, TABLE_FOUR four 
WHERE one.STATE='RED' 
    AND (two.STATUS='ON' OR two.STATUS='OFF') 
    AND (
    four.KEY='FINAL' 
    OR four.KEY='LIMIT' 
    OR (
     four.KEY='MODE' 
     AND (
     four.VALUE='T' 
     OR four.VALUE='R'))) 
GROUP BY one.ID, two.NAME, two.STATUS, four.KEY, four.VALUE 
ORDER BY group_name ASC; 

私は同等ですが、非常に速い(実行するために約1秒)を実行する別のクエリを持っている:

クエリは次のようになります。ここで

は、そのクエリです:

SELECT 
    one.ID, 
    two.NAME, 
    two.STATUS, 
    four.KEY, 
    four.VALUE, 
    count(one.ID) as num 
FROM TABLE_ONE one 
INNER JOIN TABLE_TWO two 
ON one.ID=two.ID 
INNER JOIN TABLE_THREE three 
ON two.ID=three.GROUP_ID 
INNER JOIN TABLE_FOUR four 
ON three.ID=four.ID 
WHERE one.STATE='RED' 
    AND (two.STATUS='ON' OR two.STATUS='OFF') 
    AND (
    four.KEY='FINAL' 
    OR four.KEY='LIMIT' 
    OR (
     four.KEY='MODE' 
     AND (
     four.VALUE='T' 
     OR four.VALUE='R'))) 
GROUP BY one.ID, two.NAME, two.STATUS, four.KEY, four.VALUE 
ORDER BY group_name ASC; 

(10minsについて待っていたとはまだありませんINNER JOINとクエリは本当に速く実行なぜ私は一種の混乱している(約1秒)とないものに時間がかかります実行される)。

実行時間を短縮するためにINNER JOINがないクエリに何かできますか?

私はORACLEを使用しています。

+0

実行計画(または "計画の説明")を見てください。私の推測では、「内部結合」バージョンはパフォーマンスを向上させるためにインデックスを使用していますが、結合条件がフィルタ条件と混在しているバージョンは何らかの理由でインデックスを使用していません。あるいは、実行計画を見るときに明白でなければならないいくつかの違いがあります。 – SlimsGhost

答えて

2

最初のクエリでは、テーブルは実際にどの列でも結合されません。結果はcross joinとなります。 2つのテーブルを返す行の間のクロス結合は、第1のテーブルの行の数と第2のテーブルの行の数を掛けたものに等しくなります。

Inner join与えられた列の集合に基づく結合。

0

長時間実行されているクエリには、テーブルを関連付ける結合条件がありません。したがって、各テーブルのすべてのレコードのデカルト積を作成しています。したがって、各テーブルに10の行がある場合、集計関数を実行する前に10 * 10 * 10 * 10 = 10,000の結果行が生成されます。テーブルが大きくなると悪化します。各テーブルに1,000行があれば、1,000,000,000,000行が生成されます。

高速化されたクエリの結合条件は、結果セットの行数を大幅に減らすため、より効果的です。

0

IDのN個の値があるとします。最初のクエリでは、N * N * N * N(またはN^4)行を作成します。

2番目にN行を作成します。ビッグO記法で

O(N) 

O(N^4) 

は今、あなたはインパクトの現実世界の例を持っています。

関連する問題