0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Tăng Tốc Độ Thao Tác Dữ Liệu Với Dapper: Hướng Dẫn Bulk Insert, Bulk Update và Bulk Delete

Đăng vào 3 tuần trước

• 4 phút đọc

Chủ đề:

C#DatabaseDapper

Tăng Tốc Độ Thao Tác Dữ Liệu Với Dapper: Hướng Dẫn Bulk Insert, Bulk Update và Bulk Delete

Trong một ngày trời mát mẻ, tại kinh đô bên hồ Tây, một lập trình viên đang chật vật để hoàn thiện tính năng nhập dữ liệu cho phần mềm của mình. Nhiệm vụ của anh là chèn hàng nghìn bản ghi vào cơ sở dữ liệu. Thay vì xử lý một cách hiệu quả, anh chỉ ngồi đếm từng dòng dữ liệu chờ quá trình thực hiện xong.

Sau rất nhiều thời gian, anh nhận ra rằng phương pháp mình đang sử dụng khiến cho thời gian chèn dữ liệu trở nên rất lâu. Khi xem xét kỹ lưỡng, anh phát hiện ra rằng mình đang sử dụng thư viện Dapper với Dapper.Contrib, nhưng khi thực hiện thao tác chèn nhiều bản ghi, thư viện này lại xử lý từng bản ghi một, dẫn đến việc tạo ra nhiều round trip đến cơ sở dữ liệu và làm chậm quá trình.

Sự Khác Biệt Giữa Insert Thông Thường và Bulk Insert

Ví dụ, lệnh INSERT đơn giản như sau:

sql Copy
INSERT INTO USER(Name, Age)
VALUES ('Adam', 25);
INSERT INTO USER(Name, Age)
VALUES ('Kenny', 35);

Sẽ chậm hơn rất nhiều so với lệnh:

sql Copy
INSERT INTO USER(Name, Age)
VALUES ('Adam', 25),
       ('Kenny', 35);

Để cải thiện hiệu suất, anh đã tìm kiếm các thư viện hỗ trợ Bulk Insert và phát hiện ra thư viện Dapper-Plus. Tuy nhiên, chi phí sử dụng thư viện này khá cao và không phù hợp với ngân sách của một lập trình viên mới vào nghề. Thay vì bỏ ra một số tiền lớn, anh quyết định tự viết một giải pháp của riêng mình.

Hiệu Năng Chèn Dữ Liệu Bằng Bulk

Dưới đây là bảng so sánh hiệu suất giữa các phương pháp chèn, cập nhật và xóa dữ liệu với 500 bản ghi:

Phương Pháp SQL Server MySQL PostgreSQL SQLite
Insert 24900 ms 8600 5300 7900
Bulk Insert 111 ms 88 53 89
Update 9500 ms 22600 4800 6500
Bulk Update 889 ms 112 96 N/A
Delete 17200 ms 23800 5400 6100
Bulk Delete 194 ms 150 1200 115

Như có thể thấy, hiệu suất của các hàm BulkInsert, BulkUpdate, và BulkDelete nhanh hơn rất nhiều so với các phương thức thông thường, với tốc độ tăng từ vài chục đến 100 lần. Tuy nhiên, cần lưu ý rằng phương pháp update với SQLite vẫn chậm hơn, do chưa có cách nào hiệu quả hơn cho SQLite.

Các Bước Thực Hiện Bulk Insert, Update và Delete Đơn Giản

Để bắt đầu, bạn cần cài đặt gói NuGet:

Copy
dotnet add package Bulk.Dapper

Giả sử bạn có một lớp entity như sau:

csharp Copy
public class User
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

List<User> users = new List<User>
{
    new User { Name = "Joe", Age = 10 },
    new User { Name = "Donal", Age = 10 }
};

Thao Tác Chèn Dữ Liệu

  • Chèn bình thường:
csharp Copy
connection.BulkInsert(users);
  • Chèn bất đồng bộ:
csharp Copy
connection.BulkInsertAsync(users);

Thao Tác Cập Nhật Dữ Liệu

  • Cập nhật bình thường:
csharp Copy
connection.BulkUpdate(users);
  • Cập nhật bất đồng bộ:
csharp Copy
connection.BulkUpdateAsync(users);

Thao Tác Xóa Dữ Liệu

  • Xóa:
csharp Copy
connection.BulkDelete(users);
  • Xóa bất đồng bộ:
csharp Copy
connection.BulkDeleteAsync(users);

Thay Đổi Tên Bảng và Tên Cột

Bạn có thể thay đổi tên bảng và tên cột bằng cách sử dụng thuộc tính [Table][ColumnName] như sau:

csharp Copy
[Table("Users")]
public class UserChangeColumn
{
    [Key]
    public int Id { get; set; }

    [ColumnName("name")]
    public string Fullname { get; set; }
    public int Age { get; set; }
}

Kết Luận

Việc tối ưu hóa tốc độ thao tác dữ liệu với Dapper sẽ giúp nâng cao hiệu suất ứng dụng của bạn. Hy vọng rằng các hướng dẫn trên sẽ hữu ích cho bạn trong việc phát triển phần mềm. Nếu bạn thấy bài viết này hay, hãy ủng hộ mình bằng cách upvote. Nếu có thắc mắc, vui lòng để lại bình luận!

Chân thành cảm ơn bạn đã đọc bài viết này.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào