当在表上加入然后过滤(例如 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) 我正在尝试检索django-admin用来创建模型的表单.
Django允许创建匹配某些模型的表单,但是管理员使用ModelAdmin更强大.
例如,这段代码允许我为文章添加多个标签:
class ArticleAdmin(admin.ModelAdmin):
list_display = ('author', 'type', 'date')
inlines = [
TagInline,
]
Run Code Online (Sandbox Code Playgroud)
我相信Django提供了一些方法来获得最终的HTML和逻辑,你知道怎么做吗?