0

処理されたトランザクションを追跡するテーブルがいくつかあります。これらのテーブルには数百万行あります。最近の X トランザクションを調べたいことがよくあるので、次のようなクエリを使用して、いくつかのテーブルから必要な情報を取得します。

select a.id, b.field_one, c.field_two
from trans a, table_two b, table_three c
where a.id = b.id
and a.id = c.id
and a.id in
  (select id from trans where id > (select max(id) from trans) - 100);

現在、クエリは非常に遅いです。説明計画は、B と C の完全なテーブル スキャンを示しています。ここで、ネストされたクエリを個別に評価し、カンマ区切りの ID のリストに置き換えると、クエリは非常に高速になります。これは私には明らかなように思えます-結合するのに100行しかないため、最初にAとBを結合してクエリに応答した場合よりももちろん高速になります。

概念的には、クエリ オプティマイザーが適切な実行プランを見つけようとしていることは理解していますが、この場合、ひどい仕事をしているように見えます。DBMS にネストされたクエリを最初に実行させる方法はありますか? おそらくヒントを使用して?

ありがとう

4

5 に答える 5

2

Oracle が最初に内部クエリを実行し、2 つのクエリをマージしようとしないようにする NO_MERGE ヒントを使用できます。次に例を示します。

SELECT /*+NO_MERGE(seattle_dept)*/ e1.last_name, seattle_dept.department_name 
  FROM employees e1, 
    (SELECT location_id, department_id, department_name 
       FROM departments 
      WHERE location_id = 1700) seattle_dept 
  WHERE e1.department_id = seattle_dept.department_id;



select /*+ no_merge(inner) */ a.id, b.field_one, c.field_two
  from trans a, 
       table_two b, 
       table_three c, 
       (select id from trans where id > (select max(id) from trans) - 100) inner
 where a.id = b.id
   and a.id = c.id
   and a.id = inner.id;
于 2013-09-17T20:12:26.123 に答える
0
  select a.id, b.field_one, c.field_two
 from trans a, table_two b, table_three c
 where a.id = b.id
 and a.id = c.id
 and a.id between (select max(id)-100 from trans) and (select max(id) from trans)
于 2013-09-17T18:08:11.263 に答える
0

インは何もしていないようですが、削除しようとしましたか?

select a.id, b.field_one, c.field_two
from trans a, table_two b, table_three c
where a.id = b.id
and a.id = c.id
and a.id > (select max(id) from trans) - 100;
于 2013-09-17T18:09:24.117 に答える