Еще в прошлые времена, это считалось большой нет-нет для того чтобы сделать Выберите * от стола " или " выбрать количество(*) из таблицы
из-за производительности.
Это все-таки дело в более поздних версиях SQL-сервера (Я'м через 2012, но я думаю, вопрос будет распространяться на 2008 - 2014)?
Редактировать: поскольку люди, кажется, шиферные меня немного здесь, я'м смотрю на это с эталоном/академической точки зрения, не будет ли это'ы с "Право" и что нужно сделать (что, конечно, это's не)
Если вы выберите count(*) from таблица`, который возвращает только одну строку (графу), относительно легкий, и путь к вам, что данное.
И выберите *
- это не физическая, нет-нет, в том, что это законно и разрешено.
Однако, проблема с выберите *
означает, что вы можете привести гораздо больше данных. Вы работаете на каждый столбец в таблице. Если ваш "выбор" включает в себя только несколько столбцов, вы могли бы получить ваш ответ из индекса или индексов, что снижает ввода/вывода, а также влияние на кэше сервера.
Так, Да он рекомендует, как общей практики, потому что это разорительно своим ресурсам.
Единственная реальная выгода выберите *
не набрав все имена столбцов. Но с SSMS вы можете использовать перетаскивание, чтобы получить имена столбцов в запросе и удалить те, которые вам не нужны.
Аналогия: если кто-то использует выберите *
, когда они не нужны на каждом столбе, они тоже использовать выберите
без, Где
(или некоторые другие ограничения П.), когда они не нужны все подряд?
В дополнение к ответу уже есть поставщик, я чувствую, что это's стоит отметить, что разработчики часто ленятся при работе с современными ОРМ's, таких как рамочная сущность. А дБА'ы пытаются изо всех сил, чтобы избежать выберите *
, разработчики часто пишут семантически эквивалентны, например, на C# с помощью LINQ:
var someVariable = db.MyTable.Where(entity => entity.FirstName == "User").ToList();
По сути, это приведет к следующим:
SELECT * FROM MyTable WHERE FirstName = 'User'
Есть также дополнительные накладные расходы, которые еще'т уже прикрыли. Это ресурсы, необходимые для обработки каждого столбца в каждой строке для соответствующего объекта. Кроме того, для каждого объекта хранится в памяти, что объект должен быть очищен. Если вы выбрали только те столбцы, которые вам нужны, вы можете легко сохранить более 100мб оперативной памяти. В то время как не большое количество на собственном, ее кумулятивный эффект вывоз мусора и т. д. То есть затраты со стороны клиента.
Так что да, для меня по-крайней мере, она есть и всегда будет большой нет. Мы также должны просвещать о том, что "скрытые" не стоит делать это еще больше.
Добавление
Вот образец тянет только необходимые данные, как просили в комментариях:
var someVariable = db.MyTable.Where(entity => entity.FirstName == "User")
.Select(entity => new { entity.FirstName, entity.LastNight });
Производительность: запрос с Select *, вероятно, никогда не покрывать запроса (простые разговоры explanation, переполнение стека explanation).
На будущее: Ваш запрос может возвращать сегодня все семь столбцов, но если кто-то добавляет пять столбцов в следующем году, то через год ваш запрос возвращает двенадцати колонн, тратя ввода-вывода и процессора.
Индексирование: если вы хотите, чтобы ваши мнения и возвращающих табличное значение функций, чтобы участвовать в индексации в SQL сервере, то эти представления и функции, должны быть созданы с schemabinding, который запрещает использовать в SELECT *.
Лучшие практики: никогда не использовать выберите *
в производственном коде.
Для подзапросов, я предпочитаю там, где существует ( выберите 1 из ... )`.
Редактировать: адрес Крейг молодой'ы комментарий ниже, используя и"выберите 1" в подзапросе не собой "'оптимизация" ПО - это так я могу встать перед класс и говорит: "Дон'т использовать Select *, без исключений!&и"
Про единственное исключение я могу думать, это когда клиент делает какой-то сводной таблице операции и требует все текущие и будущие колонны.
Я могу согласиться с исключением с привлечением обобщенных табличных выражений и производных таблиц, хотя я'д хотите увидеть планы выполнения.
Обратите внимание, что я считаю функция count(*)
исключение, потому что это разные синтаксические использование и"*" по.
В SQL Server 2012 и (или любые версии от 2005 года), используя `Выберите * ... - это только возможные проблемы с производительностью в инструкции Select запроса.
Так что это не проблема в виде(), во вложенных запросах, в существуют положения, в обобщенных табличных выражениях, ни в `выберите функции Count ().. и т. п., и т. д. Обратите внимание, что это, вероятно, также верно для Oracle, и DB2, и может базы данных Postgres (не уверен), но это очень вероятно, что он по-прежнему является проблемой во многих случаях для MySQL.
Чтобы понять, почему (и зачем он еще может быть проблема в топ-уровень выбора), это полезно, чтобы понять, почему это не было проблемой, потому что с помощью выберите *..
означает "возвратить все столбцы,то". В целом это позволит вернуть много больше данных, чем вы действительно хотите, что, очевидно, может привести к много более ИО, диска и сети.
Менее очевидным является то, что это также ограничивает индексов и планов запросов в SQL оптимизатор может использовать, потому что он знает, что он должен в конечном счете возвратит все столбцы данных. Если бы он мог знать заранее, что вы хотите только определенные столбцы, то его часто можно использовать более эффективные планы запросов с использованием индексов, которые имеют только эти столбцы. К счастью, есть способ для него, чтобы знать это раньше времени, что для вас, чтобы явно указать столбцы, которые вы хотите в списке столбцов. Но при использовании на "*" Ну, вы, отказавшись от этого в пользу "Просто дай мне все, что я'МР понять, то, что мне нужно.&и"
Да, там тоже дополнительные нагрузки на процессор и память для обработки каждого столбца, но это почти всегда мелкие по сравнению с этими двумя вещами: существенный дополнительный диск и пропускная способность, необходимая для столбцов, которые вы не'т необходимость, и необходимости использовать менее оптимизированный план запроса, поскольку оно должно содержать в каждом столбце.
Так что же изменилось? В принципе, для SQL оптимизаторы успешно включена функция называется "Колонки оптимизации", что просто означает, что они могут теперь выяснить, в нижней-уровень суб-запросы, если вы не собираетесь на самом деле использовать колонки в верхние уровни запросов.
Результатом этого является то, что он не'т имеет значения, больше, если вы используете 'выберите ..' в нижней/внутренней уровней запроса. Вместо того, что действительно важно, так это то, что в списке столбцов верхнего уровня выбрать. Если вы используете `выберите ..` в верхней, то в очередной раз, надо полагать, что вы хотите все из колонок, и поэтому не могут использовать эффективно оптимизаций колонки.
(- обратите внимание, что есть другой, незначительные обязательных проблема во взглядах с``, где они не всегда регистрируются изменения в списки столбцов, когда на "*" это используется. Есть и другие способы решить эту проблему, а это не влияет на производительность.)
Там'ы просто еще один маленький повод не использовать выберите *
: если порядок столбцов, возвращаемых изменений, ваше приложение будет ломаться... если вы'вновь повезло. Если вы'повторно не вы'll имеет более тонкие ошибки, которые могут остаться незамеченными в течение длительного времени. Порядок полей в таблице-это деталь реализации, которая не должна рассматриваться приложений, как только время это даже видно если вы используете выберите *
.
Это физически и проблематично разрешено использовать `выберите * от стола, однако, это'ы плохая идея. Почему?
Прежде всего, вы'll найти, что вы'вновь возвращаются столбцы, которые вы не'т нужна (ресурс большой).
Во-вторых, это'll принимать больше на большой стол, чем именования столбцов, потому что, когда вы выбираете, вы'вновь действительно выбирать имена столбцов из базы данных, и говорить тебе: "Дайте мне данные, что'ы, связанные с колоннами, которые имеют имена в этот список." в то время как это быстро для программиста, представить, как это выглядит на банк's компьютер, что, возможно, есть буквально сотни тысяч просмотров в минуту.
В-третьих, это делает его более трудным для разработчиков. Как часто нужно переключаться с SSMS, чтобы против, чтобы получить все имена столбцов?
В-четвертых, это'ы признак ленивого программирования, и я Дон'т думаю, что любой разработчик хочет что бы репутацию.
Это может быть проблемой, если вы поставите `выберите * ... код в программу, потому что, как было отмечено ранее, база данных может меняться с течением времени и имеет больше столбцов, чем вы ожидали, когда вы писали запрос. Это может привести к сбой в программе (в лучшем случае) или программа может пойти на веселый путь и повредить какие-то данные, потому что он'ы, глядя на поле значения, что это была'т написано в обращении. Короче, код должен всегда указывать поля, которые должны быть возвращены в "выбор".
Сказав это, у меня меньше проблем, когда выберите *
является частью раздела является существует
, поскольку все, что'ы будут возвращены к программе является логическое значение, указывающее на успех или неудачу в выборе. Другие могут не согласиться с этой позиции, и я уважаю их мнение. Это может быть немного менее эффективным, код выберите *
, чем код 'выберите 1' В существует
предложение, но я не'т думаю, что там's любой опасности повреждения данных, в любом случае.
Много ответов почему Выберите *
это неправильно, поэтому я'будете покрывать, когда я чувствую, что это'ы или, по крайней мере, хорошо.
выберите 1/0
и он выиграл'Т об ошибке. Существует
просто проверяет, что некоторые данные и возвращает логическое значение, исходя из этого.IF EXISTS(
SELECT * FROM Table WHERE X=@Y
)
выберите *
в моей истории триггеры таблицы. Купить Выберите *
, это мешает основной таблице от получать новый столбец без добавления столбца в таблицу, а также на его ошибки'Инг сразу после вставки, обновления или удаления в таблице. Это не много раз, где разработчики добавлять столбцы и забыл добавить в таблицу истории.