2011-12-31 32 views
6

gì là lựa chọn nhanh nhất để chèn các bản ghi vào cơ sở dữ liệu: sử dụng mà trong số này:PetaPoco Insert - Phương pháp nhanh nhất?

  • Database.Insert(poco)
  • Database.Insert(tableName, pkName, poco)
  • Database.Save(poco)
  • Database.Save(tableName, pkName, poco)

Cái nào tôi nên sử dụng cho lý do hiệu suất? Một tiện ích không kém phần thuận tiện với tôi hơn ...

Xin cảm ơn.

Trả lời

10

Tôi nên sử dụng loại nào vì lý do hiệu suất?

Các Database.Save phương pháp lấy giá trị của các trường tiểu học trọng sử dụng GetValue, sau đó gọi Database.Insert hoặc Database.Update cho phù hợp.

Do đó, bạn chỉ nên sử dụng Database.Save khi mã của bạn thực sự cần lưu các thay đổi trên đối tượng có thể mới hoặc có từ trước. Ngoài ra, lưu ý rằng bảng của bạn phải có cột khóa tự động gia tăng cho Database.Save để hoạt động.

Thậm chí không có sự khác biệt về hiệu suất nhỏ, tôi muốn sử dụng ngữ nghĩa chính xác - sử dụng Chèn hoặc Cập nhật qua Lưu.

Một là không kém thuận lợi với tôi hơn người kia ...

Đó không phải là thực sự đúng.

Database.Insert(poco) sẽ tìm giá trị cho tableNamepkName trong thuộc tính tùy chỉnh về định nghĩa lớp poco của bạn. Nếu bạn sử dụng các mẫu T4, các giá trị này sẽ được giữ đồng bộ với cơ sở dữ liệu của bạn tự động và chúng sẽ chỉ được chỉ định ở một vị trí. Mặt khác, nếu bạn vượt qua chúng trong mỗi phương thức gọi chúng sẽ được lặp lại vô số lần trong toàn bộ cơ sở mã của bạn. KHÔ. Nếu bạn cần thay đổi một trong các giá trị sau này thì sao?

Hiện tại, Database.Insert(poco) sẽ ít hoạt động hơn do tra cứu đó.Tuy nhiên, PetaPoco lưu trữ kết quả của tra cứu đó trong từ điển tĩnh, vì vậy tác động hiệu suất sẽ rất nhỏ sau lần tra cứu đầu tiên:

RWLock.EnterReadLock(); 
PocoData pd; 
try 
{ 
    if (m_PocoDatas.TryGetValue(t, out pd)) 
     return pd; 
} 
finally 
{ 
    RWLock.ExitReadLock(); 
} 
+0

Có, không thuận tiện cho tôi. .. ", những gì tôi đã làm để khắc phục nó là: http://blogs.msmvps.com/bmains/2011/12/31/helpful-petapoco-template-modifications/ Vi phạm DRY, vâng, nhưng tốt hơn cho hiệu suất theo điều này: http://www.toptensoftware.com/Articles/94/PetaPoco-More-Speed. Tôi có thể cố gắng để có những tùy biến một bước xa hơn nữa ... –

+0

@ BrianMains: Bạn có thực sự có nhu cầu ép thêm một chút tốc độ không? Tôi đã làm việc với các mẫu SubSonic tùy chỉnh trong một thời gian (chúng tôi vẫn sử dụng chúng trong một ứng dụng mà chúng tôi duy trì), và đó là một kéo. Trong mọi trường hợp, tôi nghĩ rằng tôi đã đặt ra sự cân bằng rõ ràng trong câu trả lời của tôi. Bạn chắc chắn có thể chọn tuyến đường nhanh hơn trên tuyến đường duy trì dễ dàng hơn, nhưng ít tập quán thực sự sẽ cần đến nó. Lợi ích lớn nhất sẽ là từ các hoạt động theo lô, các báo cáo đã chuẩn bị, các chỉ số thích hợp, v.v. –

+0

OK, cảm ơn cho đầu vào. –

3

Trong tất cả 4 của phương pháp bạn liệt kê, cho chèn, nó trông giống như PetaPoco luôn gọi phương thức của lớp cơ sở dữ liệu:

public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco) 

Database.Insert(tableName, pkName, poco) không số tiền ít nhất của công việc (nó là cơ bản chỉ là một phương pháp vượt qua), vì vậy tôi sẽ giả định nó là một với hiệu suất tốt nhất.

Đây là mã cho Insert(string, string, object):

public object Insert(string tableName, string primaryKeyName, object poco) 
{ 
    return Insert(tableName, primaryKeyName, true, poco); 
} 

Nó có lẽ sẽ là hơi (và unnoticeably) nhanh hơn để chỉ cần gọi sự quá tải Insert(string, string, bool, object) trực tiếp.

Các vấn đề liên quan