小编Nea*_*mar的帖子

是否可以将 LEFT JOIN 推迟到仅适用于匹配的行?

当在表上加入然后过滤(例如 LIMIT 30)时,Postgres 将对所有行应用 JOIN 操作,即使这些行中的列仅用于返回的列,而不是作为过滤谓词。

这对于 INNER JOIN(PG 必须知道该行是否会返回)或没有唯一约束的 LEFT JOIN(PG 必须知道是否会返回多于一行)是可以理解的,但是对于UNIQUE 列上的 LEFT JOIN,这似乎很浪费:如果查询匹配 10k 行,则将执行 10k 连接,然后仅返回 30。

尽可能地“延迟”或推迟连接似乎更有效,这是我在其他一些查询中看到的情况。

将其拆分为子查询 ( SELECT * FROM (SELECT * FROM main WHERE x LIMIT 30) LEFT JOIN secondary)是可行的,通过确保在加入它们之前只从主表返回 30 个项目,但感觉好像我遗漏了一些东西,并且查询的“标准”形式也应该应用相同的优化.

但是,查看 EXPLAIN 计划,我可以看到连接的行数始终是总行数,而没有“提前退出”,例如,在运行 LIMIT 5 的 Seq Scan 时可以看到。

示例架构,带有一个main表和secondary一个:将只返回辅助列,从不过滤。

drop table if exists secondary;
drop table if exists main;

create table main(id int primary key not null, main_column int);
create index main_column on main(main_column); …
Run Code Online (Sandbox Code Playgroud)

postgresql query-optimization

5
推荐指数
1
解决办法
79
查看次数

导入管理表单

我正在尝试检索django-admin用来创建模型的表单.

Django允许创建匹配某些模型的表单,但是管理员使用ModelAdmin更强大.

例如,这段代码允许我为文章添加多个标签:

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('author', 'type', 'date')
    inlines = [
        TagInline,
    ]
Run Code Online (Sandbox Code Playgroud)

我相信Django提供了一些方法来获得最终的HTML和逻辑,你知道怎么做吗?

python django django-admin

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