Що швидше / краще? SELECT * або SELECT стовпчик1, colum2, стовпець3 тощо


166

Я чув, що SELECT *це взагалі погана практика використання під час написання команд SQL, оскільки це більш ефективно для SELECTстовпців, які вам спеціально потрібні.

Якщо мені потрібно до SELECTкожного стовпця таблиці, чи повинен я використовувати

SELECT * FROM TABLE

або

SELECT column1, colum2, column3, etc. FROM TABLE

Чи справді ефективність в цьому випадку має значення? Я думаю, SELECT *було б більш оптимальним внутрішньо, якщо вам справді потрібні всі дані, але я говорю це, не маючи реального розуміння бази даних.

Мені цікаво дізнатися, яка найкраща практика в цьому випадку.

ОНОВЛЕННЯ: Напевно, я повинен зазначити, що єдиною ситуацією, коли я дійсно хотів би зробити це, SELECT *є коли я вибираю дані з однієї таблиці, де я знаю, що всі стовпці завжди потрібно буде отримати, навіть коли нові стовпці додаються.

З огляду на відповіді, які я бачив, однак це все ще здається поганою ідеєю, і SELECT *його ніколи не слід використовувати з набагато більше технічних причин, з яких я коли-небудь хотів.




1
Так, це дублікат більшості з них.
Джордж Стокер

Відповіді:


168

Однією з причин того, що вибір конкретних стовпців краще, є те, що це підвищує ймовірність того, що SQL Server може отримати доступ до даних з індексів, а не запитувати дані таблиці.

Ось пост, про який я писав: Я справжню причину вибору запитів - це погане покриття індексу

Це також менш крихке для зміни, оскільки будь-який код, який споживає дані, отримає ту саму структуру даних незалежно від змін, які ви внесете в схему таблиці в майбутньому.


3
+1 для цього. Якщо всі стовпці посилань існують в одному індексі ("індекс покриття"), ви потрапили в золото.
Ян Нельсон

22
це не відповідь на його запитання - "Якщо мені потрібно виділити кожен стовпець у таблиці, ..." - у такому випадку * vs col1, .., coln не має значення (але це робить для програміста, оскільки * коротше!).
Метт Рогіш

3
Це все ще має значення, оскільки список вибору є формою договору, особливо якщо SQL знаходиться в збереженій процедурі.
Eric Z Beard

4
Хоча те, що говорить Джон, є абсолютно правильним і дуже вагомим пунктом, я маю згоду з тим, що питання, про яке ВИПУСКЛЕНО, стосується того, чи вони вже задають усі стовпці. Через цю частину питання справжніми питаннями є крихкість на тлі зміни схеми.
Ідентифікаційний номер

1
@MattRogish, сер, ви це правильно зрозуміли, чи є різниця в продуктивності між цими двома методами (* vsall_column_names), хоча у нас є тисячі рядків і ми виконуємо SELECT з індексом (у пункті WHERE) ??
santosh

59

З огляду на ваші специфікації , що ви є вибором всіх стовпців, є невелика різниця в цей час . Зрозумійте, проте, що схеми бази даних змінюються. Якщо ви користуєтеся, SELECT *ви отримаєте нові таблиці, додані до таблиці, хоча, швидше за все, ваш код не готовий використовувати ці нові дані. Це означає, що ви піддаєте свою систему несподіваним змінам продуктивності та функціональності.

Можливо, ви хочете відхилити це як незначну вартість, але розумійте, що стовпці, які вам ще не потрібні, повинні бути:

  1. Читати з бази даних
  2. Надіслано по всій мережі
  3. Марширували у вашому процесі
  4. (для технологій типу ADO) Збережено в пам'яті таблиці даних
  5. Ігнорується та викидається / збирається сміття

Пункт №1 має багато прихованих витрат, включаючи усунення деякого потенційного індексу покриття, спричинення завантаження сторінок даних (та обробка кешу сервера), виникнення блокувань рядків / сторінок / таблиць, яких можна уникнути інакше.

Збалансуйте це за рахунок потенційної економії, вказавши стовпці проти *та єдину потенційну економію:

  1. Програмісту не потрібно переглядати SQL для додавання стовпців
  2. Мережевий транспорт SQL менший / швидший
  3. Час розбору / перевірки запитів SQL Server
  4. Кеш плану запитів SQL Server

