poniedziałek, 30 marca 2015

7 powodów dlaczego nie powinno się używać SELECT * FROM

Nie tak dawno temu, ktoś zadał pytanie dlaczego nie powinno się używać konstrukcji SELECT * FROM . Większość osób po prostu zwraca uwagę na to, że nie powinno się tego robić, nie wspominając dlaczego tak jest.

Mam nadzieję, że te kilka poniższych punktów pozwoli Wam lepiej zrozumieć dlaczego po prostu tego typu zapytania nie powinny być tworzone,

1. SQL Server przed wykonaniem zapytania musi ustalić nazwy kolumn jakie pojawią się jako rezultat zapytania. Można to dość łatwo zweryfikować używając Profilera a w nim zdarzenia RPC:Completed.

2. Zwracanie wszystkich kolumn, szczególnie tych, które nie będą później wykorzystane jest tylko stratą zasobów. Jeżeli tego typu zapytanie pochodzi z aplikacji, to bardzo prawdopodobne jest to, że dane te będą przesyłane po sieci. W zależności od ilości kolumn zwróconych a nie używanych w aplikacji a także od wolumenu danych, może się okazać ze ilość danych nikomu nie potrzebnych a przesłanych może być przeliczana w MB lub GB.

3. W przypadku gdy tylko podzbiór danych jest potrzebny i jest on zawarty w indeksie nieklastrowym, zapytanie SELECT * FROM spowoduje, że indeks ten nie będzie wykorzystywany, lub co gorsza będzie wykorzystany w połączeniu z operacją key lookup lub bookmark lookup.

4. Większa ilość fizycznych i logicznych operacji odczytu. SQL Server zapisuje dane czy to z tabeli czy indeksu na stronach, które mogą zawierać nie więcej niż 8096 bajtów. W przypadku gdy wszystkie kolumny, które rzeczywiście są potrzebne znajdują się w indeksie nieklastrowym oraz indeks ten nie zawiera wszystkich kolumn z tabeli, każda ze stron indeksu będzie zawierać więcej danych aniżeli analogiczna strona indeksu klastrowego lub też tabeli.

5. SQL Server przechowuje wyniki zapytań w pamięci podręcznej, tak by w przypadku ponownego wykonania tego samego zapytania odpowiedź mogła być zwrócona szybciej i przy wykorzystaniu mniejszej ilości zasobów. Jeżeli zapytanie zwraca niepotrzebnie dane, które nie będą wykorzystane to będą one mimo wszystko zapisane w pamięci podręcznej. Pamięć podręczna jest ograniczona i w przypadku gdy jej brakuje SQL Server uruchomi mechanizm czyszczenia. Może to skutkować tym, że dane, które rzeczywiście są potrzebne w pamięci podręcznej zostaną usunięte.

6. Jeżeli SELECT * FROM jest używane by wypełnić tabelę danymi, może się okazać, że w przyszłości liczba kolumn się zmieni i wcześniej stworzone zapytanie po prostu zwróci błąd.

7. Czytelność kodu. Zapytanie bez wylistowanych kolumn jest po prostu mniej czytelne. Lenistwo nie powinno usprawiedliwiać pogarszania jakości tworzonego kodu.

Mam nadzieję, że powyższe 7 powodów dlaczego nie powinno się używać zapytania w stylu SELECT * FROM przekonało Was aby w przyszłości pisać lepszej jakości kod.

2 Responses so far

  • W takim razie co zamiast?

  • Wypisać jawnie wszystkie nazwy kolumn, które chcesz zwrócić w wyniku zapytania.

  • Prześlij komentarz