Который более быстр/лучший? ВЫБЕРИТЕ * или ВЫБЕРИТЕ column1, colum2, column3, и т.д.

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

159
задан 8 revs, 5 users 52% 13 April 2016 в 04:35
поделиться

45 ответов

Позволяет думают, о котором быстрее. Если можно выбрать просто данные, Вам нужно тогда, это быстрее. Однако в тестировании можно вытянуть все данные для оценки, какие данные могут быть отфильтрованы на основе бизнес-потребностей.

0
ответ дан mikedopp 23 November 2019 в 21:36
поделиться

Основным различием между этими двумя является объем данных, переданный назад и вперед. Любые аргументы о разнице во времени существенно испорчены в том "выборе *" и "выборе col1..., colN" результат в том же объеме относительной работы, выполненной механизмом DB. Однако передача 15 столбцов за строку по сравнению с 5 столбцами за строку является различием на 10 столбцов.

0
ответ дан Jeff Hubbard 23 November 2019 в 21:36
поделиться

Ну, это действительно зависит от Ваших метрик и цели:

  1. , Если Вы имеете 250 столбцов и хотите (действительно) выбрать их всех, используйте выбор *, если Вы хотите возвратиться домой тот же день:)
  2. , Если для Вашего кодирования нужны гибкость и нуждающаяся таблица, является маленьким, снова, выберите *, помогает Вам кодировать быстрее и поддержать его легче.
  3. , Если Вы хотите устойчивую разработку и производительность:
    • пишут Ваши имена столбцов, если они, только некоторые, или
    • пишут инструмент, который позволяет Вам легко выбрать/генерировать свои имена столбцов

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

И наконец, что не менее важно, как Вы хотите добавить или удалить столбец в таблице для влияния на код или его обслуживание?

0
ответ дан 2 revs 23 November 2019 в 21:36
поделиться

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

/Allan

0
ответ дан Allan Wind 23 November 2019 в 21:36
поделиться

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

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

0
ответ дан mxsscott 23 November 2019 в 21:36
поделиться

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

0
ответ дан stu 23 November 2019 в 21:36
поделиться

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

0
ответ дан Sam Cogan 23 November 2019 в 21:36
поделиться

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

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

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

0
ответ дан HLGEM 23 November 2019 в 21:36
поделиться

Существуют случаи, где ВЫБОР * хорош для целей обслуживания, но в целом его нужно избежать.

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

ВЫБОР A. , B. - у Вас могут быть проблемы, где клиент теперь испытывает затруднения при выборе правой стороны поля.

В целом, я не использую ВЫБОР *, если я не делаю сознательное проектное решение и рассчитываю на связанные риски быть низким.

0
ответ дан Cade Roux 23 November 2019 в 21:36
поделиться

Для запросов DB непосредственно (такой как при подсказке sqlplus или через административное средство дб), выберите *, прекрасен вообще - это избавляет Вас от необходимости выписать все столбцы.

, С другой стороны, в коде приложения лучше перечислять столбцы. Это обладает несколькими преимуществами:

  • код более ясен
  • , Вы будете знать порядок, результаты возвращаются в (это может или не может быть важно для Вас)
0
ответ дан Morikal 23 November 2019 в 21:36
поделиться

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

0
ответ дан HLGEM 23 November 2019 в 21:36
поделиться

Может быть огромное увеличение производительности путем ограничения того, какие столбцы возвращаются, если записи пересекают Интернет.

-2
ответ дан Sam 23 November 2019 в 21:36
поделиться

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

С большими наборами данных и более быстрыми уровнями роста данных, преимущество производительности становится все более важным.

Для наблюдения графически, существует ли какое-либо различие я предложил бы использовать запрос анализатор для наблюдения плана выполнения запросов относительно ВЫБОРА * и эквивалентного ВЫБОРА col1, col2, и т.д. Это должно сказать Вам, какой из двух запросов более эффективен. Вы могли также генерировать некоторые данные тестирования переменных объемов, видят, каковы синхронизации.

0
ответ дан Scott Lawrence 23 November 2019 в 21:36
поделиться

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

Затем мне нужны все столбцы из представления, которые не изменятся при добавлении новых полей в базовые таблицы. Это дает мне дополнительное преимущество, так как позволяет мне изменять источник данных. Поле A в представлении может быть вычислено за один раз, а затем я могу изменить его на статический. В любом случае View предоставляет мне поле A.

Прелесть этого заключается в том, что он позволяет моему слою данных получать наборы данных. Затем он передает их моему BL, который затем может создавать из них объекты. Мое основное приложение знает только объекты и взаимодействует с ними. Я даже позволяю своим объектам самосоздавать при передаче строки данных.

Конечно, я единственный разработчик,

0
ответ дан 23 November 2019 в 21:36
поделиться

SELECT * может подойти, если вам действительно нужны все столбцы, но вы все равно должны перечислить их все по отдельности. Вы, конечно, не должны выбирать все строки из таблицы, даже если приложение и БД находятся на одном сервере или в сети. Перенос всех строк займет время, особенно если количество строк растет. У вас должно быть хотя бы предложение where для фильтрации результатов и / или страницы результатов, чтобы выбрать только подмножество строк, которые необходимо отобразить. Существует несколько инструментов ORM в зависимости от языка приложения, который вы используете для помощи в запросах и разбиении на страницы нужного вам подмножества данных. Например, в .NET Linq to SQL, Entity Framework и nHibernate все помогут вам в этом.

0
ответ дан 23 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: