Sonntag, Mai 30, 2010

NVidia Treiber Aktualisierung (Win7)

Eigentlich wollte ich letzte Woche Donnerstag mal ein bisschen was bloggen, allerdings hat mich mein Rechner geärgert. Unter Umständen habe ich einen Bluescreen, HP empfiehlt den Grafikkarten-Treiber zu aktualisieren. Da hatte ich mir nichts böses bei Gedacht und einfach mal den aktuellen (schon 2 Versionen) von der HP-Seite heruntergeladen. Treiber installiert und dann das große Wundern, nach einem Neustart erschien kein Login-Window, nur ein schwarzer Bildschirm immerhin mit Mauszeiger. Dann ging das große Rätseln los, was denn das? Da ich unterwegs war, konnte ich auch nicht an einem anderen Rechner googlen, also versuchte ich in den Abgesicherten Modus zu booten. Im Abgesicherten Modus mit einem BitLocker geschützten System, muss der Recovery-Key eingegeben werden, ansonsten ist kein Booten möglich. Den Key hatte ich natürlich nicht, aber unser IT-Dienstleister, zum Glück ist der meistens erreichbar, so dass nach einigen Minuten der Key kam. Aber zum Erschrecken war das gleiche Verhalten auch im abgesicherten Modus vorhanden. Ich habe mehrere male gebootet und nach dem Modus gesucht, wo man wählen konnte, welche Treiber geladen werden sollen. Alles booten in den abgesichtern Modus half nichts. Der versuch “Last Known Good” zu booten, änderte auch nichts, so dass das Suchen nach einer Windows DVD los ging. Man kann nur mit einer Windows DVD oder mit einer Windows Rettungs DVD System Restore aktivieren und einen alten Zustand zurückrollen.

Gott sei Dank, wurde von Microsoft seit Vista System Restore als Komponente mitgeliefert. Ach wichtig ist natürlich, dass System Restore aktiviert ist. Wer nicht sichert ist, ob es aktiv ist, sollte es prüfen. Dazu ”Control Panel\System and Security\System” öffnen und anschließend “Advanced system settings” öffnen. Der Tab “System Protection” enthält die hilfreichen Funktionen. Wenn neben dem Laufwerk unter “Protection” “On” steht, dann sieht es gut. Man kann für das Laufwerk den maximal nutzbaren Speicherregeln und noch einiges mehr.

System Properties\System RestoreBei der Ausführung von MSI-Installation werden durch Windows automatisch Restore Points angelegt, so dass anschließend ggf. die Installation komplett zurückgerollt werden kann. In meinem Fall habe musste ich den Eintrag vor der Treiber Installation wählen.  Leider kann man System Restore nur mit einer DVD oder im gestarteten Windows (siehe Screenshot “System Restore”) durchführen, aber ansonsten eine super Sache.

Nach dem zurücksetzen hatte ich immer noch einige Probleme, aber nach und nach ist das System wieder Ok, hoffe ich. Meine Empfehlung, System Restore aktivieren und im Hintergrund mitlaufen lassen.

Montag, Mai 03, 2010

Oracle Batch Operation

Ich hatte mich letzte Woche bei einer Anwendung mit der Geschwindigkeit bei Datenbankoperationen beschäftigt. Die Anwendung schreibt etwa 100 Datensätze in einer große Tabelle mit ca. 60 Mio Datensätzen. Beim einfügen der Daten musste ich leider 20s warten, was für mein Verständnis für Datenbankzugriffe einfach nichz akzeptabel ist. Demzufolge habe ich die Gründe untersucht.

  1. Werden alle Daten in einer Transaktion geschrieben. In dem Thema verbirgt sich eine etwas heßliche Problemstellung. Die Oracle-Clientversion ist so eine seltsame Version, dass ich kein ODP.NET Treiber bekomme, der ohne Client-Neuinstallation arbeitet. Ich habe keine Möglichkeit die Ora-Client-Installation auf den Zielsystemen zu verändern. Um meine Absichten deutlich zu machen, habe ich trotz des Bewußtseins, dass es nicht funktioniert den TransactionScope benutzt. Im Anschluss die manuelle “old-style” Transaction geöffnet, IDbConnection.BeginTransaction.
  2. Trigger auf der Tabelle prüfen. Trigger verlangsamen die Ausführung der Änderungsoptionen und könnten schon einen negativen Effekt erklären.
  3. Indizes beeinflußen die Geschwindigkeit von Änderungsoperationen ebenso, so dass diese auch geprüft werden sollten.
  4. Andere Abhängige Datenbankobjekte prüfen, z. B. Materialized views (Snapshots).

Nunja, da ich mich mit der Anwendungsprogrammierung deutlich besser auskenne als in der DB-Programmierung, habe ich mich mit dem ersten Punkt beschäftigt. Meine Transaktionen waren vorhanden, aber die Geschwindigkeit war immer noch nicht befriedigend. Also die Idee eines Kollegen aufgegriffen, einen PL/SQL aus meinen Operationen zu erstellen. Bei der Ausführung eines PL/SQL-statements wird dieses durch die DB optimiert und als ein Block  übergeben, evtl. greifen auch einige zusätzliche Optimierungen. PL/SQL-Blöcke beginnen mit “BEGIN” und Enden mit “END”. Um den Befehl aus dem .NET-Framework über den ODP-Provider zu übergeben, müssen alle Anweisungen in einer Zeile aufgeführt werden. Zum Beispiel: BEGIN Stmt1; Stmt2; … END; Nach all der Mühe war ich von dem Ergebnis enttäucht. Es gab eine Verbesserung, allerdings nur maginal. Es gab auch nix an Triggern, die ich hätte verantwortlich machen können.

Allerdings gabe es 3 Indizes, 1 PK und 2 Indizes, bei einer 4 Spalten-Tabelle. Die Wahrscheinlichkeit ist sehr hoch, dass bei den Abfragen die definierten Indizes genutzt werden, so dass ich mich nicht daran zu schaffen machen wollte. Ein Kollege meinte zu dem, dass die Berechnung der Indizes nicht die Operation merklich beeinflußt.

Blieb nur noch der Punkt 4., es gibt 4 MVs, 2 werden OnDemand aktualisiert, 2 werden OnCommit (fast) aktualisiert. Also der Versuch alle Views mittels Demand von Operationen auf der Tabelle abzuklemmen. Oh Wunder, von 20s auf unter 1s, dass sind schon Zahlen, die ich für 100 einfüge Operationen in eine große Tabelle erträglich finde. Das Aktualisieren der Views wird durch einen seperaten Aufruf am Ende der Verarbeitung angetriggert und dauert einige Sekunden, allerdings weniger, als 100 Inserts mit Daueraktualisierng. MVs haben viele Vorteile, gerade beim Abfragen der Daten und könen die Performance von Abfragen um ein vielfaches Steigern. Wie aber auch geschehen, können andere Operationen verlangsamt werden.