Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Khi nào sử dụng chỉ mục được phân cụm hoặc không được phân cụm trong SQL Server

Chỉ mục cơ sở dữ liệu được sử dụng để cải thiện tốc độ hoạt động của cơ sở dữ liệu trong một bảng có số lượng lớn các bản ghi. Chỉ mục cơ sở dữ liệu (cả chỉ mục theo nhóm và chỉ mục không được phân cụm) khá giống với chỉ mục sách về chức năng của chúng. Mục lục sách cho phép bạn đi thẳng vào các chủ đề khác nhau được thảo luận trong sách. Nếu bạn muốn tìm kiếm một chủ đề cụ thể, bạn chỉ cần vào mục lục, tìm số trang có chứa chủ đề mà bạn đang tìm kiếm và sau đó có thể đi thẳng đến trang đó. Nếu không có chỉ mục, bạn sẽ phải tìm kiếm toàn bộ cuốn sách.

Chỉ mục cơ sở dữ liệu hoạt động theo cách tương tự. Nếu không có chỉ mục, bạn sẽ phải tìm kiếm toàn bộ bảng để thực hiện một thao tác cơ sở dữ liệu cụ thể. Với các chỉ mục, bạn không cần phải quét qua tất cả các bản ghi bảng. Chỉ mục trỏ bạn trực tiếp đến bản ghi mà bạn đang tìm kiếm, làm giảm đáng kể thời gian thực hiện truy vấn của bạn.

Chỉ mục SQL Server có thể được chia thành hai loại chính:

  1. Chỉ mục được nhóm
  2. Các chỉ mục không được phân cụm

Trong bài viết này, chúng ta sẽ xem xét chỉ mục phân cụm và không phân cụm là gì, chúng được tạo ra như thế nào và sự khác biệt chính giữa hai chỉ mục này là gì. Chúng ta cũng sẽ xem xét khi nào sử dụng chỉ mục được phân cụm hoặc không phân cụm trong SQL Server.

Trước tiên, hãy bắt đầu với một chỉ mục theo nhóm.

Chỉ mục theo cụm

Chỉ mục được phân cụm là một chỉ mục xác định thứ tự vật lý trong đó các bản ghi bảng được lưu trữ trong cơ sở dữ liệu. Vì chỉ có thể có một cách để các bản ghi được lưu trữ vật lý trong một bảng cơ sở dữ liệu, nên chỉ có thể có một chỉ mục nhóm cho mỗi bảng. Theo mặc định, chỉ mục nhóm được tạo trên cột khóa chính.

Chỉ mục được nhóm mặc định

Hãy tạo một bảng giả với cột khóa chính để xem chỉ mục được nhóm mặc định. Thực thi tập lệnh sau:

CREATE DATABASE Hospital

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

Tập lệnh trên tạo một cơ sở dữ liệu giả Bệnh viện. Cơ sở dữ liệu có 4 cột:id, tên, giới tính, tuổi. Cột id là cột khóa chính. Khi tập lệnh trên được thực thi, một chỉ mục nhóm sẽ tự động được tạo trên cột id. Để xem tất cả các chỉ mục trong bảng, bạn có thể sử dụng quy trình được lưu trữ “sp_helpindex”.

USE Hospital
EXECUTE sp_helpindex Patients

Đây là kết quả:

Bạn có thể thấy tên chỉ mục, mô tả và cột mà chỉ mục được tạo. Nếu bạn thêm bản ghi mới vào bảng Bệnh nhân, bản ghi đó sẽ được lưu trữ theo thứ tự tăng dần của giá trị trong cột id. Nếu bản ghi đầu tiên bạn chèn vào bảng có id là ba, bản ghi sẽ được lưu trữ ở hàng thứ ba thay vì hàng đầu tiên vì chỉ mục được phân cụm duy trì thứ tự vật lý.

Chỉ mục được nhóm tùy chỉnh

