Was genau ist Bindung in DB2?


8

Ich bin kürzlich von einem Java-Entwickler zu einem tatsächlichen DBA in unserem Unternehmen gewechselt. Ich lerne sozusagen, wie man ein DBA ist (was für unser Unternehmen eigentlich eine neue Position ist).

Ich habe mehrere Skripte gesehen, in denen wir den Befehl ausführen DB2 BIND bind_file other_parameters.

Ich bin verwirrt darüber, was diese tun. Ich habe unsere anderen Datenbankadministratoren gefragt, aber sie konnten es mir nicht auf sinnvolle Weise erklären. Ich habe im IBM Information Center nach dem Befehl BIND gesucht , aber es war mir auch nicht klar.

Ich weiß, dass das Binden irgendwie wichtig ist, da wir REORGS, STATS und BIND regelmäßig in unseren Datenbanken ausführen sollen, um die Leistung zu verbessern.

Da ich immer noch ein n00b-DBA bin, habe ich mich gefragt, ob jemand ein "Was ist bindend für Dummies?" Erläuterung?

BEARBEITEN : In der Ausgabe der folgenden Antwort bin ich kürzlich auf den folgenden Developerworks-Artikel gestoßen : "DB2-Pakete: Konzepte, Beispiele und häufig auftretende Probleme: Grundlegendes zu DB2-System- und Benutzeranwendungspaketen" . Sehr hilfreich. Besonders für die Systempakete, auf die wir meistens gestoßen sind.


20130905 EDIT : Dieser Blogeintrag von DB2 DBA Ember Crooks ist in Bezug auf die Bindung und deren Bedeutung hervorragend . Sie schrieb auch einen vorherigen Eintrag über nicht gefundene Pakete und wann die CLIPKG-Nummer für die Bindungen erhöht werden muss und was das bedeutet. Diese Artikel sind sehr gut erklärt. Grundsätzlich wie das Lesen von "DB2-Bindung und Pakete für Dummies", wenn so etwas existiert.


1
Vielen Dank für die Hinweise in Ihren Nachbearbeitungen @Chris!
Rob Wells

Antworten:


3

Ich sehe, dass Ihr Info Center-Link zu LUW 9.7 führt und Sie erwähnen, dass Sie in Java programmiert haben, aber die meiste Erfahrung mit dem Binden habe ich mit DB2 auf dem Mainframe mit COBOL. Daher müssen Sie möglicherweise die Erklärung ein wenig anpassen (aber im Allgemeinen sollten die Konzepte dieselben sein).

Ich glaube, dass die Bindung nur relevant ist, wenn Sie Programme kompilieren, die eingebettetes SQL enthalten, das vorkompiliert ist (statisch gebundenes SQL). Wenn Sie beispielsweise JDBC verwenden, müssen Sie kein BIND ausführen. Der JDBC-Treiber gibt PREPAREdie Anweisung dynamisch aus.


Wenn Sie ein Programm über einen DB2-Pre-Compiler ausführen, PRECOMPILEIhr Programm ausführen und eingebettetes SQL finden (in COBOL sind dies Anweisungsblöcke von EXEC SQLbis END-EXEC.), wird das SQL sorgfältig herausgerissen und durch a ersetzt Aufruf der COBOL-DB2-Schnittstelle. Danach gibt es zwei Ausgaben von PRECOMPILE, die COBOL-Quelle, bei der das gesamte eingebettete SQL entfernt wurde ( Avon nun an), und eine DBRM, die das gesamte SQL enthält, das entfernt wurde ( B).

Precompile führt einige grundlegende Syntaxprüfungen durch. Beachten Sie jedoch, dass die Überprüfungen nur auf Ihren Tabellendeklarationen innerhalb des Programms basieren. Es wird nicht an DB2 angehängt, um diese zu überprüfen!

Diese beiden Dateien sind vollständig voneinander getrennt. Wenn Sie das COBOL-Programm ausführen, muss es ein Aund ein finden B, die gleichzeitig generiert wurden.

Zu diesem Zeitpunkt Awird kompiliert und mit dem Standard-COBOL-Compiler verknüpft load moduleund in eine Ladebibliothek gestellt, um später verwendet zu werden.

Es gibt jedoch noch viel zu tun mit Bdem DBRM. Hier BINDkommt BINDes ins Spiel . Es ist wie ein Compiler für den eingebetteten SQL-Code, und die Ausgabe der "Kompilierung" ist a package.

Um die SQL in ein ausführbares "Paket" zu binden, wird der BIND-Prozess an DB2 angehängt und führt einige Aktionen aus:

  • Überprüft, ob die aktuelle AuthID zum Ausführen einer Bindung berechtigt ist.
  • Überprüft die Syntax Ihres SQL mithilfe der Daten im DB2-Katalog.
  • Schließlich und vor allem optimiert die Bindung Ihr SQL

Im letzten Schritt wird Ihr gesamtes SQL über das Optimierungsprogramm ausgeführt, das alle Statistiken und verschiedenen Pfade berücksichtigt, die das DB2-Modul zum Abrufen Ihrer Daten verwenden könnte. Anschließend wird der Pfad ausgewählt, der die niedrigsten Kosten verursacht (bei neueren Versionen von DB2 [DB2 10 für z / OS] wird möglicherweise ein Pfad mit "höheren Kosten", aber "geringerem Risiko" gewählt). Sobald der Pfad ausgewählt ist, wird er kompiliert und zu einem Paket, das im Katalog gespeichert wird (Sie können alle Ihre aktuellen Pakete mit SELECT * FROM SYSIBM.SYSPACKAGE(z / OS) anzeigen).

Schließlich gibt es ein letztes Stück, das es unseren Programmen ermöglicht, sich mit ihren Paketen wieder zu vereinen, das PLAN. Sie erstellen einen Plan, indem Sie ein anderes BIND ( BIND PLAN) ausführen . Ein Plan ist eine Sammlung von Paketen, die das Programm durchsuchen darf, um das Paket mit demselben Namen zu finden. Mit COBOL geben Sie an, in welchem ​​Plan das Programm in Ihrer JCL suchen soll.


Kurz gesagt, kompilierter Code durchläuft die folgenden Schritte, um eine verwendbare Datei zu generieren BIND PLAN:

Vorkompilieren -> Erstellt ein DBRM (mit C [++] gibt der Vorkompilierer das vorkompilierte SQL in eine HFS-Datei aus, die über das Befehlszeilen-Bindungsprogramm gesendet werden kann ) -> Das DBRM wird optimiert und eine Reihe von Zugriffspfaden ( a package) wird erstellt -> Das Paket wird zu a hinzugefügt. Hierbei handelt es sich um eine BIND PLANGruppe von Paketen, mit denen Sie einen "Suchpfad" für Ihre Programme erstellen können.

Da diese Programme statisch gebunden sind, ist der vom Optimierer zur Bindezeit gewählte Zugriffspfad möglicherweise nicht mehr der beste Pfad, wenn sich Ihre Tabellenstatistiken drastisch ändern. Durch erneutes Binden kann SQL neu bewertet und möglicherweise a ausgewählt werden besserer Weg.


Bearbeiten (für Kommentar aktualisieren): Wenn Sie den Befehlszeilenprozessor verwenden, können Sie entweder ein einzelnes Bindungspaket (.bnd) oder eine Liste von Bindungsdateinamen (.lst) übergeben. Wenn Sie eine Liste übergeben, muss dem Dateinamen ein@(z/path/to/@packages.lst.B.)vorangestellt werden. In der .lst-Datei können Sie entweder jedes Paket in eine einzelne Zeile einfügen oder sie trennen durch+:

package1.bnd
package2.bnd
package3.bnd+package4.bnd+package5.bnd

Wenn ich so zu meiner Frage und damit zu Ihrer Antwort hinzufügen darf ... was ist der Unterschied zwischen .lst- und .bnd-Dateien zum Binden? Ich habe festgestellt, dass wir einige .lst-Dateien (normalerweise DB2 BIND @ myFile.lst ....) und .bnd-Dateien (gleich, aber ohne das @ -Zeichen) einbinden. Könnten Sie diese auch zu Ihrer Antwort hinzufügen?
Chris Aldrich

1
@ ChrisAldrich: Die Antwort wurde aktualisiert. Grundsätzlich sind die .bnds die Bindedateien und die .lsts Listen der Bindedateien.
Bhamby

eine andere Frage. Ich denke, es verwirrt mich immer noch ... Die .bnd- und .lst-Dateien, an die wir binden, sind Dateien, die IBM mit DB2 geliefert hat, und keine benutzerdefinierten Dateien, in die wir geschrieben haben. Also ... ich denke, ich bin mir immer noch nicht sicher, was genau an was gebunden ist. Woher weiß IBM, was wir haben? oder umgekehrt? Was macht das Ausführen von Bindungen mit diesen Dateien genau? Hoffe das frustriert nicht. Wie ich schon sagte, ich suche wirklich nach einer Antwort im "für Dummies" -Stil, weil sie für mich immer noch verschwommen ist.
Chris Aldrich

1
Tut mir leid, du hast mich kurz vor dem Urlaub erwischt! Wie auch immer, um Ihre Frage zu beantworten, ich vermute, dass Sie verbindlich sind db2ubind.lstund / oder db2cli.lst. Diese Dateien werden automatisch erstellt, wenn eine neue Datenbank auf dem Server erstellt wird. Mit diesen Dateien können verschiedene Remoteclient-Dienstprogramme ausgeführt werden (CLI / ODBC-Unterstützung; DB2 CLP; Import / Export-Dienstprogramme). Überprüfen Sie heraus diesen Link
bhamby
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.