ďťż
 
[PGSQL] Jak efektywnie odpytać serwer [bardzo długie] ďťż
 
[PGSQL] Jak efektywnie odpytać serwer [bardzo długie]
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

[PGSQL] Jak efektywnie odpytać serwer [bardzo długie]



Robi - 24-12-2006 00:37
[PGSQL] Jak efektywnie odpytać serwer [bardzo długie]
  Witam,

SQL: PostgreSQL 8.1.4

Problem dotyczy kilku tabel i na nich chciałbym się skupić.

Jest Tabela CV - przechowująca pewne dane z CV osoby (nazwę je brzydko
jednowierszone)
oraz kilka tabeli pomocniczych przechowujace dane wielowierszone np - znane
przez osobę języki, umiejętności, ukończone szkoły etc etc etc (Niżej
załączam definicje tabel)

Mam widok po ktorym chciałbym wyszukiwać konkretne grupy i tu pojawia się
problem - gdy szukanie ograniczam do danych z CV to nie ma problemu, jednak
gdy zaczynam szukac po tych tabelach pomocniczych to czas odpowiedzi jest -
po prostu za dlugi - idzie w godziny (nie doczekalem się końca).

Teraz konkrety:

Tabela CV - ilosc rekordów ~ 50.000
Tabele pomocnicze - kazda posiada 0-5 wierszy dla kazdego wiersza w tabeli
CV;

############Tabele : ###############

