Trong bài viết này, mình cố gắng tổng hợp các kiến thức về Clustered và NonClustered thật đơn giản nhất có thể.
Dưới đây là cú pháp tạo Clustered và NonClustered
Cú pháp:>
-- Create a nonclustered index on a table or view
CREATE INDEX i1 ON t1 (col1);
-- Create a nonclustered index called IX_ProductVendor_VendorID
-- on the Purchasing.ProductVendor table using the BusinessEntityID column.
CREATE NONCLUSTERED INDEX IX_ProductVendor_VendorID
ON Purchasing.ProductVendor (BusinessEntityID)
-- Create a clustered index on a table and use a 3-part name for the table
CREATE CLUSTERED INDEX i1 ON d1.s1.t1 (col1);
-- Syntax for SQL Server and Azure SQL Database
-- Create a nonclustered index with a unique constraint
-- on 3 columns and specify the sort order for each column
CREATE UNIQUE INDEX i1 ON t1 (col1 DESC, col2 ASC, col3 DESC);
Trong SQL Server có 2 loại index chính:- Clustered Index
- Chỉ có 1 Clustered Index trong 1 table.
- Không đòi hỏi unique.
- Đây là dạng INDEX mà dữ liệu của bảng sẽ được sắp xếp một cách vật lý theo thứ tự. Chính vì vậy mà trong một bảng chỉ có duy nhất một Clustered Index.
- Dạng Index này sẽ lưu trực tiếp vào trong bảng theo trường được đánh INDEX.
- Thường được tạo ra khi bảng có Primary Key.
- Non-clustered Index
- Một non-clustered index sẽ được lưu ra một nơi hoàn toàn tách biệt so với bảng cơ sở.
- Nó sẽ không sắp xếp dữ liệu khi lưu.
- Một non-clustered index sẽ chứa giá trị của chỉ mục cùng với một con trỏ trực tiếp đến vị trí của hàng dữ liệu trong bảng.
Lưu ý là bạn không nên dùng varchar để tạo Index.
So sánh Clustered Index và NonClustered Index
Giả sử có 2 table giống nhau về data, 1 table đánh ClusteredIndex, 1 table sử dụng NonClusteredIndex, thì tốc độ truy vấn ở bảng có ClusteredIndex sẽ nhanh hơn so với bảng có NonClusteredIndex
Ví dụ: Tạo table Customer_NC, và sử dụng NonClustered Index ở cột CustomerId
SELECT *
INTO Customer_NC
FROM [Sales].[Customer]
GO
CREATE INDEX Idx_CustomerID_NC ON Customer_NC(CustomerID)
GO
So sánh tốc độ khi query trên table Customer
SELECT CustomerID, AccountNumber
FROM [Sales].[Customer] WHERE CustomerID = 27684
-- #2
SELECT CustomerID,AccountNumber
FROM Customer_NC WHERE CustomerID = 27684
Như phương án thực thi cho thấy, câu lệnh thứ nhất (có clustered index) chỉ có chi phí bằng một nửa so với câu lệnh thứ hai (nonclustered index), do câu lệnh thứ hai cần thêm thao tác bookmark lookup (RID lookup ở trong hình). Bạn có thể hình dung clustered index là một covering index với độ bao phủ là toàn bộ các cột trong bảng, nhưng không chiếm thêm không gian lưu trữ riêng cho index.
Tham khảo
giải thích giúp mình với "Lưu ý là bạn không nên dùng varchar để tạo Index."
Trả lờiXóaHiệu suất truy vấn kém. Mình chưa từng thử varchar, nhưng đã thử qua uniqueidentifier. Khi data lớn thì query rất chậm. Team mình ko hiểu tại sao, tới khi phát hiện vấn đề, chuyển về bigint thì tốc độ cải thiện rất nhiều
Trả lờiXóaThực tế trong dự án đang làm của mình, mình chỉ đánh index các field có kiểu dữ liệu int, bigint