编辑:解决了!感谢@kfinity.
AskTom建议在查询开始时使用select/*+ opt_param('_ optimizer_use_feedback''false')*/来禁用反馈用法.这解决了我的问题.
tldr:向查询添加随机注释使其运行一致,删除此注释会破坏它.
警告:很久.
我首选的工作方式是将源代码中的查询作为字符串,以便它们处于版本控制状态,我可以看到随时间的变化.与我一起使用dapper和oracle.ManagedDataAccessNuGet包.有问题的应用程序是在.NET Framework 4.7.2上运行的WPF应用程序(在两种情况下).我正在使用Visual studio professional 2017 15.9.5.
大约一年前,我遇到了一个查询问题.我不记得它是什么,我知道我没有时间记录它并在此发布.我现在这样做,我遇到了同样的问题.那时我想知道如果我重新启动我的电脑或更改查询文本,它会再次正常运行.只是偶尔会出现问题的症状,我会在查询中添加注释,或者删除之前的那个,我会在每个版本中测试该特定功能.我每次都会测试它,因为如果我的机器出现故障,它在目标用户机器上也会出错.当时我认为这是我的电脑的驱动程序/硬件问题.我想通过改变查询文本来解决它的方法是因为我会ctrl-x ctrl-v从代码中剪切并粘贴()整个查询Oracle developer并在那里编辑它.在某些时候,我注意到甚至一个额外的空格或输入将使它再次工作.
回到现在,我又遇到了问题.这一次是不同的,因为它不会偶尔失败.这非常一致.回想一下我是如何理解这是一个驱动程序/硬件问题,我在3台不同的机器上构建并运行应用程序,结果相同.我可以运行查询Oracle developer,使用ctrl + end运行整个查询,而不仅仅是50行.它运行大约10秒钟.它一次又一次地运行,如果没有任何变化,这是有道理的.
如果我从我的应用程序运行它,它运行正常 - 但只有一次.它也需要大约10秒钟.如果我刷新再次运行查询的数据,它会挂起.没有例外,如果我打破调试器,它只会让database.Query<>()电话冷却.如果我重新启动我的电脑或更改查询,它将运行 - 只需一次.
当然,我去谷歌寻求帮助.找到一些有趣的文章并没有真正帮助我:
直到我发现这个:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1191435335912
他们提到v$session_longops了据说让我们深入了解长期运营的情况.
select *
from v$session_longops
where time_remaining > 0
Run Code Online (Sandbox Code Playgroud)
我在刷新应用程序中的数据时运行了这个,导致查询再次运行.我看到了这个:
第一个查询运行正常,索引很好.第二次启动全表扫描.它不需要这个,因为它在第一次运行时也运行正常oracle developer.正如预期的那样,如果我让它保持运行(超过20分钟),表扫描就会完成,我得到的结果与第一次相同.
我发现你可以explain plan for用来解释一个查询计划,而无需使用GUI Oracle developer.这给了我两个完全不同的计划,一个Oracle developer总是有这个笔记:- 'PLAN_TABLE' …