Posts Tagged ‘Index’

 

Thứ Tự Xử Lý Điều Kiện Ở Mệnh Đề WHERE

Theo bạn các điều kiện trong mệnh đề WHERE được xử lý theo thứ tự nào, từ phải sang trái hay từ trái sang phải? Thực tế là, chúng không phải luôn luôn được xử lý theo một thứ tự nhất định như các ngôn ngữ khác. Chúng được xử lý theo cách SQL Server đánh giá là đạt hiệu quả cao nhất với từng câu lệnh. Nếu bạn viết code các điều kiện của mệnh đề WHERE dựa trên giả định chúng được xử lý theo thứ tự nào đó, bạn sẽ gặp tình huống câu lệnh bị lỗi khi thứ tự xử lý bị đảo ngược (ví dụ khi lượng dữ liệu thay đổi và/hoặc có thêm index mới được tạo…).
Ta hãy thực hiện thí nghiệm sau: … đọc tiếp »

Posted on 31/10/2012 by Vũ Huy Tâm | Categories: SQL Server Programming, Tip & Trick

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