2013-05-13 2 views
2

Возможно, это был странный вопрос, но он не знал, как исследовать его. При выполнении следующего запроса:SELECT TableName.Col1 VS SELECT Col1

SELECT Foo.col1, Foo.col2, Foo.col3 
    FROM Foo 
    INNER JOIN Bar ON Foo.ID = Bar.BID 

Я предпочитаю использовать TableName.Column вместо просто col1, col2, col3

Есть ли разница в производительности? Быстрее ли указывать имя таблицы для каждого столбца?

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

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

ответ

5

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

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

Третье: Использование Tablename.Colnameявляется хорошей идеей, но по другим причинам: Если вы используете Colname только, и одна из таблиц в запросе получает новый столбец с тем же именем, вы в конечном итоге с ОН- так называемая ошибка «неоднозначного столбца». Типичными кандидатами для таких столбцов часто являются «комментарии», «измененные» и друзья. Если вы квалифицируете свои ссылки в колонках, эта проблема ремонтопригодности просто исчезает - ваш запрос будет работать как всегда, игнорируя новые поля.

+0

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

4

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

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

SELECT t.col1, t.col2 
FROM ReallyLongTableName t 

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

+0

Благодарим вас за ответ. имеет смысл. Это просто беспокоило меня, не зная об этом :) – GGio

+0

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

+0

Это ** все ** пренебрежимо мало, мы просто обсуждаем, насколько это ничтожно.:) – Barmar