Archive for the ‘Performance tuning’ Category

 

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 »

Hàm Kiểu Bảng

Hàm kiểu bảng (table-valued function) là một loại hàm do người dùng định nghĩa, trong đó kết quả trả về là một cấu trúc kiểu bảng và bạn có thể sử dụng như một bảng thông thường, như SELECT hay JOIN với nó. Trong Management Studio, hàm kiểu bảng xuất hiện ở mục “Table-Valued Functions” ở bên trong “Functions”:

Hàm kiểu bảng được chia làm hai loại: in-line và multi-statement. Ta sẽ tìm hiểu cách viết hai loại này và sự khác biệt của chúng trong bài này. … đọc tiếp »

Posted on 25/6/2011 by Vũ Huy Tâm | Categories: Function, Performance tuning, SQL Server Programming

Một Vài Kiểu Viết Join

Bài viết này nhằm phản hồi lại comment của bạn NANIA trong bài Các Loại JOIN Trong SQL Server. Tôi đã có thể viết lại một comment, nhưng vì muốn kèm theo một vài hình, đồng thời nhận thấy đây là một pattern khá phổ biến khi lập trình T-SQL nên mới viết thành một bài riêng. Hy vọng có thể giúp một số bạn hiểu thêm về cơ chế hoạt động của bộ Optimizer. … đọc tiếp »

Posted on 15/3/2011 by Vũ Huy Tâm | Categories: Performance tuning, SQL Server Programming

UNION Hay UNION ALL

UNION và UNION ALL đều dùng để hợp hai tập bản ghi cùng cấu trúc, nhưng giữa hai mệnh đề có một khác biệt khá tinh tế: UNION loại bỏ các bản ghi trùng lặp trước khi trả lại kết quả, còn UNION ALL giữ lại tất cả các bản ghi từ hai tập ban đầu. … đọc tiếp »

Posted on 14/12/2010 by Vũ Huy Tâm | Categories: Performance tuning

Phân Đoạn Bảng Theo Chiều Dọc

Khi làm việc với một bảng rộng gồm rất nhiều cột, trong đó chỉ có một số cột được truy cập thường xuyên, bạn có thể tăng hiệu năng cho câu truy vấn trên các cột này bằng cách tách chúng ra một bảng riêng. Khi đó thay vì có một bảng rộng như ban đầu thì nay bạn có hai bảng: một bảng gồm nhóm các cột được dùng thường xuyên, và một bảng gồm các cột còn lại. Cả hai bảng đều chứa cột khóa chính để giữ liên hệ với nhau. Lúc này quan hệ giữa hai bảng là quan hệ 1-1. Trong trường hợp cần thiết, bảng ban đầu có thể được tách làm nhiều hơn hai bảng. Kỹ thuật này gọi là phân đoạn bảng theo chiều dọc (vertical partitioning). Nói nôm na là bổ dọc bảng thành nhiều mảnh. … đọc tiếp »

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

Các Cơ Chế Thực Thi Lệnh JOIN

Tiếp theo bài Các Loại JOIN Trong SQL Server, bài này giới thiệu về các cơ chế bên trong SQL Server sử dụng để xử lý các câu truy vấn JOIN. Về cơ bản khi thực hiện câu lệnh JOIN, SQL Server duyệt qua hai bảng tham gia vào, lấy ra từng cặp bản ghi để so sánh, rồi trả về tập kết quả nếu thỏa mãn điều kiện JOIN hoặc loại bỏ nếu không thỏa mãn. SQL Server cài đặt một vài thuật toán khác nhau, thích hợp với các tình huống khác nhau (như số lượng bản ghi cần so sánh nhiều hay ít, cột JOIN có index hay không…). Các thuật toán đó là Nested Loop Join, Merge Join, và Hash Join. … đọc tiếp »

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

Vì sao nên tránh viết SQL code trong ứng dụng

Trong ứng dụng khi cần tương tác với database, có lẽ một cách làm rất phổ biến là tạo lập một chuỗi chứa lệnh SQL, ghép các giá trị  nhập vào của người dùng thành một lệnh SQL hoàn chỉnh, rồi thực hiện chuỗi lệnh SQL đó. Như ví dụ dưới đây:

string cmdStr = "INSERT INTO Customer(Name, Address, Email, Phone) VALUES('" + txtName.Text + "', '" + txtEmail.Text + "','" + txtPhone.Text + "')";
conn.Open();
SqlCommand cmd = new SqlCommand(cmdStr, conn);
cmd.ExecuteNonQuery();

Cách làm này có ưu điểm tiện lợi, giúp quá trình phát triển code nhanh (không phải chuyển qua lại giữa Visual Studio và Management Studio). Tuy nhiên nó tiềm ẩn rất nhiều vấn đề (cách làm tối ưu là viết một thủ tục trong database rồi từ ứng dụng gọi thủ tục này và truyền các tham số cho nó): … đọc tiếp »

Kiểm Tra Bản Ghi Tồn Tại Với IF EXISTS

Trong một thủ tục, bạn muốn kiểm tra xem có bản ghi nào thỏa mãn một số điều kiện nhất định trong bảng hay không, và rẽ nhánh chương trình tùy theo kết quả kiểm tra. Bạn hãy làm thế này … đọc tiếp »

Posted on 21/4/2010 by Vũ Huy Tâm | Categories: Performance tuning, SQL Server Programming