Archive for the ‘Index’ Category

 

Partition Bảng Đã Có Sẵn

Trong loạt bài về phân đoạn bảng và index, tôi đã giới thiệu về kiến trúc phân đoạn của SQL Server. Các ví dụ nêu trong các bài đó đều sử dụng bảng được tạo lần đầu và áp dụng phân đoạn lên nó. Một câu hỏi thường gặp là, làm thế nào để phân đoạn một bảng đã có sẵn dữ liệu? Bảng này có thể chưa được phân đoạn, hoặc đã được phân đoạn theo một cách khác, nay bạn muốn phân đoạn lại theo cách hợp lý hơn.
Có một cách làm thực ra rất đơn giản mà nếu bạn để ý một tẹo là thấy ngay, đó là trong SQL Server clustered index chính là bảng, nói cách khác là bảng được lưu trữ thành một cây index và cây này chính là clustered index. Vì vậy để phân đoạn bảng bạn chỉ việc phân đoạn clustered index của nó, bằng cách tạo lại clustered index trên partition scheme. … đọc tiếp »

Posted on 31/10/2013 by Vũ Huy Tâm | Categories: Database Administration, Index, Table partitioning

Tham Số Fill Factor

Trong buổi Seminar lần trước, có bạn đã hỏi ý nghĩa của tham số FILL FACTOR là gì và sử dụng nó có ý nghĩa như thế nào. Bẵng đi gần 2 năm, gần đây tôi có làm việc lại với SQL Server và đụng chạm đến tham số này.

I. Rebuild và Reorganize Index

Với những bảng có sử dụng Index mà những thao tác cập nhật, thêm dữ liệu (UPDATE, INSERT) xảy ra nhiều thì những Index trên bảng đó sẽ bị phân mảnh. Sự phân mảnh của Index được chia làm 2 loại:
Internal Fragmentation: Khi trang nhớ (Page) lưu Index có nhiều khoảng trống, dẫn đến việc SQL Server sẽ phải mất thêm nhiều chi phí (cần phải đọc nhiều trang hơn) khi quét qua toàn bộ Index.
Để dễ hình dung, bạn có thể hiểu nếu toàn bộ nội dung của Index có kích thước tương đương với 5 trang nhớ, nhưng mỗi trang nhớ chỉ lưu được 50%, như vậy cần tới 10 trang đế lưu index và bạn sẽ phải quét qua tổng cộng 10 trang này khi cần đọc toàn bộ index. Chi phí sẽ tăng lên gấp đôi so với trường hợp tối ưu. … đọc tiếp »

Index Partitioning

Với một bảng đã được phân đoạn, mỗi index được tạo ra theo mặc định được phân đoạn theo giống như bảng. Ví dụ bảng được phân đoạn theo năm của ngày giao dịch thì index cũng được phân đoạn theo cách đó. Index khi đó được gọi là aligned với bảng. Tuy nhiên bạn cũng có thể không phân đoạn cho index và để nó nguyên một khối, hoặc phân đoạn theo cách khác. Khi đó index được gọi là non-aligned.
Bạn hãy hình dung bảng như một cái bánh tét, và index là sợi lạt buộc xung quanh. Khi phân đoạn, chiếc bánh được cắt thành từng lát. Nếu sợi lạt cũng được cắt theo và mỗi sợi con giờ buộc xung quanh từng lát bánh, sợi lạt được gọi là aligned với chiếc bánh. Nếu sợi lạt không được cắt và vẫn bao xung quanh cả chiếc bánh to, sợi lạt được gọi là non-aligned với chiếc bánh.
SQL Server luôn ưu tiên phân đoạn index để nó aligned với bảng và luôn cố gắng phân đoạn khi có thể, vì nó đem lại nhiều thuận lợi cho các tác vụ trên bảng. Tuy nhiên khi đi vào chi tiết từng loại index, cách cư xử này được thể hiện qua những sắc thái khác nhau, ta sẽ xem xét kỹ hơn ở dưới đây. … đọc tiếp »

Posted on 7/5/2013 by Vũ Huy Tâm | Categories: Index, Table partitioning, Thiết kế database

Index Trên Trường BIT Có Lợi Gì Không

Câu trả lời ngắn là không. Câu trả lời dài hơn là nội dung của bài này.

Việc tạo index cung cấp thêm lựa chọn cho bộ Optimizer tìm các phương án thực thi khác nhau. Tuy nhiên quyết định có dùng index hay không phụ thuộc vào chi phí của phương án đó so với phương án không dùng index. Một yếu tố ảnh hưởng rất lớn đến chi phí dùng index đó là độ lựa chọn (selectivity, hay còn gọi là cardinality) của index. … đọc tiếp »

Posted on 29/12/2010 by Vũ Huy Tâm | Categories: Index

Clustered Index: Chọn Trường Nào

Do các đặc tính của clustered index, có một vài điểm bạn cần lưu ý khi chọn trường làm clustered index để có thể đạt hiệu quả tối ưu. Một ứng cử viên cho clustered index cần đạt được các chỉ tiêu sau:

