Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kesalahan Umum DBA di MS SQL Server

Dalam artikel ini, kita akan meninjau kesalahan DBA, yang konsekuensinya cukup jelas dan harus saya tangani.

Tujuan artikel ini adalah untuk mencegah pengguna mengulangi kesalahan ini. Terkadang, pengalaman buruk bahkan lebih berharga daripada pengalaman positif.

  1. Peningkatan persentase file database
    Karena pertumbuhan file dari database merupakan operasi yang memakan banyak sumber daya, tampaknya pengaturan rasio persentase pertumbuhan ini bisa menjadi ide yang bagus. Saya setuju bahwa banyak pedoman merekomendasikan pengaturan kenaikan tetap dalam MB, daripada persentase. Namun, mereka tidak menjelaskan alasannya. Berdasarkan praktik, tidak disarankan untuk mengatur kenaikan file database di atas 1 GB, karena MS SQL Server akan mengalokasikan 1 GB 2 kali daripada 2 GB sekaligus.
    Juga, jika Anda mengalokasikan kurang dari 32 MB , cepat atau lambat database akan melambat. Jadi, lebih baik untuk mengatur kenaikan tetap pada file database dari 32 menjadi 1024 MB. Namun, mengapa tidak mungkin untuk menentukan peningkatan file database sebagai persentase? Ternyata begitu file kurang dari 1 MB, DBMS membulatkan nilai ini menjadi 0 MB dan berhenti menambah file ini. Akibatnya, sistem mati. Untuk mengetahui seberapa banyak kita perlu menambah file, cukup lakukan analisis harian untuk memeriksa berapa banyak setiap file bertambah dalam MB dan atur angka yang sesuai dalam kisaran 32 hingga 1024 MB. Kami dapat mengumpulkan statistik tentang pertumbuhan file database dengan cara berikut.
  2. Ada banyak kunci asing untuk sebuah tabel
    Pernahkah Anda mencoba memeriksa paket saat menghapus setidaknya satu baris dari tabel yang direferensikan oleh hampir ratusan tabel lainnya? Anda akan terkejut mengetahui berapa banyak loop bersarang yang ada. Semuanya adalah pemeriksaan kunci asing. Itu sebabnya jika tabel berukuran besar (lebih dari satu juta catatan), lebih baik menonaktifkan kunci asing untuk tabel yang datanya akan dihapus. Kemudian, Anda harus menghapus semua data yang diperlukan dan terkait. Setelah itu, aktifkan kunci asing. Situasi serupa terjadi dengan pembaruan dan penghapusan berjenjang. Jika ada banyak tautan eksternal (ratusan), menghapus satu baris saja dapat menyebabkan pemblokiran yang panjang dan sangat ekstensif.
  3. Banyak indeks yang tidak perlu
    Sangat sering, Anda dapat melihat dalam pedoman bahwa saat membuat kunci asing, perlu untuk membangun indeks, terutama saat menggunakan kunci ini untuk bergabung. Anda perlu memeriksa apakah indeks digunakan, jika tidak, indeks yang tidak perlu ini hanya akan memperlambat operasi modifikasi data apa pun. Untuk memeriksanya, gunakan kueri berikut:

    select DB_NAME(t.database_id)		as [DBName]
    	 , SCHEMA_NAME(obj.schema_id)	as [SchemaName]
    	 , OBJECT_NAME(t.object_id)		as [ObjectName]
    	 , obj.Type						as [ObjectType]
    	 , obj.Type_Desc				as [ObjectTypeDesc]
    	 , ind.name						as [IndexName]
    	 , ind.Type						as IndexType
    	 , ind.Type_Desc				as IndexTypeDesc
    	 , ind.Is_Unique				as IndexIsUnique
    	 , ind.is_primary_key			as IndexIsPK
    	 , ind.is_unique_constraint		as IndexIsUniqueConstraint
    	 , t.[Database_ID]
    	 , t.[Object_ID]
    	 , t.[Index_ID]
    	 , t.Last_User_Seek
    	 , t.Last_User_Scan
    	 , t.Last_User_Lookup
    	 , t.Last_System_Seek
    	 , t.Last_System_Scan
    	 , t.Last_System_Lookup
    from sys.dm_db_index_usage_stats as t
    inner join sys.objects as obj on t.[object_id]=obj.[object_id]
    inner join sys.indexes as ind on t.[object_id]=ind.[object_id] and t.index_id=ind.index_id
    where (last_user_seek	is null or last_user_seek		<dateadd(year,-1,getdate()))
    and (last_user_scan		is null or last_user_scan		<dateadd(year,-1,getdate()))
    and (last_user_lookup	is null or last_user_lookup		<dateadd(year,-1,getdate()))
    and (last_system_seek	is null or last_system_seek		<dateadd(year,-1,getdate()))
    and (last_system_scan	is null or last_system_scan		<dateadd(year,-1,getdate()))
    and (last_system_lookup is null or last_system_lookup	<dateadd(year,-1,getdate()))
    and t.database_id>4 and t.[object_id]>0 -- system databases are excluded

  4. Penggunaan sumber daya yang tidak efisien
    Sering disarankan untuk menyimpan log transaksi dan file database pada perangkat penyimpanan yang berbeda. Jika Anda menggunakan RAID 10 dengan 4 dan lebih banyak SSD-disk, maka tidak ada gunanya mengisolasi file satu sama lain. Untuk kecepatan yang lebih tinggi, jika perlu, database tempdb dapat disimpan pada disk yang terpisah dari RAM. Selain itu, jumlah RAM yang terlalu besar yang disediakan untuk DBMS akan membuat DBMS mengisi semua memori dengan rencana kueri yang tidak relevan.
  5. Cadangan buruk
    Itu selalu diperlukan tidak hanya untuk memeriksa cadangan yang dibuat, tetapi juga untuk memindahkannya ke tempat uji dan memulihkannya. Semua ini perlu diotomatisasi dengan pemberitahuan lebih lanjut kepada administrator tentang pemulihan yang bermasalah dan berhasil.
  6. Toleransi kegagalan yang buruk
    Sebelum membuat cluster dua atau lebih server, Anda perlu memastikan bahwa sistem penyimpanan data juga tahan terhadap kegagalan. Jika yang terakhir gagal, seluruh toleransi kegagalan akan dikurangi menjadi nol.
  7. Rumit diagnostik tanpa pemeriksaan sederhana
    Jika ada sistem downtime, pertama, Anda perlu memeriksa log MS SQL Server dan kemudian menggali lebih dalam. Anda harus terlebih dahulu melakukan pemeriksaan sederhana dan kemudian melanjutkan ke diagnostik yang kompleks.
  8. Tabel hilang
    Tabel dapat diperpanjang dengan data yang tidak perlu yang perlu diarsipkan ke dalam database terpisah atau dihapus. Selain itu, tabel tidak dapat digunakan lagi.

Ini adalah situasi yang saya temui. Oleh karena itu, saya sarankan untuk tidak mengulangi kesalahan di atas.

Apakah Anda ingin berbagi pengalaman atau kesalahan semacam itu saat mengelola basis data, jangan ragu untuk memberi tahu saya – saya akan dengan senang hati mendiskusikannya.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa melihat semua karakter khusus yang diizinkan di bidang varchar atau char di SQL Server?

  2. Validasi Email TSQL (tanpa ekspresi reguler)

  3. SQL Server Tunggu Acara -2

  4. SQL Server - Hapus semua karakter ASCII yang tidak dapat dicetak

  5. Bagaimana saya bisa menampilkan struktur tabel dalam kueri SQL Server?