Haruskah Penyetelan Kueri menjadi Proaktif atau Reaktif?


23

Sebagai pengembang perangkat lunak dan calon DBA, saya mencoba untuk menerapkan praktik terbaik ketika saya mendesain database SQL Server saya (99% dari waktu perangkat lunak saya duduk di atas SQL Server). Saya membuat desain sebaik mungkin sebelum dan selama pengembangan.

Tapi, sama seperti pengembang perangkat lunak lain, ada fungsi tambahan, bug, dan hanya perubahan persyaratan yang menuntut objek database yang diubah / dibuat.

Pertanyaan saya adalah, apakah pencarian nada harus proaktif atau reaktif? Dengan kata lain, beberapa minggu setelah beberapa modifikasi kode / database berat, haruskah saya menyisihkan satu hari untuk memeriksa kinerja permintaan dan menyesuaikannya? Bahkan jika itu tampaknya berjalan dengan baik ?

Atau haruskah saya sadar bahwa kinerja yang kurang dari rata-rata seharusnya berupa pemeriksaan basis data dan kembali ke papan tulis pepatah?

Penyetelan kueri dapat menghabiskan banyak waktu, dan tergantung pada desain basis data awal, manfaatnya minimal. Saya ingin tahu tentang modus operandi yang diterima.


7
Optimalisasi prematur adalah akar dari semua kejahatan - DonaldKnuth
Drasill

@Drasill, bisakah Anda mengembangkannya? Jahat seperti waktu dev terbuang?
Thomas Stringer

sebenarnya pertanyaan Anda membuat saya berpikir tentang kutipan terkenal ini ( lihat google ). Tapi ini lebih ditujukan untuk pengembangan perangkat lunak, saya pikir itu tidak benar-benar cocok untuk DBA. Terakhir, saya akan mengatakan pada diri saya " Optimasi mikro prematur itu jahat".
Drasill

Lihat juga postingan horor pengkodean yang lama tentang hal ini :)
Drasill

Jawaban:


17

Keduanya, tetapi sebagian besar proaktif

Sangat penting untuk menguji selama pengembangan terhadap volume dan kualitas data yang realistis. Sangat umum memiliki kueri yang dijalankan pada pengembang 100 atau 1000 baris kemudian jatuh datar dengan 10 juta baris produksi.

Anda juga dapat membuat catatan tentang "indeks dapat membantu di sini". Atau "kunjungilah aku". Atau "akan diperbaiki dengan xxx fitur baru di versi DB berikutnya".

Namun, beberapa pertanyaan tidak akan bertahan dalam ujian waktu. Distribusi data berubah atau menjadi eksponensial karena pengoptimal memutuskan untuk menggunakan tipe gabungan yang berbeda. Dalam hal ini, Anda hanya dapat bereaksi.

Mengatakan itu, setidaknya untuk SQL Server, berbagai "DMX index" yang hilang dan "permintaan terlama" kueri dapat menunjukkan area masalah sebelum panggilan telepon

Edit: untuk memperjelas ...

Proaktif tidak berarti menyelaraskan setiap permintaan sekarang. Itu berarti menyesuaikan apa yang Anda perlu (sering jalankan) ke waktu respons yang masuk akal. Sebagian besar abaikan kueri laporan minggu 3 minggu mingguan.


16

OK, saya akan menggigit dan mengambil pandangan pelawan. Pertama, saya akan mengatakan Anda tidak boleh memulai dengan melakukan sesuatu yang Anda tahu akan membawa Anda ke dalam masalah. Jika Anda ingin menyebut ini penerapan praktik terbaik, silakan. Sejauh ini harus proaktif.

Setelah itu, buang-buang waktu (dan uang) jadi teruskan saja dan kirimkan produk Anda. Alih-alih mengambil satu ton pertanyaan penyesuaian waktu desain yang mungkin atau mungkin tidak pernah berubah menjadi leher botol, gunakan waktu itu untuk pengujian tambahan, termasuk pengujian beban.

Ketika Anda mengetahui bahwa ada sesuatu yang tidak berkinerja sesuai dengan spesifikasi desain Anda, atau jika ada sesuatu yang jatuh ke bawah 10% atau 20% dari daftar waktu profiler Anda, maka investasikan waktu yang Anda butuhkan untuk mengubah apa pun itu. rusak.

Dalam dunia yang sempurna semuanya akan dirancang dengan sempurna dari awal dan dikembangkan menggunakan urutan build yang logis. Di dunia nyata ada kendala pada anggaran dan waktu dan data pengujian Anda mungkin tidak tampak seperti data produksi Anda. Untuk alasan ini, saya katakan gunakan akal sehat untuk menghindari masalah secara proaktif tetapi konsentrasikan sumber daya Anda yang terbatas untuk menyelesaikan hal-hal yang ternyata menjadi masalah nyata alih-alih menghabiskan waktu dan uang yang mungkin tidak Anda miliki untuk mencari masalah imajiner atau potensial.


