Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zapytanie na duzej tabeli, select count(distinct(ip)) ...
mac9
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 3.04.2007

Ostrzeżenie: (0%)
-----


Witam,

mam dosc spora tabele ktora trzyma staty odwiedzin (kilka milionow rekordow)

chce dostac ilosc unikalnych odwiedzin na stronie nr "3" od poczatku lutego:

  1. SELECT count(DISTINCT(ip)) FROM staty WHERE date_trunc('month', klikniete_data) >1 AND strona_id = 3 ;


indexy btree sa na klikniete_data oraz na strona_id

niby proste zapytanie ale bardzo dlugo mieli i zamula caly serwer.

explain daje cod takiego:

Kod
Limit  (cost=128878.77..128878.78 rows=1 width=17)
   ->  Aggregate  (cost=128878.77..128878.78 rows=1 width=17)
         ->  Bitmap Heap Scan on staty  (cost=224.93..128846.64 rows=12850 width=17)
               Recheck Cond: (strona_id = 3)
               Filter: ((date_trunc('month'::text, klikniete_data))::text > '3'::text)
               ->  Bitmap Index Scan on strona_id_idx  (cost=0.00..224.93 rows=38551 width=0)
                     Index Cond: (strona_id = 3)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
wojtekmki
post
Post #2





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.04.2007

Ostrzeżenie: (0%)
-----


witam

hmm... a czy przypadkiem date_trunc nie daje ci innego wyniku (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Cytat
Examples:

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-02-16 20:00:00

SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-01-01 00:00:00


więc wg mnie zapytanie powinno wyglądać raczej tak (przy typie TIMESTAMP dla pola klikniete_data):

Cytat("SQL")
select count(distinct(ip)) from staty where date_trunc('month', klikniete_data) >= '2007-02-01 00:00:00' and strona_id = 3 ;


Ewentualnie przy takiej ilości danych sugeruję utworzyć dodatkową tabelę w której będą odpowiednio już przetworzone (statystyki miesięczne, roczne itp). Czasochłonną operację wykonasz raz (np. za m-c luty 2007 - przy takiej ilości danych to rozwiązanie będzie efektywniejsze), i później możesz z wyników korzystać do woli (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) Oczywiście strukturę tabel wynikowych musisz przemyśleć w zależności od tego jakiego rodzaju wyniki Cię interesują (IMG:http://forum.php.pl/style_emoticons/default/cool.gif)


pozdrawiam

Ten post edytował wojtekmki 18.04.2007, 14:16:24
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 13:00