=?iso-8859-2?Q?=5BPGSQL=5D_unia_schemat=F3w?=
=?iso-8859-2?Q?Andrzej_Str=F3=BFy=F1ski?= - 29-11-2005 10:11
=?iso-8859-2?Q?=5BPGSQL=5D_unia_schemat=F3w?=
Witam, mam dane w kilku schematach (identyczna struktura) i robię zapytania dotyczące wszystkich schematów (sch1, sch2, ...) :
SELECT a.pole1, b.pole2 FROM sch1.tabela1 a, sch1.tabela2 b WHERE ... UNION ALL SELECT a.pole1, b.pole2 FROM sch2.tabela1 a, sch2.tabela2 b WHERE ... UNION ALL SELECT a.pole1, b.pole2 FROM sch3.tabela1 a, sch3.tabela2 b WHERE ...
i to działa, ale jak chcę zmienić warunek to mam do zmiany kilka klauzul WHERE. Szukałem zatem innego sposobu i zrobiłem tak:
SELECT * FROM ( SELECT a.pole1, b.pole2 FROM sch1.tabela1 a, sch1.tabela2 b UNION ALL SELECT a.pole1, b.pole2 FROM sch2.tabela1 a, sch2.tabela2 b UNION ALL SELECT a.pole1, b.pole2 FROM sch3.tabela1 a, sch3.tabela2 b ) as UNIA WHERE ...
i to też działa, ale kilkukrotnie wolniej niż pierwszy sposób. Mam więc do wyboru: przejrzystość zapytania, łatwość modyfikacji ale wolne działanie, albo toporny zapis i szybkie działanie. Jak pewnie się domyślacie, szukam sposobu żeby połączyć zalety obu wersji i pozbyć się ich wad :-) Może ktoś ma doświadczenia z takimi zapytaniami i mógłby mi podsunąć jakiś pomysł? Dobrym sposobem (być może) byłoby zdefiniowanie makra zawierającego warunek i wywoływanie go potem w każdym zapytaniu? Ale czy jest taka możliwość? Jeśli tak, to jak to ugryźć?
Wiele się już nauczyłem czytając Wasze posty, może i tym razem dowiem się czegoś ciekawego? ;-)
Pozdrawiam i z góry dziękuję AS.
Krycek - 29-11-2005 10:11
Dnia Mon, 28 Nov 2005 16:01:02 +0100, Andrzej Stróżyński <astrozynski@poczta_dot_onet.pl> napisał:
> Może ktoś ma doświadczenia z takimi zapytaniami i mógłby mi podsunąć > jakiś pomysł?
Moze widoki?
-- Moim programem pocztowym jest Opera: http://www.opera.com/m2/
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 29-11-2005 10:11
Andrzej Stróżyński wrote: > Witam,
[...]
> mam dane w kilku schematach (identyczna struktura) i robię zapytania > dotyczące wszystkich schematów (sch1, sch2, ...) : > i to też działa, ale kilkukrotnie wolniej niż pierwszy sposób. > Mam więc do wyboru: przejrzystość zapytania, łatwość modyfikacji ale > wolne działanie, albo toporny zapis i szybkie działanie. > Jak pewnie się domyślacie, szukam sposobu żeby połączyć zalety obu > wersji i pozbyć się ich wad :-) > Może ktoś ma doświadczenia z takimi zapytaniami i mógłby mi podsunąć > jakiś pomysł? > Dobrym sposobem (być może) byłoby zdefiniowanie makra zawierającego > warunek i wywoływanie go potem w każdym zapytaniu? Ale czy jest taka > możliwość? Jeśli tak, to jak to ugryźć?
To jest dobry sposób ale takie rzeczy są implementowane w bibliotekach po stronie klienta. Jeśli Twoja bibliotek tego nie umożliwia, to pozostaje Ci napisać własną procedure, najłatwiej chyba będzie w plperl.
Innych rozwiązań nie znam.
-- P.M.
Robert Grabowski - 29-11-2005 10:11
Andrzej Stróżyński wrote: > Witam, > mam dane w kilku schematach (identyczna struktura) i robię zapytania > dotyczące wszystkich schematów (sch1, sch2, ...) : >
1.
> SELECT a.pole1, b.pole2 FROM sch1.tabela1 a, sch1.tabela2 b WHERE ... > UNION ALL > SELECT a.pole1, b.pole2 FROM sch2.tabela1 a, sch2.tabela2 b WHERE ... > UNION ALL > SELECT a.pole1, b.pole2 FROM sch3.tabela1 a, sch3.tabela2 b WHERE ... > > i to działa, ale jak chcę zmienić warunek to mam do zmiany kilka klauzul > WHERE. > Szukałem zatem innego sposobu i zrobiłem tak: >
2.
> SELECT * FROM > ( > SELECT a.pole1, b.pole2 FROM sch1.tabela1 a, sch1.tabela2 b > UNION ALL > SELECT a.pole1, b.pole2 FROM sch2.tabela1 a, sch2.tabela2 b > UNION ALL > SELECT a.pole1, b.pole2 FROM sch3.tabela1 a, sch3.tabela2 b > ) as UNIA > WHERE ... >
Powinno działać jednakowo szybko, bo zapytanie 2 jest niejawnie przepisywane przez PostgreSQL'a na postać 1. Dlaczego u Ciebie się tak nie dzieje, ciężko na pierwszy rzut oka powiedzieć. Zobacz, co Ci pokazuje explain, być może nie na wszystkich tabelach masz takie same indeksy, vacuum analyze wszystkich tabel biorących udział w zapytaniu może pomoże. Spróbuj te uniony wrzucić do widoku i z niego robić zapytania.
pozdrawiam Robert Grabowski
Andrzej Stróżyński - 29-11-2005 10:11
Użytkownik "Robert Grabowski" <grabba@env.pl> napisał w wiadomości news:dmfa2p$9b6$1@atlantis.news.tpi.pl... > Andrzej Stróżyński wrote: >> Witam, >> mam dane w kilku schematach (identyczna struktura) i robię zapytania >> dotyczące wszystkich schematów (sch1, sch2, ...) : >> > > 1. > >> SELECT a.pole1, b.pole2 FROM sch1.tabela1 a, sch1.tabela2 b WHERE ... >> UNION ALL >> SELECT a.pole1, b.pole2 FROM sch2.tabela1 a, sch2.tabela2 b WHERE ... >> UNION ALL >> SELECT a.pole1, b.pole2 FROM sch3.tabela1 a, sch3.tabela2 b WHERE ... >> >> i to działa, ale jak chcę zmienić warunek to mam do zmiany kilka klauzul >> WHERE. >> Szukałem zatem innego sposobu i zrobiłem tak: >> > > 2. > >> SELECT * FROM >> ( >> SELECT a.pole1, b.pole2 FROM sch1.tabela1 a, sch1.tabela2 b >> UNION ALL >> SELECT a.pole1, b.pole2 FROM sch2.tabela1 a, sch2.tabela2 b >> UNION ALL >> SELECT a.pole1, b.pole2 FROM sch3.tabela1 a, sch3.tabela2 b >> ) as UNIA >> WHERE ... >> > > Powinno działać jednakowo szybko, bo zapytanie 2 jest niejawnie > przepisywane przez PostgreSQL'a na postać 1. Dlaczego u Ciebie się tak nie > dzieje, ciężko na pierwszy rzut oka powiedzieć. Zobacz, co Ci pokazuje > explain, być może nie na wszystkich tabelach masz takie same indeksy, > vacuum analyze wszystkich tabel biorących udział w zapytaniu może pomoże. > Spróbuj te uniony wrzucić do widoku i z niego robić zapytania.
Vacuum analyze zrobione, indeksy też te same (to bliźniacze schematy generowane przez jedną aplikację). Mnie też wydawało się, że obie wersje powinny działać podobnie ale SQL-em zajmuję się od niecałych dwóch miesięcy więc moje "czucie materii" nie jest zbyt duże. W explain nie zaglądałem i widoków też jeszcze nie próbowałem. Kolega Paweł proponuje procedurę... Cóż, widzę, że pora na nowe doświadczenia :-). Z pewnością będę drążył temat a jak uda mi się to połączenie to opowiem jak.
dziękuję za pomoc AS
Robert Grabowski - 29-11-2005 10:12
Andrzej Stróżyński wrote: [...]
> dziękuję za pomoc > AS > >
Napisz jeszcze, której wersji bazy używasz.
pozdrawiam Robert Grabowski
=?iso-8859-2?Q?Andrzej_Str=F3=BFy=F1ski?= - 29-11-2005 10:12
=?iso-8859-2?Q?Re:_=5BPGSQL=5D_unia_schemat=F3w?=
> [...] > > Napisz jeszcze, której wersji bazy używasz.
PostgreSQL 7.4.6 na fedor'ze 64 bit
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
Czy zna (obsługuje) ktoś program Iso Draw ?
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
Konwesja znaków w dump'ie bazy danych - ISO -> utf-8 -> ISO -> utf-8
=?iso-8859-2?q?Co_oznacza_b=B3=B1d_Warning:_mysql=5Fconnect() _[function.mysql-connect]:_Can't_connect_to_local_MySQL_server_through_sock et_'/var/run/mysqld/mysqld.sock'_(2)_in?=
=?iso-8859-2?q?Informatyka,_Java,_EJB,_Ajax,_Spring=2E_Czy=BF by_to_koniec_=B6wiata,_czy_te=BF_nasze_uczelnie_b= EAd=B1_uczy=B3y_w_ko=F1cu!_czego_praktycznego_=2E= 2E=2E=2E?=
=?iso-8859-2?q?Ati_Mobility_Radeon_X300_W_Notebooku_Jak_Zwi=E Akszy=E6_Ilo=B6=E6_Grafiki_Poprzez_Wsp=F3=B3dziele nie_Z_Ramu=3F=3F=3F?=
=?ISO-8859-2?Q?=AFegnam_si=EA=2E=2E=2E?=
zanotowane.pldoc.pisz.plpdf.pisz.ploefg.opx.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 |
|