З огляду на ваші специфікації , що ви є вибором всіх стовпців, є невелика різниця в цей час . Зрозумійте, проте, що схеми бази даних змінюються. Якщо ви користуєтеся, SELECT *
ви отримаєте нові таблиці, додані до таблиці, хоча, швидше за все, ваш код не готовий використовувати ці нові дані. Це означає, що ви піддаєте свою систему несподіваним змінам продуктивності та функціональності.
Можливо, ви хочете відхилити це як незначну вартість, але розумійте, що стовпці, які вам ще не потрібні, повинні бути:
- Читати з бази даних
- Надіслано по всій мережі
- Марширували у вашому процесі
- (для технологій типу ADO) Збережено в пам'яті таблиці даних
- Ігнорується та викидається / збирається сміття
Пункт №1 має багато прихованих витрат, включаючи усунення деякого потенційного індексу покриття, спричинення завантаження сторінок даних (та обробка кешу сервера), виникнення блокувань рядків / сторінок / таблиць, яких можна уникнути інакше.
Збалансуйте це за рахунок потенційної економії, вказавши стовпці проти *
та єдину потенційну економію:
- Програмісту не потрібно переглядати SQL для додавання стовпців
- Мережевий транспорт SQL менший / швидший
- Час розбору / перевірки запитів SQL Server
- Кеш плану запитів SQL Server
Для пункту 1 реальність полягає в тому, що ви збираєтесь додати / змінити код, щоб використовувати будь-який новий стовпець, який ви могли б додати в будь-якому випадку, тож це миття.
Для пункту 2 різниці достатньо рідко, щоб підштовхнути вас до іншого розміру або кількості мережевих пакетів. Якщо ви перейдете до того, що час передачі операторів SQL є переважаючим питанням, вам, ймовірно, потрібно спочатку зменшити швидкість операторів.
Для пункту 3 економії немає, оскільки розширення *
має відбутися в будь-якому випадку, що означає, будь-ласка, звернутися до схеми (таблиць). Реально, перерахування стовпців буде мати таку саму вартість, оскільки вони повинні бути затверджені відповідно до схеми. Іншими словами, це повне миття.
Для пункту 4, коли ви вказуєте конкретні стовпці, кеш плану ваших запитів може збільшитися, але лише якщо ви маєте справу з різними наборами стовпців (це не те, що ви вказали). У цьому випадку ви хочете різних записів кешу, тому що вам потрібно різні плани за потребою.
Отже, все це зводиться через те, як ви вказали питання, до стійкості випуску в умовах можливих модифікацій схеми. Якщо ви записуєте цю схему в ROM (це трапляється), тоді *
цілком прийнятний.
Однак, моє загальне керівництво полягає в тому, що ви повинні вибирати лише потрібні вам стовпці, це означає, що іноді це буде виглядати так, що ви просите їх усіх, але DBA і еволюція схеми означають, що можуть з’являтися нові колонки, які можуть сильно вплинути на запит .
Моя порада полягає в тому, що ВЖЕ ВИБІРИТЕ конкретні стовпці . Пам’ятайте, що ви добре розумієтеся, чим займаєтеся знову і знову, тому просто ввійдіть у звичку робити це правильно.
Якщо вам цікаво, чому схема може змінюватися без зміни коду, подумайте з точки зору журналу аудиту, термінів набуття чинності / терміну придатності та інших подібних речей, які додаються DBA для системного вирішення питань відповідності. Іншим джерелом незмінних змін є денормалізація для продуктивності в інших місцях системи або визначених користувачем полів.