0

選択する *
から (
        (select table1.id1,​​ table1.id1_type AS id1,
         FROM child AS table2 STRAIGHT_JOIN 親 AS table1 ON table1.id1=table2.id1
         AND table1.id2=table2.id2
         AND table1.time=table2.time
         WHERE table1.id1=123456
           AND ((table1.time>=0
                 AND table1.time<=1361936895)))
      ユニオンオール
        (table1.id1 を id1、table1.id1_type として選択
         FROM child AS table2 STRAIGHT_JOIN step_parent AS table1 ON table1.id1=table2.id1
         AND table1.id2=table2.id2
         AND table1.time=table2.time
         WHERE table1.id1=123456
                 AND table1.time<=1361936895)))) AS T
WHERE id1_type NOT IN (15)
ORDER BY time DESC LIMIT 2000

次の sql クエリ (2 つの結合、1 つのユニオンすべて) を使用していますが、内部に結合を追加した後、レイテンシが大幅に増加しています。マシンのストレージ スペースの使用量が急激に増加しているのを確認できますが、これは一時テーブルを作成しているからでしょうか?

追加のコンテキストとして、結合を追加したときに「table1」、「table2」エイリアスも追加して、列を選択する際のあいまいさを回避できるようにしました。これらのスペース使用量が増加するのを見始めました。

この追加、またはクエリ全体がこれらのクエリで巨大なストレージスパイクを引き起こしている理由についての提案をいただければ幸いです:)

4

1 に答える 1

2

クエリを実行するための最良の戦略であると考えるものを決定するのは、データベースエンジン次第です。一時テーブルへのスプーリングは、間違いなくオプションの1つです。

テーブルエイリアスは実際にはそれとは何の関係もありません。右の列は、使用しているラベルに関係なく右の列です。

興味深いことに、straight_joinではなくjoinで試してみましたか?Straight_joinを指定して、クエリオプティマイザのオプションを制限しています。

于 2013-03-14T04:17:17.337 に答える