2014-10-16 1 views
0

Я хотел бы знать, какой из них является лучшим способом оптимизировать улей (0,12) запрос соединения двух таблиц из этих трех возможных кандидатов (и, возможно, понять, почему):Оптимизировать присоединиться к Улей запроса: с

SELECT * FROM a join b ON (a.id = b.id) WHERE b.dt = "2014-09-01"; 

или

SELECT * FROM a JOIN b ON (a.id = b.id AND b.dt = "2014-09-01") ; 

или

SELECT * FROM a JOIN ( 
    SELECT * FROM b where dt = "2014-09-01") c 
ON a.id = c.id ; 

у меня нет никакого контроля, как таблицы хранятся и разбит на разделы, так мой вопрос больше о общих рекомендациях, чем в конкретном случае. Я точно знаю, что a.id = b.id возможен только тогда, когда b.dt = '2014-09-01', поэтому я хотел бы ограничить данные, которые можно объединить, чтобы улучшить скорость (b - огромная таблица) ,

Чтение документации по вопросам ВИЧ-инфекции Я понял, что обычно лучше, что a - наименьшая таблица, а b - (очень) большая; Однако я не мог понять, как будут отображаться вышеописанные запросы, описанные выше, с точки зрения характеристик.

Если есть какой-либо другой способ использования, я хотел бы узнать об этом.

+0

Насколько велика таблица, она подходит для памяти? – www

+0

Я бы сказал, что это конкретное я использую, может, вообще нет, они не будут. – lucacerone

ответ

1

Я вижу, что все три одинаковы с точки зрения # MR-заданий, используемых карт и объяснения плана. Позаботившись о том, что таблица a представляет собой достаточно небольшую оптимизацию соединения на стороне карты. путем переключения положений фильтра на таблицу b не влияет на количество картографов, используемых для извлечения данных из таблицы b. Так обстоит дело, даже если таблица b находится в подзапросе.

Единственная оптимизация - обрезание разделов, если таблица b разбивается на col dt, и я вижу единственный фактор, уменьшающий количество картографов по сравнению с полным просмотром таблицы в противном случае.