Что быстрее / лучше? SELECT * или SELECT column1, colum2, column3 и т. Д. - PullRequest
151 голосов
/ 15 сентября 2008

Я слышал, что SELECT * - это, как правило, плохая практика при написании команд SQL, поскольку он более эффективен для SELECT столбцов, которые вам особенно нужны.

Если мне нужно SELECT каждый столбец в таблице, я должен использовать

SELECT * FROM TABLE

или

SELECT column1, colum2, column3, etc. FROM TABLE

Эффективность действительно имеет значение в этом случае? Я бы подумал, что SELECT * будет более оптимальным для внутреннего использования, если вам действительно нужны все данные, но я говорю это без реального понимания базы данных.

Мне любопытно узнать, какова лучшая практика в этом случае.

ОБНОВЛЕНИЕ: Я, вероятно, должен указать, что единственная ситуация, когда я действительно хочу, чтобы сделал SELECT *, это когда я выбираю данные из одной таблицы, где я знаю все столбцы всегда нужно извлекать, даже когда добавляются новые столбцы.

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

Ответы [ 47 ]

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

Если вы беспокоитесь о скорости, убедитесь, что вы используете подготовленные заявления. Иначе я с ilitirit, что изменения - это то, от чего ты защищаешь себя.

/ Allan

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

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

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

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

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

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

Это особые случаи, такие как представления или хранимые процедуры, где вы хотите, чтобы изменения в базовых таблицах распространялись без необходимости переходить и изменять каждое представление и хранимый процесс, использующий таблицу. Даже тогда это само по себе может вызвать проблемы, как в случае, когда у вас есть два вида, которые объединены. Одна базовая таблица изменяется, и теперь представление является неоднозначным, поскольку обе таблицы имеют столбец с одинаковым именем. (Обратите внимание, что это может произойти в любое время, когда вы не квалифицируете все свои столбцы с префиксами таблиц). Даже с префиксами, если у вас есть такая конструкция:

SELECT A. , B. - у вас могут быть проблемы, когда клиенту сейчас трудно выбрать правильное поле.

Как правило, я не использую SELECT *, если не принимаю осознанное дизайнерское решение и не рассчитываю на низкие риски.

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

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

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

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

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

В конечном счете, лучший план - выбрать определенные столбцы.

0 голосов
/ 04 мая 2019

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

  • 12 таблиц
  • 6 левых соединений
  • 9 внутренних соединений
  • 108 всего столбцов на всех 12 таблицах
  • Мне нужно только 54 столбца
  • A 4 колонка Order By пункт

Когда я выполняю запрос, используя Select *, он занимает в среднем 2869 мс. Когда я выполняю запрос с помощью Select, он занимает в среднем 1513 мс.

Всего возвращено 13 949 строк.

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

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

Используйте конкретные имена полей, поэтому, если кто-то изменит таблицу на вас, вы не получите неожиданных результатов. По теме: ВСЕГДА указывайте имена полей при выполнении вставки, поэтому, если вам нужно добавить столбец позже, вам не нужно возвращаться и исправлять свою программу и одновременно изменять базу данных в производственном выпуске.

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