在大型数据集上执行时,SQL不返回

时间:2018-02-05 07:49:54

标签: c++ sql oracle performance

我有下面的sql,它被困在oracle数据库中超过2个小时。这种卡住只有在通过C ++应用程序执行时才会发生。有趣的是,在它被卡住的同时我可以通过sql developer手动执行它并在几秒钟内返回。我的表有数百万行和大约100列。有人可以指出我如何克服这个问题?

select * 
from MY_TABLE  
     INNER JOIN ( (select max(concat(DATE ,concat('',to_char(INDEX, '0000000000')))) AS UNIQUE_ID 
            from MY_TABLE 
            WHERE ((DATE < '2018/01/29') 
            OR (DATE = '2018/01/29' AND INDEX <= 100000))
            AND EXISTS ( select ID 
                         from MY_TABLE 
                         where DATE = '2018/01/29'
                         AND INDEX > 100000 
                         AND LATEST =1) 
           group by ID ) SELECTED_SET ) 
      ON SELECTED_SET.UNIQUE_ID = concat(DATE, concat('',to_char(INDEX, '0000000000'))) 
 WHERE (FIELD_1 = 1 AND FIELD_2 = 1 AND FIELD_3='SomeString');

更新:

会话中存在

db file sequential read

SELECT p3, count(*) FROM v$session_wait WHERE event='db file sequential read' GROUP BY p3; 

.......................................
| P3 | COUNT(*) |
.......................................
| 1 | 2 |
.......................................

2 个答案:

答案 0 :(得分:0)

  

“我可以通过sql developer手动执行它,并在几秒钟内返回”

显然,问题不是查询固有的。所以它一定是你的应用程序的问题。

您的C ++应用程序和数据库之间的网络连接可能很慢。要检查这一点,您应该与您的网络管理员团队联系。他们可能会抵制网络问题的建议。因此,您可能需要下载并安装Wireshark,并自行进行调查。

或者你的C ++处理数据的效率非常低。代码是否已经过检测?你知道这两个小时里做了什么吗?

  

“会话显示为'缓冲区忙等待'”

缓冲区忙等待表示会话之间的块争用。如果您的应用程序有许多运行此查询的会话,那么您可能会遇到问题。缓冲区忙等待可以指示有会话等待全表扫描完成;但是当您在SQL Developer中运行查询时,查询返回结果我认为我们可以对此进行折扣。也许还有其他会话更新MY_TABLE。有多少会话正在阅读或写作?

此查询的输出是什么?

SELECT p3, count(*) 
  FROM v$session_wait 
  WHERE event='buffer busy wait'
 GROUP BY p3
;

答案 1 :(得分:0)

与我们的DBA合作,他使用
在系统级禁用了计划指令 alter system set "_optimizer_dsdir_usage_control"=0;
据他所知,SQL计划指令在执行sql后被创建为基数误估计。之后,时间大大改善,问题得到解决。