Minggu, 06 April 2014

APPLICATION PERFORMANCE


Application Performance
( Resume Pertemuan 7 – DBA )

Nim : 10410100104


Sekarang kita telah membahas kinerja dari sistem dan basis data perspektif, sekarang saatnya untuk mengalihkan perhatian kita terhadap kinerja dari perspektif kode aplikasi. Bab ini berfokus pada tuning dan mengoptimalkan kode aplikasi dan SQL pernyataan, serta memastikan aplikasi berinteraksi dengan DBMS tepat dan efisien. Buruk dibangun dan kode aplikasi dirumuskan menyumbang sebagian besar masalah-kinerja database relasional sebanyak 80% dari masalah kinerja dapat ditelusuri kembali ke aplikasi.
Kode aplikasi buruk dibangun dan dirumuskan menyumbang sebagian besar masalah kinerja database relasional.


Designing Applications for Relational Access

Masalah desain aplikasi yang dibahas dalam Bab 5 dan harus ditinjau kembali ketika kinerja aplikasi menderita. Mungkin aplikasi adalah tidak benar dirancang dan bagian-bagian dari aplikasi, atau mungkin seluruh aplikasi, perlu ditulis ulang. Aplikasi harus dirancang untuk kinerja pada awal-karena mengubah desain aplikasi nantinya adalah baik tidak mungkin, tidak praktis, atau terlalu mahal untuk mengatasi.
Desain masalah untuk memeriksa ketika menderita kinerja aplikasi termasu:

·         Jenis SQL. Adalah jenis yang tepat dari SQL (direncanakan atau tidak direncanakan, dinamis atau statis, tertanam atau berdiri sendiri) yang digunakan untuk aplikasi tertentu?
·         Bahasa Pemrograman. Adalah bahasa pemrograman yang mampu mencapai kinerja yang diperlukan, dan lingkungan bahasa dioptimalkan untuk akses database?
·         desain Transaksi dan pengolahan. Apakah transaksi dalam program benar dirancang untuk menjamin ACID properti, dan apakah program menggunakan prosesor transaksi pilihan tepat dan efisien?
·         Mengunci strategi. Apakah aplikasi memegang salah jenis kunci, atau apakah itu memegang jenis yang tepat dari kunci terlalu lama?
·         COMMIT strategi. Apakah setiap masalah program aplikasi SQL laporan COMMIT untuk meminimalkan dampak penguncian?
·         Batch processing. Apakah program batch yang dirancang tepat untuk mengambil keuntungan dari fitur pemrosesan sekuensial dari DBMS?
·         Pemrosesan online. Apakah aplikasi online yang dirancang untuk mengembalikan informasi yang berguna dan untuk meminimalkan jumlah informasi kembali ke layar pengguna untuk doa tunggal program ini?


Relational Optimization

DBA harus menjadi akrab dengan teknik optimasi yang digunakan oleh masing-masing DBMS dalam organisasi. Tentu saja, pengembang aplikasi harus kode SQL yang efisien dan memahami bagaimana mengoptimalkan SQL, tetapi pada akhirnya itu adalah DBA yang bertanggung jawab untuk kinerja aplikasi database. Dengan demikian, DBA harus terampil dalam SQL coding dan tuning SQL untuk kinerja.
Optimizer adalah jantung dari sebuah sistem manajemen database relasional. Ini adalah mesin inferensi yang bertanggung jawab untuk menentukan strategi terbaik basis data navigasi untuk setiap permintaan SQL yang diberikan. Optimizer adalah mesin inferensi untuk menentukan strategi navigasi basis data.
Pengembang aplikasi menentukan data apa yang dibutuhkan oleh coding pernyataan SQL, DBMS menyediakan informasi tentang di mana data tersebut berada, dan optimizer relasional memutuskan bagaimana efisien menavigasi database. Pengguna akhir tidak memerlukan pengetahuan tentang di mana dan bagaimana data sebenarnya disimpan. Optimizer tahu informasi ini.
Untuk mengoptimalkan SQL, optimizer relasional harus menganalisa setiap pernyataan SQL dengan parsing untuk menentukan tabel dan kolom yang harus diakses. Optimizer juga akan mengakses statistik yang disimpan oleh RDBMS baik dalam sistem katalog atau objek database sendiri. Statistik yang digunakan untuk menentukan metode terbaik untuk mencapai tugas-tugas yang perlu dilakukan untuk memenuhi permintaan SQL. Proses ini disebut optimasi relasional dan ditunjukkan pada Gambar.



Gambar Relational optimization


