В SQL Server 2012 (или любой другой версии, начиная с 2005 г.) использование SELECT *...
является единственно возможной проблемой производительности в операторе SELECT верхнего уровня запроса.
Так что это не проблема в Views (*), в подзапросах, в предложениях EXIST, в CTE, и SELECT COUNT(*)..
т. Д. И т. Д. Обратите внимание, что это, вероятно, также верно для Oracle, DB2 и, возможно, PostGres (не уверен) , но очень вероятно, что это все еще проблема во многих случаях для MySql.
Чтобы понять, почему (и почему это все еще может быть проблемой в SELECT верхнего уровня), полезно понять, почему это когда-либо было проблемой, потому что использование SELECT *..
означает « вернуть ВСЕ столбцы ». В целом это вернет намного больше данных, чем вы действительно хотите, что, очевидно, может привести к гораздо большему количеству операций ввода-вывода, как на диске, так и в сети.
Менее очевидно то, что это также ограничивает то, какие индексы и планы запросов может использовать оптимизатор SQL, поскольку он знает, что в конечном итоге должен возвращать все столбцы данных. Если он может заранее знать, что вам нужны только определенные столбцы, он часто может использовать более эффективные планы запросов, используя преимущества индексов, которые имеют только эти столбцы. К счастью, есть способ узнать это заранее, чтобы вы явно указали нужные столбцы в списке столбцов. Но когда вы используете «*», вы отказываетесь от этого в пользу «просто дайте мне все, я выясню, что мне нужно».
Да, для обработки каждого столбца также требуется дополнительное использование ЦП и памяти, но это почти всегда незначительно по сравнению с этими двумя вещами: значительная дополнительная пропускная способность диска и сети, необходимая для столбцов, которые вам не нужны, и необходимость использовать меньше оптимизированный план запроса, потому что он должен включать каждый столбец.
Так что изменилось? По сути, оптимизаторы SQL успешно включили функцию под названием «Оптимизация столбцов», которая просто означает, что теперь они могут вычислять в подзапросах нижнего уровня, если вы когда-либо собираетесь использовать столбец на верхних уровнях запроса.
Результатом этого является то, что больше не имеет значения, если вы используете «SELECT * ..» на нижнем / внутреннем уровнях запроса. Вместо этого действительно важно то, что находится в списке столбцов SELECT верхнего уровня. Если вы не используете SELECT *..
верхнюю часть, то, опять же, вы должны предполагать, что вы хотите ВСЕ столбцы, и поэтому не можете эффективно использовать оптимизацию столбцов.
(* - обратите внимание, что существует другая, незначительная проблема привязки в представлениях, *
когда они не всегда регистрируют изменения в списках столбцов при использовании «*». Существуют другие способы решения этой проблемы, которые не влияют на производительность.)