Postgresql 理解解释分析查询计划
我有以下输出Postgresql 理解解释分析查询计划,postgresql,sql-execution-plan,Postgresql,Sql Execution Plan,我有以下输出 Merge Join (cost=31843.55..32194.92 rows=30215 width=36) (actual time=496.720..510.071 rows=38381 loops=1) Merge Cond: (movies.year = people.birth_year) -> Sort (cost=9905.45..9918.62 rows=5268 width=22) (actual time=151
Merge Join (cost=31843.55..32194.92 rows=30215 width=36)
(actual time=496.720..510.071 rows=38381 loops=1)
Merge Cond: (movies.year = people.birth_year)
-> Sort (cost=9905.45..9918.62 rows=5268 width=22)
(actual time=151.781..152.690 rows=5634 loops=1) // <---- !!!! LOOKING HERE !!!!
Sort Key: movies.year
Sort Method: quicksort Memory: 729kB
-> Seq Scan on movies (cost=0.00..9579.81 rows=5268 width=22)
(actual time=145.826..149.340 rows=7640 loops=1) // <---- !!!! LOOKING HERE !!!!
Filter: (title > ’y’::text)
Rows Removed by Filter: 456425 // <---- !!!! LOOKING HERE !!!!
-> Sort (cost=21936.87..21953.89 rows=6808 width=18)
(actual time=344.918..347.980 rows=38465 loops=1)
Sort Key: people.birth_year
Sort Method: quicksort Memory: 423kB
-> Seq Scan on people (cost=0.00..21503.44 rows=6808 width=18)
(actual time=341.883..343.847 rows=4151 loops=1)
Filter: (name > ’zeke’::text)
Rows Removed by Filter: 1099324
Planning time: 0.450 ms
Execution time: 511.988 ms
合并联接(成本=31843.55..32194.92行=30215宽度=36)
(实际时间=496.720..510.071行=38381循环=1)
合并条件:(movies.year=people.birth\u year)
->排序(成本=9905.45..9918.62行=5268宽度=22)
(实际时间=151.781..152.690行=5634循环=1)//电影上的顺序扫描(成本=0.00..9579.81行=5268宽度=22)
(实际时间=145.826..149.340行=7640循环=1)/“y”::文本)
被筛选器删除的行:456425//排序(成本=21936.87..21953.89行=6808宽度=18)
(实际时间=344.918..347.980行=38465循环=1)
排序键:people.birth\u year
排序方法:快速排序内存:423kB
->按顺序扫描人员(成本=0.00..21503.44行=6808宽=18)
(实际时间=341.883..343.847行=4151循环=1)
过滤器:(名称>'zeke'::文本)
被筛选器删除的行:1099324
计划时间:0.450毫秒
执行时间:511.988毫秒
我想知道title>“y”的选择性估计值
此计划显示由筛选器删除的行:456425
我们拥有的总行数为464065
由于过滤器删除了456425
行,因此我们选择
464065-456425=7640
行,该行在Seq Scan
行中提到
但是为什么最上面的排序
会将实际行数显示为5634
?它是从哪里来的
我认为这可能与第二个排序操作有关,但它们是完全不同的分支
有没有办法知道表是否适合内存?Plan指示正在使用的内存量,但我看不到它们指示是否所有这些都适合内存。我不确定,但我猜测“合并联接”只消耗了“排序”节点中的5634行 PostgreSQL执行“按需”工作,即,只要上级节点需要,就会从下级节点请求结果行 虽然“Sort”肯定需要“Seq Scan”中的所有行,但合并连接可以在读取所有可用的排序行之前完成 这不是你的问题,但为了加快查询速度,你需要在
人物(姓名)
和电影(标题)
上建立索引
要知道数据是否已缓存,请使用
解释(分析、缓冲)
。然后您会看到在缓存中找到的块数(hit)和从操作系统读取的块数(read)。但是,请注意,“读取”数据可能来自文件系统缓存。您应该保留执行计划的缩进,因为这对理解它也很重要-缩进显示了不同计划节点的嵌套级别