Výpočet kvantilů a ořezávajících agregačních funkcí

Pokud jste někdy někdy potřebovali počítat medián nebo jiné kvantily, pravděpodobně už jste zjistili že přímo v PostreSQL odpovídající agregační funkce zabudována není. Jsou dostupná různá externí řešení s různou flexibilitou a výkonem - dovolte mi jmenovat alespoň řešení Joea Conwaye založené na PL/R a depeszovo PL/pgSQL řešení. Osobně jsem s žádným z těchto řešení nebyl příliš spokojen ale protože jsem poněkud línější tak jsem nenapsal nic vlastního ... až do minulého týdne. Extension (již dostupná na pgxn) je založena na poněkud nechutné fintě (podrobněji dále), ale zdá se že to funguje, zejména pokud se jedná o výkon.

Když jsem dokončil zmíněnou extension, uvědomil jsem si že bych stejný trik mohl použít k implementaci ořezaných agregačních funkcí - nevím jestli je to správný termín, nicméně znamená to něco jako "odstraň 3% nejnižších hodnot, 2% nejvyšších hodnot a ze zbytku spočítej AVG/VARIANCE." V podstatě se jedná o elegantní způsob jak se zbavit "outliers" tj. hodnot které leží velmi daleko od ostatních. I tato extension je již dostupná na pgxn.

Agregační funkce pro odhad DISTINCT

V poslední době jsem pracoval na možnostech jak do PostgreSQL implementovat cross-column statistiky (viz. vlákno v mailing listu a wiki), a zdá se že jedním z nutných kroků je vylepšení odhadu počtu různých hodnot pro jednotlivé sloupce (vlákno, wiki). Prvním zajímavým zjištěním týkajícím se odhadování počtu různých hodnot je že pro získání dostatečně přesného odhadu je nutné přečíst drtivou část tabulky (v podstatě celou tabulku). Druhým zajímavým zjištěním je že existuje několik velmi zajímavých algoritmů které umožňují průběžnou aktualizaci odhadu ve velmi omezeném prostoru. Pracovní verze algoritmů vypadají velmi slibně, ale jak demonstrovat jejich efektivitu? Agregačními funkcemi!

1