2009-07-03 56 views

Trả lời

11

Tôi nghĩ rằng lý do để sử dụng GetOrdinal() là để bạn có thể lưu trữ kết quả và sử dụng lại nó nhiều lần để thực hiện.

Ví dụ:

Dim reader As SqlClient.SqlDataReader 
int valueOrdinal = reader.GetOrdinal("value"); 
while (...) 
{ 
    var value = reader.GetString(valueOrdinal); 
} 
+0

Có ai có một ý tưởng về tác động của việc sử dụng hiệu suất GetOrdinal (..) bên trong vòng lặp liên tiếp so với ví dụ như hồi dữ liệu thực tế từ DB? –

+3

Tôi có một thử nghiệm performamce cho một dịch vụ Web API mà đọc khoảng 30-40 bản ghi từ DB được lưu trữ proc (với nhiều resultsets) và trả về Json có kích thước xấp xỉ 8K. Trong bài kiểm tra này, tôi đã thay thế tất cả các hằng số GetOrdinal() thành static int và kết quả là tôi nhận được tăng 2% hiệu suất ... do đó, bạn có nỗ lực tạo ra các loại tên cột như vậy không? - Tôi đoán ở hầu hết các cảnh quan không. Đọc dữ liệu từ DB và dữ liệu serialization đến Json trong thực scenarious sẽ ảnh hưởng đến hiệu suất nhiều hơn, vì vậy tôi nghĩ rằng bộ nhớ đệm của ordinals sẽ là điều cuối cùng để làm khi bạn đã tối ưu hóa mọi thứ khác ... –

5

GetOrdinal thực hiện tra cứu phân biệt chữ hoa chữ thường trước. Nếu không thành công, tìm kiếm không phân biệt chữ hoa chữ thường thứ hai được thực hiện. GetOrdinal là kana-width insensitive.Bởi vì tra cứu dựa trên thứ tự là hiệu quả hơn so với tra cứu được đặt tên, nó là không hiệu quả để gọi GetOrdinal trong vòng một vòng lặp. Tiết kiệm thời gian bằng cách gọi GetOrdinal một lần và gán kết quả cho một biến số nguyên để sử dụng trong vòng lặp.

Nguồn: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx

+8

Word for word copy and paste from http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getordinal.aspx ;-) – jpoh

+1

@jpoh, không có gì sai với điều đó, thường là. – Malfist

+5

Vâng, ít nhất là thuộc tính nó. – jpoh

1

Tôi chỉ muốn nói thêm rằng bối cảnh có bao nhiêu hồ sơ bạn đang mong đợi đóng một vai trò quan trọng bởi vì nếu bạn đang trở về một hàng duy nhất sau đó khác biệt hiệu suất giữa hai sẽ không đáng kể. Tuy nhiên nếu bạn đang looping qua nhiều hàng thì sử dụng accessor gõ là tốt hơn cho hiệu suất kể từ khi nó được tối ưu hóa. Vì vậy, trong trường hợp đó nếu bạn cần đạt hiệu suất tốt nhất bằng cách sử dụng tên cột thì hãy gọi GetOrdinal một lần, đặt nó vào một biến và sau đó sử dụng trình truy cập đã nhập với cột thứ tự trong vòng lặp của bạn. Điều này sẽ mang lại hiệu suất tốt nhất.

nếu bạn tò mò về sự khác biệt hiệu suất kiểm tra my blog post

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