3
Saya tidak berpikir itu pelawan sama sekali. Tidak ada yang menyarankan Anda harus mengoptimalkan segala sesuatu secara pre-emptive, tetapi Anda harus menguji semuanya dan mengoptimalkan hal-hal yang jelas bahwa mereka dapat / akan menyebabkan masalah dalam produksi. Itu sangat berbeda baik dari mengoptimalkan kode tanpa data dan dari menemukan apa yang rusak / lambat setelah kode telah dikirimkan. Tentu saja ada garis - seperti yang Anda sebutkan, Anda harus mengirimkan sesuatu pada akhirnya. Tapi saya pikir ada keseimbangan yang baik di sana di mana Anda dapat menghindari memberikan sesuatu yang menyebalkan dari segi kinerja.
Aaron Bertrand

4
Aaron, setuju - tidak pernah memberikan apa pun yang menyebalkan dari segi kinerja dan tidak membebani dan membangun sesuatu tanpa berpikir keras tentang kinerja dan skalabilitas. "Ukur dua kali, potong sekali" milik stiker bumper programmer seperti halnya pada tukang kayu. Pada saat yang sama, saya merasa bahwa tenor umum dari jawaban lain adalah "proaktif> reaktif" dan saya merasa ada pendapat yang kurang terwakili bahwa "kenyataan == reaktif" dan kuncinya adalah tidak membuang-buang waktu begitu banyak bersikap proaktif bahwa Anda tidak punya waktu atau uang untuk berurusan dengan kenyataan yang keras dan seringkali tidak dapat diprediksi.
Joel Brown

15

Anda akan melakukan 3 jenis penyetelan, 1 reaktif dan 2 proaktif.

Reaktif

Tiba-tiba, beberapa permintaan mulai menyebabkan masalah bagi Anda. Mungkin karena bug atau fitur aplikasi, tabel yang tumbuh melebihi harapan, lonjakan lalu lintas, atau pengoptimal kueri yang menjadi "kreatif". Ini bisa menjadi jenis perselingkuhan oh-omong kosong tengah malam, atau bisa juga sebagai respons terhadap kelambatan sistem yang sifatnya tidak kritis. Either way, karakter yang menentukan tuning reaktif adalah bahwa Anda sudah memiliki masalah . Tak perlu dikatakan, Anda ingin melakukan ini sesedikit mungkin. Yang membawa kita ke ...

Proaktif

Tipe 1: Perawatan Rutin

Pada beberapa jenis jadwal, setiap beberapa bulan atau minggu tergantung pada seberapa sering skema Anda berubah dan seberapa cepat data Anda tumbuh, Anda harus meninjau output dari alat analisis kinerja database Anda (misalnya laporan AWR untuk Oracle DBAs). Anda sedang mencari masalah yang baru jadi, yaitu hal-hal yang dalam perjalanan mereka membutuhkan penyetelan Reaktif, serta buah yang menggantung rendah, barang-barang yang kemungkinan tidak akan menimbulkan masalah segera tetapi dapat ditingkatkan dengan sedikit usaha dengan harapan mencegah jauh Masalah masa depan. Berapa banyak waktu yang Anda habiskan untuk ini akan tergantung pada berapa banyak waktu yang Anda miliki, dan apa lagi yang bisa Anda habiskan untuk itu, tetapi jumlah optimal tidak pernah nol. Namun, Anda dapat dengan mudah mengurangi jumlah yang harus Anda keluarkan dengan melakukan lebih banyak ...

Tipe 2: Desain Yang Tepat

Nasihat Knuth terhadap "optimasi prematur" secara luas dikenal dan dihormati. Tetapi definisi yang tepat dari "prematur" harus digunakan. Beberapa pengembang aplikasi, ketika diizinkan untuk menulis pertanyaan mereka sendiri, memiliki kecenderungan untuk mengadopsi permintaan pertama yang mereka temukan yang secara logis benar, dan tidak memedulikan kinerja, saat ini atau di masa depan. Atau mereka dapat menguji terhadap set data pengembangan yang tidak mewakili lingkungan produksi (tip: Jangan lakukan ini! Pengembang harus selalu memiliki akses ke data realistis untuk pengujian.). Intinya adalah bahwa waktu yang tepat untuk menyelaraskan kueri adalah ketika pertama kali digunakan, bukan ketika itu muncul pada daftar SQL berkinerja buruk, dan jelas bukan ketika itu menyebabkan masalah kritis.

