ďťż
 
[FB] Bardzo wolne zapytanie ďťż
 
[FB] Bardzo wolne zapytanie
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

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • quentinho.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com