To pytanie dotyczy funkcji first_value()
, używając innej funkcji lub obejścia problemu.Najlepsza wydajność w powtarzaniu próbkowania z kolumny zgrupowanej
Chodzi również o "niewielki wzrost wydajności" w dużych tabelach. Aby użyć np. max()
w wyjaśnianym kontekście poniżej, wymaga fałszywych porównań. Nawet jeśli jest szybki, nakłada dodatkowe koszty.
Ten typowy zapytania
SELECT x, y, count(*) as n
FROM t
GROUP BY x, y;
potrzeby powtórzyć wszystkie kolumny w GROUP BY
wrócić więcej niż jedną kolumnę. Syntaktyczna cukier to zrobić, jest użycie referencji pozycyjnych:
SELECT x, y, count(*) as n
FROM t
GROUP BY x, 2 -- imagine that 2, 3, etc. are repeated with x
Czasami potrzebuje nie tylko cukier, ale także niektóre semantyczny zrozumieć skomplikowany kontekst:
SELECT x, COALESCE(y,z), count(*) as n
FROM t
GROUP BY x, y, z -- y and z are not "real need" grouping clauses?
Mogę sobie wyobrazić wiele innych złożonych kontekstów. Zobaczymy typowe rozwiązania:
SELECT x, max(y) as y, count(*) as n
FROM t
GROUP BY x -- best semantic! no need for other columns here
gdzie max()
funkcja może być każdy „próbka()” (na przykład pierwsza lub ostatnia wartość.). Działanie czegoś, co nie robi nic, jest lepsze niż max()
, np. agregująca funkcja first_value()
, ale potrzebuje ona WINDOW
, więc straciła wydajność. Istnieją pewne stare sugestie: to implement first/last agg functions in C.
Czy istnieje funkcja agregująca "uzyskaj dowolną wartość szybko" o lepszej wydajności niż max()
lub GROUP BY X,2,...
?
Być może jakiś nowy element w najnowszym wydaniu?
proszę [edytuj] Twoje pytanie i dodać kilka przykładowych danych i oczekiwaną produkcję w oparciu o te dane. 'max()' będzie dość szybkie, jeśli masz indeks na kolumnach. Możesz zajrzeć do 'limit' lub' distinct on() 'Również jeśli * nie * masz powolne zapytania, podaj zapytania, pełną definicję tabeli i plan wykonania używając' explain (analyze, verbose) ' –
I don zrozumiałe, co masz na myśli przez funkcję 'max()' może być dowolną "próbką()". Czy chodziło Ci o "funkcję agregującą"? Również jeśli chodzi o to, jak sprawić, by funkcje agregujące były szybsze, co ma wspólnego z tym wprowadzenie do syntaktycznego cukru? –
Istnieje sposób na emulację luźnego skanowania indeksu na postgresie, który byłby najszybszy https://wiki.postgresql.org/wiki/Loose_indexscan – Mihai