2013-07-14 14 views
5

Zawsze słyszę od specjalistów SQL, że nie jest efektywne używanie znaku "*" w instrukcji SELECT, a zamiast tego lepiej wymienić wszystkie nazwy pól.SELECT * - plusy/minusy

Ale nie uważam, że jest to dla mnie efektywne, jeśli chodzi o dodawanie nowych pól do tabeli, a następnie aktualizowanie wszystkich zapisanych procedur odpowiednio.

Jakie są plusy i minusy używania "*"?
Dzięki.

+1

możliwe duplikat [można wybrać \ * Wykorzystanie kiedykolwiek być uzasadnione?] (http://stackoverflow.com/questions/3635781/can-select-usage-ever-be-be-justified) –

Odpowiedz

13

Generalnie użycie SELECT * nie jest dobrym pomysłem.

Plusy:

  • Podczas dodawania/usuwanie kolumn, nie musisz dokonać zmian w której używaliśmy SELECT *
  • Jest krótszy napisać
  • również zobaczyć odpowiedzi na: Can select * usage ever be justified?

Wady:

  • Powracasz więcej danych niż potrzebujesz. Załóżmy, że dodajesz kolumnę VARBINARY zawierającą 200 tys. Wierszy. Trzeba tylko te dane w jeden miejsce dla jednego rekordu - używając SELECT * może skończyć się powrotem 2MB na 10 wierszy że nie trzeba
  • Explicit o jakie dane są wykorzystywane
  • Określanie kolumny oznacza, że pojawia się błąd, gdy kolumna jest usuwany
  • procesor kwerend musi zrobić trochę więcej pracy - dowiedzieć się, jakie kolumny istnieje na stole (dzięki @vinodadhikary)
  • można znaleźć gdzie kolumna służy łatwiej
  • You uzyskać wszystkie kolumny w połączeniach, jeśli y ou używać SELECT *
  • Nie można używać odniesienie porządkowej (choć pomocą odwołań porządkowe dla kolumn jest złą praktyką w sobie)
  • Zobacz także odpowiedzi na: What is the reason not to use select *?
+3

Aby dodać do wad, procesor kwerend musi najpierw dowiedzieć się, jakie kolumny istnieją w konkretnej tabeli. – vee

+1

@vinodadhikary - Dlaczego miałoby to być więcej pracy niż sprawdzanie poprawności jawnej listy kolumn zawierającej wszystkie nazwy kolumn? Wyobrażam sobie, że może to być nieco mniej pracy, ponieważ wystarczy pobrać wszystkie metadane kolumny, które nie są sprawdzane indywidualnie. –

+0

@MartinSmith, Dzika postać '*' musi zostać rozwinięta przed zatwierdzeniem wszystkich pól. Więc jeśli 'select' zawiera' * ', który zostanie dodany do field_list. Optymalizacja jest minimalna pod względem wydajności, ale dodatkowe wywołanie funkcji jest zapisywane. Naprawdę nie mogłem znaleźć wersji źródłowej MySQL w Oracle (i tak naprawdę nie zadawałem sobie trudu, żeby to zrobić), ale znalazłem wersję 'twittera 'w github. Spójrz na 'https: // github.com/twitter/mysql/blob/master /', 'sql/sql_select.cc'' JOIN :: prepare' pomiędzy liniami 498 i 554 i 'setup_wild' w linii 7846 w' sql/sql_base.cc'. – vee

5

Plusy:

  • gdy naprawdę potrzebujesz wszystkich kolumn, jest krótszy czas, aby napisać: select *

Minusy:

  • przez większość czasu nie potrzebujesz wszystkich kolumn, ale tylko niektóre z nich. Bardziej wydajne jest tylko odzyskiwanie tego, co chcesz, abyś nie miał gwarancji na kolejność pobranych kolumn (lub przynajmniej kolejność nie jest oczywista w zapytaniu), który zabrania dostępu do kolumn według indeksu (tylko według nazwy).Ale nazwy są również dalekie od oczywistości
  • podczas łączenia wielu tabel zawierających potencjalnie kolumny o tej samej nazwie, można zdefiniować aliasy dla tych kolumn