多次调用 Oracle WITH 语句

Multiple calls to Oracle WITH statement

有人要求我重构 Oracle 报告,这是一个我不太熟悉的数据库。部分查询 运行 缓慢,并且已识别上下文切换。有人建议我使用 WITH 子句来代替我使用的游标:

例如

   WITH MyData AS
   (
      SELECT * FROM People WHERE Age < 60;
   )
   SELECT * FROM MyData

我的问题是我想在脚本中多次调用 MyData 但我不知道如何使用 WITH 子句来执行此操作。在研究这个过程中,我发现一些文章提到 WITH 子句可以通过使用 MATERIALIZE 提示来使用全局临时表。

我的问题是:是否可以多次调用 WITH 子句?如果不是,我仍然会看到使用全局临时表的性能改进吗?

WITH 子句应该在一个 SQL 语句中被调用多次,而不是在一个 sql 脚本 / plsql 块中。像这样:

WITH MyData AS
   (
      SELECT * FROM People WHERE Age < 60;
   )
   SELECT * FROM MyData WHERE AGE = 10
   UNION ALL
   SELECT * FROM MyData WHERE AGE = 20

在某些情况下,优化器会内联调用 MyData 并重新执行查询。在其他情况下(其中一个是 materialize 提示),它将隐式地为 SELECT * FROM People WHERE Age < 60 查询的结果创建一个临时的 table 并从 table 中创建 select ] 之后 - 但同样 - 这些临时 tables 仅在隐式创建它们的查询期间存在。

如果您使用的是 10g,并且不想多次重新执行 MyData 查询 - temp table 是您的选择。