Untuk meningkatkan kinerja SQL, mengapa tidak hanya menaruh banyak RAM daripada memiliki hard disk yang lebih cepat?

31

Orang-orang terus mengatakan kepada saya bahwa untuk meningkatkan kinerja SQL server, beli hard disk tercepat yang mungkin dengan RAID 5, dll.

Jadi saya berpikir, daripada menghabiskan semua uang untuk RAID 5 dan super-duper hard disk cepat (yang tidak murah,), mengapa tidak hanya mendapatkan ton RAM? Kita tahu bahwa server SQL memuat basis data ke dalam memori. Memori lebih cepat daripada hard disk mana pun.

Mengapa tidak memasukkan 100 GB RAM di server? Kemudian gunakan saja hard disk SCSI biasa dengan RAID 1. Bukankah itu jauh lebih murah dan lebih cepat?

pengguna1034912
sumber
33
Siapa pun yang memberi tahu Anda RAID 5 tidak memiliki petunjuk. Jika Anda benar-benar peduli dengan kinerja, gunakan RAID 10
MDMarra
5
Untuk apa D dalam ACID berdiri? Akhirnya, Anda akan perlu menuliskannya.
Adam Musch

Jawaban:

51

Analisis Anda baik-baik saja - sampai titik tertentu - karena hal itu benar-benar akan membuat segalanya lebih cepat. Anda masih harus menjelaskan beberapa masalah lain:

  1. Tidak semua orang mampu membeli cukup memori; ketika Anda memiliki beberapa terabyte data, Anda harus meletakkannya di disk beberapa saat. Jika Anda tidak memiliki banyak data, semuanya cepat.

  2. Kinerja penulisan untuk basis data Anda masih akan dibatasi oleh disk, sehingga Anda dapat menepati janji bahwa data sebenarnya disimpan.

Jika Anda memiliki kumpulan data kecil, atau tidak perlu bertahan di disk, tidak ada yang salah dengan ide Anda. Alat-alat seperti VoltDB bekerja untuk mengurangi overhead yang asumsi lama dalam implementasi RDBMS dibuat yang membatasi kinerja murni dalam memori.

(Selain itu, orang yang mengatakan kepada Anda untuk menggunakan RAID-5 untuk kinerja database mungkin bukan orang-orang hebat untuk mendengarkan subjek, karena ini hampir tidak pernah menjadi pilihan terbaik - ia memiliki kinerja membaca yang baik, tetapi kinerja penulisan yang buruk, dan menulis hampir selalu menjadi kendala produksi - karena Anda dapat memasukkan RAM ke dalam caching untuk menyelesaikan sebagian besar masalah kinerja sisi-baca.)

Daniel Pittman
sumber
1
Pengguna umum selalu mengeluh masalah baca. Jarang pada masalah penulisan
user1034912
2
@ user1034912 - bervariasi pada use case, dan pengguna. Secara umum, masalah kinerja penulisan lebih sulit untuk diselesaikan, dan akhirnya menempatkan kendala yang lebih besar pada kinerja sistem secara keseluruhan, yang berarti bahwa ketika Anda menyelesaikan masalah baca, mereka mulai mengeluh tentang masalah tulis ...
Daniel Pittman
2
@ user1034912, pengguna biasanya tidak melihat penundaan penulisan, jadi tidak menyadarinya. Sebagian besar yang dilihat pengguna sebagai penundaan baca disebabkan oleh permintaan yang lambat, bukan karena lambatnya disk.
John Gardeniers
Jawaban yang sangat bagus! @ user1034912 mereka mungkin mengeluh tentang masalah baca yang tentu saja bisa menjadi efek buruk dari kinerja penulisan yang buruk (dan kode konkurensi yang berskala rendah).
Alex
RAID5 di Database Relasional: en.wikipedia.org/wiki/… - Saya tidak mengatakan bahwa Anda salah, tetapi kebijakan konvensional mungkin didasarkan pada info lama. Secara pribadi, saya tidak menggunakan RAID5 lagi; Saya menggunakan RAID6 kecuali terlalu lambat.
gWaldo
11

Versi singkat: pertimbangkan ukuran set yang berfungsi. Versi panjang: Seberapa besar data Anda? Jika itu bisa masuk ke memori server modern, ya, Anda memang benar. Sayangnya, Xeon terbesar dapat mengatasi 2TB RAM saat ini, dan itu bukan data yang besar lagi. Jika Anda tidak dapat membeli mesin yang cukup besar untuk menampung seluruh perangkat kerja Anda dalam RAM, Anda terpaksa menyelesaikan masalah dengan otak Anda, bukan dompet Anda.

Marcin
sumber
+1 untuk kalimat terakhir yang sangat dapat dikutip. : D
pkoch
8

Jika Anda ingin kecepatan:

  • Tingkatkan RAM sehingga setidaknya indeks yang sering digunakan sepenuhnya dapat masuk ke dalam RAM (misalnya, pada sistem tempat saya bekerja, 32GB RAM banyak untuk database 350GB, karena indeks adalah apa yang Anda butuhkan dalam RAM, bukan data mentah)
  • Gunakan RAID10 dengan disk apa pun (disk yang lebih cepat lebih baik)
  • Hindari RAID5
  • Membagi mdf, ldf dan temp DB ke set spindle diskrit (contoh: tempdb pada set RAID1 sendiri, ldf pada set spindle RAID1 atau RAID10 sendiri, mdf pada set RAID 10 dengan setidaknya 4 total disk)

Ikuti langkah-langkah itu, dan SQL Server akan terbang.

Kemudian jika Anda mau, tambahkan lebih banyak RAM ... tetapi lakukan hal di atas terlebih dahulu, dan Anda mungkin sudah selesai.

Jonesome Reinstate Monica
sumber
2

RAM adalah disk baru, disk adalah rekaman baru.

Dalam http://www.tbray.org/ongoing/When/200x/2006/05/24/On-Grids . Perhatikan itu enam tahun lalu. Ya, kami memiliki sistem basis data yang mencoba (dan berusaha keras) untuk menyimpan seluruh dataset dalam RAM dan lebih baik membuangnya ke beberapa mesin daripada menggunakan disk karena disk lebih lambat. Anda perlu menulis dataset ke disk tetapi seperti dalam moto di atas, itu lebih mirip dengan tugas cadangan latar belakang daripada operasi online. Daya tahan dicapai melalui hanya menambahkan log dengan database ini (saya berpikir MongoDB dan Redis tetapi ada banyak lagi).

chx
sumber
4
-1 karena bagusnya barang ini, tidak dapat diakses atau cocok untuk sebagian besar aplikasi atau kebanyakan dari kita di sini. Untuk data hingga 500gb (atau bahkan lebih), yang Anda butuhkan adalah dua SQL Server (primer dan cadangan), dan Anda memiliki yang sangat cepat menggunakan alat normal untuk ratusan atau ribuan pengguna. Sangat sedikit dari kita yang perlu menskalakan hingga ratusan ribu pengguna bersamaan atau beberapa pusat data, sehingga kompleksitas pendekatan yang Anda usulkan jauh melebihi manfaatnya bagi kebanyakan dari kita. TKI: Penskalaan vertikal mudah, murah, dan efektif untuk semua orang yang bukan facebook atau google.
Jonesome Reinstate Monica
1

Pertanyaan ini mirip dengan yang mendasar yang telah menyebabkan banyak penelitian dan pengembangan dalam arsitektur basis data selama 5-10 tahun terakhir. Sekarang karena layak untuk menyimpan seluruh basis data dalam RAM untuk banyak kasus penggunaan, basis data perlu dirancang untuk bekerja di dalam RAM, daripada hanya menerapkan arsitektur lama yang diwariskan ke penyimpanan berbasis RAM.

Sama seperti banyak bahasa yang lebih kecil dan lebih banyak tujuan khusus telah diadopsi secara luas dalam beberapa tahun terakhir, kami memasuki era lebih banyak database tujuan khusus akan diperlukan.

Untuk bacaan lebih lanjut tentang topik ini, saya merekomendasikan makalah akademis Akhir dari Era Arsitektur (Saatnya Menulis Ulang Lengkap) . Itu tidak sulit dibaca.

Tidak jelas apakah pertanyaan ini khusus tentang SQL Server. Poster asli harus menjelaskan ini.

