Запрос SQL - Выберите * из представления или Выберите col1, col2, ... colN из представления - PullRequest
11 голосов
/ 24 сентября 2008

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

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

Select * from view 

или

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

Ответы [ 10 ]

37 голосов
/ 24 сентября 2008

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

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

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

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

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

11 голосов
/ 24 сентября 2008

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

3 голосов
/ 25 сентября 2008

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

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

3 голосов
/ 24 сентября 2008

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

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

1 голос
/ 17 ноября 2010

Это зависит. Наследование представлений может быть удобным и простым в обслуживании (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;
0 голосов
/ 13 июня 2012
select 
column1
,column2
,column3
.
.
.
from Your-View

этот оптимизатор лучше, чем

select *
from Your View 
0 голосов
/ 24 сентября 2008

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

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

0 голосов
/ 24 сентября 2008

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

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

0 голосов
/ 24 сентября 2008

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

0 голосов
/ 24 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...