小编wvh*_*wvh的帖子

通过条件过滤优化昂贵的连接/子查询

这是一个关于在 Postgresql(9.5 或 9.6)中短路昂贵的 JOIN 或子查询的问题。我也有兴趣了解人们通常如何解决先检查后执行的问题。

我正在编写很多只应有条件地返回结果的查询,例如(网络)用户是否拥有记录或记录是否被修改。我试图阻止在 Postgresql 中构建昂贵的视图和多个来回查询来检查应用程序本身中的条件,因此我尝试编写首先选择正确记录并显示哪些条件失败的查询,并且只执行查看条件是否通过。

例如,这会在返回之前检查(应用程序)用户是否拥有记录:

SELECT is_owner, is_newer, json 
FROM (
     SELECT id, owner = '053bffbc-c41e-dad4-853b-ea91fc42ea18' "is_owner"
          , modified >= created "is_newer" 
     FROM datasets 
     WHERE id = '056e4eed-ee63-2add-e981-0c86b8b6a66f'
) cond
LEFT JOIN LATERAL (
     SELECT id 
     FROM datasets 
     WHERE is_owner and is_newer
) authed
    ON cond.id = authed.id
LEFT JOIN LATERAL (
     SELECT json 
     FROM view_dataset 
     WHERE id = authed.id
) dataset
    ON true;
Run Code Online (Sandbox Code Playgroud)

结果(是所有者):

is_owner | is_newer | json
t          t          {...}
Run Code Online (Sandbox Code Playgroud)

和负面结果(不是所有者):

is_owner …
Run Code Online (Sandbox Code Playgroud)

postgresql join

7
推荐指数
1
解决办法
3558
查看次数

标签 统计

join ×1

postgresql ×1