Navigasi · Tetapkan sebagai beranda · Tambahkan ke Favorit · Tencent Seluler · Beranda Tencent Berita Blog Forum Komentar Keuangan Sekuritas Dana Saham Hong Kong Hiburan Bintang Film Musik Olahraga Sepak Bola NBA Komprehensif Mobil Real Estat Peralatan Rumah Tangga Teknologi Unduhan Seluler Digital Emosi Wanita Pengasuhan Anak Fashion Belanja Perjalanan Membaca Asli Pendidikan Pergi ke Luar Negeri Game Anime Animasi Konstelasi Video Gambar Langsung Expo Amal Anak-anak Cakram Emas Cina Populer Baru yang Populer Kunjungi Dunia Penuh Warna Mode dan Barang Mewah Ponsel Terlaris Nasional Ikuti Daftar Peringkat untuk melihat selebriti mana yang berulang tahun hari ini. Lokasi Anda: Tencent Halaman Utama > Teknologi dan Digital > Berita Gulir Digital > Teks
Catch-21 untuk pengembangan database SQL Server http://digi.QQ.com 21 Desember 2009 09:43 Zhongguancun Online Jika Anda bertanggung jawab atas proyek berbasis SQL Server, atau Anda baru mengenal SQL Server, Anda mungkin memilikinya. menghadapi beberapa masalah kinerja basis data, dan artikel ini akan memberi Anda beberapa panduan berguna (sebagian besar juga dapat digunakan dengan DBMS lain).
Di sini, saya tidak akan memperkenalkan tip untuk menggunakan SQL Server, saya juga tidak dapat memberikan solusi yang dapat menyembuhkan semuanya. Yang saya lakukan hanyalah merangkum beberapa pengalaman tentang cara membentuk desain yang baik. Pengalaman ini berasal dari apa yang telah saya pelajari selama beberapa tahun terakhir, di mana saya telah melihat banyak kesalahan desain yang sama berulang kali.
1. Ketahui alat yang Anda gunakan
Jangan meremehkan hal ini, ini adalah poin paling kritis yang akan saya sampaikan dalam artikel ini. Mungkin Anda juga pernah melihat bahwa banyak programmer SQLServer tidak menguasai semua perintah T-SQL dan alat berguna yang disediakan oleh SQLServer.
"Apa? Saya akan membuang waktu sebulan untuk mempelajari perintah SQL yang tidak akan pernah saya gunakan???", Anda mungkin berkata. Benar, kamu tidak perlu melakukan ini. Namun Anda harus menghabiskan akhir pekan mempelajari semua perintah T-SQL. Tugas Anda di sini adalah memahami bahwa di masa depan, saat Anda mendesain kueri, Anda akan mengingat: "Omong-omong, ini adalah perintah yang dapat sepenuhnya mencapai fungsi yang saya perlukan", jadi buka MSDN untuk memeriksa sintaks yang tepat dari perintah ini.
Izinkan saya mengulanginya lagi: jangan gunakan kursor. Jika Anda ingin merusak kinerja keseluruhan sistem, ini adalah pilihan pertama Anda yang paling efektif. Kebanyakan pemula menggunakan kursor tanpa menyadari dampaknya terhadap kinerja. Mereka menyita ingatan, mengunci meja dengan cara yang aneh, dan bekerja seperti siput. Dan yang terburuk adalah, mereka dapat menjadikan semua optimasi kinerja yang dapat dilakukan DBA Anda setara dengan tidak melakukannya. Tahukah Anda bahwa setiap kali Anda menjalankan FETCH, Anda menjalankan perintah SELECT? Ini berarti jika kursor Anda memiliki 10.000 catatan, ia akan melakukan 10.000 SELECT! Akan jauh lebih efisien jika Anda menggunakan serangkaian SELECT, UPDATE atau DELETE untuk menyelesaikan pekerjaan terkait.
Pemula umumnya berpikir bahwa menggunakan kursor adalah cara pemrograman yang lebih familiar dan nyaman, namun sayangnya, hal ini dapat menyebabkan kinerja yang buruk. Jelas sekali, tujuan keseluruhan SQL adalah apa yang ingin Anda capai, bukan bagaimana caranya.
Saya pernah menulis ulang prosedur tersimpan berbasis kursor menggunakan T-SQL. Tabel hanya memiliki 100.000 catatan. Prosedur tersimpan asli membutuhkan waktu 40 menit untuk diselesaikan, tetapi prosedur tersimpan baru hanya membutuhkan waktu 10 detik. Di sini, saya pikir Anda seharusnya dapat melihat apa yang dilakukan oleh programmer yang tidak kompeten! ! !
Terkadang kita dapat menulis program kecil untuk mengambil dan memproses data serta memperbarui database, yang terkadang lebih efisien. Ingat: T-SQL tidak bisa berbuat apa-apa terhadap loop.
Izinkan saya mengingatkan Anda lagi: tidak ada manfaatnya menggunakan kursor. Saya belum pernah melihat sesuatu dilakukan secara efektif menggunakan kursor, kecuali untuk pekerjaan DBA.
3. Standarisasi tabel data Anda
Mengapa tidak menormalkan database? Mungkin ada dua alasan: alasan kinerja dan kemalasan belaka. Sedangkan untuk poin kedua, cepat atau lambat Anda harus membayarnya. Dan soal performa, Anda tidak perlu mengoptimalkan sesuatu yang tidak lambat sama sekali. Saya sering melihat programmer melakukan "de-normalisasi" suatu database karena alasannya adalah "desain aslinya terlalu lambat", namun sering kali akibatnya adalah mereka membuat sistem menjadi lebih lambat. DBMS dirancang untuk menangani database kanonik, jadi ingat: rancang database sesuai dengan persyaratan kanonikalisasi.
4. Jangan gunakan PILIH *
Ini tidak mudah untuk dilakukan, karena saya sudah mengetahuinya dengan baik, karena saya sendiri yang melakukannya sepanjang waktu. Namun, jika Anda menentukan kolom yang Anda perlukan di SELECT, ini akan memberikan manfaat berikut:
1 Kurangi konsumsi memori dan bandwidth jaringan
2 Anda bisa mendapatkan desain yang lebih aman
3 Berikan kesempatan kepada pengoptimal kueri untuk membaca semua kolom yang diperlukan dari indeks
Halaman 2: Pahami apa yang akan Anda lakukan dengan data Anda
Membuat indeks yang kuat untuk database Anda adalah hal yang baik. Namun melakukan hal ini hanyalah sebuah seni. Setiap kali Anda menambahkan indeks ke tabel, SELECT akan lebih cepat, tetapi INSERT dan DELETE akan jauh lebih lambat karena membuat dan memelihara indeks memerlukan banyak kerja ekstra. Tentu saja, kunci dari pertanyaannya di sini adalah: jenis operasi apa yang ingin Anda lakukan pada tabel ini. Masalah ini tidak mudah untuk dipahami, terutama jika menyangkut DELETE dan UPDATE, karena pernyataan ini sering kali berisi perintah SELECT di bagian WHERE.
6. Jangan membuat indeks pada kolom “Gender”.
Pertama, kita harus memahami bagaimana indeks mempercepat akses ke tabel. Anda dapat menganggap indeks sebagai cara membagi tabel berdasarkan kriteria tertentu. Jika Anda membuat indeks pada kolom seperti "gender", Anda cukup membagi tabel menjadi dua bagian: pria dan wanita. Anda berhadapan dengan tabel dengan 1.000.000 catatan. Apa pentingnya pembagian ini? Ingat: mempertahankan indeks memakan waktu. Saat Anda mendesain indeks, harap ikuti aturan ini: urutkan kolom dari yang terbanyak hingga yang terkecil sesuai dengan jumlah konten berbeda yang mungkin terdapat pada kolom tersebut, seperti: nama + provinsi + jenis kelamin.
7. Gunakan transaksi
Silakan gunakan transaksi, terutama ketika pertanyaan memakan waktu. Jika ada yang tidak beres dengan sistem Anda, ini akan menyelamatkan hidup Anda. Umumnya, pemrogram dengan pengalaman tertentu akan memahami bahwa Anda sering menghadapi beberapa situasi tak terduga yang akan menyebabkan prosedur tersimpan terhenti.
8. Waspadai kebuntuan
Akses tabel Anda dalam urutan tertentu. Jika Anda mengunci tabel A terlebih dahulu dan kemudian mengunci tabel B, tabel tersebut harus dikunci dalam urutan ini di semua prosedur tersimpan. Jika Anda (secara tidak sengaja) mengunci tabel B terlebih dahulu dan kemudian mengunci tabel A dalam prosedur tersimpan, hal ini dapat menyebabkan kebuntuan. Jika urutan penguncian tidak dirancang secara rinci sebelumnya, kebuntuan tidak mudah dideteksi.
Pertanyaan yang sering diajukan adalah: Bagaimana cara cepat menambahkan 100.000 catatan ke ComboBox? Ini tidak benar dan Anda tidak bisa dan tidak perlu melakukan ini. Ini sangat sederhana. Jika pengguna Anda harus menelusuri 100.000 catatan untuk menemukan catatan yang dia butuhkan, dia pasti akan mengutuk Anda. Di sini, yang Anda butuhkan adalah UI yang lebih baik dan Anda tidak perlu menampilkan lebih dari 100 atau 200 catatan kepada pengguna Anda.
Dibandingkan dengan kursor sisi server, kursor sisi klien dapat mengurangi overhead server dan jaringan serta mengurangi waktu penguncian.
11. Gunakan kueri parameter
Terkadang, saya melihat pertanyaan seperti ini di forum teknis CSDN: "SELECT * FROM aWHEREa.id='A'B, pengecualian terjadi karena permintaan kutipan tunggal, apa yang harus saya lakukan?", dan jawaban umum adalah: gunakan dua Kutipan tunggal, bukan tanda kutip tunggal. Ini salah. Ini mengatasi gejalanya, bukan akar permasalahannya, karena Anda juga akan menemui masalah serupa dengan karakter lain, belum lagi akan menyebabkan bug yang serius. Selain itu, ini juga akan mencegah sistem buffering SQL Server berfungsi sebagaimana mestinya. Dengan menggunakan parameter query, semua masalah ini hilang.
12. Gunakan database data yang besar saat mengkode program
Basis data pengujian yang digunakan oleh pemrogram dalam pengembangan umumnya tidak memiliki data dalam jumlah besar, namun seringkali pengguna akhir memiliki data dalam jumlah besar. Pendekatan kami yang biasa salah, dan alasannya sangat sederhana: harga hard drive saat ini tidak terlalu mahal, tetapi mengapa masalah kinerja tidak diketahui sampai masalah tersebut tidak dapat diperbaiki lagi?
13. Jangan gunakan INSERT untuk mengimpor data dalam jumlah besar
Tolong jangan lakukan ini kecuali benar-benar diperlukan. Gunakan UTS atau BCP sehingga Anda mendapatkan fleksibilitas dan kecepatan dalam satu kesempatan.
14. Perhatikan masalah batas waktu
Saat menanyakan database, nilai default database umum relatif kecil, seperti 15 detik atau 30 detik. Beberapa kueri membutuhkan waktu lebih lama untuk dijalankan, terutama ketika jumlah data dalam database terus meningkat.
Halaman 3: Jangan abaikan masalah memodifikasi catatan yang sama pada waktu yang sama
15. Jangan abaikan masalah memodifikasi record yang sama pada waktu yang bersamaan
Terkadang, dua pengguna akan mengubah catatan yang sama pada waktu yang sama. Dengan cara ini, jika pengubah terakhir mengubah operasi pengubah sebelumnya, beberapa pembaruan akan hilang. Menangani situasi ini tidaklah sulit: buat kolom stempel waktu, periksa sebelum menulis, gabungkan modifikasi jika diizinkan, dan tanyakan kepada pengguna jika ada konflik.
16. Saat memasukkan record ke dalam tabel detail, jangan jalankan SELECT MAX(ID) di tabel utama
Ini adalah kesalahan umum yang menyebabkan kesalahan saat dua pengguna memasukkan data secara bersamaan. Anda dapat menggunakan SCOPE_IDENTITY, IDENT_CURRENT dan IDENTITY. Jika memungkinkan, jangan gunakan IDENTITY karena dapat menimbulkan masalah dengan adanya trigger (lihat pembahasan di sini).
17. Hindari menyetel kolom sebagai NULLable
Jika memungkinkan, Anda harus menghindari membuat kolom NULLable. Sistem akan mengalokasikan byte tambahan untuk setiap baris kolom NULLable, yang akan menyebabkan lebih banyak overhead sistem saat melakukan kueri. Selain itu, membuat kolom NULLable mempersulit pengkodean karena kolom ini harus diperiksa setiap kali diakses.
Saya tidak mengatakan NULLS adalah sumber masalah, meskipun beberapa orang berpendapat demikian. Saya pikir membuat kolom NULLable terkadang dapat bekerja dengan baik jika Anda memiliki "data nol" yang diizinkan dalam aturan bisnis Anda, tetapi menggunakan NULLable dalam situasi seperti di bawah ini akan menimbulkan masalah.
Nama Pelanggan1
Alamat Pelanggan1
Email Pelanggan1
Nama Pelanggan2
Alamat Pelanggan2
Email Pelanggan3
Nama Pelanggan1
Alamat Pelanggan2
Email Pelanggan3
Jika ini terjadi, Anda perlu menormalkan tabel Anda.
18. Usahakan untuk tidak menggunakan tipe data TEXT
Jangan gunakan TEXT kecuali Anda berurusan dengan kumpulan data yang sangat besar. Karena tidak mudah untuk query, lambat, dan akan membuang banyak ruang jika tidak digunakan dengan benar. Secara umum, VARCHAR dapat menangani data Anda dengan lebih baik.
19. Usahakan untuk tidak menggunakan tabel sementara
Cobalah untuk tidak menggunakan tabel sementara kecuali Anda benar-benar harus melakukannya. Umumnya, subkueri dapat digunakan sebagai pengganti tabel sementara. Menggunakan tabel sementara akan menimbulkan overhead sistem, dan jika Anda memprogram dengan COM+, itu juga akan membawa Anda banyak masalah, karena COM+ menggunakan kumpulan koneksi database dan tabel sementara ada dari awal hingga akhir. SQL Server menyediakan beberapa alternatif, seperti tipe data Tabel.
20. Belajar menganalisis dan menanyakan
SQL Server Query Analyzer adalah teman terbaik Anda, yang melaluinya Anda dapat memahami bagaimana kueri dan indeks memengaruhi kinerja.
21. Gunakan integritas referensial
Mendefinisikan kunci utama, batasan unik, dan kunci asing dapat menghemat banyak waktu.