Optimasi relasional sangat kuat karena memungkinkan permintaan untuk beradaptasi dengan lingkungan database berubah. Optimizer dapat bereaksi terhadap perubahan dengan merumuskan jalur akses baru tanpa memerlukan perubahan aplikasi coding untuk dilaksanakan. Aplikasi ini sehingga dapat menjadi fleksibel sebagai tabel memperluas atau kontrak dalam ukuran, karena indeks yang ditambahkan atau dihapus, dan sebagai database menjadi tidak teratur atau direorganisasi.

Terlepas dari bagaimana data disimpan secara fisik dan dimanipulasi, SQL dapat digunakan untuk mengakses data, dan DBMS akan mengambil keadaan saat ini database ke account untuk mengoptimalkan akses data. Pemisahan kriteria akses dari karakteristik penyimpanan fisik disebut data fisik kemerdekaan.

Pemisahan kriteria akses dari karakteristik penyimpanan fisik disebut data fisik kemerdekaan. Setiap RDBMS memiliki optimizer relasional tertanam yang membuat pernyataan SQL ke jalur akses executable. Selanjutnya, optimizer relasional masing-masing vendor bekerja sedikit berbeda, dengan langkah-langkah yang berbeda dan menggunakan informasi yang berbeda. Namun demikian, inti dari proses ini adalah sama dari DBMS ke DBMS. Optimizer mengurai pernyataan SQL dan melakukan berbagai tahapan optimasi, biasanya melibatkan verifikasi sintaksis dan semantik benar, diikuti dengan analisis permintaan dan perumusan jalur akses untuk memenuhi permintaan tersebut.

Optimizer relasional dapat menyebarkan berbagai jenis strategi yang tersedia untuk DBMS untuk mengoptimalkan pernyataan SQL. Operasi internal dan instruksi yang digunakan oleh masing-masing optimizer DBMS yang dijaga ketat rahasia. Pengoptimalan relasional modern berbasis biaya, yang berarti bahwa optimizer akan mencoba untuk merumuskan jalur akses setiap query yang mengurangi biaya keseluruhan. Untuk berfungsi dengan cara ini, optimizer harus mengevaluasi dan menganalisa berbagai faktor, termasuk perkiraan CPU dan I / O biaya, statistik database, dan pernyataan SQL yang sebenarnya.


CPU and I/O Costs

Sebuah penggunaan optimizer relasional formula dan model untuk memperkirakan biaya mesin untuk menjalankan setiap jalur akses potensi permintaan yang dioptimalkan. Berdasarkan informasi CPU, optimizer dapat tiba di perkiraan kasar dari waktu CPU yang dibutuhkan untuk menjalankan query menggunakan setiap jalur akses dioptimalkan analisis.
Selain itu, optimasi relasional harus memperkirakan biaya penulisan aktual dan pengambilan data. Optimizer memperkirakan biaya I / O untuk query dengan menggunakan serangkaian formula berdasarkan statistik database, efisiensi cache data, dan biaya I / O untuk file kerja menengah. Formula ini menghasilkan faktor filter, yang menentukan biaya relatif I / O dari query.


Database Statistics

Sebuah optimizer relasional adalah penggunaan sedikit tanpa statistik yang akurat tentang data yang disimpan dalam database. Sebuah DBMS relasional menyediakan program utilitas atau perintah untuk mengumpulkan statistik tentang obyek database dan menyimpannya untuk digunakan oleh optimizer (atau oleh DBA untuk memantau kinerja). Misalnya, untuk mengumpulkan statistik dalam DB2, DBA harus menjalankan utilitas RUNSTATS, untuk mengumpulkan statistik di SQL Server perintah STATISTIK UPDATE dikeluarkan. Sebuah optimizer relasional adalah penggunaan sedikit tanpa statistik yang akurat.
DBA harus mengumpulkan statistik diubah setiap kali volume yang signifikan dari data yang telah ditambahkan atau dimodifikasi. Kegagalan untuk melakukannya akan mengakibatkan optimizer mendasarkan perkiraan biaya pada statistik tidak akurat. Hal ini dapat merugikan kinerja query.
Statistik database menyediakan optimizer dengan informasi tentang keadaan tablespace, tabel, kolom, dan indeks. DBMS mengumpulkan informasi statistik seperti:

·         Jumlah baris di tablespace, meja, atau indeks
·         Jumlah nilai-nilai unik yang tersimpan dalam kolom nilai
·         Paling sering terjadi untuk kolom
·         Indeks kepadatan utama (lihat "Kepadatan" sidebar)
·         Detail pada rasio pengelompokan untuk tabel berkerumun
·         Korelasi kolom ke kolom lain
·         negara Struktural indeks atau tablespace
·         Jumlah penyimpanan yang digunakan oleh objek database

