Belajar Mengoptimalkan Pertanyaan SQL dan Memahami Rencana Eksekusi - Sumber Daya?

8

Saya menemukan diri saya semakin banyak menulis query SQL di tempat kerja (kebanyakan Oracle 11g, tetapi beberapa SQL Server 2005-2008) dan telah mulai membuat beberapa pandangan yang cukup kompleks untuk seluruh tim analis.

Mereka sebagian besar semua berjalan cukup baik, tetapi beberapa dari mereka tidak begitu baik. Begitu...

  • Bagaimana saya belajar menyetel kueri saya?
  • Apakah saya perlu belajar membaca / menindaklanjuti Rencana Eksekusi?

Dan...

  • Buku / situs web apa yang bisa Anda rekomendasikan untuk belajar tentang penyetelan query SQL 1) secara umum 2) khusus untuk Oracle 11g?

Kami memiliki beberapa DBA yang baik di sini, tetapi terlalu banyak untuk membantu kami menyetel setiap kueri yang kami tulis.

Sebagian besar buku yang saya temukan di Amazon untuk Oracle semuanya tampaknya diarahkan untuk optimasi database secara keseluruhan dan / atau ditulis 8-10 tahun yang lalu.

Terima kasih atas saran Anda :)

Tommy O'Dell
sumber
Untuk SQL Server, buku Grant: simple-talk.com/sql/performance/execution-plan-basics
Aaron Bertrand

Jawaban:

7

Saya akan mengatakan bahwa belajar bagaimana memahami menjelaskan rencana adalah keterampilan penting dalam membantu Anda untuk mengoptimalkan pernyataan SQL. Saya telah menemukan buku Christian Antognini, Troubleshooting Oracle Performance , sangat berguna dalam merinci cara kerjanya, serta menjelaskan cara mendekati optimasi basis data. Saat berusia beberapa tahun, Anda masih akan belajar banyak yang masih relevan darinya.

Jika Anda menjadi lebih maju, Anda bisa melihat buku-buku Jonathan Lewis, tetapi ini lebih mendalam sehingga mungkin bukan titik awal yang baik. Oracle Fundamentals berbasis biaya sudah cukup tua sekarang, tetapi sebagian besar masih relevan. Saya belum pernah membaca Oracle Core: Essential Internal untuk Mengatasi Masalah , tetapi telah menerima ulasan yang baik dari komunitas Oracle.

Saat Anda menggunakan 11g, jika Anda memiliki pertanyaan yang membutuhkan waktu lebih dari beberapa detik, saya pasti akan merekomendasikan untuk melihat monitor SQL real-time (dengan asumsi Anda memiliki lisensi yang sesuai). Seperti namanya, ini menunjukkan kemajuan pernyataan SQL secara real-time, memecah berapa lama setiap operasi telah mengambil dengan rincian baris yang diambil sejauh ini. Itu juga menyimpan detail kueri yang baru saja dieksekusi untuk sementara waktu sehingga dapat melihat bagaimana perubahan Anda memengaruhi pernyataan.

Dokumentasi Pemantauan Oracle SQL: http://docs.oracle.com/cd/E11882_01/server.112/e16638/instance_tune.htm#PFGRF94543

Mempelajari cara menyetel kueri adalah sesuatu yang akan membutuhkan waktu dan latihan. Beberapa hal yang saya pelajari:

  • Tulis kueri untuk mengambil sesedikit mungkin baris sesegera mungkin (mis. Anda tidak ingin memindai penuh 10 juta tabel baris jika Anda hanya membutuhkan 100 baris darinya)
  • Verifikasi bahwa jumlah baris yang diharapkan dalam setiap langkah rencana menjelaskan (diharapkan) cocok dengan yang dikembalikan dalam rencana eksekusi aktual. Ketika ini adalah urutan besarnya berbeda, kemungkinan pengoptimal tidak memilih rencana "terbaik".
  • Memahami prinsip-prinsip pengindeksan yang baik: cara kerjanya dan kapan harus / tidak boleh digunakan saat mengeksekusi kueri ( Richard Foote memiliki blog yang sangat mendalam membahas indeks di Oracle)

