У SQL Server 2012 (або будь-якій версії з 2005 р.) Використання SELECT *...
лише можливої проблеми продуктивності в операторі SELECT верхнього рівня запиту.
Так що це не проблема , в уявленнях (*), в підзапитів, в Exist пунктах, в КТР, ні і SELECT COUNT(*)..
т.д., і т.д. Зверніть увагу, що це, ймовірно , також вірно і для Oracle і DB2, і може бути , Postgres (не впевнений) , але дуже ймовірно, що це все-таки проблема у багатьох випадках для MySql.
Щоб зрозуміти, чому (і чому це все ще може бути проблемою у вищому рівні SELECT), корисно зрозуміти, чому це коли-небудь було проблемою, тому що за допомогою SELECT *..
засобів " повернути ВСІ стовпці ". Загалом це поверне набагато більше даних, ніж ви дійсно хочете, що, очевидно, може призвести до набагато більше IO, як на диску, так і на мережі.
Менш очевидно, що це також обмежує, які індекси та плани запитів може використовувати оптимізатор SQL, оскільки він знає, що в кінцевому рахунку він повинен повернути всі стовпці даних. Якщо він може заздалегідь знати, що ви хочете лише певні стовпці, то він часто може використовувати більш ефективні плани запитів, скориставшись індексами, які мають лише ці стовпці. На щастя, існує спосіб дізнатись про це заздалегідь. Це вам потрібно чітко вказати потрібні стовпці у списку стовпців. Але коли ви використовуєте "*", ви забороняєте це на користь "просто дайте мені все, я зрозумію, що мені потрібно".
Так, є також додаткове використання процесора та пам'яті для обробки кожного стовпця, але воно майже завжди незначне порівняно з цими двома речами: значна додаткова пропускна здатність диска та мережі для стовпців, які вам не потрібні, і необхідність використання меншої кількості оптимізований план запитів, оскільки він повинен містити кожен стовпець.
Так що змінилося? В основному, оптимізатори SQL успішно включили функцію під назвою "Оптимізація стовпців", яка просто означає, що вони тепер можуть з'ясувати в підзапитах нижнього рівня, якщо ви коли-небудь будете використовувати стовпчик у верхніх рівнях запиту.
Підсумком цього є те, що це вже не має значення, якщо ви використовуєте "SELECT * .." на нижньому / внутрішньому рівнях запиту. Натомість важливим є те, що знаходиться у списку стовпців SELECT верхнього рівня. Якщо ви не використовуєте SELECT *..
вгорі, то це ще раз повинно припустити, що ви хочете ВСІ з стовпців, і тому не можете ефективно використовувати оптимізацію стовпців.
(* - зауважте, що в Переглядах існує інша незначна проблема прив'язки, *
де вони не завжди реєструють зміни в списках стовпців, коли використовується "*". Є інші способи вирішити це, і це не впливає на продуктивність.)