Apa sebenarnya yang mengikat dalam DB2?

8

Saya baru-baru ini pindah dari menjadi pengembang Java ke DBA yang sebenarnya di perusahaan kami. Saya sedang mempelajari tali, untuk berbicara, tentang menjadi DBA (yang sebenarnya agak posisi baru bagi perusahaan kami).

Saya telah melihat beberapa skrip tempat kami menjalankan perintah DB2 BIND bind_file other_parameters.

Saya bingung dengan apa yang dilakukan ini. Saya telah meminta DBA kami yang lain, tetapi mereka tidak dapat menjelaskannya kepada saya dengan cara yang masuk akal. Saya telah melihat Pusat Informasi IBM untuk perintah BIND , tetapi juga tidak jelas bagi saya.

Saya tahu mengikat entah bagaimana penting, karena kita seharusnya menjalankan REORGS, menjalankan STATS, dan BIND pada database kita secara teratur untuk membantu kinerja.

Karena saya masih DBA n00b, saya bertanya-tanya apakah ada yang bisa memberikan "Apa yang BINDING for Dummies?" penjelasan?

EDIT : Dalam edisi untuk jawaban di bawah ini, saya baru-baru ini menemukan artikel developerworks berikut: "Paket DB2: Konsep, contoh, dan masalah umum: Memahami sistem DB2 dan paket aplikasi pengguna" . Sangat membantu. Khusus untuk paket sistem, yang sering kami temui.


20130905 EDIT : Entri blog ini oleh DB2 DBA Ember Crooks sangat populer untuk mengikat dan apa artinya. Dia juga menulis entri sebelumnya tentang paket yang tidak ditemukan dan kapan harus menaikkan nomor CLIPKG untuk bind dan apa artinya. Artikel-artikel ini dijelaskan dengan sangat baik. Pada dasarnya suka membaca "DB2 Binding and Packages for Dummies" jika hal seperti itu ada.

Chris Aldrich
sumber
1
Terima kasih banyak untuk petunjuk dalam tindak lanjut suntingan Anda @ Chris!
Rob Wells

Jawaban:

3

Saya melihat tautan Info Center Anda ke LUW 9.7, dan Anda menyebutkan bahwa Anda telah memprogram di Jawa, tetapi sebagian besar pengalaman yang saya miliki dengan pengikatan adalah dengan DB2 pada Mainframe dengan COBOL. Jadi, Anda mungkin perlu menyesuaikan sedikit penjelasan (tetapi umumnya, konsepnya harus sama).

Saya percaya bahwa mengikat hanya relevan ketika Anda mengkompilasi program yang menyertakan SQL tertanam yang dikompilasi (SQL terikat secara statis). Jika, misalnya, Anda menggunakan JDBC, Anda tidak diharuskan menjalankan BIND. Pengemudi JDBC akan PREPAREpernyataan secara dinamis.


Ketika Anda menjalankan program melalui pra-kompiler DB2, PRECOMPILEmenjalankan program Anda, dan jika ia menemukan SQL yang disematkan (dalam COBOL, ini adalah blok pernyataan yang beralih dari EXEC SQLke END-EXEC.), itu dengan hati-hati merobek SQL keluar, dan menggantinya dengan panggilan ke antarmuka COBOL-DB2. Setelah ini, ada dua output dari PRECOMPILE, sumber COBOL yang telah menghapus semua embedded SQL yang dihapus ( Amulai sekarang), dan DBRMyang berisi semua SQL yang telah dihapus (B ).

Precompile memang melakukan beberapa pemeriksaan sintaksis dasar, tetapi perlu diketahui bahwa pemeriksaan hanya didasarkan pada deklarasi tabel Anda dalam program. Itu tidak dilampirkan ke DB2 untuk memverifikasi ini!

Kedua file ini benar-benar terpisah, dan ketika Anda menjalankan program COBOL, ia harus menemukan Adan Byang dihasilkan pada waktu yang sama.

Pada titik ini, Adikompilasi dan dihubungkan dengan kompiler COBOL standar ke dalam load moduledan ditempatkan di pustaka beban untuk digunakan nanti.

Namun, masih banyak pekerjaan yang harus dilakukan B, DBRM. Di sinilah BINDmasuk BINDadalah semacam kompiler untuk kode SQL tertanam, dan output dari "kompilasi" adalah a package.

Untuk mengikat SQL ke dalam "paket" yang dapat dieksekusi, proses BIND melampirkan DB2 dan melakukan beberapa hal:

  • Memverifikasi bahwa AuthID saat ini berwenang untuk melakukan bind.
  • Periksa sintaks SQL Anda, dengan bantuan dari data dalam katalog DB2.
  • Akhirnya, dan yang paling penting, ikatan akan mengoptimalkan SQL Anda

