[Postgres] Zbyt wolny select
marek rynkowski - 13-11-2006 00:45
[Postgres] Zbyt wolny select
Zdefiniowałem tabelę o nazwie "tabela". W tabeli tej oprócz dużej ilości pól znajduje się również pole o nazwie "binary_counter". Jest to pole bitowe typu "bit(1024)".
Zdefiniowałem również tabelę o nazwie "uzytkownicy", w której trzymam loginy użytkowników w kolumnie o nazwie "login_uzytkownika". W tabeli tej mam również pole o nazwie "binary_mask", które jest typu bitowego "bit(1024)". Taka maska bitowa użytkownika.
Na koniec zdefiniowałem funkcję o nazwie "binary_mask", która na podstawie loginu użytkownika zwraca z tabeli "uzytkownicy" jego maskę bitową. Oto kod funkcji:
create or replace function binary_mask(name) returns bit as ' select binary_mask from uzytkownicy where login_uzytkownika = $1; ' language sql;
Teraz jeśli wykonuję zapytanie na tabeli o nazwie "tabela"
SELECT * FROM tabela WHERE binary_counter & binary_mask(current_user) = binary_counter
i już dla około 1000 rekordów wyknuje się ono kilkanaście sekund :O(
Czy jest możliwość zbudowania jakiegoś typu indeksu aby przyspieszyć to zapytanie?
marek
Michał 'Khorne' Rzechonek - 13-11-2006 00:45
marek rynkowski wrote: > create or replace function binary_mask(name) returns bit as ' > select binary_mask > from uzytkownicy > where login_uzytkownika = $1; > ' language sql; > > Teraz jeśli wykonuję zapytanie na tabeli o nazwie "tabela" > > SELECT * > FROM tabela > WHERE binary_counter & binary_mask(current_user) = binary_counter
A czemu nie tak:
SELECT * FROM tabela t, uzytkownicy u WHERE u.login_uzytkownika = t.current_user AND t.binary_counter & u.binary_mask = t.binary_counter
-- Michał 'Khorne' Rzechonek
Artur Muszynski - 13-11-2006 00:45
marek rynkowski wrote: > SELECT * > FROM tabela > WHERE binary_counter & binary_mask(current_user) = binary_counter > Czy jest możliwość zbudowania jakiegoś typu indeksu aby przyspieszyć > to zapytanie?
Już się o to pytałeś kilka dni temu.
artur
Michal Jankowski - 13-11-2006 00:45
marek rynkowski <marekrynkowski@hotmail.com> writes:
> create or replace function binary_mask(name) returns bit as ' > select binary_mask > from uzytkownicy > where login_uzytkownika = $1; > ' language sql;
Dodaj atrybut STABLE.
MJ
marek rynkowski - 13-11-2006 00:46
Artur Muszynski napisał(a): > Już się o to pytałeś kilka dni temu. > > artur
Tak wiem. Pomyślałem, że zbyt skrótowo napisałem bo nikt mi nie odpowiedział :O( Więc dokładnie opsiałem mój problem.
marek
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
[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?=
=?ISO-8859-2?Q?[psql]_Polskie_t=B3umaczenie_?= =?ISO-8859-2?Q?licencji_BSD_dla_PostgreSQL=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plptsite.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 |
|