Ketika mengeluarkan perintah RUNSTATS, DBA menentukan mana statistik untuk mengumpulkan. Tentu saja, statistik yang tepat yang dikumpulkan bervariasi oleh DBMS ke DBMS; statistik tambahan atau kurang mungkin tersedia dalam sistem database Anda. Kuncinya, meskipun, adalah untuk menjaga statistik seakurat mungkin untuk memastikan optimasi relasional yang efisien dan berguna.
Ketika mengembangkan aplikasi terhadap database tes, statistik untuk data tes tidak akan akurat mencerminkan statistik untuk database produksi. Bila mungkin, DBA harus bekerja dengan tim pengembangan aplikasi untuk membuat script untuk mengisi statistik produksi ke dalam sistem tes. Tergantung pada DBMS, hal ini dapat dicapai dengan pernyataan SQL atau alat pengujian data. Tanpa statistik produksi, DBMS kemungkinan akan memilih jalur akses yang berbeda dalam lingkungan pengujian dibandingkan produksi berpotensi menyebabkan masalah kinerja ketika aplikasi masuk ke status produksi.


Query Analysis

Analisis permintaan scan pernyataan SQL untuk menentukan kompleksitas secara keseluruhan. Rumusan pernyataan SQL adalah faktor yang signifikan dalam menentukan jalur akses yang dipilih oleh optimizer. Kompleksitas query, jumlah dan jenis predikat, kehadiran fungsi, dan keberadaan memesan klausul masuk ke dalam perkiraan biaya yang dihitung oleh optimizer. Semakin kompleks pernyataan SQL, semakin besar usaha analisis permintaan harus lakukan untuk memahami pernyataan SQL. Selama analisis query, optimizer analisis dari aspek pernyataan SQL dan sistem database, yakni seperti contoh berikut:

·         Indeks yang, jika ada, dapat digunakan
·         Berapa banyak predikat (klausa WHERE) harus puas
·         Yang fungsi harus dijalankan
·         Apakah SQL menggunakan OR atau AND
·         Bagaimana DBMS proses setiap komponen dari pernyataan SQL
·         Berapa banyak memori memiliki telah ditugaskan untuk cache data (s) yang digunakan oleh tabel dalam pernyataan SQL
·         Berapa banyak memori yang tersedia untuk menyortir jika query membutuhkan semacam sebuah
Semakin kompleks pernyataan SQL, semakin besar usaha analisis permintaan harus dilakukan.


Density

Density adalah persentase rata-rata nilai-nilai duplikat yang disimpan dalam kolom kunci indeks (s) dan dicatat sebagai persentase. Sebagai contoh, kepadatan 50% berarti bahwa untuk nilai kunci indeks yang diberikan, kita akan mengharapkan untuk kembali 50% dari baris. Persamaan berikut menentukan rata-rata jumlah baris diharapkan akan dikembalikan ketika mengakses tabel dengan indeks:





Informasi ini berguna untuk optimizer karena membantu dalam menentukan ukuran hasil yang ditetapkan dan dengan demikian apakah indeks sangat membantu untuk jalur akses khusus.
Dengan kata lain, analisis permintaan memecah pernyataan SQL menjadi tugas-tugas diskrit yang harus dilakukan untuk mengembalikan hasil query.
Sebagian besar analisis query seleksi indeks. Setelah optimizer menentukan indeks yang tersedia untuk digunakan untuk setiap predikat, akan memutuskan apakah akan menggunakan indeks tunggal, beberapa indeks, atau indeks tidak sama sekali.


Joins

Ketika beberapa tabel diakses, optimizer angka keluar bagaimana untuk menggabungkan tabel dengan cara yang paling efisien. Menggabungkan informasi dari beberapa tabel dikenal sebagai bergabung. Ketika menentukan jalur akses untuk bergabung, optimizer harus menentukan urutan di mana tabel akan bergabung, menghitung estimasi biaya keseluruhan dari setiap jalur akses, dan memilih bergabung metode untuk query tertentu. DBMS dapat menggunakan beberapa metode yang berbeda untuk bergabung dengan tabel. Menggabungkan informasi dari beberapa tabel dikenal sebagai bergabung.
Terlepas dari metode bergabung, DBMS harus membuat beberapa keputusan dan melakukan operasi tertentu. Keputusan pertama adalah memilih meja untuk memproses pertama tabel disebut sebagai tabel luar. Selanjutnya, serangkaian operasi yang dilakukan di atas meja luar untuk mempersiapkan untuk bergabung. Baris dari tabel yang kemudian digabungkan dengan baris dari tabel kedua, disebut tabel batin, seperti yang ditunjukkan pada Gambar 12-2. Serangkaian operasi juga dilakukan di meja bagian dalam sebelum bergabung terjadi, sebagai bergabung terjadi, atau keduanya.



Gambar Joining tables.