Для пункту 1 реальність полягає в тому, що ви збираєтесь додати / змінити код, щоб використовувати будь-який новий стовпець, який ви могли б додати в будь-якому випадку, тож це миття.

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

Для пункту 3 економії немає, оскільки розширення *має відбутися в будь-якому випадку, що означає, будь-ласка, звернутися до схеми (таблиць). Реально, перерахування стовпців буде мати таку саму вартість, оскільки вони повинні бути затверджені відповідно до схеми. Іншими словами, це повне миття.

Для пункту 4, коли ви вказуєте конкретні стовпці, кеш плану ваших запитів може збільшитися, але лише якщо ви маєте справу з різними наборами стовпців (це не те, що ви вказали). У цьому випадку ви хочете різних записів кешу, тому що вам потрібно різні плани за потребою.

Отже, все це зводиться через те, як ви вказали питання, до стійкості випуску в умовах можливих модифікацій схеми. Якщо ви записуєте цю схему в ROM (це трапляється), тоді *цілком прийнятний.

Однак, моє загальне керівництво полягає в тому, що ви повинні вибирати лише потрібні вам стовпці, це означає, що іноді це буде виглядати так, що ви просите їх усіх, але DBA і еволюція схеми означають, що можуть з’являтися нові колонки, які можуть сильно вплинути на запит .

Моя порада полягає в тому, що ВЖЕ ВИБІРИТЕ конкретні стовпці . Пам’ятайте, що ви добре розумієтеся, чим займаєтеся знову і знову, тому просто ввійдіть у звичку робити це правильно.

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


3
"реальність полягає в тому, що ви збираєтесь додати / змінити код, щоб використовувати будь-який новий стовпець, який ви можете все-таки додати, тож це миття." -Только якщо ви вручну читаєте кожен стовпець за іменем у коді. Якщо ви використовуєте автоматичне відображення, це не так, і ця проблема стає важливою.
Josh Noe

36

Вам слід вибрати лише потрібні стовпці. Навіть якщо вам потрібні всі стовпці, все ж краще перелічити назви стовпців, щоб серверу sql не потрібно було запитувати системну таблицю для стовпців.

Також ваша програма може зламатися, якщо хтось додасть стовпці до таблиці. Ваша програма отримає стовпці, яких вона теж не очікувала, і вона може не знати, як їх обробити.

Крім цього, якщо в таблиці є двійковий стовпець, то запит буде набагато повільніше і використовувати більше мережевих ресурсів.


6
Так, використовуючи *, ви додаєте додаткову роботу для БД. Гаразд, це одна з причин, про яку я не думав.
Анкур

1
+1 за ризики раннього порушення / лову помилок. Я думаю, що обговорення ефективності справедливе, але YAGNI.
nailitdown

6
Чи не потрібно SQL-серверу перевіряти чи перевіряти, чи "col1" все-таки є у зазначеній таблиці, тобто системна таблиця запитів?
Патрік

3
Найбільший показник ефективності, ймовірно, пов'язаний з індексуванням. Якщо стовпець, який ви шукаєте, є частиною індексу, який використовується для пошуку даних, на яких сервер буде отримувати дані саме там, якщо ви вибрали *, швидше за все, доведеться робити те, що називається пошук закладок, що вимагає додаткової скануйте, щоб знайти решту основних даних, які можуть вам навіть не знадобитися.
Cobusve

3
@Patrick - пляма на. Дуже багато вагомих причин уникати *, але це не одна з них.
Мартін Сміт

31

Існує чотири великі причини, що select *погано:

  1. Найважливіша практична причина полягає в тому, що вона змушує користувача магічно пізнати порядок повернення стовпців. Краще бути явним, що також захищає вас від зміни таблиці, яка чудово перетворюється на ...

  2. Якщо ім’я стовпця, яке ви використовуєте, зміни, краще зафіксувати його рано (в точці виклику SQL), а не тоді, коли ви намагаєтесь використовувати стовпець, якого більше немає (або змінилася його назва тощо). )

  3. Перерахування імен стовпців робить ваш код набагато більш задокументованим та таким, ймовірно, більш читабельним.

  4. Якщо ви переносите по мережі (або навіть якщо ви цього не зробите), стовпці, які вам не потрібні, - це лише відходи.


