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 (1 - 8)
DeyV
post
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




jaki wynik i explain da zapytanie
  1. SELECT count( ip ) FROM staty WHERE date_trunc('month', klikniete_data) >1 AND strona_id = 3 ;
?


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
mac9
post
Post #3





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

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


witam,

ciagle nie moge znalezc skutecznego rozwiazania dla tego problemu:

stworzylem sobie widok ktory wyciaga staty z kwietnia jedynie:

create view kwiecien_stats as select from kliki gdzie data z kwietnia..

tyle tylko ze nie wiem po co ten widok jest skoro zapytanie zapuszczone na tym wiidoku i tak mieli 40000 rekordow(tak mowi explain), czyli zachowuje sie tak jak byloby zapuszczone na tabeli glownej "staty".. a widok ma tylko 1500 wierszy..

nie rozumiem tego..
Go to the top of the page
+Quote Post
wojtekmki
post
Post #4





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 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 cool.gif Oczywiście strukturę tabel wynikowych musisz przemyśleć w zależności od tego jakiego rodzaju wyniki Cię interesują cool.gif


pozdrawiam

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





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Odpowiedz na moje pytanie....


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
wojtekmki
post
Post #6





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

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


Cytat(DeyV @ 18.04.2007, 21:31:12 ) *
Odpowiedz na moje pytanie....


cześć

mianowicie questionmark.gif
Go to the top of the page
+Quote Post
maryaan
post
Post #7





Grupa: Zarejestrowani
Postów: 380
Pomógł: 2
Dołączył: 5.01.2007

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


DeyV zadal tylko jedno pytanie wiec za duzego wyboru nie masz...
Cytat(DeyV @ 15.04.2007, 22:49:34 ) *
jaki wynik i explain da zapytanie
  1. SELECT count( ip ) FROM staty WHERE date_trunc('month', klikniete_data) >1 AND strona_id = 3 ;
?


--------------------
Wybierasz się do Zakopanego? Odwiedź Willę Pod Górami. Następnym razem na pewno do niej wrócisz :)
Go to the top of the page
+Quote Post
wojtekmki
post
Post #8





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

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


Cytat(maryaan @ 19.04.2007, 08:03:17 ) *
DeyV zadal tylko jedno pytanie wiec za duzego wyboru nie masz...


hmm...

Kod
select count( ip ) from staty where date_trunc('month', klikniete_data)  > 1 and strona_id = 3;


wg mnie zliczy wszystkie ip "jak leci" dla strona_id = 3

Kod
select count(distinct(ip)) from staty where date_trunc('month', klikniete_data) > 1 and strona_id = 3;


to zliczy ilość unikalnych dla strona_id = 3

ale może się mylę...

Jednak przy dużych ilościach danych osobiście wolę "generować" tego typu wyniki raz i zapisywać je w tabeli - często w przyszłości się przydają.

pozdrawiam

PS. a jakie masz założone indeksy questionmark.gif data + strona_id questionmark.gif jeśli tak to może pomyśl nad indeksem funkcyjnym...

Kod
CREATE INDEX nazwa ON tabela USING btree (date_trunc('month', klikniete_data),strona_id);


piszę "z palca" więc sprawdź czy zadziała

Ten post edytował wojtekmki 19.04.2007, 11:22:00
Go to the top of the page
+Quote Post
DeyV
post
Post #9





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




ehh - chodzi właśnie o explain tego mojego zapytania.
Dlaczego? Bo chciałem sprawdzić, czy czasem za problemy z wydajnością nie jest odpowiedzialny brak indexu na IP.


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 23:21