Walaupun semua bergabung serupa dalam fungsi, masing-masing bergabung dengan metode bekerja secara berbeda di belakang layar. Mari kita menyelidiki dua metode umum bergabung: nested loop bergabung dan gabungan-pemindaian bergabung.
Nested-loop bergabung bekerja dengan membandingkan baris kualifikasi tabel luar ke meja batin. Sebuah baris kualifikasi diidentifikasi dalam tabel luar, dan kemudian tabel batin dipindai untuk pertandingan. Sebuah baris kualifikasi adalah satu di mana predikat untuk kolom dalam pertandingan tabel. Ketika scan meja batin selesai, baris kualifikasi lain di luar tabel diidentifikasi. Tabel batin dipindai untuk pertandingan lagi, dan seterusnya. Pemindaian diulang dari tabel dalam biasanya dilakukan dengan indeks untuk menghindari yang tidak semestinya biaya I / O. Semakin kecil ukuran tabel batin, baik yang bersarang loop bergabung melakukan, karena lebih sedikit baris perlu dipindai untuk setiap baris kualifikasi tabel luar.
Tipe kedua dari bergabung adalah metode merge-pemindaian bergabung. Dalam merge scan bergabung, tabel yang akan bergabung yang diperintahkan oleh tombol. Pemesanan ini dapat dicapai dengan semacam atau dengan akses melalui indeks. Setelah memastikan bahwa kedua tabel luar dan dalam yang diurutkan dengan benar, setiap meja dibaca secara berurutan, dan bergabung kolom dicocokkan. Selama merge scan bergabung, tidak ada baris baik dari tabel dibaca lebih dari sekali. Merge-Scan bergabung berguna ketika indeks yang tepat tidak tersedia pada salah satu (atau keduanya) dari tabel. Tergantung pada DBMS, metode bergabung lainnya mungkin tersedia.


Join Order

Optimizer ulasan masing-masing bergabung dalam query dan analisis statistik yang tepat untuk menentukan urutan optimal di mana tabel harus diakses untuk mencapai bergabung. Untuk menemukan optimal bergabung akses jalan, optimizer menggunakan built-in algoritma yang berisi pengetahuan tentang bergabung dan volume data. Ini cocok dengan kecerdasan ini terhadap bergabung predikat, database statistik, dan indeks yang tersedia untuk memperkirakan urutan yang lebih efisien. Secara umum, optimizer akan menggunakan algoritma yang meminimalkan jumlah kali tabel batin harus diakses untuk kualifikasi baris tabel luar. Namun, tidak ada pengoptimalan relasional saat ini yang sempurna.


Access Path Choices

Optimizer relasional memiliki banyak pilihan untuk membuat jalur akses SQL. Kita telah membahas bergabung akses jalan, jadi mari kita membahas beberapa jenis umum lainnya dari akses data.


Table Scans

Tabel scan adalah bentuk sederhana dari akses data. Sebuah meja scan dilakukan hanya dengan membaca setiap baris dari tabel. Tergantung pada DBMS, alternatif jenis pemindaian mungkin ada, yang disebut scan tablespace. Tablespace memindai membaca setiap halaman di tablespace, yang mungkin berisi lebih dari satu tabel. Jelas, scan tablespace akan berjalan lebih lambat dari meja scan karena tambahan I / O akan dikeluarkan membaca data yang tidak berlaku. Tabel scan adalah bentuk sederhana dari akses data.
Bentuk lain dari pemindaian scan partisi. Jika DBMS dapat menentukan bahwa data yang akan diakses ada di partisi tertentu dari sebuah tabel multipartition (atau tablespace), dapat membatasi data yang dipindai ke partisi yang sesuai. Scan partisi harus mengungguli scan tabel atau tablespace pemindaian karena jumlah I / O yang dibutuhkan berkurang.

Biasanya, optimizer akan memilih untuk memindai data untuk salah satu alasan berikut:
·         Query tidak dapat puas menggunakan indeks mungkin karena tidak ada indeks yang tersedia, tidak ada predikat sesuai indeks, atau predikat menghalangi penggunaan indeks.
·         Sebuah persentase yang tinggi dari baris dalam tabel memenuhi syarat. Dalam hal ini, menggunakan indeks mungkin akan kurang efisien karena sebagian besar baris data yang perlu dibaca pula.
·         Indeks yang memiliki predikat yang cocok memiliki rasio klaster rendah dan hanya efisien untuk sejumlah kecil data.
·         Tabel sangat kecil sehingga penggunaan indeks benar-benar akan merugikan. Untuk meja kecil, menambahkan akses indeks untuk akses tabel dapat menghasilkan tambahan I / O, bukan kurang I / O.