7
"Найважливіша практична причина полягає в тому, що вона змушує користувача магічно знати порядок повернення стовпців". Я не бачу, як це проблема. У будь-якому сучасному клієнті DB ви читаєте стовпці за іменем, а не за порядком.
Josh Noe

Я схильний запускати свій SQL через інтерфейс С, тому я б не знав, у чому полягає сучасний стан «клієнтів DB». Але я думаю, що, ймовірно, той тип клієнта, про якого ви говорите, робить якусь нестандартну магію не-SQL. (наприклад, у SQLite, запитуйте sqlite3_master, щоб з'ясувати, як змінити свій *набір імен.)
pkh

А далі з цього, скільки людей пишуть код у сучасних додатках, які використовують індекс імен стовпців? Більшість людей, безсумнівно, використовують якийсь маппер і цілу купу кешування даних, які можуть бути несвіжими. Особисто спочатку напишіть код, а потім переживайте, якщо пізніше виникнуть проблеми з продуктивністю.
Колін Вісман

10

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


7

Вказання назв стовпців, безумовно, швидше - для сервера. Але якщо

  1. продуктивність не є великою проблемою (наприклад, це база даних із вмістом веб-сайтів із сотнями, може, тисячами, але не мільйонами - рядків у кожній таблиці); І
  2. ваше завдання - створити багато невеликих подібних додатків (наприклад, веб-сайти, що керують вмістом), використовуючи загальну основу, а не створювати складні разові програми; І
  3. важлива гнучкість (велике налаштування схеми db для кожного сайту);

тоді вам краще не дотримуватися SELECT *. У нашій рамках велике використання SELECT * дозволяє нам ввести нове поле вмісту, кероване веб-сайтом, до таблиці, надаючи йому всі переваги CMS (версія, робочий процес / затвердження тощо), при цьому лише торкаючись коду на пару балів, замість пари десятків балів.

Я знаю, що гуру БД будуть ненавидіти мене за це - продовжуйте, голосуйте мене - але в моєму світі час розробників обмежений, а цикли процесора - в достатку, тому я відповідно коригую те, що я заощаджую і на що трачу.


1
Це також робить ORM набагато простішими у використанні. Коли запити будуються шляхом передачі об'єкта будівлі запитів навколо, необов’язково знати, які стовпці вимагаються якими іншими частинами коду (перевірки дозволів, що у вас є). Тому для обмеження стовпців потрібно досліджувати кожен раз, коли запит потребує написання. Це безглуздо, ІМО. Коли запити виявляються повільними (журнали!), Їх можна вдосконалити.
bytepusher

6

SELECT * є поганою практикою, навіть якщо запит не надсилається через мережу.

  1. Вибір більшої кількості потрібних даних робить запит менш ефективним - сервер повинен читати та передавати зайві дані, тому це потребує часу і створює зайве навантаження на систему (не тільки мережу, як згадували інші, але й диск, процесор тощо). ). Крім того, сервер не в змозі настільки добре оптимізувати запит (наприклад, використовувати індекс покриття для запиту).
  2. Через деякий час структура таблиці може змінитися, тому SELECT * поверне інший набір стовпців. Отже, ваша програма може отримати набір даних про несподівану структуру і зламатися десь за течією. Явне зазначення стовпців гарантує, що ви отримаєте набір даних відомої структури, або отримаєте явну помилку на рівні бази даних (наприклад, "стовпець не знайдено").

Звичайно, для маленької та простої системи все це не має великого значення.


4

Вибір продуктивності, SELECT з певними стовпцями може бути швидшим (не потрібно читати у всіх даних). Якщо ваш запит дійсно використовує ВСІ стовпці, SELECT з явними параметрами все ж є кращим. Будь-яка різниця швидкостей буде в основному непомітною і майже постійною. Одного разу ваша схема зміниться, і це хороша страховка для запобігання проблем через це.


Ви помиляєтесь щодо непомітного, оскільки з перевірок, які я зробив з декількома БД, було зрозуміло, що вибір кожного стовпця, навіть якщо вони всі, відбувається набагато швидше. В деяких випадках це було втричі швидше.
шахар ельдад

