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