2013-07-23 2 views
0

В этом посте: SQL Query to get the data.Помогает ли MAX() повысить производительность запроса?

первый ответ:

SELECT students.student_id,student_name,father_name,mother_name, 
      COUNT(student_addresses.student_id) AS total_addresses,  
      COUNT(student_phones.student_id) AS total_phones 
    FROM students,student_phones,student_addresses 
    WHERE students.student_id = student_phones.student_id AND 
      students.student_id = student_addresses.student_id AND 
      students.student_id = 7 
    GROUP BY BY students.student_id,student_name,father_name,mother_name; 

в то время как второй является:

SELECT s.student_id, 
     max(s.student_name) student_name, 
     max(s.father_name) father_name, 
     max(s.mother_name) mother_name, 
     COUNT(distinct a.student_address_id) total_addresses,  
     COUNT(distinct p.student_phone_id) total_phones 
FROM students s 
LEFT JOIN student_phones p ON s.student_id = p.student_id 
LEFT JOIN student_addresses a ON s.student_id = a.student_id 
WHERE s.student_id = 7 
GROUP BY s.student_id 

Теперь вопрос: есть ли какие-либо существенные различия между двумя запроса, когда речь идет о производительности? Использует ли использование MAX() время выполнения второго запроса?

Я пытаюсь ответить Google, но не повезло. Я хочу дать четкое и конкретное объяснение этому.

+0

Кристиан, я думаю, что Макс не повлияет на изменение от внутреннего к внешнему соединению. Если вы действительно хотите видеть, я бы сделал два запроса одинаковыми, за исключением использования агрегатных функций. – asantaballa

+0

GROUP BY IN никоим образом не увеличивает производительность. –

ответ

1

Эти два запроса не делать то же самое, даже если четыре колонки являются уникальными (students.student_id, student_name, father_name, mother_name).

С логической точки зрения два запроса не совпадают. Первый не будет возвращать строки для ученика, у которого нет ни телефонов, ни адресов. Второй вернет таких учеников. Кроме того, значения счета различаются (в зависимости от данных).

С точки зрения производительности, основным отличием является:

 COUNT(student_addresses.student_id) AS total_addresses,  
     COUNT(student_phones.student_id) AS total_phones 

против:

 COUNT(distinct student_addresses.student_id) AS total_addresses,  
     COUNT(distinct student_phones.student_id) AS total_phones 

Использование count(distinct) является более дорогим, так как SQL двигатель должен поддерживать списки всех значений. В крайних случаях эти значения могут превышать память и даже приводить к большему количеству операций ввода-вывода. Для count(), двигатель просто добавляет один к номеру вместо того, чтобы делать операции с файловым списком.

Аналогично, накладные расходы min() и max() минимальны - двигатель выполняет сравнение и перезаписывает значение. Это небольшая iota дополнительной работы, которая вряд ли повлияет на производительность. Балансировка этого заключается в том, что ключ group by короче. Более короткие клавиши могут влиять на производительность, в зависимости от используемого алгоритма. Несмотря на это, оба запроса имеют одинаковый объем данных, обрабатываемых group by, поэтому общая разница в длине ключа (независимо от алгоритма), вероятно, будет минимальной.

Короче говоря, любая разница в производительности обусловлена ​​count(distinct), а не max(). Вы должны решить, действительно ли это то, что вам действительно нужно, и написать запрос. Вторая форма лучше, потому что она использует стандартный синтаксис объединения ANSI.

+0

Спасибо, что указали это. Значит, использование 'MAX()' вместо многих полей в предложении GROUP BY лучше по производительности, если у вас есть тот же запрос выбора с тем же полем? –

+0

@ChristianMark. , , Нет, это не то, что я сказал. Я сказал, что прирост производительности, если таковой имеется, может быть минимальным. Для дополнительного вызова функции есть небольшая часть накладных расходов. Возможно, есть немного преимуществ от наличия более короткого ключа. Общая работа для 'group by', вероятно, захлестнет любой из этих небольших эффектов. –

+0

Ах .. извините. Я прошу только уточнить. :) Спасибо! –

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