CREATE TABLE "CV"
(
"IDCV" int4 NOT NULL DEFAULT nextval('"CV_IDCV_seq"'::regclass),
"NAZWA_CV" text NOT NULL,
"IDOS" int4 NOT NULL,
"IDB" int4 NOT NULL,
"IDH" int4 NOT NULL,
"IDMWP" int4 NOT NULL,
"IDS" int4 NOT NULL,
"OBSLUGA_KOMPUTERA" text,
"POSIADA_SAMOCHOD" bool,
"WAZNE_DO" date NOT NULL,
"WYNAGRODZENIE" int4 NOT NULL DEFAULT 0,
"IDRU" int4 NOT NULL DEFAULT 0,
CONSTRAINT "CV_pkey" PRIMARY KEY ("IDCV"),
CONSTRAINT "CV_IDOS_fkey" FOREIGN KEY ("IDOS")
REFERENCES "OSOBY" ("IDOS") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH OIDS;

CREATE TABLE "CV_FIRMY"
(
"IDCVFI" int4 NOT NULL DEFAULT nextval('"CV_FIRMY_IDCVFI_seq"'::regclass),
"IDCV" int4 NOT NULL,
"IDFI" int4 NOT NULL,
"OD" date,
"DO" date,
"IDST" int4 NOT NULL,
CONSTRAINT "CV_FIRMY_pkey" PRIMARY KEY ("IDCVFI"),
CONSTRAINT "CV_FIRMY_IDCV_fkey" FOREIGN KEY ("IDCV")
REFERENCES "CV" ("IDCV") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH OIDS;

CREATE TABLE "CV_JEZYKI"
(
"IDCVJE" int4 NOT NULL DEFAULT
nextval('"CV_JEZYKI_IDCVJE_seq"'::regclass),
"IDCV" int4 NOT NULL,
"IDJ" int4 NOT NULL,
"ILE" int2 DEFAULT 0,
"OSTATNIO" int2 DEFAULT 0,
"IDO" int4 NOT NULL,
CONSTRAINT "CV_JEZYKI_pkey" PRIMARY KEY ("IDCVJE"),
CONSTRAINT "CV_JEZYKI_IDCV_fkey" FOREIGN KEY ("IDCV")
REFERENCES "CV" ("IDCV") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH OIDS;

CREATE TABLE "CV_SZKOLY"
(
"IDCVSZ" int4 NOT NULL DEFAULT
nextval('"CV_SZKOLY_IDCVSZ_seq"'::regclass),
"IDCV" int4 NOT NULL,
"IDSK" int4 NOT NULL,
"OD" date,
"DO" date,
"IDWY" int4 NOT NULL,
CONSTRAINT "CV_SZKOLY_pkey" PRIMARY KEY ("IDCVSZ"),
CONSTRAINT "CV_SZKOLY_IDCV_fkey" FOREIGN KEY ("IDCV")
REFERENCES "CV" ("IDCV") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH OIDS;

########### WIDOKI i TESTY ##########

#####WERSJA 1

CREATE OR REPLACE VIEW "V_CV" AS
SELECT "CV"."IDCV", "CV"."NAZWA_CV", "OSOBY"."IMIE", "OSOBY"."NAZWISKO",
"_BRANZE"."NAZWA_B", "_HIERARCHIE"."NAZWA_H", "_MIASTA"."NAZWA_M",
"_STATUSY"."NAZWA_S", "OSOBY"."PESEL", "CV"."WYNAGRODZENIE",
"GetTAKNIE"("CV"."POSIADA_SAMOCHOD") AS "GetTAKNIE", ("CV"."WAZNE_DO" >
now())::integer AS "WAZNE", "_UMIEJETNOSCI"."NAZWA_U", "_JEZYKI"."NAZWA_J",
"_SZKOLY"."NAZWA_SK", "_FIRMY"."NAZWA_FI", "_STANOWISKA"."NAZWA_ST",
"CV"."IDOS"
FROM "CV"
LEFT JOIN "OSOBY" ON "OSOBY"."IDOS" = "CV"."IDOS"
LEFT JOIN "_MIASTA" ON "_MIASTA"."IDM" = "OSOBY"."MIASTO"
LEFT JOIN "_BRANZE" ON "_BRANZE"."IDB" = "CV"."IDB"
LEFT JOIN "_HIERARCHIE" ON "_HIERARCHIE"."IDH" = "CV"."IDH"
LEFT JOIN "_STATUSY" ON "_STATUSY"."IDS" = "CV"."IDS"
LEFT JOIN "CV_UMIEJETNOSCI" ON "CV_UMIEJETNOSCI"."IDCV" = "CV"."IDCV"
LEFT JOIN "_UMIEJETNOSCI" ON "_UMIEJETNOSCI"."IDU" =
"CV_UMIEJETNOSCI"."IDU"
LEFT JOIN "CV_JEZYKI" ON "CV_JEZYKI"."IDCV" = "CV"."IDCV"
LEFT JOIN "_JEZYKI" ON "_JEZYKI"."IDJ" = "CV_JEZYKI"."IDJ"
LEFT JOIN "CV_SZKOLY" ON "CV_SZKOLY"."IDCV" = "CV"."IDCV"
LEFT JOIN "_SZKOLY" ON "_SZKOLY"."IDSK" = "CV_SZKOLY"."IDSK"
LEFT JOIN "CV_FIRMY" ON "CV_FIRMY"."IDCV" = "CV"."IDCV"
LEFT JOIN "_FIRMY" ON "_FIRMY"."IDFI" = "CV_FIRMY"."IDFI"
LEFT JOIN "_STANOWISKA" ON "_STANOWISKA"."IDST" = "CV_FIRMY"."IDST";

####i ZAPYTANIE 1 - calkowty dramat - widok robi sie gigantycznie wielki
;-)

SELECT * from \"V_CV\"
WHERE
\"NAZWA_B\" IN ('Budownictwo','Sektor publiczny') AND
\"NAZWA_H\" IN ('Kierownik','Specjalista')AND
\"NAZWA_U\" IN ('Prawo jazdy kat B')AND
\"NAZWA_J\" IN ('Angielski','Niemiecki') ";

####WERSJA 2

CREATE OR REPLACE VIEW "V_CV2" AS
SELECT "CV"."IDCV", "CV"."NAZWA_CV", "OSOBY"."IMIE", "OSOBY"."NAZWISKO",
"_BRANZE"."NAZWA_B", "_HIERARCHIE"."NAZWA_H", "_MIASTA"."NAZWA_M",
"_STATUSY"."NAZWA_S", "OSOBY"."PESEL", "CV"."WYNAGRODZENIE",
"GetTAKNIE"("CV"."POSIADA_SAMOCHOD") AS "GetTAKNIE", ("CV"."WAZNE_DO" >
now())::integer AS "WAZNE", "CV"."IDOS"
FROM "CV"
LEFT JOIN "OSOBY" ON "OSOBY"."IDOS" = "CV"."IDOS"
LEFT JOIN "_MIASTA" ON "_MIASTA"."IDM" = "OSOBY"."MIASTO"
LEFT JOIN "_BRANZE" ON "_BRANZE"."IDB" = "CV"."IDB"
LEFT JOIN "_HIERARCHIE" ON "_HIERARCHIE"."IDH" = "CV"."IDH"
LEFT JOIN "_STATUSY" ON "_STATUSY"."IDS" = "CV"."IDS";

###TO CHODZI DOBRZE

SELECT * from \"V_CV2\"
WHERE
\"NAZWA_B\" IN ('Budownictwo','Sektor publiczny') AND
\"NAZWA_H\" IN ('Kierownik','Specjalista');

###ALE GDY W GRE WCHODZI SZUKANIE PO TABELACH POMOCNICZYCH to DRAMAT :

###Zrobilem jeszcze funkcje ktora zwraca bool i sprawdza czy dane CV posiada
jeden z podanych języków
###ograniczyłem do MAX 4 parametrów oraz już po ID (języka, czy
umiejętności)

SELECT * from \"V_CV2\"
WHERE
\"NAZWA_B\" IN ('Budownictwo','Sektor publiczny') AND
\"NAZWA_H\" IN ('Kierownik','Specjalista') AND "CheckCVUM"("IDCV",
2,3,0,0");

####A FUNKCJA TUTAJ

CREATE OR REPLACE FUNCTION "CheckCVUM"(v0 int8, v1 int4, v2 int4, v3 int4,
v4 int4)
RETURNS bool AS
$BODY$
DECLARE
i integer;
BEGIN

i = "IDCV" from "CV_UMIEJETNOSCI" where "IDCV"=v0 and ( ("IDU" = v1) or
("IDU" = v2) or("IDU" = v3) or("IDU" = v4) ) LIMIT 1 ;

if (i is null) then
return false;
end if;
return true;

END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Indexy oczywiście są jednak ich dodawanie lub zmienianie nie pomaga.
Proszę o naprowadzenie w którym kierunku optymizować aby otrzymać w miarę
sensowe rezultaty.
Może użyć innego języka w funkcji sprawdzającej ?
Dzięki za informacje.





Paweł Matejski - 24-12-2006 00:37

  Robi wrote:
> Witam,
>
> SQL: PostgreSQL 8.1.4
>
>
> Indexy oczywiście są jednak ich dodawanie lub zmienianie nie pomaga.
> Proszę o naprowadzenie w którym kierunku optymizować aby otrzymać w miarę
> sensowe rezultaty.

Zacząć używać explain analyze (a tam gdzie nie da się doczekać wyniku, to samo
explain).

--
P.M.




Antoni Jakubiak - 24-12-2006 00:37

 
> Jest Tabela CV - przechowująca pewne dane z CV osoby (nazwę je brzydko
> jednowierszone)
> oraz kilka tabeli pomocniczych przechowujace dane wielowierszone np - znane
> przez osobę języki, umiejętności, ukończone szkoły etc etc etc (Niżej
> załączam definicje tabel)

Spropoj nie joinowac z tabelkami wielowieszone :) .
Czyli realcje jeden do wielu i wiele do wielu obsluzyc w osobnym zapytaniu.
Funkcje pgsql oznacz jako "stable".

Antoni Jakubiak
http://www.jaukubiak.eu/




Michał Zaborowski - 24-12-2006 00:37

  Witam,
Mam jedno pytanie - po co jest ten widok?
Warto podać wyniki explain analyze - bez tego ewentualna pomoc
ogranicza się do gdybania.

Zamiast robić "in ('Ala', 'ma', 'kota')" proponuję zrobić "= any
('{1,2,3}')". Czyli zamiast filtrować po labelach słownika lepiej
jest po identyfikatorach.

--
Pozdrawiam,
Michał Zaborowski (TeXXaS)
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    =?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?= [pgsql] Akcja w =?iso-8859-2?b?emFsZb9ub7ZjaQ==?= od liczby zmienionych =?iso-8859-1?q?rekord=F3w?= [sql][pgsql] zapytanie sql [pgsql] Wykonanie triggera po =?ISO-8859-2?Q?zako=F1czeniu_tra?==?ISO-8859-2?Q?nsakcji?= [pgsql] =?ISO-8859-2?Q?Prawid=B3owe_post=EApowanie_w_przyp?==?ISO-8859-2?Q?adku_awarii?= [PGSQL] Funkcje =?ISO-8859-2?Q?zwracaj=B1ce_=27rowset=27_i_?==?ISO-8859-2?Q?tabele_tymczasowe?= [pgsql] 7.4 =?ISO-8859-2?Q?og=B3upia=B3_przy_zak=B3adaniu_?==?ISO-8859-2?Q?indeksu?= [pgsql] Zmiana schematu do =?ISO-8859-2?Q?kt=F3rego_nalezy_o?==?ISO-8859-2?Q?biekt=2E?= Centralny serwer =?ISO-8859-2?Q?log=F3w_MS_Windows_na_Po?==?ISO-8859-2?Q?stgreSQL?= [MSSQL 2k] - jak =?ISO-8859-2?Q?pod=B3=B1czy=E6_serwer_na_?==?ISO-8859-2?Q?porcie_innym_ni=BF_1433=3F?=
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lubiatowo.xlx.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