Co jest wydajniejsze, dwa sposoby na select

0

Pytanie odnośnie wydajności, który sposób selecta jest wydajniejszy.
Sytuacja wygląda tak że mam dwie tabele. Powiedzmy Klient i Zamówienia.

Klient ma wiele zamówień, prosta sprawa.

Właściwie nie chodzi mi o wydajność selecta ale o coś innego. Mam w programie pobrane wcześniej dane z tabel czyli klienta i zamówienia, w pewnym momencie chcę zsynchronizować dane więc chcę sprawdzić czy nie przyszło jakieś nowe zamówienie. Potem je oczywiście pobiorę ale najprawdopodobniej nie przyszło nic nowego, a sprawdzać muszę często więc zależy mi na wydajności, żeby nie obciążać bazy tylko peceta. Więc mogę to sprawdzić na dwa sposoby.
Jeszcze zaznaczę że Klient ma kolumnę OstatnieZamówienie gdzie jest data ostatniego zamówienia jakie przyszło.

Więc, sposoby:

  1. Robię select zamówień where Klient == klient and data > data_ostatniego_pobrania_zamówień_do_systemu
    (Jeżeli nic nie przysżło to select nic nie da, jeżeli przyszło to od razu mam dane)
  2. Robię select Klienta i sprawdzam czy OstatnieZamówienie jest równe data_ostatniego_pobrania_zamówień_do_systemu. Jeżeli nie to ciągnę zamówienia.

Podkreślam że w 99% przypadków nie będzie nowych zamówień. Jak ogólnie sprawdzić co jest szybsze?

0

Jeśli ilość zamówień będzie znacznie większa od ilości klientów to oczywiście opcja numer 1 będzie znacznie wolniejsza. Bo przelatujesz przez całą tabelę zamówień. Opcja druga będzie znacznie szybsza bo przelatujesz tylko przez klientów, a zakładam że jest ich znacznie mniej.

0

a może baza ma mechanizm eventów :>

0

Jeśli ilość zamówień będzie znacznie większa od ilości klientów to oczywiście opcja numer 1 będzie znacznie wolniejsza. Bo przelatujesz przez całą tabelę zamówień.

Eee tam. Jak ma indeks na (klient, data), to oba zapytania będą praktycznie tak samo szybkie, i to bardzo szybkie. Największy koszt, to IMHO czas przesłania zapytania, odpowiedzi po sieci w obie strony i samych przygotowań do wykonania zapytania po stronie bazy (otwarcie transakcji, przygotowanie pamięci itp). Zwłaszcza, że jak będziesz często stukał do bazy, to nawet dysku nie dotknie. Drugie może być nieznacznie szybsze, jeśli baza obsługuje indeksy haszujące, w pierwszym haszujące na nic się nie zdadzą.

0

Ale to sprawdzasz jednego klienta czy chcesz w ogóle reagować na wszystkie nowe zamówienia? Bo takie szukanie jest IMHO cholernie nieefektywne. Czy te nowe zamówienia mają jakiś ID? Albo prościej.... jeśli baza jest Twoja, czy możesz do niej dodać do bazy pole ZROBIONE, domyślnie jako NULL, a potem ustawiasz true jak już przerobisz? Czyli coś takiego

SELECT Count(Zamówienia) FROM Zamówienia ... WHERE (Zrobione=NULL)
i pozamiatane. Jak jest >=1, to odpalasz pełną kwerendę.

0

jaki system bazodanowy i jaki klient?
na pewno sa lepsze sposoby na osiagniecie tego celu, tylko powiedz czego uzywasz?

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