pbi*_*len 13 sql postgresql common-table-expression
在PostgreSQL中,公用表表达式(CTE)是优化范围.这意味着CTE已实现为内存,并且来自另一个查询的谓词永远不会被推入CTE.
现在我想知道关于CTE的其他元数据(例如排序)是否与其他查询共享.我们来看看以下问题:
WITH ordered_objects AS
(
SELECT * FROM object ORDER BY type ASC LIMIT 10
)
SELECT MIN(type) FROM ordered_objects
Run Code Online (Sandbox Code Playgroud)
在这里,MIN(type)显然总是第一行ordered_objects(或者NULL如果ordered_objects是空的),因为ordered_objects已经被排序了type.这些知识ordered_objects在评估时是否可用SELECT MIN(type) FROM ordered_objects?
如果我正确理解您的问题-不,不是。没有这样的知识。如以下示例所示。当您将行数限制为10行时,执行速度会非常快-处理的数据更少(在我的情况下,数据要少一百万倍),这意味着CTE会忽略整个事实来扫描整个有序集,而这min将出现在第一行中...
t=# create table object (type bigint);
CREATE TABLE
Time: 4.636 ms
t=# insert into object select generate_series(1,9999999);
INSERT 0 9999999
Time: 7769.275 ms
Run Code Online (Sandbox Code Playgroud)
explain analyze WITH ordered_objects AS
(
SELECT * FROM object ORDER BY type ASC LIMIT 10
)
SELECT MIN(type) FROM ordered_objects;
Run Code Online (Sandbox Code Playgroud)
执行时间:3150.183 ms
https://explain.depesz.com/s/5yXe
explain analyze WITH ordered_objects AS
(
SELECT * FROM object ORDER BY type ASC
)
SELECT MIN(type) FROM ordered_objects;
Run Code Online (Sandbox Code Playgroud)
执行时间:16032.989 ms
https://explain.depesz.com/s/1SU
我一定要在测试前预热数据
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |