2012-02-01 11 views
5

Słyszałem, że jest to zły sposób pisania zapytań w ogóle, ale zastanawiam się, co ludzie mówią nowym użytkownikom SQL.Jakie są plusy i minusy używania `select table_name. *`?

Czy to naprawdę zła forma, czy po prostu leniwy?

Tak więc, aby nie prosić o zbyt wiele opinii na ten temat, jakie są dobre powody, dla których jest on używany w zapytaniach, poza tym, że nie trzeba wpisywać nazwy każdego pola. Ponadto, czy te przyczyny przeważają nad szkodliwym działaniem?

+0

To narzędzie jak każde inne. Jeśli nigdy go nie użyjesz, nie martw się o to. –

+0

Może to później doprowadzić do gryzienia, jeśli zmieni się schemat, a kod będzie zależał od kolejności kolumn w zbiorze danych. Poza tym nie ma nic * technicznie * źle z tym. –

+0

@Marc B. Używam go przez cały czas i to może mnie martwić. – Matthew

Odpowiedz

11

Kiedy twój program wie o strukturze twojego stołu podczas kompilacji lub konfiguracji, użycie select * nie jest dobrym pomysłem: każda zmiana w strukturze twojego stołu może złamać strukturę wyników wracających z zapytania , ostatecznie powodując błędy w czasie wykonywania.

Istnieją jednak przypadki, kiedy * jest niezbędny. W szczególności, jeśli twój program "dynamicznie uczy się" struktury twoich tabel przez czytanie metadanych wracających z zapytania, użycie polecenia "wszystkie kolumny" pozwala twojemu programowi dynamicznie pobierać zmiany do twoich tabel.

Jest rzeczą oczywistą, że korzystanie z * do zapytań ad-hoc w ulubionym smaku SQL Studio/SQLPlus/etc. jest bardzo powszechne i wygodne.

+0

Jest to dobry przykład, dlaczego uważam, że jest w porządku dla tego, co robiłem ostatnio. Mam ogólne klasy Java, które pobierają wyniki kwerend i pobierają zmienne dla pól. Jeśli używam *, te Obiekty zbierają wszystkie nowe pola dodane do tabeli. – Matthew

+0

@Matthew - Ale przypuszczalnie musisz napisać kod, który pochłonie te dodatkowe kolumny, lub w końcu przywrócisz ładunek danych, które nigdy nie zostaną użyte?Dlaczego więc po prostu nie zmienisz zapytania w tym samym czasie, co rozszerzenie kodu. –

+0

@Matthew Masz rację, twój przykład to klasyczny przypadek użycia 'select *' w programie do osiągnięcia wyników, które w innym przypadku wymagałyby znacznie więcej wysiłku. – dasblinkenlight

3

Podczas korzystania z wieloznacznika * system musi przetworzyć nazwy wszystkich kolumn dla tej tabeli i je zwrócić.

Dlatego korzystanie z * jest gorsze dla wydajności niż faktyczne ręczne wpisywanie ich wszystkich.

Ogólna zasada polega na tym, aby tego nie używać, jeśli nie trzeba, i zamiast tego podać kolumny, które faktycznie są wymagane.

+6

W każdym razie db musi przetworzyć tablicę dla nazw pól, aby upewnić się, że nie pytasz o pola, które nie istnieją. Problemem jest dodatkowe pobieranie danych - brak punktów w ładowaniu/dekodowaniu/sformatowanych polach, które są po prostu odrzucane, ponieważ użytkownik chciał tylko jednego pola, a nie 50 innych w tabeli. –

+0

@Marc B Twój komentarz pozwala również na to, że jeśli tabela ulegnie zmianie, a pole zostanie usunięte, mniej kodu zostanie z tego powodu zerwane. – Matthew

+0

@marcB, Twój komentarz jest niepoprawny, wystąpiła skuteczność, gdy użyjesz opcji *. – HLGEM

1

Korzystanie z select * polega na kolejności zachowywanych kolumn. Z relacyjnego punktu widzenia kolejność kolumn jest nieistotna. Poniższe dwie tabele są identyczne podczas pracy nad nimi:

create table alpha (int id, int value); 
create table beta (int value, int id); 

Tylko jedna rzecz, która różni się między nimi jest kolejność kolumn. Nazwy kolumn & są identyczne. Kolejność kolumn należy traktować we wszystkich przypadkach jako wewnętrzny szczegół implementacji i jako taka nigdy nie powinna być zaprogramowana.

Istnieją okoliczności, w których po prostu chcesz wybrać wszystkie kolumny, bez uwzględnienia kolejności. (Na przykład, programy do analizy danych mogą wykonywać pewne rodzaje zapytań w celu określenia struktury tabeli - ale znowu, struktura jest nazwami/typami danych kolumn, a nie ich kolejnością.

Nie używaj tego .

1

książka SQL Antipatterns obejmuje ten temat szczegółowo w rozdziale „niejawne kolumny”.

najbardziej typowe zastosowanie zamiennika dla fieldnames w zapytaniu jest podczas pisania zapytania ad-hoc. jest szybszy wpisać "*", zamiast wpisywać każdą nazwę pola, która ma zostać zwrócona Czas programisty jest dość drogi, więc nie ma powodu, by martwić się nieznacznym wzrostem wydajności podczas uruchamiania zapytania ad-hoc, gdzie " Będziemy marnować więcej czasu na wpisywanie nazw.

Jednak nadal należy znać schematy bazy danych, ponieważ oczekiwanie na wartości z kolumny "blob" na dużej liczbie wierszy może również zmarnować dużo czasu, szczególnie jeśli wszystko, co potrzebne, było wartością klucza podstawowego .

Za pomocą SELECT *, możesz uzyskać dobrą wydajność w danym zapytaniu, ponieważ zwraca niewielki zestaw wyników może kilkaset bajtów, jednak dodać kilka pól kropli do tabeli dla innej funkcji, a może teraz zestaw wyników znajduje się w milionach bajtów i nagle zapytanie jest powolne, mimo że dane, których faktycznie używasz, są bardzo małe. Aby uniknąć tego problemu, nazwij kolumny w zapytaniu.

Jeśli używasz , aby automatycznie dodawać wartości nowych kolumn po ich dodaniu, nadal będziesz ofiarą powyższego scenariusza. To kompromis, który musisz wybrać.

Ważne jest, aby używać SELECT *, o ile masz powód, z wyjątkiem tego, że lenistwo nie jest uzasadnionym powodem.

+0

Nie martw się, nigdy nie sugerowałbym używania go we wszystkich przypadkach. Ostatnio dużo z tego korzystałem. Uważam, że osiągnąłem wystarczający postęp i nie używam go już, gdy po prostu "potrzebuję uzyskać dane" ze stołu. – Matthew

Powiązane problemy