W SQL Server 2012 (lub dowolnej wersji od 2005 r.) Użycie SELECT *...
jest tylko możliwym problemem z wydajnością w instrukcji SELECT najwyższego poziomu zapytania.
NIE jest to więc problem w Views (*), w podkwerendach, w klauzulach EXIST, w CTE, ani w SELECT COUNT(*)..
itp. Itd. Uwaga: prawdopodobnie dotyczy to również Oracle, DB2 i być może PostGres (nie jestem pewien) , ale jest bardzo prawdopodobne, że w wielu przypadkach nadal stanowi problem dla MySql.
Aby zrozumieć, dlaczego (i dlaczego nadal może być problemem w SELECT najwyższego poziomu), pomocne jest zrozumienie, dlaczego kiedykolwiek był to problem, ponieważ użycie SELECT *..
„oznacza WSZYSTKIE kolumny ”. Ogólnie rzecz biorąc, to zwróci o wiele więcej danych, niż naprawdę chcesz, co oczywiście może spowodować dużo więcej IO, zarówno dysku, jak i sieci.
Mniej oczywiste jest to, że ogranicza to również to, jakich indeksów i planów zapytań może używać optymalizator SQL, ponieważ wie, że ostatecznie musi zwrócić wszystkie kolumny danych. Jeśli z góry może wiedzieć, że chcesz tylko określone kolumny, to często może korzystać z bardziej wydajnych planów zapytań, korzystając z indeksów zawierających tylko te kolumny. Na szczęście istnieje sposób, aby wiedzieć to z wyprzedzeniem, a mianowicie, aby wyraźnie określić kolumny, które chcesz na liście kolumn. Ale kiedy używasz „*”, rezygnujesz z tego na korzyść „po prostu daj mi wszystko, wymyślę, czego potrzebuję”.
Tak, istnieje również dodatkowe użycie procesora i pamięci do przetwarzania każdej kolumny, ale prawie zawsze jest niewielkie w porównaniu z tymi dwiema rzeczami: znaczny dodatkowy dysk i przepustowość sieci wymagana dla kolumn, których nie potrzebujesz, i konieczność korzystania z mniejszej ilości zoptymalizowany plan zapytań, ponieważ musi zawierać każdą kolumnę.
Co się zmieniło? Zasadniczo optymalizatory SQL z powodzeniem wprowadziły funkcję o nazwie „Optymalizacja kolumny”, która po prostu oznacza, że mogą teraz dowiedzieć się w podkwerendach niższego poziomu, jeśli rzeczywiście zamierzasz użyć kolumny na wyższych poziomach kwerendy.
Rezultatem tego jest to, że nie ma już znaczenia, jeśli użyjesz „SELECT * ..” na niższych / wewnętrznych poziomach zapytania. Zamiast tego naprawdę ważne jest to, co znajduje się na liście kolumn SELECT najwyższego poziomu. O ile nie użyjesz go SELECT *..
u góry, to znowu musisz założyć, że chcesz WSZYSTKIE kolumny, więc nie możesz efektywnie zastosować optymalizacji kolumn.
(* - zwróć uwagę, że w widokach występuje inny, mniejszy problem z wiązaniem, w *
którym nie zawsze rejestrują zmianę w listach kolumn, gdy używane jest „*”. Istnieją inne sposoby rozwiązania tego problemu i nie wpływa to na wydajność.)