Daniel Pittman menulis:

Jika Anda memiliki kumpulan data kecil, atau tidak perlu bertahan di disk, tidak ada yang salah dengan ide Anda. Alat-alat seperti VoltDB bekerja untuk mengurangi overhead yang asumsi lama dalam implementasi RDBMS dibuat yang membatasi kinerja murni dalam memori.

Mengurangi overhead dari asumsi lama dalam implementasi RDBMS adalah persis tujuan desain dari VoltDB , tetapi melakukan skala secara horizontal tanpa batas arsitektur pada ukuran data, dan dapat bertahan ke disk untuk daya tahan penuh menggunakan snapshotting dan command-logging.

BenjaminBallard
sumber
0

Jika Anda bisa mendapatkan server dengan RAM yang cukup untuk menampung, setidaknya, bagian panas dari dataset Anda, Anda akan baik-baik saja. Juga, RAID 1 dan 5 bukan cara tercepat untuk mengatur data Anda - RAID 0 lebih cepat, tetapi, kemudian, Anda harus mempertimbangkan kemungkinan lebih tinggi dari kegagalan sistem file yang menghapus database Anda - bukan hal yang baik untuk terjadi . Anda dapat RAID 1 atau RAID 5 array RAID 0 Anda, asalkan Anda memiliki cukup drive dan pengontrol.

Anda bahkan dapat bermain dengan replikasi di sini - lakukan penulisan Anda ke server disk-berat yang mereplikasi ke satu atau lebih server memori-berat tempat Anda menjalankan kueri yang rumit.

Sayangnya, RDBMS tampaknya berada di ranah besar - mereka tidak mudah tumbuh secara horizontal.

kasar
sumber
0

Ini adalah kasus "itu tergantung apa yang Anda lakukan." Mungkin saran "benar" adalah untuk menghindari SQL sama sekali dan menggunakan memcache / redis / etc!

Saya setuju dengan Anda bahwa RAM ekstra akan banyak membantu, terutama jika Anda dapat membaca seluruh set kerja ke dalam RAM. Ya itu masih harus menulis data, tetapi jika Anda memiliki sebagian besar membaca maka penulisan tidak akan memiliki perselisihan untuk disk I / O.

Namun kinerja disk sering menjadi hambatan pada server SQL dan lebih sulit daripada hal-hal lain seperti RAM untuk ditingkatkan nanti (jika Anda memiliki server yang tidak sepenuhnya diisi dengan DIMM).

Ada sejumlah komentar tentang RAID5 yang lambat, tapi saya akan mengatakan ini tidak selalu terjadi, jadi berhati-hatilah sebelum membuat pernyataan. Server yang benar-benar canggih dengan kartu RAID yang cepat dan banyak BBWC terkadang berjalan jauh lebih cepat di RAID5 (atau RAID50 dengan> 4 disk) daripada di RAID10 ...

Selama bertahun-tahun saya secara pribadi mengalami susunan RAID5 yang lambat, tetapi setelah melakukan pembandingan DL360 G5 dengan 4 cakram SAS 146G pada ~ 2009, kami harus memeriksa ulang pengujian kami. Memang, array berjalan lebih cepat dengan RAID5 daripada RAID10 di hampir setiap pengujian. BBWC dan perhitungan paritas cepat memungkinkan server dapat menggunakan 4 disk jauh lebih efektif sebagai array RAID5 daripada RAID10. Beberapa tes menunjukkan throughput 50% lebih baik dengan RAID5, dan hampir tidak ada yang lebih lambat. Tes yang lebih lambat hanya mendapat potongan 5-10%.

Saya akan memperingatkan orang-orang yang membuat pernyataan selimut bahwa RAID5 lambat, semua orang mengatakannya secara online, tetapi itu tidak benar dalam setiap kasus.

Mat
sumber
-1

Anda memiliki campuran kantong permen untuk dipilih dan sangat tergantung pada apa rasa yang Anda inginkan.

  1. DB akan memiliki konfigurasi ke permintaan cache dan di mana cache ini ada, memori atau hard drive.
  2. RAID 5 tidak selalu yang tercepat tetapi RAID 0 (JBOD) adalah garis dan cepat, karena RAID 5 juga merupakan garis ide yang hampir sama.
  3. RAID 1 tidak akan meningkatkan kecepatan Anda, itu hanya sebuah cermin.
  4. Kinerja SQL didasarkan pada Pengindeksan, dan merupakan hal pertama yang harus diperiksa. Sangat penting dalam database relasional.
  5. Jangan indeks semuanya, pengindeksan yang berlebihan juga dapat mengurangi kecepatan karena pengindeksan Anda menjadi terlalu dimuat.
  6. Terkadang dengan SQL Joins basis data menjadi lebih lambat. Menggunakan pemrograman untuk mengulang serangkaian hasil indeks minimal meningkatkan kecepatan.
  7. Server Virtual adalah mimpi buruk pada kecepatan jika Anda tidak membayar dolar.

Sederhananya berinvestasi dalam pengetahuan (gratis) sebelum membagikan uang tunai. 1. Pelajari konfigurasi untuk database Anda dan lihat konfigurasi Anda saat ini untuk mengoptimalkan. 2. Lihatlah pernyataan pemrograman dan sql, tes unit dengan skrip sederhana yang meniru operasi yang terlibat, bahkan mungkin bukan apa yang Anda pikirkan adalah masalahnya. JIKA skrip sederhana membutuhkan waktu menggunakan SQL Joins, bagilah dan lakukan hal yang sama dengan loop terprogram untuk melakukan hal yang sama. Ini adalah memori yang dapat membantu 3. Lihatlah paket hosting dan server. Gunakan ps aux di konsol linux dan lihat apakah ada sesuatu yang menyedot memori dan prosesor Anda.

Hard Drive absolut meningkatkan kecepatan tetapi tidak terserah Anda di ruang server virtual. Memori tidak meningkatkan kecepatan kecuali jika Anda mengkonfigurasi layanan untuk itu, titik. RAID Striped (0,5), RPM dan Synchronous Read / Write dengan bus cepat membantu itu. Prosesor inti dengan cache l1, l2, l3 yang baik akan membantu memproses bottleneck. dapatkah saya mendengarnya untuk Xeon!

Mark Allen
sumber
2
RAID1 benar-benar akan meningkatkan kecepatan dalam situasi membaca. Sebagian besar pengontrol cukup pintar untuk menggunakan beberapa spindel untuk membaca dari kumpulan data (identik) sekaligus. RAID0 adalah ide yang buruk karena Anda terbatas pada spindle pada suatu waktu.
Bryan Boettcher
-4

Secara keseluruhan, Anda harus mengingat ukuran dan skalabilitas. Meskipun Anda mungkin mulai dengan kebutuhan penyimpanan kecil, data Anda akan tumbuh dengan sangat cepat dan eksponensial. DB paling baik menggunakan data atom, yaitu data yang dipecah menjadi ukuran sekecil mungkin. Karena ukurannya yang kecil, ia bergerak lebih cepat di dalam gudang data. Kemudian, Anda juga memperhitungkan struktur DB. Di masa depan, Anda bisa menghubungkan ke luar DB, itulah sebabnya struktur juga penting. Dalam skenario ini, itu akan membuat sedikit perbedaan untuk permintaan Anda jika setengah dari data tinggal di luar mart data Anda. Ketika data ditanyai, intinya bukan menyimpan data yang tersimpan di RAM; melainkan, kueri harus cepat dalam mengakses dan mengembalikan data.

  • Anda benar-benar tidak selalu menggunakan RAID 5 untuk data. Itu tergantung pada data & kepentingannya, di samping apa yang sebelumnya disebutkan tentang cadangan. RAID 1 dapat digunakan dan.
  • Anda harus memutakhirkan semua server dalam kisaran kueri Anda untuk meningkatkan kecepatan. Karena banyak data berada di luar kendali Anda, itu akan menghambat di suatu tempat di luar mart data Anda. (Dalam hal Anda meningkatkan sendiri)
galaksi6
sumber
Wow, apakah Anda menyalinnya dari (kesalahpahaman) buku teks Anda?
adaptr
Ugh. Berapa kali orang harus diberi tahu bahwa RAID bukan solusi cadangan?
Cromulent