Archive for the ‘Sql động’ Category

 

Có Phải SQL Động Luôn Luôn Chậm?

Gần đây tôi có tranh luận với một người cùng team xung quanh một chức năng của module quản lý nhóm khách hàng. Khi thảo luận về phần sql code, có hai phương án được đưa ra: dùng sql động, hoặc cố gắng dùng sql tĩnh. Dùng sql động thì code rất đơn giản, còn dùng sql tĩnh thì vòng vèo mà phải tạo thêm một số meta data để hỗ trợ. Anh chàng cùng team gợi ý dùng sql tĩnh, với lý do là dùng sql động làm giảm hiệu năng thực hiện.
Tuy đúng là sql động chậm hơn sql tĩnh, nhưng sự “chậm hơn” này nhiều hay ít còn phụ thuộc vào từng ngữ cảnh. Sql động yêu cầu câu lệnh được biên dịch lại mỗi khi thực hiện (còn tùy theo cách viết). Trong khi sql tĩnh có thể dùng lại phương án thực thi đã biên dịch cho đến khi bị loại khỏi cache. Vì thế tần suất thực hiện của câu lệnh càng lớn thì nhược điểm này của sql động càng bộc lộ rõ so với sql tĩnh. Ví dụ một câu lệnh được gọi liên tục từ trang chủ của một website thì sql động chắc không thích hợp. Tuy nhiên, khi tần suất thực hiện giảm xuống thì khác biệt giữa hai phiên bản cũng trở nên ít đáng kể đi. Như trong trường hợp tôi nêu ở trên, chức năng này được dùng khoảng 5 lần/1 tháng bởi vài ba user trong nội bộ công ty. Khi đó khả năng câu lệnh sql tĩnh có phương án thực thi lưu sẵn trong cache là zero (tôi không nhớ chính xác thời gian lâu nhất được lưu là bao nhiêu, nhưng là rất ngắn, hình như 30s). Do đó mỗi lần chức năng được gọi đến, câu lệnh sql tĩnh cũng sẽ được biên dịch lại y chang như câu lệnh động, không có gì nhanh hơn.
Tuy khi sử dụng sql động bạn còn có một vài điểm khác cần lưu ý, nhưng bạn nên cân nhắc cả các yếu tố tần suất thực hiện và độ phức tạp của từng phương pháp mà chọn cách làm cho phù hợp. Có thể trong một số trường hợp, sql động lại là cách làm ưu thế hơn cả.

Posted on 3/10/2011 by Vũ Huy Tâm | Categories: SQL Server Programming, Sql động

Sql Động

Khi bạn cần viết một thủ tục, trong đó tùy thuộc vào giá trị của các tham số đầu vào mà câu lệnh SQL cần thực hiện sẽ thay đổi, bạn cần tạo lập chuỗi lệnh SQL trong chương trình và thực thi chuỗi này. Chuỗi lệnh SQL đó được gọi là sql động.

Trong nhiều trường hợp SQL Server có thể thực hiện thẳng câu lệnh cùng với tham số được cung cấp, ví dụ:
SELECT * FROM dbo.KhachHang WHERE KhachHang_ID = @KhachHang_ID

Tuy nhiên có những tình huống không thể thực hiện thẳng được như vậy và bạn phải dùng sql động. Ví dụ khi có một tham số vào qui định tên bảng cần được truy vấn; hoặc khi bạn có một đoạn sql code lưu trữ trong database (như một biểu thức tính toán hoặc mệnh đề WHERE…) và bạn cần ghép vào thành một lệnh SQL hoàn chỉnh để thực thi. … đọc tiếp »

Posted on 11/8/2010 by Vũ Huy Tâm | Categories: SQL Server Programming, Sql động

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 »

Tìm Kiếm Với Nhiều Tham Số

Khi ta cần viết một thủ tục để tìm kiếm dữ liệu dựa vào các tham số đầu vào, ta có thể hình dung ra logic sẽ như sau:

IF @Param1 IS NOT NULL
SELECT... FROM dbo.Tblxxx WHERE Col1= @Param1
ELSE
SELECT TOP 200 ... FROM dbo.Tblxxx -- TOP 200 để khống chế số bản ghi khi không có tham số

Tức là khi tham số vào @Param1 được truyền giá trị thì ta lọc các bản ghi dựa trên giá trị đó, còn nếu không (NULL) thì ta không lọc. Tuy nhiên cách làm trên không thể mở rộng với nhiều tham số, vì số nhánh chương trình sẽ tăng rất nhanh (2^n). Ví dụ nếu ta có hai tham số @Param1 và @Param2, đoạn code sẽ giống như thế này:

IF (@Param1 IS NOT NULL) AND (@Param2 IS NOT NULL)
...
ELSE IF (@Param1 IS NOT NULL) AND (@Param2 IS NULL)
...
ELSE IF (@Param1 IS NULL) AND (@Param2 IS NOT NULL)
...
ELSE
...

Không những code rất cồng kềnh mà nó còn rất khó bảo trì. Nếu đến một lúc ta cần thêm một tham số thứ ba @Param3, sẽ tốn rất nhiều công để sửa lại và viết thêm vào đoạn code trên. Hoặc nếu cần thêm một cột vào kết quả đầu ra, ta sẽ phải thêm vào tất cả các nhánh của chương trình. Có thể nói cách làm trên là không khả thi trong đa số trường hợp.

Bài viết này giới thiệu hai cách làm có thể áp dụng trên thực tế, nhưng trước hết tôi nói qua về ví dụ sẽ được sử dụng trong bài. … đọc tiếp »

Posted on 20/5/2010 by Vũ Huy Tâm | Categories: SQL Server Programming, Sql động