Za zminku stoji 2 featury:
1. soucty diskovych stranek - bylo implementovano v oracle 6
2. materializovane pohledy - Oracle 8
Tak a ted mi napiste ze tohle vyviji 50 lidi a jak jde vyvoj skvele rychle.
Dobra zprava, rek bych ze jste s tou replikaci vicemene dohnali INFORMIX, ten je ale tuhej od doby co ho IBM koupilo v 2001 za miliardu a porad jeste do jeho vyvoje investuje - zoufalci. Neznam zadneho NOVEHO zakaznika ktery by si nainstaloval INF.
Vývoj Postgresu začal o dekádu později (až dvě dekády později) - na hw s úplně jinými parametry a pro úplně jiné programátory - takže chybějící součty a chybějící materializované pohledy nikoho extra netrápily. V Oracle zase není typ Range nebo indexace regulárních výrazů - a když ukazuji Oraclistům nenáročnost instalace, konfigurace nebo pohodlí a možnosti SQL konzole, tak jenom smutně koukají.
Ale cílem Postgresu není napsat "Oracle zadarmo", ale vytvořit dlouhodobě a s minimálními nároky udržovatelnou výkonnou a spolehlivou databázi, která nabízí vysokou shodu se standardem a jednoduše se používá, a kterou lze jednoduše rozvíjet, případně jednoduše forkovat (EnterpriseDB, Greenplum, ..).
"1. soucty diskovych stranek - bylo implementovano v oracle 6"
Je otázkou, zda tohle vůbec patří do DB vrstvy. Podlě mě ne. I mezi vývojáři Psql se o tom vedla dlouhá disku.
Vzhledem k tomu, že o checksum bloků se dneska starají systémy souborů a i samotná bloková zařízení, tak mi nedává smysl tohle ještě duplikovat na softwarové vrstvě.
Takze o implementaci v oracle nevite nic, ale jste presvedcen ze je spatna neli uplne nemozna.
Lidi s timhle pristupem vyhazuju a je mi jedno kolik let pro mne vzorne pracovali. Jakmile takhle zmagori tak uz nedokazi vubec nic.
Moje uspechy zaviseli na presne tehle veci. Zatimco mnoho chytrych lidi rozumovalo proc je neco nemozne, tak ja trouba si to sel zkusit a dal jsem to.
To je asi na dlouhou diskusi - v mailing listu se hrozně dlouho diskutovalo jestli to vůbec dělat, a jestli to skutečně nepatří do filesystému.
Jeden z důvodů proč to nestačí na úrovni souborového systému je že fs (na x86) pracují tradičně s max. 4kB bloky, zatímco PostgreSQL defaultně s 8kB (menší se v podstatě nevyplatí, naopak větší mohou být výhodné pro DWH aplikace).
No a potom už checksum na úrovni fs nestačí, protože zápis 8kB stránky může spadnout "uprostřed" - jedna 4kB stránka se zapíše, druhá ne. Obě mají na úrovni filesystému správný checksum, ale z pohledu DB nikoliv.
Navíc implementace v DB by mohla poskytovat potenciálně větší flexibilitu v reakci (ale to už vařím z vody).
Ááá, lenin chválí oracle. Mám zde typickou ukázku toho, jak je v nejementárnějších záležitostech na hovno. Hledej rodíl mezi 2ma SQL:
- SELECT seq_book_id.NEXTVAL, * FROM books
- SELECT seq_book_id.NEXTVAL, b.* FROM books b
Že žádný nevidíš? První uvedený v opěvovanám oraclu (9-tka) jednoduše nejede - chyba výrazu. Jaké milé překvapení! Je libo další ukázky? Mám jich ve svém zápisníčku kuriozit několik dalších...
K tomu Oracle: velmi často (eufemismus pro 'vždycky') je v Oracle funkce sice implementována, má však nějaké 'ALE' a zrovna v té mé situaci ji nelze použít. Taky se vám to stává? U Ingresu jsem na taková omezení nenarážel. Když transakce, tak vždy a všude, včetně DROP a CREATE TABLE...
Klobouk dolů za takovýto článek. Jen pro upřesnění (nejde o těžiště tématu), SAP v reálném nasazení byl nucen s MySQL ad hoc spolupracovat (ladilo se neoficiálně on site), nyní již na základě tlaku uživatelů oficiálně spolupracuje.
Každý rok 1. dubna někdo přijde s podobným návrhem. Teoreticky by to ale neměl být velký problém - ještě z dob před SQL podporuje Postgres tzv FastCall API (a protokol) a napsat extenzi, která by obalovala INSERT, UPDATE, DELETE je práce tak na dva dny (interní API tam je). Možná ještě méně. Jenomže proč to dělat? Postgres je ACID MGA relační databáze. Key value CAP databáze budou řádově rychlejší - pro jednořádkové INSERT, UPDATE, DELETE, SELECT operace - i kdyby se jednoduše obešlo SQL (většina relačních databází je optimalizovaná pro hromadné operace). Přepsat Postgres pro CAP by znamenalo napsat skoro celou novou databázi, což mi přijde zbytečné, když už tu CAP nebo memory NoSQL databáze jsou.
Technicky to možné je, zatím to nikdo nezkusil. A osobně jsem docela skeptik. U dobře napsaných aplikací má SQL zanedbatelnou režii, a u špatně napsaných by to ničemu moc nepomohlo, bo by se rychle narazilo na limity způsobené podporou ACID. Ale třeba to někdo někdy dá. Může to být i zajímavý test jestli někde v pg není třeba nějaká performance bota.
diky za links, takze koukam, ze uz se na to dokonce nekdo ptal. Jestli tomu rozumim spravne, tak ta FastPath interface se nedoporucuje a misto toho by se vzala jednoduse SPI s prepared statemensts - to uz jsem zkousel a meril a bohuzel je to stale jeste dost pomale. (proti ndb-engine nebo ads)
Otazka proc to chtit je vlastne jiz nahore zodpovezena neprimo, handlersocket by nevznikl, kdyby to nikdo nepotreboval. U postgresql by se to hodilo, protoze je to proste jedina databaze, ktera je free bez vsech tech ostatnich 'svobod'. Jak psal autor handlersocketu, udelali to proto, ze chteli rychlou interface pro jednotlivy pristup a presto mit moznost odsadit komplikovanou query.
Ale nejak to jit musi, protote alaska-software (vyrobce Xbase++) chce pouzit postresgq jako backend. (aby mohli uz konecne opustit foxpro). No, uvidime :-)
Pokud jde opravdu o co nejrychlejší emulaci ISAM engine, tak pak potrebujete obejít protocol a komunikovat s db přímo - což by teoreticky nyní šlo snáze díky background worker processu - a dál už by bylo volání lowend funkcí pro přístip k datům. Potom nejsou potřeba ani PP statements. Pořád si netroufám odhadnout o kolik by tento přístup byl rychlejší - možná výrazně, pokud budete mít data v cache. Reálně by ovšem mělo být hrdlem IO operace.
Sice to není úplně k tématu, ale při tom čtení (mimochodem, opět skvělé) jsem si vzpomněl na jeden můj drobný nevyřešený problém s PostgreSQL. Třeba mi někdo pomůže, běžní SQLkáři okolo mi neporadili, google nic nenašel a celou dokumentaci se mi prohledávat zatím nechtělo.
Používám PostgreSQL v jedné malé firemní aplikaci, v jedné z tabulek mám mj. celočíselné sloupce 'count' a 'length' a čistě ze statistických důvodů by se mi líbilo získat sumu všech řádků pro 'count*length'. Jako SQL příkaz to napsat umím, ale výsledek nezískám, protože během výpočtu dojde k přetečení. Očekáváný výsledek je již totiž v řádu terabajtů. Jak se tohle řeší? Hledal jsem nějaké možnosti přetypování, ale marně...