Chuyển đến nội dung chính

Clustered và NonClustered trong SQL Server

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:
  1. 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. 
  2.  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

 

Nhận xét

  1. 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óa
  2. Hiệ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
    Thự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

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.