Tối ưu kết nối C# với SQL Server

Tối ưu kết nối C# với SQL Server

  1. Khai thác tối đa Connection đã tạo ra
  2. Tối ưu câu lệnh SQL
  3. Thực hiện truy vấn bất đồng bộ
  4. Sử dụng Transaction trong SQL khi nghiệm vụ nhiều luồng xử lý.
  5. Cấu hình timeout hợp lý tránh lãng phí tài nguyên
  6. Tối ưu cấu hình server

1. Khai thác tối đa Connection đã tạo ra

Còn có thuật ngữ hay dùng là Connection Pooling (gộp kết nối lại).
Khi có nghiệp vụ kết nối đến SQL Server, hãy đảm bảo rằng connection pooling (biến kết nối nào đang OPEN thì sử dụng chính nó, đừng tạo thêm kết nối mới)
Điều này giúp tái sử dụng kết nối, giảm thời gian kết nối.

csharp

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    // Thực hiện các thao tác với cơ sở dữ liệu 01
    // Thực hiện các thao tác với cơ sở dữ liệu 02
    // ..
    // Thực hiện các thao tác với cơ sở dữ liệu n
}

Ví dụ cách viết code lãng phí tài nguyên:
SqlConnection connection1 = new SqlConnection(connectionString);
connection1.doSQL("sql ....");
SqlConnection connection2 = new SqlConnection(connectionString);
connection2.doSQL("sql ....");
// Đoạn code trên tạo 2 connect, nhưng chỉ để thực hiện 2 đoạn sql gần nhau.

2. Tối ưu câu lệnh SQL

    2.1 Trong 1 table, cần lấy cột nào thì chọn cột đó, không nên chơi kiểu 'đại gia' nhé !

    Tránh sử dụng SELECT *.  , ngoài trừ cần thiết.
    Sử dụng chỉ mục: Tạo chỉ mục cho các cột thường xuyên được truy vấn.
    Sử dụng câu lệnh được chuẩn bị (Parameterized Queries): Giúp giảm nguy cơ SQL Injection và tối ưu hóa hiệu suất.

Ví dụ từ table chứng từ có 10 cột, nhưng ta chỉ cần lấy cột So,TenKhachHang,SoTien thì ta chỉ chọn 3 cột, chứ không *.

using (SqlCommand command = new SqlCommand("SELECT So,TenKhachHang,SoTien FROM ChungTuWHERE Nam= @value", connection))
{    command.Parameters.AddWithValue("@value", value); }

 

  2.2 Sử dụng nhiều câu select nếu xác định được nguồn trả về.

       Ví dụ: bạn cần lấy table KhachHang và NhomKhachHang
     Có 2 cách code
      Cách 1:
      DataTable dtKH = LibSQL("Select * from KhachHang");
      DataTable dtNhom = LibSQL("Select * from NhomKhachHang");
    * Cách này 2 lần connect SQL

      Cách 2:
      DataSet dsAll = LibSQL_dataset("Select * from KhachHang;Select * from NhomKhachHang");
    * Cách này 1 lần connect SQL
    ⇒Bạn tham khảo DataSet trong C# nhé 

      => Nếu là bạn thì nên chọn cách nào cách 1/ cách 2 để tối ưu kết nối.

Đặt câu hỏi code

  2.3 Sử dụng một số câu lệnh trong SQL

      Select TOP , phân trang dữ liệu.

3. Thực hiện truy vấn bất đồng bộ

Sử dụng các phương thức bất đồng bộ (async) để không làm tắc nghẽn luồng chính, cải thiện khả năng phản hồi của ứng dụng.

await connection.OpenAsync();
using (SqlCommand command = new SqlCommand("SELECT Column1 FROM Table", connection))
{
    using (SqlDataReader reader = await command.ExecuteReaderAsync())
    {
        // Xử lý dữ liệu
    }
}

4. Sử dụng Transaction trong SQL khi nghiệm vụ nhiều luồng xử lý.

Đảm bảo sử dụng transaction khi thực hiện nhiều thao tác liên quan để giữ tính toàn vẹn dữ liệu.


using (var transaction = connection.BeginTransaction())
{
    using (SqlCommand command = new SqlCommand("UPDATE Table SET Column1 = @value", connection, transaction))
    {
        command.Parameters.AddWithValue("@value", value);
        command.ExecuteNonQuery();
    }
    transaction.Commit();
}

5. Cấu hình timeout hợp lý tránh lãng phí tài nguyên

Đảm bảo cấu hình timeout cho kết nối và các lệnh sao cho hợp lý, tránh gặp phải tình trạng đợi quá lâu.

6. Tối ưu cấu hình server

Vấn đề này bạn cần giỏi về quản trị server / vps
Dừng các services của SQL / liên quan đến SQL không cần thiết.

Ví dụ: nếu như web app và server chung 1 IP / trên cùng server thì bạn nên tắt chức năng Share SQL nhé !

Tìm kiếm: khai thac toi da connection da tao ra;toi uu cau lenh sql;thuc hien truy van bat dong bo;su dung transaction trong sql khi nghiem vu nhieu luong xu ly.;cau hinh timeout hop ly tranh lang phi tai nguyen;toi uu cau hinh server;

Tối ưu kết nối C# với SQL Server