Untuk membantu kinerja scan, optimizer dapat meminta data yang prefetch. Data prefetch menyebabkan DBMS untuk membaca halaman data secara berurutan ke dalam cache data bahkan sebelum mereka diminta. Pada dasarnya, data yang prefetch adalah mekanisme-ketika membaca-depan scan data yang mendapatkan sekitar untuk meminta data, sudah akan ada di memori. Data prefetch ini berguna untuk meja dan tablespace scan, tetapi dapat praktis untuk semua jenis akses data berurutan. Apakah data prefetch tersedia, serta kapan dan bagaimana digunakan, tergantung pada DBMS. Optimizer dapat memilih untuk menyebarkan ketika jalur akses dirumuskan, atau DBMS dapat memilih untuk mengaktifkan data prefetch saat query sedang dijalankan. Sebagai DBA, Anda harus belajar bagaimana dan mengapa data DBMS tertentu prefetches. Data prefetch ini berguna untuk meja dan tablespace scan.

Indexed Access

Dari sekian banyak keputusan yang harus dibuat oleh optimizer, salah satu yang paling penting bagi kinerja query adalah apakah indeks akan digunakan untuk memenuhi permintaan. Untuk menentukan ini, optimizer harus terlebih dahulu mengetahui apakah indeks ada. Indeks tidak harus didefinisikan sebelum SQL dapat ditulis untuk mengakses kolom-Anda dapat query setiap kolom dari setiap tabel yang dikenal ke database.
Tentu saja, sebelum optimizer relasional akan menggunakan indeks untuk memenuhi permintaan, indeks yang tepat harus sudah ada. Selain itu, setidaknya satu kolom diindeks harus dirujuk dalam sebuah predikat diindeks dalam pernyataan SQL. DBMS tidak mampu menggunakan indeks untuk setiap klausa WHERE. Anda harus belajar apa jenis predikat dapat menggunakan indeks untuk memastikan bahwa indeks yang sesuai diciptakan untuk query dalam aplikasi database Anda. Setiap DBMS memiliki daftar yang berbeda dari apa yang ada, dan apa yang tidak, diindeks. Selanjutnya, apa yang diindeks cenderung berubah dari versi ke versi masing-masing DBMS.
Optimizer relasional dapat memilih untuk menggunakan indeks dalam berbagai cara. Tipe pertama, dan yang paling sederhana, akses diindeks adalah pencarian indeks langsung. Untuk melakukan pencarian indeks langsung, DBMS memulai langkah-langkah berikut:

1.      Nilai dalam SQL predikat dibandingkan dengan nilai-nilai yang disimpan di halaman akar indeks. Berdasarkan perbandingan ini, DBMS akan melintasi indeks ke set terendah berikutnya halaman.
2.      Jika halaman nonleaf menengah ada, halaman nonleaf tepat dibaca, dan nilai tersebut dibandingkan untuk menentukan halaman daun untuk mengakses.
3.      Halaman daun yang sesuai dibaca, halaman daun index berisi pointer (s) dengan data aktual untuk baris kualifikasi.
4.      Berdasarkan pointer (s) dalam entri indeks halaman daun, DBMS membaca halaman data tabel yang sesuai.

Untuk DBMS untuk melakukan pencarian indeks langsung, nilai-nilai harus disediakan untuk setiap kolom dalam indeks. Sebagai contoh, perhatikan pertanyaan berikut:

SELECT last_name, first_name, middle_initial, empno
FROM employee
WHERE position = 'MANAGER'
AND work_code = 1
AND dept = '001000';

Selanjutnya, asumsikan bahwa indeks ada di posisi, work_code, dan dept kolom. DBMS dapat melakukan pencarian indeks langsung menggunakan indeks dan nilai yang diberikan dalam predikat untuk masing-masing kolom. Untuk pencarian indeks langsung terjadi, ketiga kolom harus muncul dalam pernyataan SQL. Jika hanya satu atau dua kolom ini ditetapkan sebagai predikat, pencarian indeks langsung tidak dapat dipilih karena DBMS tidak bisa cocok dengan kunci indeks penuh. Sebaliknya, indeks scan bisa dipilih. Ingat pembahasan sebelumnya meja dan tablespace scan. Indeks scan serupa. Ketika indeks scan dipanggil, halaman daun indeks dibaca secara berurutan, satu demi satu.

Ada dua tipe dasar indeks scan: Indeks pencocokan scan dan scan indeks nonmatching. Sebuah indeks scan pencocokan kadang-kadang disebut posisi absolut. Sebuah indeks scan pencocokan dimulai di halaman akar indeks dan bekerja ke halaman daun dalam banyak cara yang sama seperti pencarian indeks langsung tidak. Namun, karena kunci lengkap indeks tidak tersedia, DBMS harus memindai halaman daun indeks mencari nilai-nilai yang tersedia, sampai semua nilai pencocokan telah diambil. Untuk melihat bagaimana scan indeks pencocokan bekerja, mengikuti panah pada Gambar.



