2009-12-08 4 views
3

Я задал этот вопрос и не могу найти последовательного мнения или мнения, основанные на твердых данных. Я просто хотел бы знать, использует ли использование подстановочного символа в инструкции SQL SELECT дополнительные накладные расходы, чем индивидуальный вызов каждого элемента. Я сравнил планы выполнения как в нескольких разных тестовых запросах, так и, кажется, оценки всегда читаются одинаково. Возможно ли, что некоторые накладные расходы понесены в другом месте или они действительно обрабатываются одинаково?Подстановочный знак Sql: служебные накладные расходы?

То, что я имею в виду именно:

SELECT * 

против

SELECT item1, item2, etc. 
+0

Можете ли вы пояснить небольшим примером? –

+3

Также обратите внимание, что использование шаблона в производственном коде 99% является симптомом плохого дизайна. Вы не должны этого делать. Когда-либо. Когда-либо. У меня недостаточно запоминающихся воспоминаний. –

+0

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

ответ

9
SELECT * FROM... 

и

SELECT every, column, list, ... FROM... 

будет выполнять те же, потому что оба являются unoptimised Scan

Разница заключается в том:

  • дополнительный поиск в sys.columns для решения *
  • изменение контракта/подписи при схеме таблицы cha nges
  • Неспособность создать индекс покрытия. На самом деле, нет настройки опций на всех, на самом деле
  • не должны обновить изображения, необходимые, если не schemabound
  • не может индексировать или schemabind вид использования *
  • ... и другие вещи

Другое SO вопросы по той же теме ...

+0

Чтобы добавить, я бы предположил, что «накладные расходы» в этом подстановочном разрешении незначительны по сравнению с фактической работой, необходимой для извлечения данных с диска и т. Д. –

+0

Правда, но народ часто упоминает об этом. конечно, для 300 колонок и 10 рядов ..;-) – gbn

+0

Спасибо за информацию! –

1

EDIT: Если вы говорите о Звездочка джокера как в Select * From ... затем посмотреть другие ответы ...

Если вы говорите о подстановочных знаках в предложениях предикатов или других выражениях запроса, используя оператор Like, (_ , %), как описано ниже, тогда:

Это связано с тем, влияет ли использование подстановочного знака на то, является ли SQL «SARG-ABLE» или нет. SARGABLE, (Search-ARGument-able) означает, могут ли параметры поиска или сортировки запроса использоваться в качестве параметров ввода для существующего индекса. Если вы предварять джокер к началу аргумента

Where Name Like '%ing' 

Тогда нет никакого способа, чтобы пройти через индекс на поле имени, чтобы найти узлы, которые конца в «ИНГ».

Если Ото вы добавите подстановочные до конца,

Where Name like 'Donald%' 

оптимизатор может по-прежнему использовать индекс на столбце имя, а запрос по-прежнему SARG-состоянии

+0

Я должен был быть более конкретным. Я отредактировал это. Я имел в виду SELECT * vs. список SELECT. Однако этот ответ дает мне некоторое представление о проблеме, которую я не рассматривал. Благодаря! –

2

ли вы имеете в виду select * from ... вместо select col1, col2, col3 from ...?

Я думаю, что это всегда лучше назвать колонну и получить минимальное количество информации, потому что

  • ваш код будет работать независимо от физического порядка столбцов в БД. Порядок столбцов не должен влиять на ваше приложение, но это будет так, если вы используете *. Это может быть опасно в случае миграции db и т. Д.
  • Если вы назовете столбцы, СУБД может дополнительно оптимизировать выполнение. Например, если есть индекс, содержащий все данные, которые вас интересуют, таблица вообще не будет доступна.

Если вы имеете в виду что-то еще с «подстановочным знаком», просто игнорируйте мой ответ ...

+0

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

0

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

insert into mytable values(1,2) 

Что произойдет, если таблица распространяется на три поля?

0

Это не может быть больше работы с точки зрения плана выполнения. Но если вы извлекаете столбцы, которые вам действительно не нужны, это дополнительная пропускная способность сети, используемая между базой данных и вашим приложением. Кроме того, если вы используете клиентский API высокого уровня, который выполняет некоторую работу с возвращенными данными (например,), то эти дополнительные столбцы будут налагать затраты на производительность на стороне клиента. Сколько? Зависит.