2014-09-07 2 views
0

У меня есть две таблицы с одинаковой схемой. Я хочу, чтобы получить количество всех людей с данной фамилией в обеих таблицах, и нашел, что я могу сделать это так:Группа по двум таблицам

SELECT surname, count(*) AS cnt 
FROM 
(
    SELECT surname 
    FROM people.NorthKorea 
    UNION ALL 
    SELECT surname 
    FROM peopleGlobal.NorthKorea 
) AS t 
GROUP BY surname 
ORDER BY cnt DESC 

Это хорошо для маленьких таблиц, но у меня есть таблицы с до 250 миллион строк, поэтому было интересно, может ли быть более эффективный способ сделать это? Например, ВСТАВИТЬ результат COUNT из одной таблицы в таблицу, а затем обновить/вставить (ЗАМЕНИТЬ?) Результат COUNT во второй таблице.

N.B. Я действительно хочу сохранить результат COUNT на обеих таблицах в другой таблице.

+0

Зачем вам хранить счет в таблице? Вам нужно будет обновить его в любое время, когда будут изменены фамилии. Похоже на плохую идею. –

+0

Две исходные таблицы - это списки людей, которые живут в Северной Корее. Они не будут обновлены. –

ответ

1

Индекс в столбце фамилии должен многое помочь. Я бы постарался с этим запросом, если есть намного больше строк, чем фамилий, я ожидаю, что он будет работать быстрее:

SELECT surname, SUM(cnt) 
FROM 
(
    SELECT surname, COUNT(*) as cnt 
    FROM people.NorthKorea 
    GROUP BY surname 
    UNION ALL 
    SELECT surname, COUNT(*) as cnt 
    FROM peopleGlobal.NorthKorea 
    GROUP BY surname 
) 
GROUP BY surname 
ORDER BY cnt DESC 
+0

Спасибо. Я попробовал свой запрос на 4 миллиона строк - это заняло 146 секунд; ваш взял 2,75. Я соглашусь через несколько минут, когда SO позволит мне. * Временные ограничения на принятие ответов универсальны, или это только я? * –

Смежные вопросы