Jaki select jest wydajnieszy?

0

Lepiej używać select * from dane_usera czy select id, login, haslo from dane_usera. Jeśli wszystkie pola to te które chcemy wypisać, dostać się do nich? Czy jest jakaś różnica w wydajności?

Załóżmy że oba zapytania zwrócą te same wyniki, które zapytanie jest wydajniejsze,bardziej optymalne, które lepiej stosować?

0

Jeśli korzystasz z Management Studio możesz sprawdzić po kosztach zapytania.

0

Optymalizator powinien zadbać o to, żeby różnicy nie było. Nie wiadomo, jakiego konkretnie silnika pytanie dotyczy, więc powiem tylko ogólnie - sam zobacz, jak wygląda plan zapytania, i przetestuj.

2

Jeżeli później wykorzystujesz ten **select **w programowaniu, to preferowałbym zapytanie z zadeklarowanymi kolumnami. Zapytanie z gwiazdką, przy jakiejkolwiek zmianie w tabeli może spowodować komplikacje w aplikacji.

Jeśli chodzi o wydajność bazodanową, to zależy. Teoretycznie zapytanie obciąża podobnie serwer, aczkolwiek jeśli masz założone indexy na konkretne kolumny a przy gwiazdce obejmujesz większą połać danych z tabeli to wydaje mi się, że zapytanie na konkretnych kolumnach także i tutaj wygra.

Tyle z mojej strony. Może jeszcze jedna z bardziej doświadczonych osób na forum się wypowie :)

0

fourfour Pytanie jest z rodziny teoretycznych, swobodne pytanie z głowy podczas pisania zapytania. Nie podałam bazy MySQL MSSQL(Już nie mówiąc o konkretnym silniku), ponieważ pytanie było ogólne, chciałam się później o to dopytać aby nie zaciemniać mojego pytania.

EroSanin Dziękuję za wypowiedź :P Rozwiałeś moje wątpliwości. 1 argument wystarczająco do mnie przemawia. Lepiej przyswoić dobre nawyki aby w przyszłości nie narobić komuś (możliwe że sobie) problemów.

0
EroSanin napisał(a):

Jeżeli później wykorzystujesz ten **select **w programowaniu, to preferowałbym zapytanie z zadeklarowanymi kolumnami. Zapytanie z gwiazdką, przy jakiejkolwiek zmianie w tabeli może spowodować komplikacje w aplikacji.

Chyba w paskudnie napisanej aplikacji...
Możesz podać jakiś konkret na potwierdzeni swojej tezy? Bo nijak żadnego nie jestem sobie w stanie wyobrazić.

Jeśli chodzi o wydajność bazodanową, to zależy.

Nic nie zależy - przy takich warunkach jest to bez znaczenia.

Teoretycznie zapytanie obciąża podobnie serwer, aczkolwiek jeśli masz założone indexy na konkretne kolumny a przy gwiazdce obejmujesz większą połać danych z tabeli to wydaje mi się, że zapytanie na konkretnych kolumnach także i tutaj wygra.

Bzdura.
Co mają indeksy do wybierania określonej ilości kolumn, zwłaszcza że podano wszystkie kolumny z tabeli?
Ano nic nie mają.
Szybciej będzie działać zapytanie z gwiazdką, bo mniej danych wysyłasz do serwera - tyle, że to tak wyimaginowana różnica w wydajności, że jest absolutnie bez znaczenia...

Tyle z mojej strony. Może jeszcze jedna z bardziej doświadczonych osób na forum się wypowie :)

Wg mnie mylisz się w każdym punkcie.

0
wloochacz napisał(a):
EroSanin napisał(a):

Jeżeli później wykorzystujesz ten **select **w programowaniu, to preferowałbym zapytanie z zadeklarowanymi kolumnami. Zapytanie z gwiazdką, przy jakiejkolwiek zmianie w tabeli może spowodować komplikacje w aplikacji.

Chyba w paskudnie napisanej aplikacji...
Możesz podać jakiś konkret na potwierdzeni swojej tezy? Bo nijak żadnego nie jestem sobie w stanie wyobrazić.

Przychodzi mi na myśl jedna sytuacja (ale tak jak napisałeś musi to być paskudnie napisany kod):
Mamy tabelę z np 3 kolumnami (np id, imie, nazwisko)
W kodzie programu (przy SELECT * FROM database) odwołujemy się do kolumn nie po nazwach a po indeksach (więc chcąc wyświetlić nazwisko wyświetlamy FieldByNumber(2) ), w pewnym momencie admin bazy dodaje nową kolumnę płeć, zmieniając przy okazji kolejność (id, plec, imie, nazwisko) - w tej chwili FieldByNumber(2) zwróci nam imię.
Jeżeli użylibyśmySELECT id, imie, nazwisko FROM database to ta zmiana była by nie odczuwalna w aplikacji.

0

Rozumiem, że w takiej sytuacji praktycznie obojętne którą metodę wybierzemy tak?

A odnośnie dobrych praktyk, przejrzystości kodu, aby był czytelny to lepiej konkretne pola tabeli, czy też bez znaczenia?

0
hipekk napisał(a):
wloochacz napisał(a):
EroSanin napisał(a):

