postgresql, sekwencje, query planner i wieloprocesowosc
ďťż
postgresql, sekwencje, query planner i wieloprocesowosc Zobacz wiadomości
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Zacznę od definicji mojego dylematu: - Niezbędnym jest w mojej aplikacji utworzenie zapytania, ktore bedzie sortowalo wyniki i podawalo "miejsce porzadkowe" rekordu po posortowaniu. Na dodatek wszystko to jedynie w pewnym podzbiorze rekordow z danej tabeli. - Oczywiscie uzycie sekwencji to naturalne rozwiazanie dla takiego problemu.
Nie wysilajac sie zbytnio do glowy przyszly mi od razu dwa zapytania w sumie realizujace to samo
Zapytanie 1: SELECT *, nextval('"Ordering_seq"'::regclass) AS "Konkretne miejsce na podstawie sekwencji" FROM ( SELECT setval('"Ordering_seq"'::regclass,0) AS "Bzdura_resetujaca_sekwencje" ,* FROM "Classes" ORDER BY "Uzyskany_czas_eksperymentu" DESC) AS "A"
Zapytanie 2: ewentualnie drugie
SELECT *, nextval('"Ordering_seq"'::regclass) - "A"."Poczatkowa_wartosc_sekwencji" AS "Konkretne miejsce na podstawie sekwencji" FROM ( SELECT currval('"Ordering_seq"'::regclass AS "Poczatkowa_wartosc_sekwencji" ,* FROM "Classes" ORDER BY "Name" DESC) AS "B"
Roznica tylko taka, ze w podzapytaniu pierwszego zapytania resetuje sekwencje za kazdym razem, w podzapytaniu drugiego pobieram jej wartosc przed wykonaniem zapytania nadrzednego, po czym ta wartosc wykorzystywana jest do wyliczenia numeru danego rekordu.
Poniewaz postgres chodzi sobie na wielu procesach, to rozwazmy taka teoretyczna mozliwosc, ze w jednym czasie z dwoch roznych "miejsc" do bazy danych zostana zgloszone dwa powyzsze zapytania modyfikujace sekwencje Ordering_seq (za pomoca nextval, czy tez setval). Czy istnieje w takim przypadku mozliwosc, ze:
- sekwencja ma na poczatku wartosc np. 100 - wykonuje sie podzapytanie B (czyli pobranie wartosci sekwncji), ale na razie bez wykonania calego Zapytania 2: - wykonuje sie podzapytanie A (resetujace sekwencje) - nastepnie wykonuje sie Zapytanie 2 (jego nadrzedna czesc), ktore zwieksza i pobiera wartosc sekwencji, ale juz wyzerowanej, w zwiazku z czym zwraca bzdurne wyniki (nie zaczynajace sie od jedynki w polu "Konkretne miejsce na podstawie sekwencji")
Innymi slowy mozna zapytac: "Czy jedno zapytanie z podzapytaniami jest zawsze niepodzielna operacja, czy tez moze zostac podzielone i przerwane innym zapytaniem i moze dojsc do sytuacji, ktora poprzez analogie mozna okreslic jako "non-repeatable read", (ale oczywiscie na poziomie pojedynczych zapytan z pozdapytaniami, a nei transakcji) ???
On 2007-07-11, dominik <dominik.olsztyn@WYTNIJ.gazeta.pl> wrote: > Innymi slowy mozna zapytac: "Czy jedno zapytanie z podzapytaniami jest zawsze > niepodzielna operacja, czy tez moze zostac podzielone i przerwane innym > zapytaniem i moze dojsc do sytuacji, ktora poprzez analogie mozna okreslic > jako "non-repeatable read", (ale oczywiscie na poziomie pojedynczych zapytan > z pozdapytaniami, a nei transakcji) ???
to o co pytasz i to czego chcesz to zupełnie inne rzeczy. problemem jest to, że sekwencje są poza całą mechaniką transakcji itd. tak więc - może się zdarzyć, że dostaniesz "losowe" wartości. dlatego sugestia - użyj tymczasowych sekwencji: create temp sequence xxx;
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
> On 2007-07-11, dominik <dominik.olsztyn@WYTNIJ.gazeta.pl> wrote: > > Innymi slowy mozna zapytac: "Czy jedno zapytanie z podzapytaniami jest zawsze > > > niepodzielna operacja, czy tez moze zostac podzielone i przerwane innym > > zapytaniem i moze dojsc do sytuacji, ktora poprzez analogie mozna okreslic > > jako "non-repeatable read", (ale oczywiscie na poziomie pojedynczych zapytan > > z pozdapytaniami, a nei transakcji) ??? > > to o co pytasz i to czego chcesz to zupełnie inne rzeczy. problemem jest > to, że sekwencje są poza całą mechaniką transakcji itd. > tak więc - może się zdarzyć, że dostaniesz "losowe" wartości. > dlatego sugestia - użyj tymczasowych sekwencji: > create temp sequence xxx; > > depesz >
Witam.
Na wstepie dzieki za zainteresowanie tematem. Niestety jeszcze troche pomarudze. Transakcje wskazalem tylko dla pokazania analogii w problemie (mamy pojedyncze zapytanie, wiec transakcje nas nie dotycza w tym przypadku). Chodzi mi o troche inna rzecz. Moze jeszcze uscisle - Mamy dwie maszyny klienta (A i B) i jedna (C) na ktorej zainstalowany jest serwer. - Zapytanie z maszyny A jest realizowane w jednym polaczaniu do bazy na procesie P1 serwera, natomiast zapytanie z maszyny B na procesie P2 serwera. - Zapytania pokazalem w poprzednim poscie (posiadaja podzapytania, ktore "kombinuja" na jednej sekwencji)
I teraz pytanie: Czy moze sie zdazyc sytuacja, ze wykonanie jednego zapytania (nie transakcji, lecz pojedynczego zapytania) realizowanego przez P1 , zostanie przerwane przez wykonanie innego zapytania realizowanego przez proces P2, a obydwa zapytania korzystac beda z tej samej sekwencji. Czy moze istnieja w postgres jakies mechanizmy semaforow, ktore umiemozliwiaja wielu procesom jednoczesny dostep do tej samej sekwencji, tzn blokujace dostep do sekwencji na czas wykonania calego zapytania .
On 2007-07-12, dominik <dominik.olsztyn@NOSPAM.gazeta.pl> wrote: > Czy moze sie zdazyc sytuacja, ze wykonanie jednego zapytania (nie transakcji, > lecz pojedynczego zapytania) realizowanego przez P1 , > zostanie przerwane przez wykonanie innego zapytania realizowanego przez > proces P2, a obydwa zapytania korzystac beda z tej samej sekwencji. Czy moze > istnieja w postgres jakies mechanizmy semaforow, ktore umiemozliwiaja wielu > procesom jednoczesny dostep do tej samej sekwencji, tzn blokujace dostep do > sekwencji na czas wykonania calego zapytania .
tak jak już napisałem - nie ma takiego mechanizmu. i dostaniesz "losowe" wartości z sekwencji. nie do końca rozumiem czemu pytasz zamiast po prostu sprawdzić. prosty test - na tej samej bazie odpaliłem to samo zapytanie z dwóch połączeń, w tym samym momencie.
zapytanie: select min(q), max(q) from (select nextval('x') as q from pg_class, pg_attribute) w;
wyniki: połączenie 1: min | max -----+-------- 1 | 608164 (1 row)
połącznie 2: min | max -------+-------- 26055 | 762996 (1 row)
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
dominik - 13-07-2007 00:01
> zapytanie: > select min(q), max(q) from (select nextval('x') as q from pg_class, pg_attribut > e) w; > > wyniki: > połączenie 1: > min | max > -----+-------- > 1 | 608164 > (1 row) > > połącznie 2: > min | max > -------+-------- > 26055 | 762996 > (1 row) > > depesz >
Test i jego wyniki mowia same za siebie. Wszystko jasne. Dziekuje bardzo :)
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona