我写了一个查询语句如下:
   select FreightOrder.Fromsitecode fromwarehouse,
       FreightOrder.Fromsitename   FromWHName,
       FreightOrder.Tositecode toWarehouse,
       FreightOrder.Tositename TOWHName,
       packline.ordertype,
       item.uniquekey item,
       sysdate statisticdate,
       facility.ownership,
       packline.packqty,
       packline.packqty * parameter.parvalue inventoryvalue,
       facility.category
from   
       itaitem    item,
       BOAPARGRP  ParGroup,
       BOABOPARAM parameter,
       FMPFRGTORD FreightOrder,
       WHAMPACLST MainPackList,
       WHAMPACLIN packline,
       loafacilit facility
where  
       item.Uniquekey = ParGroup.Parentbo and
       parameter.parentgroup = parGroup.Uniquekey and
       MainPackList.Foid = FreightOrder.Pid and
       packline.parentlist = mainpackList.Uniquekey
其中itaitem, BOAPARGRP,BOABOPARAM都是大表(100万),我希望的执行计划应先连接小表,在连接大表。但执行计划总先连接三个大表。 如何改变执行计划的顺序?

解决方案 »

  1.   

    列出执行计划,看哪个是驱动表,同时尽量避免table full scan.
    实在不行,就用hint来指定, 你用的是cbo?
      

  2.   

    是的 应为表大 如果加索引,执行计划使用Nested Loop 所以速度很慢,不用索引还快些 使用Merge Loop(full Scan) 所以快些. 我现在想使用方法更改执行计划的顺序,先做小表 在联大表。 各位老大有什么方法?
      

  3.   

    hint 的语法是什么 请赐教
      

  4.   

    如果取的连接表数据量很大,那走Nested Loop效果不好,它适用与小表和大表做连接,而且驱动表是小表.如果你用的cbo,就不存在这个问题,但最好把表和索引都分析一次.
    试试用hash join吧,同时注意你的hash area size不能过小.hint: select /*+ use_hash(..) */ .. .from ...