ďťż
 
[PGSQL] Zapytane o wartości w przedziale ďťż
 
[PGSQL] Zapytane o wartości w przedziale
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] 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.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?= [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • own-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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com