0

作为序言,我已经看到了十几个类似的 SO Q/As,它们似乎有点不同(不同的服务器、不同的参数等)。

基本问题

这是我的问题,我们正在针对我们的 exadata 11g 实例从 Web 服务器运行一个 select 语句。这是一个相当简单的查询(它是一个计数)。当它从 web 服务器执行时,它通常比我们从 toad 对完全相同的数据库实例运行完全相同的查询平均长 150 倍。每隔一段时间,查询就会从 Web 服务器以同样快的速度运行。

附加信息

当它从 Web 服务器变坏时,执行计划会显着不同,包括全表扫描。我们可以切换到 toad 并运行查询并获得 300 毫秒的响应。转回 web 服务器,45 秒响应(我们正在通过 oracle 性能工具观察,new relic)。

我们还尝试以 Web 用户的 oracle 帐户登录,并且在正确的执行计划下性能运行良好。所以我假设它与用户无关(但我不完全知道是否还有其他东西可以在这里查看)。

此外,我们启用/禁用了并行查询并没有发现任何差异,在 toad 中也是如此。我们无法让它在 Web 服务器之外中断。

Web 服务器本身是一个 iis,使用读取提交的事务(我们在 toad 中模拟,toad 仍然正常执行)。

桌子上的程度是正常的(我的意思是,如果这是一个问题,你会期望它从 Web 服务器和 toad 中吸取)。

我不认为这可能是驱动程序的事情(可能吗?),因为查询已经在数据库服务器上,并且无论谁发送它,oracle 都会决定执行计划,并且它位于执行全表扫描的 exadata 节点中。

所以我想我的问题是,当我基本上为相同的查询、相同的参数、相同的用户、使用不同的客户端同时(或交替)运行时获得两个不同的执行计划时,我还能在哪里看?

4

1 回答 1

2

以前见过这个。我的查询从两台不同的计算机运行,并获得了显着的执行响应时间。与您的类似,一个执行计划获取索引,而另一个执行计划使用全表扫描。就我而言,原因与基数反馈有关。将其关闭并修复此问题。顺便问一下,您使用的是哪个版本的 11g?要为您的快速查询提取执行计划,添加 /*+ monitor */ 提示将帮助您的查询显示在 SQL Monitor 上。

于 2014-03-06T20:28:53.563 回答