Учитывая вашу спецификацию того, что вы выбираете все столбцы, в настоящее время есть небольшая разница . Поймите, однако, что схемы базы данных меняются. Если вы используете SELECT *
, вы добавите в таблицу новые столбцы, хотя, по всей вероятности, ваш код не готов к использованию или представлению этих новых данных. Это означает, что вы подвергаете свою систему неожиданным изменениям производительности и функциональности.
Возможно, вы захотите отклонить это как незначительные расходы, но понимайте, что столбцы, которые вам не нужны, по-прежнему должны быть:
- Чтение из базы данных
- Отправлено по сети
- Маршалл в вашем процессе
- (для технологий типа ADO) Сохранено в таблице данных в памяти
- Игнорируется и выбрасывается / сборщик мусора
Элемент № 1 имеет много скрытых затрат, в том числе устранение некоторого потенциального индекса покрытия, вызывая загрузки страниц данных (и перегрузку кэша сервера), вызывая блокировки строк / страниц / таблиц, которых в противном случае можно было бы избежать.
Соотнесите это с потенциальной экономией при указании столбцов с *
, и единственная потенциальная экономия:
- Программисту не нужно пересматривать SQL для добавления столбцов
- Сетевой транспорт SQL меньше / быстрее
- Время анализа / проверки запроса SQL Server
- Кэш плана запросов SQL Server
Для пункта 1 реальность такова, что вы собираетесь добавить / изменить код, чтобы использовать любой новый столбец, который вы можете добавить в любом случае, так что это стирка.
Для пункта 2 разница редко бывает достаточной, чтобы подтолкнуть вас к другому размеру пакета или количеству сетевых пакетов. Если вы дойдете до того момента, когда преобладает проблема с передачей операторов SQL, вам, вероятно, сначала нужно уменьшить скорость операторов.
Для пункта 3 экономия НЕТ, так как расширение *
должно произойти в любом случае, что означает, в любом случае, обращение к схеме таблиц. Реально, перечисление столбцов будет стоить одинаково, потому что они должны быть проверены по схеме. Другими словами, это полная стирка.
Для пункта 4, когда вы указываете определенные столбцы, кэш плана запросов может увеличиться, но только , если вы имеете дело с различными наборами столбцов (что не соответствует указанному вами). В этом случае вам нужно хотеть разных записей в кеше, потому что вам нужны разные планы при необходимости.
Итак, все из-за того, как вы задали вопрос, к устойчивости проблемы перед лицом возможных изменений схемы. Если вы записываете эту схему в ПЗУ (это происходит), тогда *
вполне приемлемо.
Тем не менее, мое общее правило заключается в том, что вы должны выбирать только те столбцы, которые вам нужны. Это означает, что иногда будет выглядеть так, будто вы запрашиваете их все, но администраторы баз данных и эволюция схемы означают, что некоторые новые могут появиться столбцы, которые могут сильно повлиять на запрос.
Мой совет: ВСЕГДА ВЫБИРАЙТЕ определенные столбцы . Помните, что вы хорошо разбираетесь в том, что делаете снова и снова, поэтому просто приобретайте привычку делать это правильно.
Если вам интересно, почему схема может измениться без изменения кода, подумайте о журнале аудита, датах вступления в силу / истечении срока действия и других подобных вещах, которые добавляются администраторами баз данных для системного разрешения проблем соответствия. Другим источником скрытых изменений является денормализация производительности в других местах системы или пользовательских полей.