2016-05-31 73 views
-1

我有一个将表连接到某些数据字典视图的查询。查询有时可以正常工作,但有时执行时间太长。当它这样做时,即使我再次取消并运行100次,它也不会响应。Oracle查询的性能变化

查询是:

SELECT 
     /*+ PARALLEL(auto) */ 
    t.id 
    FROM table1 t , 
     (SELECT  /*+ PARALLEL(auto) */ DISTINCT r.INDEX_VALUE AS id, 
      r.LOCAL_ROWID, 
      r.REMOTE_ROWID 
     FROM DBA_COMPARISON_COLUMNS c, 
      DBA_COMPARISON_ROW_DIF r, 
      DBA_COMPARISON_SCAN s 
     WHERE R.SCAN_ID  = S.SCAN_ID 
     AND c.COMPARISON_NAME = 'CMP_name' 
     AND s.root_SCAN_ID = '{scan_id}' 
     AND r.STATUS   = 'DIF' 
     ) dif 
     WHERE t.id = dif.id; 

谁能帮我解决这个问题?

+5

这是不可能回答这样的问题。请分享查询以及在查询无效时收到的错误。 – Mureinik

+0

为什么这个问题upvoted两次?这个问题甚至没有代码可以查看。 –

+0

查询没有错误,当我运行它时需要太长的时间,所以我取消它。 –

回答

1

可以有,为什么你的查询会继续运行,这取决于(但不限于)数据库100个理由,其他表写上表中的数据相同的表,锁等

你应该拳头检查V $ SESSION_LONGOPS查看该查询是否存在以及其他一些细节。

我一般使用下面的故障排除。你可以检查你的查询是否存在。如果是的话,找到sid并原路返回的意见,以检查锁等

select sesion.sid,sql_text 
from v$sqltext sqltext, v$session sesion 
where sesion.sql_hash_value = sqltext.hash_value 
and sesion.sql_address = sqltext.address 
and sesion.username is not null 
order by sqltext.piece; 
1

您的查询是基于该意见从显示输出DBMS_COMPARISON。所以结果集的大小将根据比较生成的增量而变化。如果存在大量漂移,则三角洲可能非常大,因为您在查询行差异。

另一个潜在问题:您的查询不会将DBA_COMPARISON_COLUMNS加入到其他表中。可能你应该在加入标准中包括COMPARISON_NAME,像这样...

FROM DBA_COMPARISON_COLUMNS c, 
     DBA_COMPARISON_ROW_DIF r, 
     DBA_COMPARISON_SCAN s 
    WHERE c.COMPARISON_NAME = 'CMP_name' 
    AND r.COMPARISON_NAME = c.COMPARISON_NAME 
    AND s.COMPARISON_NAME = c.COMPARISON_NAME 
    AND R.SCAN_ID  = S.SCAN_ID 
    AND s.root_SCAN_ID = '{scan_id}' 
    AND r.STATUS   = 'DIF'