Что быстрее / лучше? 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 ]

1 голос
/ 04 июня 2010

То, что все выше сказали, плюс:

Если вы стремитесь к читаемому сопровождаемому коду, сделайте что-то вроде:

SELECT foo, панель ОТ виджетов;

мгновенно читается и показывает намерение. Если вы сделаете этот звонок, вы знаете, что вы получаете обратно. Если у виджетов есть только столбцы foo и bar, то выбор * означает, что вам все равно нужно подумать о том, что вы получаете, подтвердить правильность отображения порядка и т. Д. Однако, если виджеты имеют больше столбцов, но вас интересует только foo и бар, тогда ваш код становится беспорядочным, когда вы запрашиваете шаблон, а затем используете только часть из того, что было возвращено.

1 голос
/ 09 ноября 2008

SELECT * необходимо, если требуется получить метаданные, например количество столбцов.

1 голос
/ 04 июня 2010

И помните, что если у вас есть внутреннее объединение по определению, вам не нужны все столбцы, поскольку данные в столбцах объединения повторяются.

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

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

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

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

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

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

Что касается того, что быстрее, я буду полагаться на других за их опыт.

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

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

Я бы проигнорировал комментарии о том, как * нужно получить список - шансы при разборе и проверке именованных столбцов равны времени обработки, если не больше. Не преждевременно оптимизировать; -)

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

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

0 голосов
/ 05 ноября 2009

Конечно, меня это задело, но я делаю выбор *, потому что почти все мои данные извлекаются из представлений SQL Server, которые предварительно объединяют необходимые значения из нескольких таблиц в одно удобное для доступа представление.

Затем я хочу, чтобы все столбцы в представлении не изменялись при добавлении новых полей в базовые таблицы. Это дает мне дополнительное преимущество, позволяя мне менять источник данных. Поле А в представлении может быть рассчитано за один раз, а затем я могу изменить его на статическое. В любом случае View предоставляет мне FieldA.

Прелесть этого в том, что он позволяет моему слою данных получать наборы данных. Затем он передает их моему BL, который затем может создавать объекты из них. Мое главное приложение знает и взаимодействует только с объектами. Я даже позволяю своим объектам создавать себя при прохождении datarow.

Конечно, я единственный разработчик, так что это тоже помогает :)

0 голосов
/ 04 декабря 2008

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

0 голосов
/ 12 марта 2015

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

Когда вы используете (выберите *) в запросе и если кто-то изменяет таблицу и добавляет новые поля, которые не нужны для предыдущего запроса, это приводит к ненужным накладным расходам. А что, если вновь добавленное поле является блобом или полем изображения ??? тогда ваше время ответа на запрос будет очень медленным.

С другой стороны, если вы используете (выберите col1, col2, ..) и если в таблицу вносятся изменения и добавляются новые поля, и если эти поля необходимы в наборе результатов, вам всегда нужно редактировать запрос на выбор после таблицы изменение.

Но я предлагаю всегда использовать select col1, col2, ... в ваших запросах и изменять запрос, если таблица будет изменена позже ...

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