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

Мы используем SQL Server 2005, но этот вопрос может быть для любых RDBMS.

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

Select * from view 

или

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

Ответ 1

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

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

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

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

ПРИНИМАЙТЕ ВСЕ, ЧТО ВЫ МОЖЕТЕ ЕШЬ, НО ЕЩЕ ВСЕ, ЧТО ВЫ ПРИНИМАЕТЕ.

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Плюс быстро перетащить имена столбцов из браузера объектов, так что это просто чистая лень, а не эффективность в кодировании.

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

Это зависит. Наследование представлений может быть удобной и удобной в обслуживании (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;

Ответ 10

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

этот оптимизатор больше, чем с помощью

select *
from Your View