ďťż
 
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
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

postgresql, sekwencje, query planner i wieloprocesowosc



dominik - 12-07-2007 00:09
postgresql, sekwencje, query planner i wieloprocesowosc
  Witam.

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) ???

Bede dozgonnie wdzieczny za pomoc

pozdrawiam
Dominik

--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/





hubert depesz lubaczewski - 13-07-2007 00:01

  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)




dominik - 13-07-2007 00:01

  hubert depesz lubaczewski <depesz@depesz.com> napisał(a):

> 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 .

dominik

--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/




hubert depesz lubaczewski - 13-07-2007 00:01

  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 :)

pozdrawiam

dominik

--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?= postgresql - int/int postgresql Select count(*) czy raczej Select count(ID) [PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?= [postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?= [postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?= [PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?= Postgres - replikcja master-master Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL] Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • own-team.pev.pl
  • Cytat

    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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com