繁体   English   中英

从Oracle的Progress数据服务器中停止与索引相关的提示和子句

[英]Stopping index related hints and clauses from Progress data server for oracle

我正在为Oracle使用进度数据服务器。 实际的数据库驻留在ORACLE 11g上,并且仅使用oracle DB模式创建进度模式,并使用ora-brokers连接Oracle DB。 我们希望Oracle根据执行计划来处理索引选择,因此我们为Data Server添加了-noindexhint参数,它停止了查询的索引提示,而这些查询是Oracle遇到的。 现在的问题是,即使没有索引提示,数据服务器也会使用与where子句列及其顺序匹配的索引向SQL查询添加order by子句(即使在进度查询中未使用by子句)。 由于来自数据服务器的此顺序,Oracle被迫使用其他索引,这会花费很多时间。 这里的一种解决方案似乎是从Schema持有者中删除所有索引,因为在源代码中我们没有使用任何显式的use-index关键字。 请提供您的意见以处理这种情况。

您不应阻止全局阻止订单的尝试,而且我很确定您不能通过开关来执行此操作。

之所以要添加order by,是因为Progress试图维持与代码针对Progress DB运行相同的行为。 意思是,如果您使用的是FIND FIRST(例如),则有一个特定的含义是FIRST记录,而不仅仅是随机记录(除非您指定order by,否则Oracle一样)。

通常,但并非总是如此,当我遇到这些问题时,我发现列的统计信息不够详细,无法知道有多少记录要返回,并且/或者没有正确设置与排序/ IO相关的参数。 这会导致CBO做出错误的决定并选择索引路径,而不是对通常返回的较小子集进行排序。

我将首先检查这些内容,并确保您具有适当数量的直方图或切换到SKEW,然后再开始与模式持有人混淆。

从模式持有者中删除索引将是有问题的,因为这将影响Progress如何看待表与表的唯一性之间的关系。

您的确有一些与代码相关的选项:

  1. 运行存储过程,而不使用FOR / FIND。
  2. 通过SQL运行传递而不是使用FOR / FIND。
  3. 在Oracle端添加与指定排序匹配的索引

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM