假设有 表A和表B ,通过 C1做内连接。
也就是 select * from A inner join B on A.C1 =B.C1 where xxxx 
对于表B来说 C1是 pk。想问一下 B的执行计划是全表检索 还是 pk检索。 
A大概 从几万条中检索100条 。B表有几千万。我这的结果是全表检索。求高手解释下原理。
另,这种情况如何处理比较好?用hint么?还是分两步检索?

解决方案 »

  1.   

    试试:select /*+ first_rows */  from A inner join B on A.C1 =B.C1 where xxxx 
      

  2.   

    A B 一般可以用nest loop join吧
    不过还 是看你where后面的条件
      

  3.   

    这个不好确定,关键还看你后边的where条件。
      

  4.   

    谢谢各位回复。
    重新设计了下数据和逻辑避开了这个问题。但是发现一个不理解的事。B表其实是个view。内容为俩个表数据的union all。如果在我的sql里写view,就全表扫,如果把view的sql直接写在b的位置,就会走pk的索引。
    这是怎么回事?
      

  5.   

    sql语句不同的写法,oracle可能采取的优化改写也不同,可以选择的执行计划也不同,尤其是sql比较复杂的情况