4

Поки що тут відповіли безліч вагомих причин, ось ще одна, про яку не згадували.

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

Якщо ви чітко вказані імена, то знайти кожне посилання на цей стовпець - через усі ваші збережені процедури, представлення даних тощо - просто. Просто скиньте CREATE-скрипт для вашої схеми БД і виконайте пошук тексту за допомогою нього.


3

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


Це: 1) не має значення, оскільки SQL Server повинен посилатися на схему таблиці будь-яким способом (для перевірки імен стовпців або пошуку відомих дійсних імен стовпців) 2) Не стосується заданого питання, на яке посилаються всі стовпці. Єдине питання, ЯК ЗАПИТАНО, це неміцність змін / схем.
Ідентифікаційний

Незважаючи на те, що стовпці повинні перевіряти стовпці незалежно.
Джон Гібб

3

Завжди краще вказувати потрібні стовпці, якщо ви думаєте про це один раз, SQL не повинен думати "wtf є *" щоразу, коли ви запитуєте. Крім того, хтось пізніше може додати стовпці до таблиці, які вам фактично не потрібні у вашому запиті, і вам буде краще в цьому випадку, вказавши всі ваші стовпці.


1
Це неправда: SQL-сервер повинен все-таки проаналізувати кожен стовпчик і побачити, чи він існує в каталогах, тоді як він знає, що "*" робить (і так, * розширюється на всі кола). Так чи інакше, СУБД буде тривіально легко зробити будь-яку (якщо у вас немає 24 000 стовпців), тож,
обділяюсь,

Я думаю, що кращим моментом, що багато хто відсутній, і, на жаль, ця відповідь адресована лише вдруге, це те, що якщо зміни схеми / таблиці відбудуться (тобто додаються нові стовпці), це не порушить справи.
Шон Хенлі

1
Це повна помилка, оскільки пошук стовпців для розширення * - це те саме, що перевірка наданих назв стовпців.
Ідентифікатор

3

Проблема "select *" - це можливість передачі даних, які вам насправді не потрібні. Під час фактичного запиту до бази даних вибрані стовпці насправді не додають до обчислення. Насправді "важким" є перевезення даних до вашого клієнта, і будь-який стовпець, який вам насправді не потрібен, - це просто витрачати пропускну спроможність мережі та додати час, який ви очікуєте, щоб повернути запит.

Навіть якщо ви використовуєте всі стовпці, приведені з пункту "select * ...", це лише наразі. Якщо в майбутньому ви зміните макет таблиці / перегляду та додасте більше стовпців, ви почнете приносити ті, що є у вибраному, навіть якщо вони вам не потрібні.

Ще один момент, у якому заява "select *" погана - це створення перегляду. Якщо ви створили подання за допомогою "select *" і пізніше додасте стовпці до таблиці, визначення перегляду та повернуті дані не збігаються, і вам потрібно буде перекомпілювати свої представлення для того, щоб вони знову працювали.

Я знаю, що написання "select *" є заманливим, тому що я дійсно не люблю вручну вказувати всі поля моїх запитів, але коли ваша система почне розвиватися, ви побачите, що варто витратити цей додатковий час / зусиль у визначенні полів, а не витрачати набагато більше часу та зусиль на видалення помилок у ваших переглядах чи оптимізацію програми.


Точка щодо СМОТРІВ дуже важлива. Ви не тільки не будете отримувати всі стовпці, якщо додати стовпці до таблиці (незважаючи на те, що * змусило б вас задуматися), але вони можуть навіть не відповідати реальній схемі таблиці.
Євро Міцеллі

3

Хоча явний перелік стовпців є хорошим для продуктивності, не збожеволійте.

Отже, якщо ви використовуєте всі дані, спробуйте SELECT * для простоти (уявіть, що у вас є багато стовпців і робити СПОЛУЧЕННЯ ... запит може стати жахливим). Потім - міра. Порівняйте запит із чітко вказаними назвами стовпців.

Не спекулюйте на ефективності, вимірюйте це!

Явний перелік найбільше допомагає, коли у вас є стовпець із великими даними (наприклад, частина публікації чи статті), і він не потребує цього в заданому запиті. Тоді, не повертаючи його у відповідь, сервер DB може заощадити час, пропускну здатність та пропускну здатність диска. Результат запиту також буде меншим, що добре підходить для будь-якого кешу запитів.