Bạn có thể tạo chỉ mục nhóm của riêng mình. Tuy nhiên, trước khi bạn có thể làm điều đó, bạn phải tạo chỉ mục nhóm hiện có. Chúng tôi có một chỉ mục được nhóm lại do cột khóa chính. Nếu chúng ta loại bỏ ràng buộc khóa chính, cụm mặc định sẽ bị loại bỏ. Tập lệnh sau loại bỏ ràng buộc khóa chính.

USE Hospital
ALTER TABLE Patients
DROP CONSTRAINT PK__Patients__3213E83F3DFAFAAD
GO

Tập lệnh sau tạo chỉ mục tùy chỉnh “IX_tblPatology_Age” trên cột tuổi của bảng Bệnh nhân. Do chỉ số này, tất cả các bản ghi trong bảng Bệnh nhân sẽ được lưu trữ theo thứ tự tăng dần của tuổi.


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

Bây giờ, hãy thêm một vài bản ghi giả trong bảng Bệnh nhân để xem liệu chúng có thực sự được chèn theo thứ tự tăng dần của độ tuổi hay không:

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)

Trong tập lệnh trên, chúng tôi thêm 5 bản ghi giả. Lưu ý các giá trị cho cột tuổi. Chúng có giá trị ngẫu nhiên và không theo bất kỳ thứ tự logic nào. Tuy nhiên, vì chúng tôi đã tạo chỉ mục được phân cụm, các bản ghi sẽ thực sự được chèn theo thứ tự tăng dần của giá trị trong cột tuổi. Bạn có thể xác minh điều này bằng cách chọn tất cả các bản ghi từ bảng Bệnh nhân.

SELECT * FROM Patients

Đây là kết quả:

Bạn có thể thấy rằng các bản ghi được sắp xếp theo thứ tự tăng dần của các giá trị trong cột tuổi.

Chỉ mục không phân cụm

Chỉ mục không phân cụm cũng được sử dụng để tăng tốc hoạt động tìm kiếm. Không giống như chỉ mục được phân nhóm, chỉ mục không được phân cụm không xác định về mặt vật lý thứ tự mà các bản ghi được chèn vào bảng. Trên thực tế, một chỉ mục không phân cụm được lưu trữ ở một vị trí riêng biệt với bảng dữ liệu. Mục lục không phân cụm giống như mục lục sách, mục lục này nằm tách biệt với nội dung chính của cuốn sách. Vì các chỉ mục không được phân nhóm được đặt ở một vị trí riêng biệt, nên có thể có nhiều chỉ mục không được phân nhóm trên mỗi bảng.

Để tạo chỉ mục không phân cụm, bạn phải sử dụng câu lệnh “TẠO KHÔNG CHỈNH SỬA”. Phần còn lại của cú pháp vẫn giống như cú pháp để tạo chỉ mục được phân cụm. Tập lệnh sau tạo một chỉ mục không phân cụm “IX_tblPosystem_Name” sắp xếp các bản ghi theo thứ tự tăng dần của tên.

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

Tập lệnh trên sẽ tạo một chỉ mục chứa tên của các bệnh nhân và địa chỉ của các bản ghi tương ứng của họ như được hiển thị bên dưới:

Tên Địa chỉ Ghi
Ana Địa chỉ Bản ghi
Jon Địa chỉ Bản ghi
Mike Địa chỉ Bản ghi
Biệt hiệu Địa chỉ Bản ghi
Sara Địa chỉ Bản ghi

Ở đây, “Địa chỉ ghi” trong mỗi hàng là tham chiếu đến các bản ghi trên bảng thực tế cho Bệnh nhân có tên tương ứng.

Ví dụ:nếu bạn muốn truy xuất tuổi và giới tính của bệnh nhân có tên “Mike”, trước tiên cơ sở dữ liệu sẽ tìm kiếm “Mick” trong chỉ mục không phân cụm “IX_tblPatology_Name” và từ chỉ mục không phân nhóm, nó sẽ lấy tham chiếu bản ghi thực tế. và sẽ sử dụng thông tin đó để trả về tuổi và giới tính thực của Bệnh nhân có tên là “Mike”

