2014-01-24 4 views
2

Как человек, который является новее ко многим вещам SQL, поскольку я его мало использую, я уверен, что есть ответ на этот вопрос там, но я не знаю, что искать, чтобы найти его, поэтому я извиняюсь.«SELECT * FROM ...» VS «SELECT ID FROM ...» Производительность

Вопрос: если бы у меня было множество строк в базе данных со многими столбцами, но нужно было только вернуть идентификаторы, которые бывают быстрее или они имеют одинаковую скорость?

SELECT * FROM... 

против

SELECT ID FROM... 
+2

без сомнения 'SELECT field FROM ...' быстрее и чище. – bansi

+0

, когда вы используете какую-либо функцию агрегата, такую ​​как 'Max',' Min' и т. Д. Вам нужна группа в этом столбце. –

+1

Разделите второй вопрос на свой пост. Вы получите лучший ответ. –

ответ

3

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

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

Я думаю, действительно, это было связано только с тем, что сначала выполняется запрос на идентификатор. При повторном запуске (в обратном порядке) они занимали одинаково мало ресурсов процессора.

Вот взгляд на вещи в SQL Profiler:

SQL Profiler Results - *, ID-Only, ID-Only, *

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

Где вы действительно увидите разницу отправляет результирующий набор обратно по сети! Набор результатов только для ID будет, как правило, намного меньше, т. Е. Меньше, чтобы отправить обратно.

+1

Отмечено это как ответ, поскольку он явно доказывает, что есть усиление производительности ЦП. – zezba9000

1

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

Для второй части вы должны, вероятно, разместить отдельный вопрос, а не переписывать это. Легко отличить то, о чем вы просите.

+0

Хорошо, круто получил его. И будет делать вторую часть. – zezba9000

2

Никогда не используйте *, чтобы возвращать все столбцы в таблице - это лениво. Вам нужно только извлечь нужные данные. SO-> поле выбора из более быстрее

1

Есть несколько причин, вы никогда (никогда никогда) следует использовать SELECT * в производстве код:

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

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

Смежные вопросы