3

Ви дійсно повинні вибирати лише потрібні вам поля, і лише необхідну кількість, тобто

SELECT Field1, Field2 FROM SomeTable WHERE --(constraints)

Поза межами бази даних динамічні запити ризикують нападів ін'єкцій та неправильних даних. Зазвичай ви долаєте це за допомогою збережених процедур або параметризованих запитів. Також (хоча це не дуже велика проблема) сервер повинен генерувати план виконання щоразу, коли виконується динамічний запит.


"сервер повинен генерувати план виконання щоразу, коли виконується динамічний запит", який, я вважаю, сповільнює запит. Дякую.
Анкур

Питання щодо продуктивності використання динамічного sql, ймовірно, будуть реалізовані лише у дуже високих сценаріях навантаження, Sql Server досить добре керує планами запитів.
Меттью Еббот

2

Вибір не менш ефективний (з точки зору швидкості), якщо ви використовуєте * або стовпці.

Різниця стосується пам’яті, а не швидкості. При виборі декількох стовпців SQL Server повинен виділити простір пам’яті для обслуговування запиту, включаючи всі дані для всіх запитуваних стовпців, навіть якщо ви використовуєте лише один із них.

Що стосується продуктивності, важливим є план виплат, який, в свою чергу, сильно залежить від вашого пункту WHERE та кількості ПРИЄДНАЙТЕСЬ, ЗОВНІШНІЙ ПРИЄДНАЙТЕСЬ тощо.

Для свого питання просто використовуйте SELECT *. Якщо вам потрібні всі стовпці, різниці в продуктивності немає.


2

НЕ швидше використовувати явні імена полів проти *, якщо і лише якщо вам потрібно отримати дані для всіх полів.

Програмне забезпечення вашого клієнта не повинно залежати від порядку повернених полів, тому це теж нісенітниця.

І можливо (хоча й малоймовірно), що вам потрібно отримати всі поля за допомогою *, оскільки ви ще не знаєте, які поля існують (думаю, дуже динамічна структура бази даних).

Ще одним недоліком використання явних імен полів є те, що якщо їх багато і вони довгі, це ускладнює читання коду та / або журналу запитів.

Отже, правило повинно бути: якщо вам потрібні всі поля, використовуйте *, якщо вам потрібна лише підмножина, назвіть їх явно.


2

Результат занадто величезний. Генерувати та відправляти результат із двигуна SQL клієнту повільно.

Клієнтська сторона, будучи загальним середовищем програмування, не має і не повинна розроблятися для фільтрації та обробки результатів (наприклад, пункт WHERE, пункт ORDER), оскільки кількість рядків може бути величезною (наприклад, десятки мільйонів рядків).


Отже, якщо вам потрібно було фактично використовувати всі різні стовпці, було б добре ... і якщо ваша база даних та додаток знову сидять на одному сервері, це не має великої різниці?
Анкур

@Ankur: Навіть на одному сервері коштують для передачі даних через інтерфейс бази даних.
kennytm

2

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


1

Це залежить від версії вашого сервера БД, але сучасні версії SQL можуть кешувати план будь-яким способом. Я б сказав, що за допомогою коду доступу до даних можна отримати все, що найрентабельніше.


1

Однією з причин є краща практика чітко визначити, які саме стовпці ви хочете, через можливі майбутні зміни структури таблиці.

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

Що стосується того, що швидше, я віддам іншим їх досвід.


1

Як і у більшості проблем, це залежить від того, чого ви хочете досягти. Якщо ви хочете створити сітку db, яка дозволить усім стовпцям у будь-якій таблиці, то відповідь "Вибрати *". Однак якщо вам знадобляться лише певні стовпці, а додавання або видалення стовпців із запиту робиться нечасто, то вкажіть їх окремо.

Це також залежить від кількості даних, які ви хочете передати з сервера. Якщо один із стовпців визначений як пам'ятка, графіка, крапка тощо, і вам не потрібен цей стовпець, вам краще не використовувати "Select *", або ви отримаєте цілу купу даних, яких ви не хочете хочете, і ваша ефективність може постраждати.


