[FB] Bardzo wolne zapytanie
point - 11-07-2006 00:09
[FB] Bardzo wolne zapytanie
Witam
Mam problem z wydajnością zapytania SQL (kod poniżej). Przy dużej [1] ilości rekordów w tabelach czas wykonania skacze do pojedyńczych minut.
select rc.card_id from reader_cards rc where rc.reader_id = :reader_id
/* !!! Problematyczny warunek. */ and rc.user_id not in ( select user_id from select_users_in_reader(:reader_id) )
into :old_card_id
Zapytanie ma wykonać różnicę: delta = reader_cards - select_users_in_reader (czyli weź te karty z tabeli reader_cards, których nie ma w wyniku wykonania procedury select_users_in_reader() ).
Gdy usunę warunek 'and rc.user_id not in' to czas wykonania jest rzędu kilkunastu ms. Sama procedura select_users_in_reader() wykonuje się w podobnym czasie. Po połączeniu czas skacze aż do 1 minuty, co jest kompletnie nie do zaakceptowania. Używam Firebird 1.5 i narzędzia IBExpert. IBExpert pokazuje ilość fetches rzędu 11 milionów (?!). Ilość indexed i non-indexed reads wydaje się być w normie.
Czy macie jakiś pomysł na optymalizację tego kodu?
-- point
[1] Liczebność tabel: reader_cards - 4500 users - 10000 groups - 1 zones - 1 group_access_maps - 1 readers - 3
CREATE PROCEDURE SELECT_USERS_IN_READER ( reader_id integer) returns ( user_id bigint) as begin for select u.user_id from users u where u.group_id in ( select g.group_id from groups g where g.group_id in ( select gam.group_id from group_access_maps gam where gam.zone_id in ( select z.zone_id from zones z where z.zone_id in ( select r.zone_id from readers r where r.reader_id = :reader_id ) ) ) ) into :user_id do suspend; end
wloochacz - 11-07-2006 00:09
[ciach] > Czy macie jakiś pomysł na optymalizację tego kodu? na początek:
CREATE PROCEDURE SELECT_USERS_IN_READER ( reader_id integer) returns ( user_id bigint) as begin for select u.user_id from users u inner join groups g on (g.group_id = u.group_id) inner join group_access_maps gam on (gam.group_id = g.group_id) inner join zones z on (z.zone_id = gam.zone_id) inner join readers r on (r.zone_id = z.zone_id) where r.reader_id = :reader_id into :user_id do suspend; end
-- wloochacz
point - 11-07-2006 00:09
wloochacz wrote:
> [ciach] > >> Czy macie jakiś pomysł na optymalizację tego kodu? > > na początek: > > CREATE PROCEDURE SELECT_USERS_IN_READER ( > reader_id integer) > returns ( > user_id bigint) > as > begin [...]
Dzięki, nieźle przyśpieszyło. Teraz zapytanie wykonuje się w ~10 sekund, jest 100% indexed read i 2,3M fetches.
-- point
wloochacz - 11-07-2006 00:09
[ciach] > Dzięki, nieźle przyśpieszyło. Teraz zapytanie wykonuje się w ~10 sekund, > jest 100% indexed read i 2,3M fetches. No właśnie - teraz przerób sobie resztę zapytań na złączenia. FB to nie jest przykład najlepszej implementacji optymalizatora zapytań; trzeba bardzo uważnie pisać,a le jak się załapie co z czym to FB potrafi pokazać pazurki ;-)
-- wloochacz
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?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?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
zanotowane.pldoc.pisz.plpdf.pisz.plquentinho.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 |
|