[PGSQL] Zapytane o wartości w przedziale
Łukasz - 09-09-2006 01:08
[PGSQL] Zapytane o wartości w przedziale
Witam,
Mam tabelę w której są pola START_DATE i END_DATE typu TIMESTAMP wyznaczające przedział czasowy Chcę teraz znaleźć rekordy dla których dany rekord mieści się w tym przedziale, czyli
.... WHERE current_timestamp() BETWEEN START_DATE END END_DATE
Niestety rekordów jest bardzo dużo, a takie zapytanie fatalnie się liczy przy zwykłym indeksie... Mam więc pytanie, co mogę z tym fantem zrobić? Nie mogę założyć górnej granicy END_DATE-START_DATE (oprócz tego że jest dodatnia :) )
Z góry dzięki za wskazówki Łukasz
zomelos - 09-09-2006 01:08
Łukasz napisał(a): > Mam tabelę w której są pola START_DATE i END_DATE typu TIMESTAMP > wyznaczające przedział czasowy > Chcę teraz znaleźć rekordy dla których dany rekord mieści się w tym > przedziale, czyli > > ... > WHERE current_timestamp() BETWEEN START_DATE END END_DATE > > Niestety rekordów jest bardzo dużo, a takie zapytanie fatalnie się liczy > przy zwykłym indeksie...
1) jakiego typu masz indeks na kolumnach START_DATE i END_DATE? Z tego, co pamiętam, to dla BETWEEN powinieneś mieć indeksy typu btree 2) zrób VACUUM FULL na tabeli 3) czy musisz mieć wyniki z dokładnością current_timestamp() ? Jesli nie, to ogranicz dokładność kolumn (np. do 1 sekundy).
-- Pozdrawiam, Michał zomelos@orange.pl
Łukasz - 09-09-2006 01:08
Użytkownik "zomelos" <zomelos@gazeta.pl> napisał w wiadomości news:ed3v95$k5h$1@inews.gazeta.pl... >> ... >> WHERE current_timestamp() BETWEEN START_DATE END END_DATE >> >> Niestety rekordów jest bardzo dużo, a takie zapytanie fatalnie się liczy >> przy zwykłym indeksie... > > 1) jakiego typu masz indeks na kolumnach START_DATE i END_DATE? Z tego, co > pamiętam, to dla BETWEEN powinieneś mieć indeksy typu btree
Tak, ale chyba dla START_DATE between val1 and val2 Niestety chociaż START_DATE i END_DATE pozostają w związku logicznym, w indeksach tego nie widać
Filip Rembiałkowski - 10-09-2006 00:14
Łukasz napisał(a): > Użytkownik "zomelos" <zomelos@gazeta.pl> napisał w wiadomości > news:ed3v95$k5h$1@inews.gazeta.pl... >>> ... >>> WHERE current_timestamp() BETWEEN START_DATE END END_DATE >>> >>> Niestety rekordów jest bardzo dużo, a takie zapytanie fatalnie się liczy >>> przy zwykłym indeksie... >> >> 1) jakiego typu masz indeks na kolumnach START_DATE i END_DATE? Z >> tego, co pamiętam, to dla BETWEEN powinieneś mieć indeksy typu btree > > Tak, ale chyba dla START_DATE between val1 and val2 chyba nie tylko :)
> Niestety chociaż START_DATE i END_DATE pozostają w związku logicznym, w > indeksach tego nie widać >
jeśli podzielisz się wynikami
1) \d tabela 2) select count(*) from tabela 3) explain analyze select * from tabela where current_timestamp between START_DATE and END_DATE
to może coś z tego wyniknie ...
Arkadiusz 'nare' Kindziuk - 11-11-2006 00:52
Dnia Wed, 30 Aug 2006 13:15:58 +0200, Łukasz napisał(a): > Mam tabelę w której są pola START_DATE i END_DATE typu TIMESTAMP > wyznaczające przedział czasowy > Chcę teraz znaleźć rekordy dla których dany rekord mieści się w tym > przedziale, czyli > > ... > WHERE current_timestamp() BETWEEN START_DATE END END_DATE > > Niestety rekordów jest bardzo dużo, a takie zapytanie fatalnie się liczy > przy zwykłym indeksie... > Mam więc pytanie, co mogę z tym fantem zrobić? Nie mogę założyć górnej > granicy END_DATE-START_DATE (oprócz tego że jest dodatnia :) ) > Pewnie dodatkowa tabela i suma odcinków czasów pamiętana logarytmicznie. Timestamp ma 8 bajtów więc dostaniesz 64-128 razy większą tabelę pomocniczą (względem ilości wierszy) i selecta na działającym "poprawnie" indeksie (z tym że odnajdujesz w nim 64 konkretne wartości). Stała pewnie Ci się zmiejszy bo: - np (min(start_date),max(end_date)) nie obejmują całego zakresu - np nie musisz wykorzystywać całej dokładności timestampa - np inserty są w sporadycznych paczkach, więc czasy w tabelce możesz ponumerować rosnąco (i szukać po najbliższym start_date czy end_date)
-- Arkadiusz Kindziuk "Zasady zmieniają się całkowicie. Szachy, nie warcaby. Go, nie szachy. Rozumiesz?" (c) Neil Gaiman, "Władca Górskiej Doliny"
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?=
[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
[MySQL]: Dodanie zliczania =?ISO-8859-2?Q?rekord=F3w_do_rozb?==?ISO-8859-2?Q?udowanego_zapytania?=
zanotowane.pldoc.pisz.plpdf.pisz.plown-team.pev.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 |
|