2013-07-14 5 views
5

Я всегда слышу от специалистов по SQL, что неэффективно использовать знак «*» в инструкции SELECT, и лучше всего перечислить все имена полей.SELECT * - плюсы/минусы

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

Итак, каковы плюсы и минусы при использовании '*'?
Спасибо.

+1

возможно дубликат [Можно выбрать \ * использование когда-либо будет оправдано?] (http://stackoverflow.com/questions/3635781/can-select-usage-ever-be-justified) –

ответ

13

В общем, использование SELECT * - это не очень хорошая идея.

Плюсы:

  • При добавлении/удалить столбцы, вам не придется вносить изменения, где вы действительно использовали SELECT *
  • Он короче писать
  • Также смотрите ответы: Can select * usage ever be justified?

Минусы:

  • Вы возвращаете больше данных, чем вам нужно. Скажем, вы добавили столбец VARBINARY, который содержит 200 тыс. Строк. Вам нужно только эти данные в один место для одной записи - с помощью SELECT * вы можете в конечном итоге возвращаются 2Мб за 10 строк , что вам не нужно
  • Явная о том, что данные используются
  • Задание столбцов означает, что вы выдается сообщение об ошибке, когда столбец удаляется
  • процессор запрос должен делать больше работы - выяснить, какие столбцы существуют на столе (спасибо @vinodadhikary)
  • Вы можете найти, где столбец используется более легко
  • You получить все столбцы в объединениях, если y НУ использовать SELECT *
  • Вы не можете использовать порядковое реферирование (хотя, используя порядковые ссылки для столбцов плохая практика сама по себе)
  • Также смотрите ответы: What is the reason not to use select *?
+3

Чтобы добавить к минусам, процессор запросов должен выяснить, какие столбцы существуют в конкретной таблице. – vee

+1

@vinodadhikary - Почему это будет больше, чем проверка явного списка столбцов, содержащего все имена столбцов? Я бы предположил, что это может быть немного меньше на самом деле, поскольку ему просто нужно получить все метаданные столбцов, не проверяя их отдельно. –

+0

@MartinSmith, дикий символ '*' должен быть расширен до того, как все поля будут проверены. Поэтому, если 'select' содержит' * ', который добавляется в поле_файл. Оптимизация минимальна по производительности, но дополнительный вызов функции сохраняется. Я не мог найти версию MySQL версии MySQL (и я действительно не удосужился ее перекопать), но нашел версию 'twitter' в github. Посмотрите на 'https: // github.com/twitter/mysql/blob/master /', 'sql/sql_select.cc'' JOIN :: prepare' между строками 498 и 554 и 'setup_wild' в строке 7846 в' SQL/sql_base.cc'. – vee

5

Pros:

  • когда вам действительно нужны все столбцы, короче написать select *

Против:

  • В большинстве случаев вам не нужны все столбцы, но только некоторые из них. Лучше всего получить то, что вы хотите
  • у вас нет гарантии на порядок извлеченных столбцов (или, по крайней мере, порядок не очевиден в запросе), что запрещает доступ к столбцам по индексу (только по имени).Но имена также далеки от очевидного
  • при объединении нескольких таблиц, имеющих потенциально столбцы с одинаковыми именами, вы можете определить псевдонимы для этих столбцов