1

Щоб додати до сказаного всі інші, якщо всі ваші стовпці, які ви вибираєте, включені до індексу, ваш набір результатів буде витягнутий з індексу замість пошуку додаткових даних з SQL.



1

Що сказали всі вище, плюс:

Якщо ви прагнете дочитаного коду, який можна читати, виконайте щось на кшталт:

SELECT foo, bar ВІДЖЕТИ;

легко читається і виявляє наміри. Якщо ви зробите цей дзвінок, ви знаєте, що повертаєтеся. Якщо у віджетах є лише колонки foo та bar, тоді вибір * означає, що вам все одно доведеться думати про те, що ви повертаєтесь, підтвердити, що замовлення відображено правильно тощо. Однак якщо у віджетах є більше стовпців, але вас цікавить лише foo і бар, тоді ваш код стає безладним, коли ви запитуєте на підстановку, а потім використовуєте лише частину повернутого.


1

І пам’ятайте, якщо у вас є внутрішнє з'єднання за визначенням, вам не потрібні всі стовпці, оскільки дані в стовпцях приєднання повторюються.

Це не так, як перерахування стовпців на сервері SQl є важким або навіть трудомістким. Ви просто перетягніть їх із браузера об'єктів (ви можете отримати все за один раз, перетягнувши з стовпців слова). Поставити постійне звернення до продуктивності у вашій системі (тому що це може зменшити використання індексів і, таким чином, надсилання зайвих даних по мережі дорого коштує) та зробить більш імовірним виникнення несподіваних проблем під час зміни бази даних (іноді додаються стовпці, що ви не хочете, щоб користувач бачив, наприклад) лише для того, щоб заощадити менше хвилини часу на розробку, є недалекоглядним та непрофесійним.


1

Якість бачення Я бачив коментарі, що обидва рівні. але аспект юзабіліті є деякі + і

Якщо ви використовуєте (виберіть *) у запиті, і якщо хтось із них змінює таблицю та додає нові поля, які не потрібні попередньому запиту, це непотрібна накладні витрати. А що робити, якщо щойно додане поле - це крапка або поле зображення ??? тоді ваш час відповіді на запит буде дуже повільним.

З іншого боку, якщо ви використовуєте (виберіть col1, col2, ..) і якщо таблиця буде змінена і додано нові поля, і якщо ці поля потрібні у наборі результатів, вам завжди потрібно буде редагувати обраний запит після зміни таблиці.

Але я пропоную завжди використовувати у своїх запитах Select col1, col2, ... та змінювати запит, якщо таблиця буде змінена пізніше ...


0

Абсолютно визначайте стовпці, які ви бажаєте вибирати кожен раз. Причин цього не робити, а покращення продуктивності варто того.

Вони ніколи не повинні давати можливість "SELECT *"


0

Якщо вам потрібен кожен стовпець, просто використовуйте SELECT *, але пам’ятайте, що порядок потенційно може змінюватися, тому коли ви споживаєте результати, отримуйте доступ до них за назвою, а не за індексом.

Я б ігнорував коментарі про те, як * потрібно пройти отримати список - шанси на аналіз і перевірку названих стовпців дорівнює часу обробки, якщо не більше. Не передчасно оптимізуйте ;-)


0

Щодо ефективності виконання, я не знаю жодної суттєвої різниці. Але для ефективності програмістів я б написав назви полів, оскільки

  • Ви знаєте порядок, якщо вам потрібно індексувати за номером, або якщо ваш драйвер веде себе смішно на значення blob, і вам потрібно певне замовлення
  • Ви читаєте лише потрібні поля, якщо ви коли-небудь повинні додавати більше полів
  • Ви отримуєте sql-помилку, якщо неправильно написали або перейменували поле, а не порожнє значення із набору записів / рядків
  • Ви можете краще прочитати, що відбувається.

0

ей, будь практичним. використовувати select * при прототипуванні та вибирати конкретні стовпці при впровадженні та розгортанні. З точки зору плану виконання, обидва відносно однакові в сучасних системах. однак, вибір конкретних стовпців обмежує кількість даних, які потрібно отримати з диска, зберегти в пам'яті та надіслати по мережі.

Зрештою, найкращим планом є вибір конкретних стовпців.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.