我正在使用oracle的进度数据服务器。实际的数据库位于ORACLE 11g上,只有进度模式是使用ORACLE数据库模式创建的,并用于使用ora代理连接ORACLE数据库。我们希望Oracle根据执行计划来处理索引选择,因此我们为Data Server添加了-noindexint参数,它停止了针对Oracle的查询的索引提示。现在的问题是,即使并没有索引提示,数据服务器也会使用匹配where子句列及其序列的索引,逐子句向SQL查询添加order。(即使在未使用的进行中查询中使用by子句)。由于这种来自数据服务器的顺序,Oracle被迫使用不同的索引,这需要很长时间。这里的一个解决方案似乎是从Schema holder中删除所有索引,因为在源代码中我们没有使用任何显式use index关键字。请提供您对处理此案的意见。
你不应该阻止通过全局阻止订单的尝试,我很确定你不能用开关来做到这一点。
添加订单的原因是Progress试图保持与代码在Progress DB上运行相同的行为。这意味着,如果您使用的是FIND FIRST(例如),则FIRST记录有一个特定的含义,而不仅仅是一个随机记录(就像Oracle一样,除非您指定了排序依据)。
通常(但并非总是如此),当我遇到这些问题时,我会发现列的统计信息不够详细,无法知道返回了多少记录,和/或排序/IO相关参数设置不正确。这导致CBO做出错误的决定,并选择索引路径,而不是对通常返回的子集进行排序。
我会先检查一下这些,并确保你有适当数量的直方图,或者在你开始摆弄模式持有者之前切换到SKEW。
从架构持有者中删除索引将是有问题的,因为这将影响Progress如何看待表之间的关系以及表的唯一性。
您也有一些与代码相关的选项:
- 运行存储过程,而不是使用FOR/FIND
- 运行直通SQL,而不是使用FOR/FIND
- 在Oracle端添加与指定排序匹配的索引