SELECT /*+ first_rows*/ 
F.CONSTRAINT_NAME FROM SYS.ALL_CONSTRAINTS F, 
SYS.ALL_CONS_COLUMNS,SYS.ALL_CONSTRAINTS P WHERE F.OWNER = 'SCOTT' AND 
F.TABLE_NAME = 'EMP' AND F.CONSTRAINT_TYPE ='R' AND 
SYS.ALL_CONS_COLUMNS.CONSTRAINT_NAME = F.CONSTRAINT_NAME AND 
SYS.ALL_CONS_COLUMNS.TABLE_NAME = 'EMP' AND SYS.ALL_CONS_COLUMNS.OWNER = 
'SCOTT' AND P.OWNER = F.R_OWNER AND P.CONSTRAINT_NAME = F.R_CONSTRAINT_NAME 
ORDER BY F.CONSTRAINT_NAME, SYS.ALL_CONS_COLUMNS.POSITION; 
-----------------------------------------------------------------
将第一行的/*+ first_rows*/改为/*+ rule*/就可以运行,如何可以在基于成本的first_rows模式下运行以上语句? 

解决方案 »

  1.   

    是不是有两个表以上都存在first_rows字段?给这个字段加上个表名试试,如f.first_rows
      

  2.   

    运行上述语句后在OEM中看到此用户的SQL信息为:
    -----------------------------------------------
    解释计划不可用于该SQL语句:
    ORA-01039:试图基本对象的权限不足
    其原因可能是对基础对象执行解析计划命令的权限不足,也可能是SQL中的目标名不符合要求.
    -----------------------------------------------
    在很长时间后,sql/plus才返回结果,但添加/*RULE*/提示后就很快。
    请问该如何改变此种情况。以上代码是在用PB连接ORACLE后查看TABLE中的数据时反映很慢并用OEM监控到的。如果将数据库的OPTIMIZER_MODE改为RULE将改变整个数据库的执行计划,如果不改在PB画数据窗口时反映很慢(程序无响应),请问高手们这个如何解决。
                                                                        谢谢