Biorąc swoją specyfikację, które są wybierając wszystkie kolumny, nie ma różnicy w tym czasie . Pamiętaj jednak, że schematy bazy danych się zmieniają. Jeśli użyjesz SELECT *
, dostaniesz jakiekolwiek nowe kolumny dodane do tabeli, nawet jeśli najprawdopodobniej twój kod nie jest przygotowany do używania lub prezentowania tych nowych danych. Oznacza to, że narażasz swój system na nieoczekiwane zmiany wydajności i funkcjonalności.
Możesz chcieć odrzucić to jako niewielki koszt, ale pamiętaj, że kolumny, których nadal nie potrzebujesz, muszą zawierać:
- Odczytaj z bazy danych
- Wysłano przez sieć
- Wpisane w twój proces
- (dla technologii typu ADO) Zapisane w tabeli danych w pamięci
- Zignorowano i odrzucono / zebrano śmieci
Pozycja nr 1 wiąże się z wieloma ukrytymi kosztami, w tym wyeliminowaniem potencjalnego indeksu, powodując ładowanie stron danych (i niszczenie pamięci podręcznej serwera), generowanie blokad wierszy / stron / tabel, których można by uniknąć w inny sposób.
Zrównoważyć to z potencjalnymi oszczędnościami wynikającymi z określenia kolumn w porównaniu z, *
a jedyne potencjalne oszczędności to:
- Programista nie musi ponownie odwiedzać SQL, aby dodać kolumny
- Transport sieciowy SQL jest mniejszy / szybszy
- Czas analizy / walidacji zapytania SQL Server
- Pamięć podręczna planu kwerend programu SQL Server
W przypadku pozycji 1 rzeczywistość jest taka, że zamierzasz dodać / zmienić kod, aby użyć dowolnej nowej kolumny, którą i tak możesz dodać, więc jest to pranie.
W przypadku punktu 2 różnica rzadko jest na tyle duża, aby popchnąć Cię do innego rozmiaru pakietu lub liczby pakietów sieciowych. Jeśli dojdziesz do momentu, w którym czas transmisji instrukcji SQL jest dominującym problemem, prawdopodobnie musisz najpierw zmniejszyć szybkość instrukcji.
W przypadku pozycji 3 NIE ma żadnych oszczędności, ponieważ rozszerzenie *
tabeli i tak musi nastąpić, co i tak oznacza sprawdzenie schematu tabeli (ów). Realistycznie, umieszczenie kolumn na liście będzie wiązało się z tym samym kosztem, ponieważ muszą zostać sprawdzone pod kątem schematu. Innymi słowy, jest to pełne mycie.
W przypadku pozycji 4, kiedy określisz konkretne kolumny, pamięć podręczna planu zapytań może się zwiększyć, ale tylko wtedy, gdy masz do czynienia z różnymi zestawami kolumn (co nie jest tym, co określono). W takim przypadku chcesz mieć różne wpisy w pamięci podręcznej, ponieważ potrzebujesz różnych planów w razie potrzeby.
Tak więc wszystko sprowadza się, ze względu na sposób, w jaki określiłeś pytanie, do odporności na problemy w obliczu ewentualnych modyfikacji schematu. Jeśli nagrywasz ten schemat do ROM (zdarza się), to jest *
to całkowicie akceptowalne.
Jednak moją ogólną wskazówką jest to, że powinieneś wybierać tylko te kolumny, których potrzebujesz, co oznacza, że czasami będzie wyglądać tak, jakbyś prosił o wszystkie z nich, ale bazy danych i ewolucja schematu oznaczają, że mogą pojawić się nowe kolumny, które mogą znacznie wpłynąć na zapytanie .
Moja rada jest taka, że ZAWSZE WYBIERAJ określone kolumny . Pamiętaj, że w tym, co robisz, stajesz się dobry, więc po prostu zdobądź nawyk robienia tego dobrze.
Jeśli zastanawiasz się, dlaczego schemat może się zmienić bez zmiany kodu, pomyśl w kategoriach rejestrowania audytu, dat wejścia w życie / wygaśnięcia i innych podobnych rzeczy, które są dodawane przez administratorów baz danych w celu systemowego rozwiązywania problemów ze zgodnością. Innym źródłem podstępnych zmian są denormalizacje wydajności w innym miejscu systemu lub w polach zdefiniowanych przez użytkownika.