Sql Oracle:查询优化

Sql Oracle:查询优化,sql,oracle,query-optimization,Sql,Oracle,Query Optimization,我有两个表tab1和tab2tab1有108000行,而tab2有1200000行。 以下是示例数据 tab1 +-----------------------------------------------------+ | Low | high | Region_id | +-----------------------------------------------------+ |5544220000000000 | 554

我有两个表
tab1
tab2
tab1
有108000行,而
tab2
有1200000行。
以下是示例数据
tab1

+-----------------------------------------------------+
|       Low        |         high        | Region_id  |
+-----------------------------------------------------+
|5544220000000000  |   5544225599999999  |     1      |
|5544225500000000  |   5544229999999999  |     2      |
|5511111100000000  |   5511111199999999  |     3      |
+-----------------------------------------------------+    
tab2

+------------------+
|       pan        |
+-------------------
|5544221111111111  |
|5544225524511244  |
|5511111111254577  |
+------------------+ 
所以我运行了这样一个查询

select t2.pan, t1.region_id from tab2 t2
 join tab1 t1 on t2.pan between t1.low and t1.high;
我试图做的是找到
tab2.pan
存在于哪个范围,并检索它的
区域id
:范围是唯一的,意味着低对和高对是不同的。
我尝试添加索引,并行运行,但查询运行非常慢(大约3小时)。 任何人都可以提出一些加快查询速度的建议,比如添加某种索引、更改数据结构或其他任何内容。
我正在运行针对Oracle 11gR2的查询
更新
从评论中,我测试了几件事

添加索引(高,低)和添加索引(pan)和(高,低,区域),这两种方式都会进行索引完全扫描,我也尝试了在pan上进行索引(低,高)和索引,这种方式会在tab1上进行索引范围扫描,在tab2上进行索引完全扫描,但是无论如何,它看起来非常慢。

如果没有重叠,并且
tab1
中的每个值恰好匹配
tab2
中的一行,那么我认为最好的方法是使用正确索引的相关子查询:

select t.*, t2.region_id
from (select t1.*,
             (select max(t2.low)
              from tab2 t2
              where t2.low <= t.pan
             ) as t2low
      from tab1 t1
     ) t join
     tab2 t2
     on t.t2low = t2.low;

索引、主键、外键?@jarlh我曾尝试在tab1.high和tab1.low中添加索引,但出现了索引完全扫描,查询速度非常慢。tab1和tab2中都没有主键。我想在(低、高)上使用多列索引。我认为,通过这种方式,引擎将在tab1上执行索引范围扫描?假设这是真的,你试过T1(低,高,区域)和T2(泛)的索引吗?@NeriaNachum我还没有试过,我马上就试。我一结束测试就会回信。先生,这似乎有效。我会接受这个作为一个答案,只要我尝试它的生产,不幸的是,这是不可能的今天。
select t.*,
       (case when t.pan <= t2.high then t2.region_id end) as region_id
from (select t1.*,
             (select max(t2.low)
              from tab2 t2
              where t2.low <= t.pan
             ) as t2low
      from tab1 t1
     ) t join
     tab2 t2
     on t.t2low = t2.low;