database - 停止来自 Progress data server for oracle 的索引相关提示和条款

标签 database oracle11g progress-4gl openedge

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

最佳答案

你不应该阻止全局阻止 order by 的尝试,我相当确定你不能用开关来做到这一点。

添加 order by 的原因是因为 Progress 试图保持相同的行为,就好像代码是针对 Progress DB 运行一样。这意味着如果您使用的是 FIND FIRST(例如),那么第一个记录有一个特定的含义,而不仅仅是一个随机记录(就像 Oracle 那样,除非您指定顺序)。

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

我会先检查这些并确保您有适当数量的直方图或在开始弄乱架构持有者之前切换到 SKEW。

从架构持有者中删除索引会产生问题,因为它会影响 Progress 如何看待表之间的关系以及表的唯一性。

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

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

关于database - 停止来自 Progress data server for oracle 的索引相关提示和条款,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31110313/

相关文章:

hibernate - 如果没有更新完成,LockMode.WRITE是否释放锁

甲骨文 : PLS-00103 occur on procedure with condition

multidimensional-array - 如何在 Progress 4GL 中制作多维数组?

csv - 如何使用ABL编码将数据写入CSV文件

ruby-on-rails - rails : how to use database bindings in where

SQL 数据截断 : Incorrect date value

java - 实现新闻提要的最佳方式 - 类似于天空新闻应用程序

break - 对多个字段使用 Break By

php - 数据库抽象层——那是什么?

sql - 使用 IN 或子查询到另一个表的 where 查询速度更快吗?