oracle with子句如何影响整个查询[closed]

7xzttuei  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(116)

已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。

5天前关闭。
Improve this question
我有一个带有这样的with子句的查询,

select column1, column2,........., columnN
  from table1, table2, table3, ......, tableN
 where table2.uniqueIndex = table1.uniqueIndex
   and table3.uniqueIndex = table2.uniqueIndex
   and ...... tableN.uniqueIndex = tableN-1.uniqueIndex

在我的查询中,N = 23。单独运行这个程序时,我的运行时间大约为1分钟。这是因为数据本身非常大,并且没有我应用的过滤子句。现在我想应用一个过滤器子句,比如table1.primaryKey = xxxxxxx,当我把它添加到查询中时,我得到了0.197秒的运行时间,这很好。
但是,如果我将上面的查询 Package 到WITH块中,然后从子查询中选择,然后应用我的筛选子句,我将获得超过3分钟的运行时间。
使用WITH语句时,oracle在添加我的筛选器之前是否返回子查询的整个数据集?我也知道oracle将WITH块保存为存储查询,以便每次都不运行它。然而,我的表中的数据是不断变化的,而且很大,所以我不应该使用WITH块来获取这些数据,然后应用我的过滤器(用户输入)吗?
从本质上讲,我的查询是慢的,但它不应该慢,特别是当匹配我最重要的数据表之一的主键时。其他表都是小型配置表。
只是想了解WITH语句实际上是如何改变效率的,以及在使用WITH子句时“从不做”的规则是什么(以及为什么?)).
任何文档/教程是赞赏。

kognpnkq

kognpnkq1#

正如已经建议的那样,为查询的“快”版本和“慢”版本发布一个EXPLAIN计划。并张贴实际的查询-那里可能有相关的细节。
作为一个盲目的猜测...你在两个查询中都使用了正确的数据类型吗?如果您的列是VARCHAR 2,但您在“过滤器子句” predicate 中使用了一个数字(而不是字符串),那么这可能会阻止使用您期望的索引。
至于您对Oracle如何处理“WITH”子句的期望-它可能会实现它,也可能不会。Oracle按照自己的方式做事。这些计划应该会对这一点有所帮助。
根据您的描述,使用WITH构造的查询的性能应该与在查询中嵌入 predicate 的查询一样好。

相关问题