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

Kapan Menggunakan Indeks Clustered atau Non-Clustered di SQL Server

Indeks basis data digunakan untuk meningkatkan kecepatan operasi basis data dalam tabel dengan sejumlah besar catatan. Indeks database (baik indeks berkerumun dan indeks non-berkelompok) sangat mirip dengan indeks buku dalam fungsinya. Sebuah indeks buku memungkinkan Anda untuk langsung ke topik yang berbeda dibahas dalam buku. Jika Anda ingin mencari topik tertentu, Anda tinggal masuk ke index, cari nomor halaman yang berisi topik yang Anda cari dan kemudian bisa langsung menuju halaman tersebut. Tanpa indeks, Anda harus mencari seluruh buku.

Indeks database bekerja dengan cara yang sama. Tanpa indeks Anda harus mencari seluruh tabel untuk melakukan operasi database tertentu. Dengan indeks, Anda tidak perlu memindai semua catatan tabel. Indeks mengarahkan Anda langsung ke catatan yang Anda cari, secara signifikan mengurangi waktu eksekusi kueri Anda.

Indeks SQL Server dapat dibagi menjadi dua jenis utama:

  1. Indeks Terkelompok
  2. Indeks Non-Clustered

Pada artikel ini, kita akan melihat apa itu indeks berkerumun dan tidak berkerumun, bagaimana indeks itu dibuat dan apa perbedaan utama di antara keduanya. Kami juga akan melihat kapan harus menggunakan indeks berkerumun atau tidak berkerumun di SQL Server.

Mari kita mulai dengan indeks berkerumun.

Indeks Tergugus

Indeks berkerumun adalah indeks yang mendefinisikan urutan fisik di mana catatan tabel disimpan dalam database. Karena hanya ada satu cara di mana catatan disimpan secara fisik dalam tabel database, hanya ada satu indeks berkerumun per tabel. Secara default, indeks berkerumun dibuat pada kolom kunci utama.

Indeks Clustered Default

Mari kita buat tabel dummy dengan kolom kunci utama untuk melihat indeks berkerumun default. Jalankan script berikut:

CREATE DATABASE Hospital

CREATE TABLE Patients
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
age INT NOT NULL
)

Script di atas membuat database Rumah Sakit dummy. Database memiliki 4 kolom:id, nama, jenis kelamin, usia. Kolom id adalah kolom kunci utama. Ketika skrip di atas dijalankan, indeks berkerumun secara otomatis dibuat pada kolom id. Untuk melihat semua indeks dalam tabel, Anda dapat menggunakan prosedur tersimpan “sp_helpindex”.

USE Hospital
EXECUTE sp_helpindex Patients

Berikut adalah outputnya:

Anda dapat melihat nama indeks, deskripsi dan kolom di mana indeks dibuat. Jika Anda menambahkan catatan baru ke tabel Pasien, itu akan disimpan dalam urutan menaik dari nilai di kolom id. Jika rekaman pertama yang Anda sisipkan dalam tabel memiliki id tiga, rekaman akan disimpan di baris ketiga alih-alih baris pertama karena indeks berkerumun mempertahankan urutan fisik.

Indeks Tergugus Kustom

Anda dapat membuat indeks berkerumun Anda sendiri. Namun, sebelum Anda dapat melakukannya, Anda harus membuat indeks berkerumun yang ada. Kami memiliki satu indeks berkerumun karena kolom kunci utama. Jika kami menghapus batasan kunci utama, kluster default akan dihapus. Skrip berikut menghapus batasan kunci utama.

USE Hospital
ALTER TABLE Patients
DROP CONSTRAINT PK__Patients__3213E83F3DFAFAAD
GO

Skrip berikut membuat indeks kustom "IX_tblPatient_Age" pada kolom usia tabel Pasien. Karena indeks ini, semua catatan di tabel Pasien akan disimpan dalam urutan menaik usia.


use Hospital
CREATE CLUSTERED INDEX IX_tblPatient_Age
ON Patients(age ASC)

Sekarang mari kita tambahkan beberapa catatan dummy di tabel Pasien untuk melihat apakah mereka benar-benar dimasukkan dalam urutan usia:

USE Hospital

INSERT INTO Patients

VALUES
(1, 'Sara', 'Female', 34),
(2, 'Jon', 'Male', 20),
(3, 'Mike', 'Male', 54),
(4, 'Ana', 'Female', 10),
(5, 'Nick', 'Female', 29)

Dalam skrip di atas, kami menambahkan 5 catatan dummy. Perhatikan nilai untuk kolom usia. Mereka memiliki nilai acak dan tidak dalam urutan logis apa pun. Namun, karena kami telah membuat indeks berkerumun, catatan akan benar-benar dimasukkan dalam urutan nilai dalam kolom usia. Anda dapat memverifikasi ini dengan memilih semua catatan dari tabel Pasien.

SELECT * FROM Patients

Berikut adalah outputnya:

Anda dapat melihat bahwa catatan diurutkan dalam urutan nilai dalam kolom usia.

Indeks Non-Clustered

