我有下面的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
|
.......................................
答案 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后被创建为基数误估计。之后,时间大大改善,问题得到解决。