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

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

Давайте подумаем, что быстрее. Если вы можете выбрать только те данные, которые вам нужны, то это быстрее. Однако при тестировании вы можете извлечь все данные, чтобы определить, какие данные можно отфильтровать в зависимости от потребностей бизнеса.

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

Также помните об изменениях. Сегодня Select * только выбирает нужные вам столбцы, но завтра он может также выбрать тот столбец varbinary (MAX), который я только что добавил, не сообщая вам, и теперь вы также получаете все 3,18 гигабайта двоичных данных, которые не были вчера в таблице.

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

Ну, это действительно зависит от ваших показателей и цели:

  1. Если у вас 250 столбцов и вы хотите (действительно) выделить их все, используйте select *, если вы хотите вернуться домой в тот же день:)
  2. Если вашему кодированию нужна гибкость и нужная таблица невелика, снова выберите *, чтобы ускорить код и упростить его поддержку.
  3. Если вы хотите надежную конструкцию и производительность:
    • напишите названия столбцов, если их всего несколько, или
    • написать инструмент, который позволит вам легко выбирать / генерировать имена столбцов

Как правило, когда мне нужно выбрать все столбцы, я бы использовал "select *", если у меня нет особой причины поступить иначе (плюс, я думаю, быстрее для таблиц с большим количеством столбцов)

И, наконец, что не менее важно, как вы хотите, чтобы добавление или удаление столбца в таблице влияло на ваш код или его обслуживание?

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

То, имеет ли значение эффективность, во многом зависит от размера ваших производственных наборов данных (и скорости их роста). Если ваши наборы данных не будут такими большими и не будут расти так быстро, то при выборе отдельных столбцов может не быть большого преимущества в производительности.

С большими наборами данных и более быстрыми темпами роста данных преимущество в производительности становится все более и более важным.

Чтобы графически увидеть, есть ли какая-либо разница, я бы предложил использовать анализатор запросов, чтобы увидеть план выполнения запроса для SELECT * и эквивалентный SELECT col1, col2 и т. Д. Это должно сказать вам, какой из двух запросов является более эффективным. Вы также можете сгенерировать некоторые тестовые данные разного объема, чтобы посмотреть, каковы сроки.

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

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

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

Основное различие между ними заключается в количестве данных, передаваемых туда и обратно. Любые рассуждения о разнице во времени в корне ошибочны в том, что «select *» и «select col1, ..., colN» приводят к одинаковому объему относительной работы, выполняемой механизмом DB. Однако передача 15 столбцов в строке против 5 столбцов в строке представляет собой разницу в 10 столбцов.

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

Абсолютно определите столбцы, которые вы хотите ВЫБРАТЬ каждый раз. Нет причин не делать этого, и улучшение производительности того стоит.

Они никогда не должны были выбирать «ВЫБРАТЬ *»

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

SELECT * может быть в порядке, если вам действительно нужны все столбцы, но вы все равно должны перечислить их все по отдельности. Вы, конечно, не должны выбирать все строки из таблицы - даже если приложение и БД находятся на одном сервере или в сети. Передача всех строк займет время, особенно с ростом числа строк. У вас должно быть хотя бы предложение where, фильтрующее результаты, и / или страницы результатов, чтобы выбрать только подмножество строк, которые должны отображаться. Существует несколько инструментов ORM, в зависимости от языка приложения, который вы используете, чтобы помочь в запросе и разбивке на подмножество нужных вам данных. Например, в .NET Linq to SQL, Entity Framework и nHibernate все помогут вам в этом.

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

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

С другой стороны, в коде приложения лучше всего перечислять столбцы. Это имеет несколько преимуществ:

  • Код понятнее
  • Вы будете знать порядок, в котором возвращаются результаты (это может или не может быть важно для вас)
0 голосов
/ 15 сентября 2008

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

  • Вы знаете порядок, если вам нужно индексировать по номеру, или если ваш драйвер ведет себя смешно с BLOB-значениями, и вам нужен определенный порядок
  • Вы читаете только те поля, которые вам нужны, если вам нужно добавить больше полей
  • Вы получаете ошибку sql, если вы неправильно написали или переименовали поле, а не пустое значение из набора записей / строки
  • Вы можете лучше прочитать, что происходит.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...