Dienstag Mai 30, 2006

POSTGRESQL: Migration Oracle / Postgres

Oracle und Postgres sind sich in so mancher Hinsicht recht ähnlich. Darum sieht man jetzt auch viele Projekte, in denen von Oracle zu Postgres migriert wird. Für viele Anwendungen ist Postgres mehr als ausreichend. Nun... Entsprechend vorbereitet, klappt das auch recht gut, wenn einem nicht ein bestimmtes Datentypen/Index-Problem um die Ohren fliegt und das beim Lasttest dann auch nicht auffällt, weil man genau die URL zufälligerweise nicht getestet hat ;-)

Das sieht dann z.B. so aus:

test=> EXPLAIN SELECT * FROM tab1 JOIN tab2 ON tab2.rel2objects=tab1.relation_id WHERE tab2.oid=7929;
                                               QUERY PLAN
Hash Join  (cost=4.11..42522.51 rows=64 width=573)
  Hash Cond: (("outer".relation_id)::text = ("inner".object_assign)::text)
  ->  Seq Scan on tab3  (cost=0.00..34034.29 rows=1131129 width=77)
  ->  Hash  (cost=4.11..4.11 rows=1 width=496)
        ->  Index Scan using idx_tab2 on tab2  (cost=0.00..4.11 rows=1 width=496)
              Index Cond: (oid = 7929)
(6 rows)

Der Hash Join (was mehr oder weniger ein Full Table Scan ist) zeigt es schon: Die Datenbank erwartet Kosten zwischen 4.11 und 42522.51 und beim Seq. Scan sehen wir das über 1,1 Mio. Datensätze durchgegrast werden. Für eine Webapplikation nicht so ganz gut. Und warum ist das so? Wir haben doch entsprechende Indizies, aber die DB nimmt sie nicht her! Hmmm... Bei Oracle war der Execution Plan einwandfrei. Bauen wir die Query mal wie folgt um:

test=> EXPLAIN SELECT * FROM tab1 JOIN tab2 ON tab2.rel2objects::integer=rel_o.relation_id WHERE tab2.oid=7929;
                                            QUERY PLAN
Nested Loop  (cost=0.00..13.53 rows=18 width=573)
  ->  Index Scan using idx_tab2 on tab2  (cost=0.00..4.11 rows=1 width=496)
        Index Cond: (oid = 7929)
  ->  Index Scan using idx_tab1 on tab1  (cost=0.00..9.15 rows=18 width=77)
        Index Cond: (("outer".object_assign)::integer = tab3.relation_id)
(5 rows)

Alles was ich geändert habe, ist der Integer-Cast (... tab2.rel2objects::integer=...). Der Witz an der Sache ist, das rel2objects vom Datentyp Varchar ist und relation_id ist ein Integer. Damit werden für Postgres die Indizies wertlos. Ein expliziter Cast tut Not. Und wie man sieht, ist der Ausführungsplan nun schon erheblich besser. Oracle hat die gleiche Query hingegen ganz anders behandelt. Das Casten war hier kein Thema. Die Oracle bekommt allerdings die totale Krise, wenn die Optimizer Statistiken nicht stimmen. Das stört die Postgres nicht so stark. Allerdings wird diese wiederum sauer, wenn die Datentypen beim Join nicht exakt stimmen. Auch int, int4 und int8 sind für die Postgres nicht gleich und würde auch hier eventl. vorhandene Indizies nicht verwenden. Es hilft also nur, den Ausführungsplan zu checken, um sich vor bösen Überraschungen bei der Migration einigermaßen zu schützen.

Samstag Mai 27, 2006

Today's Links

Rebol Programming For The Absolute Beginner
LAMEOnJ - The Open Source LAME symmetric Java MP3 encoder API
Google:maps - JSP Taglibrary für GoogleMaps
JavaOne 2006 in 444 Photos
Eight places to find music
Bilder in Photoshop schnell begradigen
SVNDuplicate - Wer ein SVN Repository schnell duplizieren möchte, dem hilft dieses Programm weiter.
Photovault Image Organizer - Open Source Programm zu verwalten von Photos.


Freitag Mai 19, 2006

Today's Links

SwingSet - An open source Java toolkit containing data-aware replacements for many of the standard Java Swing components.

