我有两个大数据量的表a和b,(a.id1, a.id2)是a的联合组件主键有索引,a.code也有索引,(b.id1,b.id2)是b的联合主键有索引,它们都还有许多其他的字段。
查询如下:
select a.id1, a.id2, a.code, a.x, a.y, ..., b.x, b.y, ... 
from a, b
where a.id = b.id and a.code = '123'
这个查询应该能用到索引(a.code和a.(id1,id2)以及b.(id1,id2))
我有几个数据库,在大部分数据库上都是正常的,但其中有一台却会fullscan b表。
区别是这台数据库对a和b用了分区表,索引都是全局索引。
请问谁有这方面的经验,使这条查询在分区表上也能正常查询?

解决方案 »

  1.   

    更正查询如下:
    select a.id1, a.id2, a.code, a.x, a.y, ..., b.x, b.y, ... 
    from a, b
    where a.id1 = b.id1 and a.id2 = b.id2 and a.code = '123'
      

  2.   

    try:
    select a.id1, a.id2, a.code, a.x, a.y, ..., b.x, b.y, ... 
    from (select * from a where a.code='123') a, b
    where a.id1 = b.id1 and a.id2 = b.id2;
      

  3.   

    to bzszp(SongZip) :“try:
    select a.id1, a.id2, a.code, a.x, a.y, ..., b.x, b.y, ... 
    from (select * from a where a.code='123') a, b
    where a.id1 = b.id1 and a.id2 = b.id2;”
    --不能这样做,因为我要把这个语句做成视图。
      

  4.   

    是否使用索引跟优化器有关
    如果返回结果大于20%,使用索引可能效率比full scan还低你说的奇怪现象可能是这样的
    如果你的结果完全可以从索引列中取出来,则直接通过索引检索出来,而省去了scan by rowid这个工序,效率最高。
      

  5.   

    to bzszp(SongZip) :不是返回结果记录数多,记录数还是只有几条,字段增多而已。
    to waterfirer(水清):试着建了分区索引,没有作用。
      

  6.   

    a.code = '123'也许能将A表的数据锁定在一个分区内,提高查询速度,
    没有过滤B表的条件,所以B表每个分区都要走一遍。
    还有,如果在较多重复数据的字段上建索引也是不合适的,不知道你的是不是这样
      

  7.   

    to bobfang(匆匆过客)/waterfirer(水清):表的索引建的没问题,都是主键或编号字段;
    由于a表用到索引,而a和b有很强的关系(其实是一对一),所以应该也能通过关联被限定,实际确实也是可以用到索引的,只是字段多加几个就不行了,怪呀!