Ok, więc tytuł jest nieco zawiłowany. Jest to w zasadzie największy problem typu "n-per-group", ale nie mogę tego zrozumieć.Postgres, table1 left join table2 z tylko jednym rzędem na ID w tabeli1
Mam tabeli, user_stats:
------------------+---------+---------------------------------------------------------
id | bigint | not null default nextval('user_stats_id_seq'::regclass)
user_id | bigint | not null
datestamp | integer | not null
post_count | integer |
friends_count | integer |
favourites_count | integer |
Indexes:
"user_stats_pk" PRIMARY KEY, btree (id)
"user_stats_datestamp_index" btree (datestamp)
"user_stats_user_id_index" btree (user_id)
Foreign-key constraints:
"user_user_stats_fk" FOREIGN KEY (user_id) REFERENCES user_info(id)
Chcę uzyskać statystyki dla każdego identyfikatora przez najnowszej DATESTAMP. Jest to spory stół, gdzieś w sąsiedztwie rzędów 41m, więc stworzyłem tabelę temp z user_id, last_date używając:
CREATE TEMP TABLE id_max_date AS
(SELECT user_id, MAX(datestamp) AS date FROM user_stats GROUP BY user_id);
Problemem jest to, że Sygnatura daty nie jest unikalna, ponieważ nie może zawierać więcej niż 1 aktualizacja statystyk w ciągu dnia (powinien być prawdziwym znacznikiem czasu, ale facet, który to zaprojektował, był swego rodzaju idiotą i jest za dużo danych, aby wrócić w tym momencie). Więc niektórzy identyfikatory mają wiele wierszy kiedy robię społeczności:
SELECT user_stats.user_id, user_stats.datestamp, user_stats.post_count,
user_stats.friends_count, user_stats.favorites_count
FROM id_max_date JOIN user_stats
ON id_max_date.user_id=user_stats.user_id AND date=datestamp;
Gdybym robił to za obsługę żądań Chyba mogę graniczna 1, ale zawsze słyszałem te są strasznie niewydajne. Myśli?
"... Zawsze słyszałem, że są okropnie nieefektywne." Nie daj się wciągnąć w kult ładunku! 'EXPLAIN' jest twoim przyjacielem! Wypróbuj go i dowiedz się, co może zrobić dla ciebie optymalizator zapytań. – Charles