Gambar. Matching index scan.


Ada dua tipe dasar indeks scan: pencocokan dan nonmatching. Untuk memperjelas, mempertimbangkan permintaan sebelumnya dari tabel karyawan, tapi kali ini query recoded tanpa predikat untuk kolom dept. DBMS dapat menggunakan indeks scan yang cocok. Indeks pencocokan scan pertama menempatkan halaman daun pertama dengan nilai yang sesuai untuk posisi dan work_code dengan melintasi indeks mulai dari akar. Namun, bisa ada entri indeks berganda dengan kombinasi nilai-nilai dan nilai-nilai yang berbeda untuk dept. Oleh karena itu, halaman daun akan dipindai secara berurutan sampai tidak ada entri lebih valid ditemukan.
Untuk indeks scan yang cocok untuk diminta, Anda harus menentukan kolom high-order dalam indeks kunci-dengan kata lain, untuk kolom pertama ditentukan dalam DDL indeks. Untuk contoh sebelumnya, kolom high-order adalah kolom posisi. Kolom high-order menyediakan titik awal untuk DBMS untuk melintasi struktur indeks dari halaman ke halaman akar daun yang sesuai.
Pertimbangkan konsekuensi dari tidak menentukan kolom high-order dalam query. Misalnya, kita mengambil query dan menghapus predikat untuk posisi, tapi mempertahankan dua lainnya, meninggalkan pernyataan SQL berikut:

SELECT last_name, first_name, middle_initial, empno
FROM employee
WHERE work_code = 1
AND dept = '001000';

Dalam situasi seperti itu, DBMS dapat menyebarkan indeks scan nonmatching, kadang-kadang disebut sebagai posisi relatif. Ketika titik awal tidak dapat ditentukan karena kolom pertama dalam kunci indeks tidak ditentukan, DBMS tidak dapat menggunakan struktur pohon indeks. Namun, hal itu dapat menggunakan halaman indeks daun, seperti yang ditunjukkan pada Gambar. Sebuah indeks scan nonmatching dimulai dengan halaman daun pertama dalam indeks dan scan halaman daun berikutnya secara berurutan, menerapkan predikat yang tersedia.



Gambar. Nonmatching index scan


Sebuah indeks scan nonmatching dapat lebih efisien daripada tabel atau tablespace memindai, terutama jika halaman data yang harus diakses dalam urutan berkerumun. Tentu saja, sebuah indeks scan nonmatching dilakukan pada indeks nonclustered juga.
Hal ini membawa kita ke berkerumun dibandingkan akses indeks unclustered. Setiap metode di atas untuk akses diindeks dapat digunakan dengan baik indeks berkerumun dan unclustered. Namun, scan indeks yang kemudian harus mengakses halaman data tabel tidak mungkin akan sangat efisien jika data tidak terkelompok: akses index Clustered, karena hasil dari halaman ke halaman daun daun, tidak pernah meminta untuk membaca halaman data yang sama dua kali. Akses indeks Unclustered, bagaimanapun, akan meminta halaman data yang sama beberapa kali karena data tersebut tersebar di seluruh meja. Untuk klarifikasi clustering, lihat pembahasan dan diagram dalam Bab 4 dan 11.
Sebuah teknik akses indeks tambahan yang dapat digunakan adalah skrining indeks. Dengan screening indeks, scan indeks pencocokan dilakukan pada kolom terkemuka indeks multicolumn, dan predikat tambahan diterapkan selama pemindaian. Teknik ini berguna jika beberapa kolom dari indeks multicolumn tidak ditentukan dalam query. Pertimbangkan permintaan sampel lain:

FROM employee
WHERE position = 'MANAGER'
AND work_code = 1
AND salary > 50000.00;