Sebagian besar Anda akan belajar dengan menulis kueri, melihat (diharapkan) menjelaskan rencana dan membandingkannya dengan rencana pelaksanaan yang sebenarnya (baik melalui melacak kueri atau menggunakan monitor SQL). Kemudian tulis ulang kueri, tambahkan / hapus indeks, dll. Dan lihat bagaimana hal itu memengaruhi rencana dan waktu eksekusi

Chris Saxon
sumber
1

Ketika Anda mencari informasi spesifik Oracle, saya akan merekomendasikan blog Ask Tom di Oracle. Secara umum, saya pikir Anda akan menemukan saran untuk tidak menyetel kueri. Anda akan mendapatkan saran bagus tentang cara menulis kueri yang dapat dioptimalkan oleh pengoptimal. Dokumentasi Oracle juga online , dan saya biasanya mencari informasi terkini tentang Oracle. Saya belum pernah bekerja dengan SQLServer jadi saya tidak punya rekomendasi untuk itu.

Saya belum melihat banyak hal baru di bidang mengoptimalkan kueri selama beberapa tahun terakhir. Perubahan besar adalah penghentian pengoptimal berbasis aturan, yang saya hampir tidak ingat bekerja dengannya. Namun, saya mengerti SQLServer masih menggunakan pengoptimal berbasis aturan, jadi memahami aturannya dapat membantu.

Alat di mana Anda dapat mengedit kueri, menjalankannya, dan membuat rencana penjelasan membantu dalam memahami perubahan apa yang membuat Anda mendapatkan kueri yang berkinerja baik. Saya memiliki hasil yang baik dengan AquaData Studio, dan sangat suka tampilan pohonnya. Pengembang SQL juga harus melakukannya.

Seperti halnya optimasi apa pun, Anda perlu memiliki data kuantitatif tentang kinerjanya. Maka Anda dapat menentukan apakah Anda benar-benar mengoptimalkannya.

Cara mengoptimalkan kueri sebagian bergantung pada bagaimana parser membangun dan mengoptimalkan kueri. Pada tingkat yang lebih besar tergantung pada distribusi data yang Anda tanyakan. Dalam database Oracle jika hasil set membuat empat persen atau lebih tabel dan didistribusikan secara acak, pemindaian tabel biasanya lebih cepat daripada indeks.

Saya telah bekerja untuk mengoptimalkan kueri untuk tim pengembang. Hanya dua atau tiga pertanyaan dalam setahun yang membutuhkan pengoptimalan serius. Sebagian besar pertanyaan cukup sederhana sehingga tidak perlu dioptimalkan. Sisanya biasanya dapat ditangani dengan menambahkan jalur gabung yang hilang.

Untuk Oracle ada tiga pengaturan merdu yang dapat secara signifikan mempengaruhi kinerja. Penentuan biaya untuk indeks dan pencarian data berinteraksi untuk mengubah kondisi di mana indeks dalam akan atau tidak akan digunakan. Keduanya dapat disetel berdasarkan per sesi. Defaultnya sering tidak optimal. Nilai lainnya mengontrol berapa banyak alternatif yang akan dicoba oleh pengoptimal. Meningkatkan nilai ini sering membantu.

Optimalisasi dipengaruhi secara signifikan oleh distribusi dan volume data. Ketika mengoptimalkannya, lebih baik menggunakan salinan database produksi, atau setidaknya database dengan distribusi dan volume data yang sama. Saya telah sangat merusak lingkungan pengujian, mengoptimalkan kueri untuk basis data pesanan produksi. Database pengujian dan pengembangan memiliki distribusi data yang sangat berbeda yang menyebabkan permintaan gagal bahkan dengan data yang jauh lebih sedikit.

BillThor
sumber
Anda mungkin ingin mempertimbangkan untuk memasukkan lebih banyak zat di sini. Ini sebenarnya batas "bukan jawaban" seperti saat ini.
JNK