Indeks non-clustered juga digunakan untuk mempercepat operasi pencarian. Tidak seperti indeks berkerumun, indeks tidak berkerumun tidak secara fisik menentukan urutan catatan yang dimasukkan ke dalam tabel. Faktanya, indeks yang tidak berkerumun disimpan di lokasi terpisah dari tabel data. Indeks tidak berkerumun seperti indeks buku, yang letaknya terpisah dari isi utama buku. Karena indeks yang tidak berkerumun terletak di lokasi yang terpisah, dapat ada beberapa indeks yang tidak berkerumun per tabel.

Untuk membuat indeks non-cluster, Anda harus menggunakan pernyataan “CREATE NONCLUSTERED”. Sintaks lainnya tetap sama dengan sintaks untuk membuat indeks berkerumun. Skrip berikut membuat indeks non-clustered “IX_tblPatient_Name” yang mengurutkan record dalam urutan nama.

use Hospital
CREATE NONCLUSTERED INDEX IX_tblPatient_Name
ON Patients(name ASC)

Script di atas akan membuat indeks yang berisi nama pasien dan alamat catatan yang sesuai seperti yang ditunjukkan di bawah ini:

Nama Rekam Alamat
Ana Rekam Alamat
Jon Rekam Alamat
Mike Rekam Alamat
Nick Rekam Alamat
Sara Rekam Alamat

Di sini, "Alamat catatan" di setiap baris adalah referensi ke catatan tabel sebenarnya untuk Pasien dengan nama yang sesuai.

Misalnya, jika Anda ingin mengambil usia dan jenis kelamin pasien bernama "Mike", database pertama-tama akan mencari "Mick" di indeks non-cluster "IX_tblPatient_Name" dan dari indeks non-cluster itu akan mengambil referensi catatan aktual dan akan menggunakannya untuk mengembalikan usia dan jenis kelamin sebenarnya dari Pasien bernama “Mike”

Karena database harus melakukan dua pencarian, pertama di indeks non-cluster dan kemudian di tabel aktual, indeks non-cluster bisa lebih lambat untuk operasi pencarian. Namun, untuk operasi INSERT dan UPDATE, indeks non-clustered lebih cepat karena urutan record hanya perlu diperbarui di indeks dan bukan di tabel sebenarnya.

Kapan Menggunakan Indeks Clustered atau Non-Clustered

Sekarang setelah Anda mengetahui perbedaan antara indeks berkerumun dan tidak berkerumun, mari kita lihat skenario yang berbeda untuk menggunakan masing-masing indeks.

1. Jumlah Indeks

Ini cukup jelas. Jika Anda perlu membuat beberapa indeks di database Anda, gunakan indeks non-cluster karena hanya ada satu indeks clustered.

2. PILIH Operasi

Jika Anda ingin memilih hanya nilai indeks yang digunakan untuk membuat dan mengindeks, indeks non-cluster lebih cepat. Misalnya, jika Anda telah membuat indeks pada kolom "nama" dan Anda hanya ingin memilih nama, indeks yang tidak berkerumun akan segera mengembalikan nama tersebut.

Namun, jika Anda ingin memilih nilai kolom lain seperti usia, jenis kelamin menggunakan indeks nama, operasi SELECT akan lebih lambat karena pertama nama akan dicari dari indeks dan kemudian referensi ke catatan tabel yang sebenarnya akan digunakan untuk mencari usia dan jenis kelamin.

Di sisi lain, dengan indeks berkerumun karena semua catatan sudah diurutkan, operasi SELECT lebih cepat jika data dipilih dari kolom selain kolom dengan indeks berkerumun.

3. Operasi INSERT/UPDATE

Operasi INSERT dan UPDATE lebih cepat dengan indeks non-cluster karena catatan aktual tidak perlu diurutkan saat operasi INSERT atau UPDATE dilakukan. Sebaliknya hanya indeks non-cluster yang perlu diperbarui.

4. Ruang Disk

Karena, indeks non-cluster disimpan di lokasi yang terpisah dari tabel asli, indeks non-cluster mengkonsumsi ruang disk tambahan. Jika ruang disk menjadi masalah, gunakan indeks berkerumun.

5. Putusan Akhir

Sebagai aturan praktis, setiap tabel harus memiliki setidaknya satu indeks berkerumun lebih disukai pada kolom yang digunakan untuk MEMILIH catatan dan berisi nilai unik. Kolom kunci utama adalah kandidat ideal untuk indeks berkerumun.

Di sisi lain, kolom yang sering terlibat dalam kueri INSERT dan UPDATE harus memiliki indeks non-cluster dengan asumsi bahwa ruang disk tidak menjadi masalah.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 5 Trik untuk Memastikan Kinerja Puncak SQL Server

  2. Berurusan dengan kesalahan tingkat keparahan tinggi di SQL Server

  3. Jalankan Query Dinamis dengan go in sql

  4. Microsoft Mengumumkan SQL Server 2012 R2 dan SQL Server 2012 R3!

  5. SQL Server mengonversi string ke datetime