Jaki select jest wydajnieszy?

Jaki select jest wydajnieszy?
LI
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Postów:518
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ć?


Life is Strange
panryz
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 13 godzin
0

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

fourfour
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:627
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.

EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
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 :)

edytowany 2x, ostatnio: EroSanin
Sarrus
Indeksy nie mają tu nic do rzeczy. Największy koszt jest zawsze na wyszukiwaniu krotek w tabeli. Jak już masz krotkę, to czy weźmiesz 5 pól czy 10, nie robi różnicy. No chyba, że masz ich 500 - to wtedy może.
LI
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Postów:518
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.


Life is Strange
flowCRANE
Jak chcesz kogoś przywołać, to wstawiaj znak @ przed nickiem - dzięki temu zostanie wysłane powiadomienie;
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
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.

HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1855
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.

edytowany 3x, ostatnio: hipekk
LI
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Postów:518
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?


Life is Strange
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
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.

HI
No tak, to jest wyjątkowa sytuacja gdy "admin" z jednej strony "programista" z drugiej zbierają się do pracy ;)
WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
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.

Vardamir
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 8 lat
  • Lokalizacja:Wrocław
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.


"There are people who actually like programming. I don't understand why they like programming."
Rasmus Lerdorf
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
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.
EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
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.

WL
  • Rejestracja:około 21 lat
  • Ostatnio:około 2 miesiące
  • Postów:1082
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ść.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)