So sánh clustered index và non-clustered index trong SQL Server
Như tiêu đề câu hỏi ạ.
Mọi người cho em hỏi sự khác nhau giữa 2 loại index trên là gì ạ?
Khi nào thì nên dùng loại nào ạ?
Em cảm ơn.
sql server
indexing
Remain: 5
2 Answers
tvd12
Enlightened
tvd12
Enlightened
Câu này muốn trả lời thì bạn phải đi từ vấn đề "How the data is stored?" trong SQL Server. Bạn sẽ tìm hiểu được cái khái niệm Page, Leaf Page, Leaf node, B-Tree. Từ đó bạn sẽ hiểu được bản chất của Clustered index là một physical index được store ở Page Header (Metadata) và dùng để sorted các physical row của table trong B-tree. Ngược lại non-clustered index lại ko thuộc physical data của table mà được lưu trữ ở 1 vùng khác, đóng vai trò như pointer đến vùng row data. Từ 2 vấn đề lưu trữ index bạn sẽ rõ dc vì sao clustered chỉ duy nhất 1 trong table trong khi có nhiều non clustered index
Đây là hình 1 data của table được lưu trữ dạng vật lý trên disk nè. Nhìn vô đây sẽ hiểu được cách các row của 1 table nó lưu trữ thế nào, làm sao sql server có thể tìm nhanh dc dữ liệu:
<img src="https://stackask.com/wp-content/uploads/2021/09/cluster-index.jpeg" alt="" class="alignnone size-full wp-image-2114" />
Cái clustered index thực chất là để map giữa RowNo và sort các row đó như thế nào trong B-Tree
Còn cái non clustered thực chất là nằm ngoài bảng này, nó sẽ là pointer đến clustered index thôi
Johnathan Le-
1
monkey
Enlightened
monkey
Enlightened
Mình không biết dùng từ "so sánh" có đúng không, cá nhân mình nghĩ rằng 2 cái này sinh ra là để phục vụ cho 1 mục tiêu chung là truy vấn nhanh hơn.
1. clustered index<img src="https://stackask.com/wp-content/uploads/2021/09/index-clustered.png" alt="" class="alignnone size-full wp-image-2124" />
Có thể hiểu đơn giản là 1 B-Tree (cây) và key là trường id của table và value là toàn bộ thông tin của bản ghi tương ứng với id đó. Cái này mặc định phải có và thường là duy nhất trong 1 bảng.
2. non-clustered index<img src="https://stackask.com/wp-content/uploads/2021/09/non-clusterd.png" alt="" class="alignnone size-full-size wp-image-2125" />
Có thể hiểu đơn giản là 1 B-Tree (cây) với key là trường bạn muốn đánh index và value là id. Như vậy thì 1 bảng sẽ có thể đánh index thoải mái và không bị giới hạn. Tuy nhiên tìm kiếm sẽ phải trải qua 2 bước:
- Bước 1: tìm ra id của bản ghi theo giá trị trường bạn truyền vào
- Bước 2: tìm ra bản ghi theo id vừa tìm được
-
0