Jeżeli później wykorzystujesz ten **select **w programowaniu, to preferowałbym zapytanie z zadeklarowanymi kolumnami. Zapytanie z gwiazdką, przy jakiejkolwiek zmianie w tabeli może spowodować komplikacje w aplikacji.

Chyba w paskudnie napisanej aplikacji...
Możesz podać jakiś konkret na potwierdzeni swojej tezy? Bo nijak żadnego nie jestem sobie w stanie wyobrazić.

Przychodzi mi na myśl jedna sytuacja (ale tak jak napisałeś musi to być paskudnie napisany kod):
Mamy tabelę z np 3 kolumnami (np id, imie, nazwisko)
W kodzie programu (przy SELECT * FROM database) odwołujemy się do kolumn nie po nazwach a po indeksach (więc chcąc wyświetlić nazwisko wyświetlamy FieldByNumber(2) ), w pewnym momencie admin bazy dodaje nową kolumnę płeć, zmieniając przy okazji kolejność (id, plec, imie, nazwisko) - w tej chwili FieldByNumber(2) zwróci nam imię.
Jeżeli użylibyśmySELECT id, imie, nazwisko FROM database to ta zmiana była by nie odczuwalna w aplikacji.

Zgoda, ale żaden admin (który jest adminem, a nie któremu się wydaje że nim jest) nie zrobi sobie takiego kuku. Każdy admin działa wg zasady - "działa, nie tykać" ;-)
Poza tym, pierwsze słyszę żeby admin zmieniał strukturę bazy danych - to nie jego zadanie.

0
lightinside napisał(a):

Rozumiem, że w takiej sytuacji praktycznie obojętne którą metodę wybierzemy tak?

W takim konkretnym przypadku (czyli pobieramy WSZYSTKIE pola z tabeli) to bez znaczenia.
Natomiast, jeśli chciałbyś aby program z danej tabeli ZAWSZE pobierał wszystkie pola i czasem zmieniasz strukturę tej tabeli - użyj gwiazdki.

A odnośnie dobrych praktyk, przejrzystości kodu, aby był czytelny to lepiej konkretne pola tabeli, czy też bez znaczenia?

A tu już inaczej - generalnie powinieneś pobierać tylko te pola, które są niezbędne w danym kontekście.
Nie pobieraj wszystkiego, bo masz niepotrzebny narzut na przesyłanie danych z serwera do aplikacji, które i tak nie są do niczego potrzebne.

0

Ja preferuje wypisawanie kolumn expicite. Dużo przyjemniej się na takich skryptach pracuje, szczególnie jeśli musisz skorzystać ze skryptu napisanego przez kogoś innego. Ale oczywiście zdarzają się sytuacje, gdy gwiazdka nie przeszkadza i jej użycie poprawia czytelność. Tak więc, zależy to od sytuacji i kontekstu w jakim te dane mają być przetworzone.

Odnośnie wydajności, plany wykonania są identyczne. Tu chodzi tylko o wypisanie danych bez jakiejkolwiek ich obróbki na wyjściu. Zatem nie ma to znaczenia dla zapytania.

1

"Select *" jest właściwie klasycznym anty-wzorcem. Można przyjąć dość bezpiecznie że koszt będzie nie-lepszy od zapytania z wypisanymi kolumnami.

A jeśli nie-lepszy to warto wziąć pod uwagę to, że tego rodzaju zapytanie tworzy problemy natury inżynieryjnej:

  • nie wiadomo które kolumny chciał obsłużyć autor
  • w związku z tym nie można bezpiecznie usunąć kolumny patrząc tylko na zapytania, potrzebna jest analiza kodu
  • jeśli program jest w języku dynamicznym i daje radę obsłużyć wszystkie kolumny (nawet te, które są dodane po jego utworzeniu), to może się okazać, że nagle po zmianie tabeli raporty i pliki wyglądają inaczej (auto-magicznie). Nie zawsze jest to pożądana sytuacja.
0

@wloochacz

Trochę więcej opanowania w Twojej wypowiedzi byłoby milsze w odbiorze Spin Doktorku.

Chciałeś przykład to masz.

Oracle Application Express -> wszelkie raporty budowane na schemacie. Zacznij wszędzie stosować zapytanie z gwiazdką, to będziesz miał później latanie z szufelką i poprawianie selectów.

0
EroSanin napisał(a):

@wloochacz
Trochę więcej opanowania w Twojej wypowiedzi byłoby milsze w odbiorze Spin Doktorku.

Że co?
Rozumiem, że mam miło reagować na bzdury w stylu "zapytanie z gwiazdką jest mniej wydajne bo nie wykorzystuje indeksów"?

Chciałeś przykład to masz.
Oracle Application Express -> wszelkie raporty budowane na schemacie. Zacznij wszędzie stosować zapytanie z gwiazdką, to będziesz miał później latanie z szufelką i poprawianie selectów.

Jak napisałem wcześniej - jak aplikacja jest napisana gówniano, to i takie będą efekty.
A czy to będzie aplikacja od Oracle, SAP czy od Ciebie - bez znaczenia.
Poza tym, nie takie było pytanie w tym wątku - poczytaj ze zrozumieniem, a potem pisz.
Żeby nie było - ja w swoich aplikacjach nigdy nie korzystam z wersji z gwiazdką, ale z zupełnie innych powodów niż wydajność.

1 użytkowników online, w tym zalogowanych: 0, gości: 1