Під час вибору SQL БД завжди буде посилатися на метадані таблиці, незалежно від того, чи це SELECT * для SELECT a, b, c ... Чому? Тому що тут інформація про структуру та компонування таблиці в системі.
Він повинен прочитати цю інформацію з двох причин. Один, щоб просто скласти заяву. Для цього потрібно переконатися, що ви принаймні вказали існуючу таблицю. Також структура бази даних, можливо, змінилася з моменту останнього виконання заяви.
Тепер, очевидно, метадані БД є кешованими в системі, але це все ще обробка, що потрібно зробити.
Далі метадані використовуються для генерації плану запитів. Це відбувається кожного разу, коли також складається компіляція. Знову ж таки, це працює проти кешованих метаданих, але це завжди робиться.
Єдиний час, коли ця обробка не виконується, це коли БД використовує попередньо складений запит або кешує попередній запит. Це аргумент для використання параметрів прив'язки, а не буквального SQL. "SELECT * OF TABLE WHERE key = 1" - це інший запит, ніж "SELECT * OF TABLE WHERE key =?" і "1" прив'язується до дзвінка.
БД сильно покладаються на кешування сторінок для роботи там. Багато сучасних БД є досить маленькими, щоб повністю вміститись у пам'яті (або, можливо, слід сказати, сучасна пам'ять достатньо велика, щоб вмістити багато БД). Тоді ваша основна вартість вводу-виводу на зворотному кінці - це ведення журналів та перегляд сторінки.
Однак, якщо ви все ще натискаєте на диск для своєї БД, першочерговою оптимізацією багатьох систем є покладання даних на індекси, а не на самі таблиці.
Якщо у вас є:
CREATE TABLE customer (
id INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(150) NOT NULL,
city VARCHAR(30),
state VARCHAR(30),
zip VARCHAR(10));
CREATE INDEX k1_customer ON customer(id, name);
Тоді, якщо ви робите "SELECT id, name FROM customer WHERE id = 1", велика ймовірність, що ви DB буде витягувати ці дані з індексу, а не з таблиць.
Чому? Він, швидше за все, використовуватиме індекс для задоволення запиту (проти сканування таблиці), і навіть незважаючи на те, що "ім'я" не використовується в пункті "де", цей індекс все ще буде найкращим варіантом для запиту.
Тепер у базі даних є всі необхідні дані, щоб задовольнити запит, тому немає ніяких причин звертатися до самих сторінок таблиці. Використання індексу призводить до зменшення дискового трафіку, оскільки у вас більша щільність рядків в індексі порівняно з таблицею загалом.
Це хвилеподібне пояснення конкретної методики оптимізації, яка використовується деякими базами даних. Багато хто має кілька методів оптимізації та настройки.
Зрештою, SELECT * корисний для динамічних запитів, які потрібно вводити вручну, я б ніколи не використовував його для "реального коду". Ідентифікація окремих стовпців надає БД більше інформації, яку він може використовувати для оптимізації запиту, і дає вам кращий контроль у вашому коді щодо змін схеми тощо.
SELECT
виконання / обробка запитів відрізняється від бази даних до бази даних.