Что быстрее / лучше? SELECT * или SELECT column1, colum2, column3 и т. Д. - PullRequest
151 голосов
/ 15 сентября 2008

Я слышал, что SELECT * - это, как правило, плохая практика при написании команд SQL, поскольку он более эффективен для SELECT столбцов, которые вам особенно нужны.

Если мне нужно SELECT каждый столбец в таблице, я должен использовать

SELECT * FROM TABLE

или

SELECT column1, colum2, column3, etc. FROM TABLE

Эффективность действительно имеет значение в этом случае? Я бы подумал, что SELECT * будет более оптимальным для внутреннего использования, если вам действительно нужны все данные, но я говорю это без реального понимания базы данных.

Мне любопытно узнать, какова лучшая практика в этом случае.

ОБНОВЛЕНИЕ: Я, вероятно, должен указать, что единственная ситуация, когда я действительно хочу, чтобы сделал SELECT *, это когда я выбираю данные из одной таблицы, где я знаю все столбцы всегда нужно извлекать, даже когда добавляются новые столбцы.

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

Ответы [ 47 ]

3 голосов
/ 15 сентября 2008

Хотя явное перечисление столбцов хорошо для производительности, не сходите с ума.

Так что, если вы используете все данные, попробуйте SELECT * для простоты (представьте, что у вас много столбцов и выполнение запроса JOIN ... может оказаться ужасным). Тогда - мера. Сравните с запросом с явно указанными именами столбцов.

Не рассуждайте о производительности, измерьте ее!

Явный листинг помогает больше всего, когда у вас есть какой-то столбец, содержащий большие данные (например, текст сообщения или статьи), и он вам не нужен в данном запросе. Тогда, не возвращая его в ответе, сервер БД может сэкономить время, пропускную способность и пропускную способность диска. Результат вашего запроса также будет меньше, что хорошо для любого кеша запросов.

3 голосов
/ 15 сентября 2008

Проблема с «select *» заключается в возможности получения данных, которые вам не нужны. Во время фактического запроса к базе данных выбранные столбцы не добавляются к вычислениям. Что действительно «тяжело», так это передача данных обратно вашему клиенту, и любой столбец, который вам на самом деле не нужен, просто тратит пропускную способность сети и увеличивает время ожидания возврата запроса.

Даже если вы используете все столбцы, извлеченные из «select * ...», это только сейчас. Если в будущем вы измените макет таблицы / представления и добавите больше столбцов, вы начнете вносить их в выбранные элементы, даже если они вам не нужны.

Еще один момент, в котором утверждение "select *" неверно, - это создание представления. Если вы создаете представление с помощью «select *», а затем добавляете столбцы в таблицу, определение представления и возвращаемые данные не будут совпадать, и вам нужно будет перекомпилировать ваши представления, чтобы они снова заработали.

Я знаю, что писать "select *" заманчиво, потому что я действительно не люблю вручную указывать все поля в моих запросах, но когда ваша система начнет развиваться, вы увидите, что стоит потратить это дополнительное время / усилие при указании полей вместо того, чтобы тратить гораздо больше времени и усилий на устранение ошибок в ваших представлениях или оптимизацию приложения.

3 голосов
/ 15 сентября 2008

определенно определяет столбцы, потому что SQL Server не нужно будет искать столбцы для их извлечения. Если вы определяете столбцы, то SQL может пропустить этот шаг.

3 голосов
/ 15 сентября 2008

Всегда лучше указывать нужные столбцы, если вы думаете об этом один раз, SQL не должен думать, что «wtf is *» каждый раз, когда вы запрашиваете. Кроме того, кто-то позже может добавить столбцы в таблицу, которые вам на самом деле не нужны в вашем запросе, и вам будет лучше в этом случае, указав все ваши столбцы.

2 голосов
/ 15 сентября 2008

Выбор одинаково эффективен (с точки зрения скорости), если вы используете * или столбцы.

Разница в памяти, а не в скорости. При выборе нескольких столбцов SQL Server должен выделять пространство памяти для обслуживания запроса, включая все данные для всех запрошенных столбцов, даже если вы используете только один из них.

Что важно с точки зрения производительности, так это план исключений, который, в свою очередь, сильно зависит от вашего предложения WHERE и количества JOIN, OUTER JOIN и т. Д. ...

Для вашего вопроса просто используйте SELECT *. Если вам нужны все столбцы, разница в производительности отсутствует.

2 голосов
/ 15 сентября 2008

НЕТ быстрее использовать явные имена полей по сравнению с *, если и только если вам нужно получить данные для всех полей.

Ваше клиентское программное обеспечение не должно зависеть от порядка возвращаемых полей, так что это тоже глупость.

И возможно (хотя и маловероятно), что вам нужно получить все поля, используя *, потому что вы еще не знаете, какие поля существуют (представьте себе очень динамичную структуру базы данных).

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

Таким образом, правило должно быть таким: если вам нужны все поля, используйте *, если вам нужно только подмножество, назовите их явно.

2 голосов
/ 04 июня 2010

Результат слишком велик. Медленно генерировать и отправлять результат из механизма SQL клиенту.

Клиентская сторона, будучи универсальной средой программирования, не предназначена и не должна быть предназначена для фильтрации и обработки результатов (например, предложение WHERE, предложение ORDER), поскольку число строк может быть огромным (например, десятки миллионов строки).

2 голосов
/ 04 июня 2010

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

1 голос
/ 15 сентября 2008

Как и в большинстве проблем, это зависит от того, чего вы хотите достичь. Если вы хотите создать сетку БД, которая будет разрешать все столбцы в любой таблице, тогда ответом является «Выбор *». Однако если вам нужны только определенные столбцы, а добавление или удаление столбцов из запроса выполняется нечасто, укажите их по отдельности.

Это также зависит от объема данных, которые вы хотите передать с сервера. Если один из столбцов определен как памятка, графика, блоб и т. Д., И вам не нужен этот столбец, лучше не использовать «Выбрать *», либо вы получите целую кучу данных, которые вам не нужны хочу, и ваша производительность может пострадать.

1 голос
/ 15 сентября 2008

Это зависит от версии вашего сервера БД, но современные версии SQL могут кэшировать план в любом случае. Я бы сказал, что с вашим кодом доступа к данным лучше всего справиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...