JavaOne 2006: Java zum Entwicklen von AJAX Anwendungen?

Die Lösung heißt: Google Web Toolkit oder GWT. Vorgestellt auf der diesjährigen JavaOne Konferenz. Die Demos sehen ziemlich gut aus. Und das Beste: Auch der Back-Button funktioniert damit, was bei AJAX Anwendungen ja nicht zwangsweise funktioniert. Java Entwickler mit AJAX Ambitionen sollten sich das Toolkit mal anguggen. Mehr dazu auch hier.

Today's Links

Sprajax - Ein Open Source Security Scanner für AJAX Anwendungen
Favicon von einem Bild erzeugen
Flood Maps - Was passiert, wenn der Meeresspiegel um 7m ansteigt? Hier kann man's mit Hilfe von Google Maps anguggen.
Installing packages across multiple hosts with CFEngine
Google: Finden statt Suchen
Whiliam Shatner präsentiert den Commodore VC20 Video
Directory Synchronize - Ein nettes Java Utility das Verzeichnisse abgleicht.
Mehrere Internet Explorer-Versionen ohne Installation
Add-Links für Web 2.0 Dienste - Wer Social Bookmarking Links auf seiner Homepage unterstützen möchte, sollte diese Seite mal besuchen.
Linux Tips: take control of your bash_history
Aerith - Dieses Java Swing Mashup kombiniert drei Webservices: Google Maps, Flickr und Yahoo's geocoding webservice. Ziemlich coole Anwendung. Hoffe, der Source Code kommt bald raus.

Donnerstag Mai 18, 2006

Außerirdische ;-)

"Eines will ich Ihnen mal sagen: Mit Außerirdischen, die nicht weitergekommen sind als Microsoft und Apple, will ich persönlich nix zu tun haben."

Prof. Harald Lesch in der Sendung Alpha Centauri "Was gibt es Neues über Außerirdische?" und den Film Independence Day.

The 46 Best-ever Freeware Utilities...

Der Autor hat die Liste auf den neuesten Stand gebracht.

Neues Sonnensystem

Astronomen haben ein neues Sonnensystem entdeckt. Eventl. ist ein Planet mit Wasser dabei.

Plantronics VoIP Telefon

Von Plantronics gibt es jetzt einen Headset für VoIP Telefonie, der sowohl mit Computern als auch mit Mobiltelefonen über Bluethooth arbeitet.

Mittwoch Mai 17, 2006

JavaOne 2006: Sun ändert die Lizenz

Sun hat die Java Distributionslizenz geändert. Damit können nun Linux Distributionen wie Debian oder Ubuntu das Sun Java SDK direkt einbinden. Mehr dazu auf der jdk-distros Seite auf java.net.

JavaOne 2006

Das Event des Jahres für Java Entwickler hat begonnen. Auf der JavaOne Webseite gibts wie jedes Jahr wieder einige interessante Webcasts.

Today's Links

Ajax RSS reader - Mit Hilfe von Ajax einen RSS Reader basteln.
Html Validator Firefox Extension - Damit läßt sich HTML-Code ganz easy aus dem Browser heraus prüfen.
Firefox 1.5 CCK (Client Customization Kit) Wizard - Wer Firefox seinen Bedürfnissen anpassen möchte...
Ophcrack 2 - The fastest Windows password cracker
jMaki - Ein freies JavaScript-Wrapper-Framework. Damit lassen sich JavaScript-Widgets in einen JSP- oder JSF-Tag packen, um so JavaScript-Komponenten wie Teile der Java-Programmiersprache behandeln zu können.
Prevent Caching of Javascript Files
Sun Developer Network - AJAX Developer Resource Center
Sun Developer Network - JavaScript Technology und Java
How to launch external applications from java - Arbeiten mit der ProcessBuilder Klasse
Howto setup an OpenLDAP PGP keyserver

Dienstag Mai 09, 2006

Today's Links

DVD-Audio Tools - Wer seine eigene Audio-DVD unter Linux erstellen möchte, findet hier vielleicht das Richtige.
Xapian is designed to be a highly adaptable toolkit to allow developers to easily add advanced indexing and search facilities to their own applications.

IM1.TV

Ein neuer Musiksender startet über Sat Ende Mail. Mehr Infos auf der Webseite von IM1.TV
.