sql >> Databáze >  >> RDS >> PostgreSQL

Postgres:Proč je výkon u dílčích výběrů s Offset/Limit tak špatný

Myslím si, že spojení vyjádřené v klauzuli SELECT se provádí i pro 100 000 řádků, které nezahrnujete do konečného souboru dat.

Co třeba tohle:

SELECT s2.user_id,
(SELECT address_id FROM address a WHERE a.user_id = s2.user_id ORDER BY address_id OFFSET 0 LIMIT 1) AS a_id
FROM (select *
      from   subscribers s
      ORDER BY s.user_id
      OFFSET 100000 LIMIT 200) s2

Pokud se tak nestane, zkuste běžný tabulkový výraz:

With s2 as (
  select *
  from   subscribers s
  ORDER BY s.user_id
  OFFSET 100000 LIMIT 200)
SELECT s2.user_id,
(SELECT address_id FROM address a WHERE a.user_id = s2.user_id ORDER BY address_id OFFSET 0 LIMIT 1) AS a_id
FROM s2


  1. pg_stat_activity se v rámci procedury nebo transakce neaktualizuje

  2. Vydán SQL Developer 4.1.3

  3. V MySQL počítání offsetu pro časové pásmo

  4. Je to bezpečná/silná vstupní sanitační funkce?