Kích thước nhỏ: Nói chung với loại index nào thì bạn cũng nên chọn trường nhỏ để giảm kích thước của index. Với clustered index thì tiêu chí này càng quan trọng, vì khóa của nó được dùng trong tất cả các index khác (nonclustered) của bảng để làm con trỏ tới bản ghi. Ví dụ một trường VARCHAR(100) hay trường có kiểu dữ liệu xấp xỉ như FLOAT có lẽ cần được xem xét lại. Tốt nhất là một trường kiểu số nguyên (INT hoặc BIGINT) vì tìm kiếm theo số nguyên luôn nhanh hơn tìm kiếm theo chuỗi ký tự. Và mặc dù clustered index cho phép chứa nhiều trường (index phức hợp) nhưng bạn chỉ nên dùng một trường, cũng vì lý do giữ cho kích thước index nhỏ. … đọc tiếp »

Posted on 6/10/2010 by Vũ Huy Tâm | Categories: Index, Thiết kế database

Clustered Index

Clustered index là loại index theo đó các bản ghi trong bảng được sắp thứ tự theo trường index. Khi bảng được tạo clustered index thì bản thân nó trở thành một cây index, với các node lá chứa khóa là các trường được index và cũng đồng thời chứa tất cả các trường còn lại của bảng. Vì các bản ghi chỉ có thể được sắp xếp trên cây index theo một thứ tự nhất định nên mỗi bảng chỉ có thể có tối đa một clustered index. Bạn tạo clustered index như sau: … đọc tiếp »

Posted on 22/9/2010 by Vũ Huy Tâm | Categories: Index, Thiết kế database

Tạo Ràng Buộc Duy Nhất Bằng Filtered Index

Ràng buộc duy nhất (unique constraint) được xây dựng trong SQL Server hơi khác so với định nghĩa trong lý thuyết CSDL. Theo định nghĩa (và cũng được qui định trong chuẩn ANSI) thì ràng buộc duy nhất yêu cầu các giá trị phải khác nhau trừ khi chúng là NULL. Ví dụ nếu một bảng có 1000 bản ghi, và trường C có 800 bản ghi có các giá trị khác nhau, còn ở 200 bản ghi còn lại đều là NULL, thì vẫn thỏa mãn ràng buộc duy nhất.
SQL Server cũng yêu cầu các giá trị phải khác nhau nhưng đồng thời chỉ cho phép tối đa một giá trị NULL. Nói cách khác là nó coi NULL như một giá trị thông thường và hai bản ghi cùng NULL sẽ bị coi là trùng nhau: … đọc tiếp »

Posted on 5/8/2010 by Vũ Huy Tâm | Categories: Index

Tối Ưu Hóa Câu Lệnh Bằng Covering Index

Khi một non-clustered index được dùng để thực thi một câu lệnh, ta thường thấy trong kế hoạch thực thi thao tác Key Lookup (hoặc Bookmark Lookup), là thao tác mà hệ thống sau khi tìm kiếm trên cây index nhảy tới bản ghi tương ứng trong bảng để lấy các trường dữ liệu cần trả về:

USE AdventureWorks
GO
SELECT ContactID, FirstName, LastName
FROM  Person.Contact
WHERE EmailAddress = 'kristina1@adventure-works.com'

Ta thấy index IX_Contact_EmailAddress trên trường EmailAddress đã được sử dụng (thao tác Index Seek), và câu lệnh đạt được hiệu năng tốt hơn rất nhiều so với quét bảng khi không có index. Tuy nhiên thao tác Key Lookup ở đó vẫn chiếm tới một nửa chi phí câu lệnh. Một kỹ thuật có thể giúp tối ưu hơn nữa cho câu lệnh này, là loại bỏ Key Lookup bằng cách đưa các trường dữ liệu cần thiết vào cây index. Khi đó hệ thống chỉ cần tìm trên index và trả kết quả về cho câu lệnh mà không cần phải truy nhập vào bảng. Index lúc đó được gọi là covering index cho câu lệnh. … đọc tiếp »

Posted on 29/7/2010 by Vũ Huy Tâm | Categories: Index, Performance tuning

Để Dùng Được Index Trong Điều Kiện Tìm Kiếm Của Câu Lệnh

Trong một câu lệnh SQL, một điều kiện tìm kiếm ở mệnh đề WHERE được gọi là sargable (viết tắt từ Search Argument-Able) nếu index có thể được sử dụng khi thực hiện câu lệnh (giả sử cột tương ứng có index). Ví dụ, với câu lệnh sau:

SELECT *
FROM dbo.Customer
WHERE CustomerID = 1234

thì điều kiện “CustomerID = 1234″ là sargable, vì nó cho phép index trên cột CustomerID được sử dụng.
index giúp tăng hiệu năng của câu lệnh lên rất nhiều, việc viết code để sao cho các điều kiện tìm kiếm trở thành sargable là một mục tiêu rất quan trọng. Một nguyên tắc rất cơ bản trong SQL Server mà bạn có thể áp dụng trong rất nhiều trường hợp, đó là cột cần tìm phải đứng một mình ở một phía của biểu thức tìm kiếm, nói cách khác là không có hàm số hay phép tính toán nào áp dụng trên cột đó. Hãy xem xét hai câu lệnh dưới đây: … đọc tiếp »

Posted on 24/6/2010 by Vũ Huy Tâm | Categories: Index, Performance tuning

Index Giúp Tăng Hiệu Năng Thực Hiện Như Thế Nào

Index là phương tiện rất mạnh để tăng hiệu năng thực hiện của câu lệnh. Bài post này sẽ cung cấp một ví dụ cho bạn thấy bên trong SQL Server sử dụng index để  tăng hiệu năng như thế nào. … đọc tiếp »

Posted on 18/4/2010 by Vũ Huy Tâm | Categories: Index, Performance tuning