2015-10-07 3 views
9

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

select sum(qty) as qty, field 
from 
(
    (
     select SUM(table1.qty) as qty , field 
     from 
     table1 
     left join table2 on table1.field = table2.field 
     left join table3 on table3.field = table2.field 
     where condition 
     group by fieldname 
    ) 
    UNION ALL 
    (
     selecy SUM(table1.qty) as qty,field 
     from 
     table1 
     left join table2 on table1.field = table2.field 
     left join table3 on table3.field = table2.field 
     where condition 
     group by fieldname 
    ) 
    UNION ALL 
    (
     select SUM(table1.qty) as qty, field 
     from 
     table1 
     left join table2 on table1.field = table2.field 
     left join table3 on table3.field = table2.field 
     where condition 
     group by fieldname 
    ) 
    ... 
    .. 
    12 times 
) as temp 
LEFT JOIN another_main_table ON another_main_table.field = temp.field 

Я позаботилась индексы каждой таблицы, но есть некоторые союзы, которые занимают больше времени, чем ожидался. В этом запросе используется около 45 таблиц, и все они полностью изучены. В некоторых таблицах содержится около 2,6 миллиона записей. Можете ли вы предложить мне, как я могу получить результат за полтора секунды? На данный момент я получаю результат примерно за одну минуту.

+0

Непонятно, что вам нужно для этого запроса. Являются ли таблицы1, table2, table3 одинаковыми во всех запросах? Если это так, просто используйте один запрос с 'WHERE Condition1 OR Condition2 OR .....' – valex

+0

Это может быть уродливый запрос, но вам может потребоваться опубликовать более полный запрос. Возможно, вам даже понадобится опубликовать его в каком-то месте вне сайта, например pastebin.com, если он слишком велик, чтобы принять его здесь. – DRapp

+0

эй .. Все таблицы table1, table2, table3 различны. Я знаю, что если бы я мог вставить запрос здесь, мне было бы легче направить меня .. но не могу отправлять запрос здесь, потому что .. Я ограничен, чтобы не раскрывать информацию о базе данных и таблицах :(Извините за это. –

ответ

1

С вашего данного примера нельзя правильно обосновать правильные решения, но, если я грубо исследую ваш запрос, вы использовали LEFT JOIN, так что это займет больше времени, чем INNER JOIN.

Итак, используйте INNER JOIN, если ваши данные позволяют

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