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