对于返回相同结果的不同查询,我有两个查询计划 我想知道是否有人可以告诉我哪一个“更好”,以及为什么。
SELECT *
FROM bids order by (select ranking from users where users.id = runner_id) DESC limit 1
"Limit (cost=17.62..17.62 rows=1 width=568)"
" -> Sort (cost=17.62..17.62 rows=2 width=568)"
" Sort Key: ((SubPlan 1))"
" -> Seq Scan on bids (cost=0.00..17.61 rows=2 width=568)"
" SubPlan 1"
" -> Index Scan using users_pkey on users (cost=0.28..8.29 rows=1 width=4)"
" Index Cond: (id = bids.runner_id)"
第二个陈述和计划:
SELECT "bids".*
FROM "bids" inner join users u on bids.runner_id=u.id ORDER BY u.ranking DESC LIMIT 1
"Limit (cost=17.64..17.64 rows=1 width=572)"
" -> Sort (cost=17.64..17.64 rows=2 width=572)"
" Sort Key: u.ranking"
" -> Nested Loop (cost=0.28..17.63 rows=2 width=572)"
" -> Seq Scan on bids (cost=0.00..1.02 rows=2 width=568)"
" -> Index Scan using users_pkey on users u (cost=0.28..8.29 rows=1 width=8)"
" Index Cond: (id = bids.runner_id)"
答案 0 :(得分:1)
没有足够的东西可以产生任何真正的不同。我会使用第二个,因为第一个语法具有相当不规则的语法,这使得维护起来更加困难。略。
你也可以试试这个:
select b.*
from (select id
from users
order by ranking desc
limit 1) u
join bids b on b.runner_id = u.id
limit 1
最后一个限制1可能是多余的。
答案 1 :(得分:0)
我认为此查询性能优于第二个
SELECT *
FROM bids order by (select ranking from users where users.id = runner_id) DESC limit 1;
因为看到解释分析器平面差异在第二个显示
嵌套循环(成本= 0.28..17.63行= 2宽度= 572)
在数据结构方面总是循环使得程序输出的复杂性更高。还有很多其他参数见
宽度 两种情况的参数。