Selama langkah terakhir, semua SQL Anda dijalankan melalui Pengoptimal, yang memperhitungkan semua statistik dan berbagai jalur yang dapat diambil mesin DB2 untuk mengambil data Anda. Kemudian ia memilih jalur yang muncul dengan biaya terendah yang terkait (dengan versi DB2 yang lebih baru [DB2 10 untuk z / OS] , ia mungkin memutuskan untuk mengambil jalur "biaya lebih tinggi", tetapi jalur "risiko lebih rendah"). Setelah path dipilih, ia dikompilasi dan menjadi sebuah paket, yang disimpan dalam katalog (Anda dapat melihat semua paket Anda saat ini dengan SELECT * FROM SYSIBM.SYSPACKAGE(z / OS)).

Akhirnya, ada bagian terakhir yang memungkinkan program kami untuk menyatukan kembali dengan paket mereka, the PLAN. Anda membuat rencana dengan melakukan BIND lain ( BIND PLAN). Paket adalah kumpulan paket yang diizinkan oleh program untuk dicari guna menemukan paket yang memiliki nama yang sama. Dengan COBOL, Anda menentukan paket mana yang harus dicari program di JCL Anda.


Singkatnya, kode yang dikompilasi melewati langkah-langkah ini untuk menghasilkan yang dapat digunakan BIND PLAN:

Precompile -> Membuat DBRM (dengan C [++], precompiler mengeluarkan SQL yang sudah dikompilasi ke file HFS, yang dapat dikirim melalui program bind command-line ) -> DBRM dioptimalkan dan serangkaian jalur akses ( a package) dibuat -> Paket ditambahkan ke BIND PLAN, yang merupakan sekelompok paket yang memungkinkan Anda untuk membuat "jalur pencarian" untuk program Anda untuk melihat.

Karena program-program ini terikat secara statis, jika statistik tabel Anda berubah secara drastis, maka jalur akses yang dipilih pengoptimal pada waktu-mengikat mungkin bukan jalan terbaik lagi, dan mengikat kembali akan memungkinkannya untuk mengevaluasi kembali SQL dan mungkin memilih jalan yang lebih baik.


Sunting (perbarui untuk komentar): Jika Anda menggunakan prosesor baris perintah, Anda dapat mengirimkan paket bind tunggal (.bnd), atau daftar nama file bind (.lst). Jika Anda memasukkan daftar, nama file harus didahului dengan@(misalnya/path/to/@packages.lst). Di dalam file .lst, Anda dapat meletakkan setiap paket pada satu baris, atau Anda dapat memisahkannya dengan+:

package1.bnd
package2.bnd
package3.bnd+package4.bnd+package5.bnd
Bhamby
sumber
Jika saya dapat menambahkan pertanyaan saya dan dengan demikian jawaban Anda ... apa perbedaan antara file .lst dan .bnd untuk pengikatan? Saya perhatikan kita mengikat beberapa file .lst (biasanya DB2 BIND @ myFile.lst ....) dan file .bnd (sama tetapi tanpa tanda @). Bisakah Anda menambahkan itu ke jawaban Anda juga?
Chris Aldrich
1
@ChrisAldrich: jawabannya telah diperbarui. Pada dasarnya, .bnds adalah file bind, dan .lsts adalah daftar file bind.
bhamby
pertanyaan lain. Saya kira itu masih membingungkan saya .... File .bnd dan .lst yang kami ikat adalah file yang disediakan oleh IBM dengan DB2 dan bukan kebiasaan apa pun yang telah kami tulis. Jadi ... saya kira saya masih bingung tentang apa yang sebenarnya mengikat pada apa. Bagaimana IBM mengetahui apa yang kami miliki? atau sebaliknya? Apa yang sebenarnya dilakukan dengan file-file ini? Semoga ini tidak membuat frustrasi. Seperti yang saya katakan benar-benar mencari jawaban gaya "untuk boneka" karena itu masih kabur bagi saya.
Chris Aldrich
1
Maaf tentang itu, Anda menangkap saya tepat sebelum pergi berlibur! Ngomong-ngomong, untuk menjawab pertanyaan Anda, yang saya duga Anda ikat adalah db2ubind.lstdan / atau db2cli.lst. File-file ini secara otomatis dibuat ketika database baru dibuat di server, dan file-file ini memungkinkan berbagai utilitas klien jarak jauh untuk bekerja (dukungan CLI / ODBC; DB2 CLP; utilitas impor / ekspor). Lihat tautan ini
bhamby