Запрос SQL - Выберите * в представлении или выберите col1, col2, ... colN в представлении

Мы используем SQL Server 2005, но этот вопрос может быть для любой СУБД.

Что из следующего является более эффективным при выборе всех столбцов в представлении?

Select * from view 

или же

Select col1, col2, ..., colN from view

10 ответов

Решение

НИКОГДА, НИКОГДА НЕ ИСПОЛЬЗУЙТЕ "SELECT *"!!!!

Это основное правило дизайна запросов!

Есть несколько причин для этого. Одним из них является то, что если в вашей таблице только три поля и вы используете все три поля в коде, который вызывает запрос, есть большая вероятность, что вы будете добавлять в эту таблицу больше полей по мере роста приложения, и если Ваш запрос select * предназначался только для того, чтобы вернуть эти 3 поля для вызывающего кода, тогда вы извлекаете из базы данных гораздо больше данных, чем вам нужно.

Другая причина - производительность. В дизайне запросов не думайте о возможности повторного использования столько, сколько эта мантра:

Берите все, что вы можете съесть, но есть все, что вы взяли.

Рекомендуется выбирать каждый столбец по имени. В будущем ваша схема БД может измениться, добавив столбцы, которые вам не понадобятся для определенного запроса. Я бы порекомендовал выбрать каждый столбец по имени.

Просто чтобы прояснить точку зрения, которую уже сделали несколько человек, причина в том, что Select * неэффективен, заключается в том, что должен быть начальный вызов БД, чтобы точно определить, какие поля доступны, а затем второй вызов, когда запрос выполняется с использованием явные столбцы.

Не стесняйтесь использовать Select *, когда вы отлаживаете, выполняете случайные запросы или находитесь на ранних этапах разработки запроса, но как только вы узнаете нужные столбцы, укажите их явно.

Select * - плохая практика программирования. Это может привести к тому, что что-то сломается, так же как и спасти вещи от разрушения. Если вы запрашиваете только одну таблицу или представление, то повышения эффективности может не быть (хотя это возможно, если вы не собираетесь фактически использовать каждое поле). Если у вас есть внутреннее соединение, то у вас есть как минимум два поля, возвращающие одни и те же данные (поля соединения), и, таким образом, вы тратите впустую сетевые ресурсы для отправки избыточных данных обратно в приложение. Сначала вы этого не заметите, но по мере того, как результирующие наборы будут становиться все больше и больше, у вас скоро будет сетевой конвейер, который заполнен и не нуждается в этом. Я не могу вспомнить ни одного случая, когда select * выигрывает вам что-либо. Если добавлен новый столбец, и вам не нужно переходить к коду, чтобы что-то с ним сделать, тогда столбец не должен возвращаться вашим запросом по определению. Если кто-то отбросит и заново создаст таблицу со столбцами в другом порядке, то все ваши запросы будут содержать неверную информацию или будут давать плохие результаты, например, указание цены в поле номера детали в новой записи.

Кроме того, можно быстро перетаскивать имена столбцов из браузера объектов, так что это просто лень, а не эффективность в кодировании.

Это зависит. Наследование представлений может быть удобным и простым в обслуживании (SQL Anywhere):

create view v_fruit as select F.id, S.strain from F key join S; 
create view v_apples as select v_fruit.*, C.colour from v_fruit key join C;

Всегда выбирайте col1, col2 и т. Д. Нет никакой разницы в эффективности между двумя известными мне методами, но использование "select *" может быть опасным. Если вы измените определение представления, добавив новые столбцы, вы можете разбить программу, используя "select *", тогда как выбор предварительно определенного набора столбцов (даже всех именованных) все равно будет работать.

Я думаю, все зависит от того, что делает оптимизатор запросов.

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

select 
column1
,column2
,column3
.
.
.
from Your-View

этот более оптимизатор, чем Использование

select *
from Your View 

Если вы действительно выбираете все столбцы, это не должно иметь заметного значения, спрашиваете ли вы * или если вы явно. SQL-сервер будет анализировать запрос таким же образом в течение практически одинакового времени.

Для производительности - посмотрите на план запроса (не должно быть никакой разницы).

Для ремонтопригодности. - всегда указывайте список полей (это относится и к INSERT INTO).

Другие вопросы по тегам