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
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
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:
dotnet add package Bulk.Dapper
Giả sử bạn có một lớp entity như sau:
csharp
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
connection.BulkInsert(users);
- Chèn bất đồng bộ:
csharp
connection.BulkInsertAsync(users);
Thao Tác Cập Nhật Dữ Liệu
- Cập nhật bình thường:
csharp
connection.BulkUpdate(users);
- Cập nhật bất đồng bộ:
csharp
connection.BulkUpdateAsync(users);
Thao Tác Xóa Dữ Liệu
- Xóa:
csharp
connection.BulkDelete(users);
- Xóa bất đồng bộ:
csharp
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]
và [ColumnName]
như sau:
csharp
[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