Вложенный запрос выбора слишком медленный для результата - PullRequest
0 голосов
/ 10 марта 2019

Следующий запрос работает нормально для 10 записей, но требует больше записей:

SELECT s.a, s.b, s.c
FROM
(SELECT abc FROM h1
WHERE a IN
(SELECT a FROM h1 GROUP BY a HAVING COUNT(DISTINCT b) = 1 )) s

Может кто-нибудь дать ему толчок?

1 Ответ

0 голосов
/ 10 марта 2019

Во-первых, не используйте ненужные подзапросы в FROM, поэтому напишите это как:

SELECT h.a, h.b, h.c
FROM h1 h
WHERE a IN (SELECT hh.a FROM h1 hh GROUP BY hh.a HAVING COUNT(DISTINCT hh.b) = 1);

Это все равно будет очень паршивым. То, что вы хотите, это все строки, где значения a имеют один b. Итак:

select h.*
from h1 h
where not exists (select 1
                  from h1 hh
                  where hh.a = h.a and hh.b <> h.b
                 );

Намного лучше. Тогда для этого запроса вы хотите индекс на h1(a, b).

Вы также можете написать это, используя JOIN:

SELECT h.a, h.b, h.c
FROM h1 h JOIN
     (SELECT hh.a
      FROM h1 hh
      GROUP BY hh.a
      HAVING MIN(hh.b) = MAX(hh.b)
     ) hh
     ON hh.a = h.a;

Это агрегирует только один раз. И я также должен воспользоваться тем же индексом.

...