Выберите * из таблицы ИЛИ выберите id, field1, field2, field3 из таблицы - лучшие практики? - PullRequest
2 голосов
/ 16 сентября 2009

Может ли кто-нибудь вмешаться в вопрос о том, что является лучшей практикой? для запросов на выборку я должен вернуть все или идентификаторы, которые мне требуются?

Эффективность? Масштабируемость? и т.д.

спасибо

Конверт: SQL Server 2008, VS2008 (VB)

Ответы [ 9 ]

9 голосов
/ 16 сентября 2009

Всегда явно перечисляйте ваши столбцы. Никогда не включайте select * в производственный код.

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

Держитесь подальше от select *, если вы не набираете запрос и не выполняете его тут же.

3 голосов
/ 16 сентября 2009

Используйте select col1, col2, col3 из таблицы вместо select * из таблицы1. Это имеет многочисленные преимущества, как упомянуто здесь и здесь.

Также см .: http://weblogs.sqlteam.com/jeffs/jeffs/archive/2007/07/26/60271.aspx

Есть ли разница между Select * и Select [перечислите каждый столбец]

3 голосов
/ 16 сентября 2009

Может ли кто-нибудь вмешаться в вопрос о том, что является лучшей практикой? для запросов на выборку я должен вернуть все или идентификаторы, которые мне требуются?

Назовите ваши столбцы.

Это не только лучшая практика, но и может повысить производительность.

Представьте себе два запроса:

SELECT  *
FROM    mytable
WHERE   column1 = @somevalue

и

SELECT  id, column1
FROM    mytable
WHERE   column1 = @somevalue

id является кластеризованным первичным ключом, и существует индекс column1.

Я предполагаю, что ваш клиентский код правильно обрабатывает переменное число столбцов, т.е. е. изменение макета таблицы не нарушает код. Это очень сильное предположение, но давайте сделаем это.

Теперь, если mytable состоит только из id и column1, запросы совпадают.

Что произойдет, если вы добавите column2 к mytable?

Во втором запросе (с именованными столбцами) по-прежнему используется индекс (поскольку в нем содержится все, что нужно запросу), но в первом также необходимо выбрать column2 (SQL Server не знает, что вы его проигнорируете) .

Это добавит Clustered Table Seek в план, и производительность вашего запроса ухудшится.

2 голосов
/ 17 февраля 2012

Никогда не слушайте, чтобы кто-нибудь говорил вам всегда делать что-то в SQL - альтернативно, всегда будьте осторожны с тем, чтобы кто-то говорил вам, что никогда не нужно что-то делать в SQL:)

В следующих примерах SELECT * не может причинить вреда и, вероятно, имеет выгоду в отношении читабельности и обслуживания кода ( DRY и все такое):


Пример 1

Когда комманист атрибутов уже указан во «внутренней» области видимости:

SELECT * 
  FROM (
        SELECT col1, col2, col3, col4, col5
          FROM T1 
       ) AS DT1;

Пример 2

Когда используется конструктор табличных значений в CTE, и каждый вынужден (например, в SQL Server!) Обернуть предложение VALUES в табличное выражение (SELECT..FROM), например.

WITH T1
     AS
     (
      SELECT * 
        FROM (
              VALUES (1, 1, 1, 2, 1), 
                     (1, 1, 2, 1, 1), 
                     (1, 2, 1, 1, 1)
             ) AS T (col1, col2, col3, col4, col5)
     )
SELECT ...

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

WITH T2 (author_name, book_title, ISBN) 
     AS
     (
      SELECT book_title, ISBN, author_name
        FROM (
              VALUES ('9780321189561', 'C. J. Date', 'An Introduction to Database Systems')
             ) AS T (ISBN, author_name, book_title)
     )
SELECT *
  FROM T2;
1 голос
/ 16 сентября 2009

Причины предпочтения явного именования столбцов над SELECT * FROM our_table:

  1. Явное именование столбцов в проекте выражает наши намерения более четко и, таким образом, способствует самодокументируемому коду.
  2. В будущем кто-то добавит один или несколько столбцов в таблицу.Если мы используем SELECT *, эти столбцы будут перетаскиваться автоматически, что может нарушить наш код или привести к его плохой работе (особенно если используется LOB).
1 голос
/ 16 сентября 2009

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

1 голос
/ 16 сентября 2009

Всегда используйте именованные столбцы!

Хороший пример того, почему это плохо: "выберите * из таблицы" против "выберите colA, colB и т.д. из таблицы" интересное поведение в SqlServer2005

0 голосов
/ 16 сентября 2009

Я не собираюсь говорить вам " никогда " или " всегда ", использовать одно или другое. Советы, которые начинаются с этого, не следует воспринимать буквально.

Если вы работаете с небольшими наборами данных, не настаивайте на использовании глупых «оптимизаций», таких как замена * списком полей, особенно если вы собираетесь указать all полей.

Наличие читаемого и простого в обслуживании кода SQL часто стоит больше, чем несколько сохраненных циклов ЦП или на пару килобайт меньше использования памяти или сетевого трафика.

0 голосов
/ 16 сентября 2009

Если вы никогда не ссылаетесь ни на одно из имен столбцов в коде клиента, вы должны использовать именованные столбцы.

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