Postgresql 理解SQL查询复杂性

Postgresql 理解SQL查询复杂性,postgresql,Postgresql,我现在很难理解为什么一个看似简单的查询要比一个复杂得多的查询花费更长的时间来返回结果 我有一个视图,performance\u summary(它依次从另一个视图中选择)。当前,在psql中,当我运行以下查询时 SELECT section FROM performance_summary LIMIT 1; 返回结果需要一分钟左右的时间,而查询 SELECT section, version, weighted_approval_rate FROM performance_summary

我现在很难理解为什么一个看似简单的查询要比一个复杂得多的查询花费更长的时间来返回结果

我有一个视图,
performance\u summary
(它依次从另一个视图中选择)。当前,在
psql
中,当我运行以下查询时

SELECT section 
FROM performance_summary 
LIMIT 1;
返回结果需要一分钟左右的时间,而查询

SELECT section, version, weighted_approval_rate 
FROM performance_summary 
WHERE version in ('1.3.10', '1.3.11') AND section ~~ '%WEST' 
ORDER BY 1,2;

几乎可以立即得到结果。在不知道视图是如何定义的情况下,是否存在任何明显或常见的原因?

在不知道视图是如何定义的情况下,不太可能。可能是“更复杂”的查询使用索引只选择两行,然后对这两行执行一些简单的分组排序。没有where子句的查询可能会看到postgres在丢弃99999999行之后操作数百万行、万亿次操作并生成一行,我们只是不知道,除非您发布这两个查询的视图定义和解释计划输出


您可能会陷入这样一个陷阱:视图在某种程度上是一个信息缓存,而事实并非如此。这是一个存储的查询,当您从中选择/将其包含在另一个查询中时,它会插入到较大的查询中-这意味着整个过程必须从头开始计划和执行。没有一个概念认为创建视图会进行任何预规划等,其他进一步的改进也会在这些预规划上进行。这更像是将视图的定义粘贴到任何使用它的查询中,然后像在那里写入一样运行查询,然后不知道视图是如何定义的,实际上不知道。可能是“更复杂”的查询使用索引只选择两行,然后对这两行执行一些简单的分组排序。没有where子句的查询可能会看到postgres在丢弃99999999行之后操作数百万行、万亿次操作并生成一行,我们只是不知道,除非您发布这两个查询的视图定义和解释计划输出


您可能会陷入这样一个陷阱:视图在某种程度上是一个信息缓存,而事实并非如此。这是一个存储的查询,当您从中选择/将其包含在另一个查询中时,它会插入到较大的查询中-这意味着整个过程必须从头开始计划和执行。没有一个概念认为创建视图会进行任何预规划等,其他进一步的改进也会在这些预规划上进行。这更像是将视图的定义粘贴到任何使用它的查询中,然后将查询当作刚在那里写入一样运行,然后

没有明显的内容,但是如果检查查询的
EXPLAIN(ANALYZE,BUFFERS)
输出,它应该会变得清晰。你应该编辑问题并添加输出。没有什么明显的,但是如果你检查查询的
EXPLAIN(ANALYZE,BUFFERS)
output,它应该很清楚。您应该编辑问题并添加该输出。