Jadi apa yang akan memenuhi syarat sebagai optimasi dini di tanah DBA? Di bagian atas daftar saya akan mengorbankan normalisasi tanpa kebutuhan yang ditunjukkan. Tentu Anda dapat mempertahankan jumlah pada baris induk daripada menghitungnya saat runtime dari baris anak, tetapi apakah Anda benar-benar perlu melakukannya? Jika Anda Twitter atau Amazon, de-normalisasi strategis dan pra-perhitungan dapat menjadi teman terbaik Anda. Jika Anda merancang sedikit basis data akuntansi untuk 5 pengguna, struktur yang tepat untuk memfasilitasi integritas data perlu menjadi prioritas utama. Optimalisasi prematur lainnya juga merupakan masalah prioritas. Jangan menghabiskan berjam-jam men-tweak permintaan yang dijalankan sekali sehari dan membutuhkan waktu 10 detik, bahkan jika Anda pikir Anda dapat memotongnya menjadi 0,1 detik. Mungkin Anda memiliki laporan yang berjalan selama 6 jam setiap hari, tetapi jelajahi penjadwalan sebagai pekerjaan batch sebelum menginvestasikan waktu dalam menyetelnya. Jangan berinvestasi dalam contoh pelaporan yang direplikasi dan real-time yang terpisah jika beban produksi Anda tidak pernah mengapung di atas 10% (dengan asumsi Anda dapat mengelola keamanan).

Dengan menguji terhadap data realistis, mengambil tebakan edukasi pada pola pertumbuhan dan lalu lintas (ditambah kelonggaran untuk lonjakan), dan menerapkan pengetahuan Anda tentang keanehan pengoptimal platform Anda, Anda dapat menggunakan kueri yang menjalankan (hampir) secara optimal bukan hanya sekarang, tetapi di masa mendatang. , dan dalam kondisi yang kurang ideal. Ketika Anda menerapkan teknik yang tepat, kinerja kueri dapat diprediksi secara akurat, dan dioptimalkan (dalam arti setiap komponen secepat yang diperlukan).

(Dan saat Anda berada di sana, pelajari statistik! )


Desain Yang Tepat adalah 95% dari kinerja dan skalabilitas.
Mark Stewart

6

Dalam dunia yang sempurna, semua penyetelan akan dilakukan dalam fase desain secara proaktif dan tidak ada yang reaktif, tetapi dunia tidak sempurna. Anda akan menemukan bahwa data pengujian kadang-kadang tidak representatif, kasus pengujian akan terlewatkan, beban akan sangat berbeda, dan akan ada bug yang menyebabkan masalah kinerja. Situasi ini mungkin memerlukan penyetelan reaktif, tetapi itu tidak berarti penyetelan reaktif lebih disukai. Tujuannya harus selalu untuk menangkap ini di depan.

Perencanaan Anda untuk penyetelan retroaktif sangat pragmatis. Ketika Anda menguji Anda harus mendokumentasikan waktu dan throughput yang diharapkan dan kadang-kadang harus benar-benar membangun dalam analisis yang memungkinkan Anda mengetahui kapan proses produksi tidak memenuhi spesifikasi desain. Dengan cara ini Anda dapat mengidentifikasi terlebih dahulu kode apa yang perlu disetel. Anda kemudian dapat menentukan tidak hanya apa masalahnya, tetapi mengapa Anda tidak menangkapnya pada tahap desain / pengujian.


5

Bagi saya, pengujian kinerja selalu menjadi bagian dari proses pengembangan. Ingin mengubah tabel ini, mengubah laporan ini, menambahkan fitur ini? Sebagai bagian dari pengujian, Anda memastikan bahwa Anda dapat membandingkan kinerja individu dan keseluruhan dengan baseline yang diketahui dan / atau bertentangan dengan persyaratan (misalnya, beberapa laporan berjalan di latar belakang atau diotomatisasi, sehingga kinerja - atau lebih tepatnya kecepatan - dari setiap permintaan tunggal di sistem tidak selalu menjadi prioritas utama).

IMHO, ini seharusnya tidak menjadi proses reaktif sama sekali - Anda tidak boleh menunggu sampai perubahan menyebabkan masalah kinerja dalam produksi untuk mulai bereaksi. Ketika Anda membuat perubahan dalam dev / test dll., Anda harus menguji perubahan itu dengan data yang serupa pada perangkat keras yang sama dengan aplikasi yang sama dan pola penggunaan yang serupa. Jangan biarkan perubahan ini disibukkan dengan produksi dan mengejutkan Anda. Ini hampir selalu terjadi ketika tidak nyaman untuk menghabiskan waktu tuning sehari - anggaran untuk waktu tuning sebelumnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.