Vì cơ sở dữ liệu phải thực hiện hai lần tìm kiếm, trước tiên trong chỉ mục không phân cụm và sau đó trong bảng thực tế, các chỉ mục không phân nhóm có thể chậm hơn cho các hoạt động tìm kiếm. Tuy nhiên, đối với các thao tác CHÈN và CẬP NHẬT, các chỉ mục không phân cụm sẽ nhanh hơn vì thứ tự của các bản ghi chỉ cần được cập nhật trong chỉ mục chứ không phải trong bảng thực tế.

Khi nào thì sử dụng chỉ mục được phân nhóm hoặc không được phân cụm

Bây giờ bạn đã biết sự khác biệt giữa chỉ mục được phân nhóm và không được phân nhóm, hãy xem các tình huống khác nhau để sử dụng từng chỉ mục.

1. Số chỉ mục

Điều này là khá rõ ràng. Nếu bạn cần tạo nhiều chỉ mục trên cơ sở dữ liệu của mình, hãy chọn chỉ mục không phân cụm vì chỉ có thể có một chỉ mục được phân nhóm.

2. Hoạt động CHỌN

Nếu bạn chỉ muốn chọn giá trị chỉ mục được sử dụng để tạo và lập chỉ mục, các chỉ mục không phân cụm sẽ nhanh hơn. Ví dụ:nếu bạn đã tạo một chỉ mục trên cột “tên” và bạn chỉ muốn chọn tên, các chỉ mục không phân cụm sẽ nhanh chóng trả về tên.

Tuy nhiên, nếu bạn muốn chọn các giá trị cột khác như tuổi, giới tính bằng cách sử dụng chỉ mục tên, thì thao tác CHỌN sẽ chậm hơn vì đầu tiên tên sẽ được tìm kiếm từ chỉ mục và sau đó tham chiếu đến bản ghi bảng thực tế sẽ được sử dụng để tìm kiếm. tuổi và giới tính.

Mặt khác, với các chỉ mục được phân nhóm vì tất cả các bản ghi đã được sắp xếp, hoạt động SELECT sẽ nhanh hơn nếu dữ liệu đang được chọn từ các cột khác với cột có chỉ mục được phân nhóm.

3. CHÈN / CẬP NHẬT Hoạt động

Thao tác CHÈN và CẬP NHẬT nhanh hơn với các chỉ mục không phân cụm vì các bản ghi thực tế không bắt buộc phải được sắp xếp khi thao tác CHÈN hoặc CẬP NHẬT được thực hiện. Thay vì chỉ có chỉ mục không phân cụm cần cập nhật.

4. Dung lượng đĩa

Vì các chỉ mục không được phân cụm được lưu trữ tại một vị trí riêng biệt so với bảng gốc, các chỉ mục không được phân cụm tiêu thụ thêm dung lượng đĩa. Nếu không gian đĩa có vấn đề, hãy sử dụng chỉ mục được phân cụm.

5. Phán quyết cuối cùng

Theo quy tắc chung, mọi bảng nên có ít nhất một chỉ mục được phân cụm tốt nhất là trên cột được sử dụng để CHỌN bản ghi và chứa các giá trị duy nhất. Cột khóa chính là một ứng cử viên lý tưởng cho một chỉ mục được phân nhóm.

Mặt khác, các cột thường liên quan đến các truy vấn CHÈN và CẬP NHẬT phải có chỉ mục không phân cụm với giả định rằng dung lượng đĩa không phải là mối quan tâm.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo công việc SQL Server tự động

  2. Hàm tính giá trị trung bình trong SQL Server

  3. Làm cách nào để lấy danh sách ID từ bảng SQL dưới dạng chuỗi giá trị được phân tách bằng dấu phẩy?

  4. Sử dụng câu lệnh UPDATE có điều kiện trong SQL

  5. SQL Server 2016:Tạo một dạng xem