多次调用 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 是您的选择。
有人要求我重构 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 是您的选择。