Indeks skrining berguna jika beberapa kolom dari indeks multicolumn tidak ditentukan dalam query. Sekarang asumsikan bahwa indeks telah dibuat pada kolom berikut dengan urutan sebagai berikut: posisi, work_code, dept, dan gaji. Indeks dapat disaring dengan menerapkan indeks pencocokan scan pada posisi dan work_code, dan kemudian scan nonmatching untuk nilai gaji yang ditetapkan lebih besar dari $ 50,000.00, tapi hanya untuk orang-orang baris yang cocok posisi = ‘MANAGER’ dan work_code = 1 predikat.
Salah satu tipe yang paling efisien akses diindeks adalah akses indeks-only, kadang-kadang disebut sebagai indeks yang mencakup. Pertimbangkan lagi permintaan kami hanya diperiksa. Selanjutnya, asumsikan bahwa indeks telah dibuat pada kolom berikut: posisi, work_code, dept, gaji, last_name, dan empno. Dalam skenario seperti itu, DBMS dapat memenuhi permintaan hanya menggunakan indeks karena semua data yang diminta dalam daftar SELECT dan predikat ada di indeks. Tidak ada tambahan I / O ke halaman data tabel diperlukan.
Dengan akses indeks-only, DBMS dapat memenuhi permintaan dengan hanya memindai halaman daun indeks. Sebuah nonmatching indeks-hanya memindai bisa jauh lebih cepat daripada tablespace atau scan meja karena entri indeks umumnya lebih kecil daripada baris tabel, dan akibatnya banyak data yang dibaca dengan masing-masing I / O.
Untuk mendorong akses indeks-only, DBA dapat membebani indeks dengan menambahkan kolom tambahan yang muncul dalam daftar SELECT pernyataan SQL. Melakukan hal tersebut dapat memberikan kinerja pengembalian yang besar, tetapi datang pada biaya kebutuhan penyimpanan disk tambahan karena kolom tambahan sedang diindeks.
Salah satu jenis akhir akses diindeks adalah akses multi-indeks. Dengan akses multi-indeks, DBMS menggunakan lebih dari satu indeks untuk memenuhi jalur akses tunggal. Sebagai contoh, perhatikan variasi lain dari tabel query karyawan kami:

SELECT last_name, empno
FROM employee
WHERE position = 'MANAGER'
AND work_code = 1;

Dengan akses multi-indeks, DBMS menggunakan lebih dari satu indeks untuk memenuhi jalur akses tunggal. Kali ini kita memiliki dua indeks: satu di kolom posisi dan lain pada kolom work_code. Permintaan menetapkan dua predikat, yang masing-masing didukung oleh indeks yang berbeda. Alih-alih memilih untuk menggunakan satu indeks atau yang lain, optimizer relasional bisa menggabungkan dua indeks untuk mengembalikan data yang benar efisien.
Ada dua jenis akses multi-index, tergantung pada apakah predikat yang diikat bersama-sama menggunakan AND atau OR. Beberapa DBMSs hanya mendukung operator AND logis, sedangkan yang lain mendukung kedua AND dan OR. Dalam beberapa kasus, DBA dapat meminimalkan jumlah indeks yang dibuat dengan mengerahkan beberapa indeks tunggal-kolom, bukan dari beberapa indeks multicolumn. DBA harus mendasarkan keputusan ini pada efisiensi DBMS dalam menggunakan akses multi-indeks dan persyaratan kinerja dari aplikasi yang digunakan.

Using Indexes to Avoid Sorts

DBMS mungkin perlu untuk mengurutkan data untuk memenuhi permintaan SQL. Sorting adalah biaya cukup mahal dan harus dihindari jika mungkin. DBA dapat menggunakan indeks untuk menghindari macam dengan menciptakan mereka pada kolom yang perlu diurutkan. Optimizer relasional akan mencoba untuk menggunakan indeks untuk menghindari macam bila memungkinkan. Sorting mungkin terjadi ketika klausul berikut ditentukan:

·         DISTINCT: Bila distinct ini ditentukan DBMS mengharuskan setiap kolom data yang dihasilkan berada dalam urutan sehingga duplikasi baris dapat dihapus dari hasil yang ditetapkan.
·         UNION: Operasi ini memerlukan kolom dalam setiap daftar SELECT yang akan dipesan karena hasil set dapat memiliki duplikasi baris.
·         GROUP BY: Bila pasal ini ditentukan, DBMS memerlukan data yang akan diurutkan oleh kolom yang ditentukan untuk data agregat.
·         ORDER BY: Bila pasal ini ditentukan, DBMS akan memastikan bahwa hasil ditetapkan diurutkan menurut kolom tertentu.

Gunakan indeks untuk menghindari macam dengan menciptakan mereka pada kolom yang perlu diurutkan. Perhatikan pernyataan SQL berikut:

SELECT last_name, first_name, middle_initial, empno, position
FROM employee
WHERE position in ('MANAGER', 'DIRECTOR', 'VICE PRESIDENT')
ORDER BY last_name;

Jika indeks ada di kolom last_name, query dapat menggunakan indeks ini dan menghindari penyortiran. Menggunakan indeks untuk menghindari semacam perdagangan dari biaya CPU tambahan yang dibutuhkan untuk memilah untuk tambahan I / O biaya yang diperlukan untuk akses diindeks. Tentu saja, jika indeks akan digunakan pula, pilihannya adalah no-brainer. Apakah atau tidak menggunakan indeks sebenarnya lebih cepat dari pemindaian data dan pemilahan akan tergantung pada:

·         Jumlah baris kualifikasi
·         Kecepatan karakteristik semacam
·         Index (misalnya, berkerumun atau nonclustered)


Why Wasn't the Index Chosen?

