Sql 如何使用左连接优化查询

Sql 如何使用左连接优化查询,sql,postgresql,left-join,Sql,Postgresql,Left Join,请帮助优化我的查询: select id, paid_till, rating, paid from lots left join (select 1 paid) paid on current_timestamp <= lots.paid_till order by paid asc, rating desc, updated_at desc; 选择id、已付款、评级、已付款 抽签 左连接(选择1付费)在当前时间戳嵌套循环左连接时付费(成本=0.00..1948.13行=4宽度=2

请帮助优化我的查询:

select id, paid_till, rating, paid 
from lots
left join (select 1 paid) paid on current_timestamp <= lots.paid_till 
order by paid asc, rating desc, updated_at desc;
选择id、已付款、评级、已付款
抽签
左连接(选择1付费)在当前时间戳嵌套循环左连接时付费(成本=0.00..1948.13行=4宽度=28)(实际时间=0.014..0.682行=4个循环=1)
连接筛选器:(现在()按批次顺序扫描(成本=0.00..1948.04行=4宽度=24)(实际时间=0.008..0.675行=4圈=1)
->具体化(成本=0.00..0.03行=1宽度=4)(实际时间=0.001..0.001行=1循环=4)
->结果(成本=0.00..0.01行=1宽度=0)(实际时间=0.000..0.000行=1圈=1)
计划时间:0.210毫秒
执行时间:0.724毫秒
我应该添加什么索引?如何修复“嵌套循环左连接”


另外,我无法在select中使用虚拟列进行订购,这会导致Rails问题。

要摆脱左连接,请使用:

select id, paid_till, rating, paid_till is null as paid
from lots
where current_timestamp <= lots.paid_till 
   or paid_till is null
order by 4 asc, rating desc, updated_at desc;

以上所有这些都将摆脱“嵌套循环左连接”步骤。但我真的怀疑这是您的问题,即使是在生产中也是如此。对于一个大表,“批量顺序扫描”将产生更大的影响


如果条件
current\u timestamp要摆脱左连接,请使用:

select id, paid_till, rating, paid_till is null as paid
from lots
where current_timestamp <= lots.paid_till 
   or paid_till is null
order by 4 asc, rating desc, updated_at desc;

以上所有这些都将摆脱“嵌套循环左连接”步骤。但我真的怀疑这是您的问题,即使是在生产中也是如此。对于一个大表,“批量顺序扫描”将产生更大的影响


如果条件
current\u timestamp,那么获取
paid
值的方式很奇怪。请改用
CASE
表达式:

select 
  id, 
  paid_till, 
  rating, 
  case when current_timestamp <= paid_till then 1 else 0 end as paid 
from lots
order by paid asc, rating desc, updated_at desc;

但是为这个查询定制一个索引似乎有些过分。

这是一种获取
付费值的奇怪方式。请改用
CASE
表达式:

select 
  id, 
  paid_till, 
  rating, 
  case when current_timestamp <= paid_till then 1 else 0 end as paid 
from lots
order by paid asc, rating desc, updated_at desc;

但是,为这个查询定制索引似乎有些过分。

这个查询需要不到一毫秒的时间。您需要多快的速度?您无法避免“嵌套循环左连接”除非你去除了一个常量值的无用的左连接。这是因为在开发数据库中只有4条记录。如果你想要真正的答案,你必须显示真正的解释计划。这是不一样的。我想获得所有记录,但先要付费。没有左连接,我只能付费。我想你可以在
付费\u上建立索引,直到
相信你仍然可以得到一个<代码>嵌套循环左连接< /代码>,但是它会命中索引而不是表。因为我不确定你会看到任何性能提升。我同意在你的DEV表中需要实际数据的“AyHORSESY”。优化器需要与生产相称的统计数据来制作B。est执行计划。现在它正在使用嵌套循环左连接制定最佳计划。小于1毫秒。此查询所需时间小于1毫秒。您需要多快?无法避免“嵌套循环左连接”除非你去除了一个常量值的无用的左连接。这是因为在开发数据库中只有4条记录。如果你想要真正的答案,你必须显示真正的解释计划。这是不一样的。我想获得所有记录,但先要付费。没有左连接,我只能付费。我想你可以在
付费\u上建立索引,直到
相信你仍然可以得到一个<代码>嵌套循环左连接< /代码>,但是它会命中索引而不是表。因为我不确定你会看到任何性能提升。我同意在你的DEV表中需要实际数据的“AyHORSESY”。优化器需要与生产相称的统计数据来制作B。est执行计划。现在它使用嵌套循环左连接来制定最佳计划。小于1毫秒。
select 
  id, 
  paid_till, 
  rating, 
  case when current_timestamp <= paid_till then 1 else 0 end as paid 
from lots
order by paid asc, rating desc, updated_at desc;
create index idx_quick on lots
(
  case when current_timestamp <= paid_till then 1 else 0 end,
  rating,
  updated_at desc,
  paid_till,
  id)
;