Open Sql转换为本机oracle-Sql通过where子句选择任意索引



我们在一个客户项目中发现了一个奇怪的行为。底层数据库是oracle,所以这个问题被标记为oracle,因为我们只在开放的sql层操作,这使得我们对底层数据库架构/过程/优化的了解等于零。

让我按原样描述一下设计:

  1. 我们有两张表,一张是核心表,另一张是可选附加表
  2. 始终填充核心表,而不填充其他表
  3. 核心表包含关键字MANDT、WERKS和我们自己的运行ID
  4. 可选表具有相同的键,这些键被设置为一个集合外键,参考核心表
  5. 外键设置为:需要控件,没有消息,外键的类型"未指定",没有设置基数

现在让我具体说明我们要做什么:

  1. 我们有自己的查询生成器,它允许我们几乎通过拖放技术创建select语句
  2. 我们想要选择具有可选表的内部联接的核心表(是的,在这个特定情况下,master-data告诉我们,这个可选表也总是被填充的),基于三个键域(实际上是两个)
  3. 我们在两个表上都有一些索引,在核心中我们使用索引ERDAT(创建日期),在可选表中我们使用char20字段,也进行了索引
  4. 我们想以这种方式进行抽象选择
  5. 我们调试

让我描述一下,我们看到了什么:

  1. 我们分析了调试器中创建的select语句,并验证了它看起来,正如我们希望的那样,意味着where子句首先涵盖了核心表中的ERDAT,第二行涵盖了可选表的char20字段
  2. 我们进行了运行时分析(为where标准提供其他值),运行ST05等……尽管底层数据库对我们来说是一个黑匣子,但显然ST05可以显示生成的本地SQL索引顺序,这是使用的
  3. 结果:首先使用可选表的索引CHAR20,然后使用核心表的ERDAT上的索引

让我问一下:

  1. 有人能解释为什么吗?(如果需要更多信息,我会尽力提供)

Oracle通常会使用基于成本的优化器来执行查询。根据索引的选择性和联接的最佳执行方式,DB决定首先查询哪个表。

我只能猜测,但我认为您的核心表有很多值,并且该表上的索引不是很有选择性。因此,首先查询核心表可能会产生许多结果行。如果可选表只有很少的行,那么当使用CHAR20字段上的索引进行查询时,预计会传递更少的行。在这种情况下,DB将从一个较小的连接结果集开始,因此更喜欢这个选项。

查询优化是一个非常复杂的过程,您可以在这里阅读更多信息:https://docs.oracle.com/cd/B10501_01/server.920/a96533/optimops.htm

相关内容

  • 没有找到相关文章

最新更新