Situasi kadang-kadang muncul di mana Anda berpikir optimizer harus memilih indeks, tapi ternyata tidak. Setiap beberapa alasan dapat menyebabkan optimizer untuk menghindari menggunakan indeks. Konsultasikan daftar berikut cara untuk mendorong seleksi indeks.

·         Apakah query menentukan argumen pencarian? Jika tidak ada predikat menggunakan argumen pencarian, optimizer tidak dapat menggunakan indeks untuk memenuhi permintaan tersebut.
·         Apakah Anda bergabung dengan sejumlah besar tabel? Optimizer dalam beberapa DBMSs dapat menghasilkan hasil rencana permintaan yang tak terduga ketika bergabung dengan sejumlah besar tabel.
·         Apakah statistik saat ini? Jika sejumlah besar data telah dimasukkan, diperbarui, dan / atau dihapus, statistik database harus direbut kembali untuk memastikan bahwa optimizer memiliki informasi up-to-date yang mendasari rencana permintaan nya.
·         Apakah Anda menggunakan prosedur yang tersimpan? Kadang-kadang DBMS menyediakan pilihan di mana prosedur yang tersimpan, sekali dikompilasi, tidak akan merumuskan rencana permintaan untuk eksekusi berikutnya. Anda mungkin perlu mengkompilasi ulang atau reoptimize prosedur yang tersimpan untuk mengambil keuntungan dari up-to-date statistik, indeks baru, atau perubahan database terkait lainnya.
·         Apakah predikat tambahan yang diperlukan? Sebuah klausa WHERE yang berbeda bisa saja memungkinkan optimizer untuk mempertimbangkan indeks yang berbeda.

Hashed Access

Optimizer juga akan mempertimbangkan menggunakan struktur hashing yang ada saat merumuskan jalur akses. Sebuah hash operasinya mirip dengan indeks lookup langsung. Hash yang paling tepat untuk random I / O sejumlah kecil data. Untuk mengambil data didasarkan pada algoritma hashing, DBMS menggunakan rutin mengacak untuk menerjemahkan nilai yang diberikan untuk kunci hash ke lokasi fisik. Algoritma ini akan memberikan offset baris dalam tabel database sebenarnya. Sebuah hash operasinya mirip dengan indeks lookup langsung.

Parallel Access

Optimizer relasional dapat memilih untuk menjalankan query secara paralel. Ketika permintaan paralelisme dipanggil oleh DBMS, beberapa tugas secara simultan dipanggil untuk mengakses data. Tiga jenis dasar paralelisme dapat didukung oleh DBMS:

·         I / O paralelisme memungkinkan konkuren I / O stream harus dimulai untuk query tunggal. Menjalankan paralel I / O tugas secara signifikan dapat meningkatkan kinerja I / O terikat pertanyaan. Memutus akses data untuk query ke konkuren I / O stream dieksekusi secara paralel dapat mengurangi waktu yang telah berlalu keseluruhan untuk query.
·         CPU paralelisme memungkinkan multitasking pengolahan CPU dalam query. Menjalankan CPU paralelisme juga memanggil I / O paralelisme karena setiap mesin membutuhkan CPU sendiri I / O stream-nya. CPU paralelisme terurai query ke dalam beberapa pertanyaan yang lebih kecil yang dapat dieksekusi secara bersamaan pada beberapa prosesor. CPU paralelisme dapat mengurangi waktu yang telah berlalu untuk query.

·         Akhirnya, DBMS dapat menyebarkan sistem paralelisme untuk lebih meningkatkan operasi query paralel. Sistem paralelisme memungkinkan permintaan tunggal untuk dipecah dan lari melintasi beberapa contoh DBMS. Dengan membiarkan satu query untuk mengambil keuntungan dari kekuatan pemrosesan dari beberapa contoh DBMS, waktu yang telah berlalu keseluruhan untuk query yang kompleks dapat dikurangi lebih jauh.

Tiga jenis dasar paralelisme dapat didukung oleh DBMS: I / O, CPU, dan sistem. Memastikan bahwa rencana permintaan yang tepat dirumuskan dengan penggunaan indeks yang benar adalah proses yang memakan waktu, tapi satu yang dapat membayar dividen yang besar dalam bentuk peningkatan kinerja. DBA harus melatih staf pengembangan aplikasi untuk memahami optimasi relasional dan untuk menciptakan SQL optimal. Tentu saja, tanggung jawab jatuh pada pengembang aplikasi untuk kode SQL yang efisien dan logika program. Namun, DBA adalah penjaga kinerja database relasional. Ketika masalah kinerja terjadi, DBA adalah orang yang harus mencari penyebab masalah dan menyarankan solusi untuk mengatasinya. Selain itu, DBA harus melakukan review desain untuk mencari dan tune efisien SQL sebelum jalur akses suboptimal dan program yang bermigrasi ke status produksi.