2015-12-09 20 views
6

Tôi có một tình huống thú vị. Khi tôi chạy một truy vấn trên máy chủ SQL từ xa trong Microsoft SQL Server Management Studio nó chạy nhanh (12 giây), nhưng khi tôi chạy cùng một truy vấn trong khung thực thể sử dụng DbContext.Database.SqlQuery<EntityType>(script) nó mất 48 giây.Hiệu suất đọc dữ liệu của khung thực thể

Tôi đã thử đặt set arithabort on. Cài đặt đã được áp dụng nhưng nó không thay đổi hiệu suất. Tôi không thể cung cấp kế hoạch thực hiện truy vấn, bởi vì tôi chỉ có quyền hạn chế trên máy chủ SQL. Nhưng tôi có thể nói 100% rằng đây không phải là vấn đề truy vấn.

xem xét truy vấn này:

declare @t table (...) 
insert into @t 
select <long query> 

select top 1 * from @t 

Biến @t chứa khoảng 35k hàng. Thời gian thực hiện khá giống với EF và SSMS. Nhưng khi tôi xóa top 1 thì điều kỳ lạ bắt đầu xảy ra. Trong SSMS tôi nhận được 10 giây, nhưng trong EF khoảng 40 giây.

Tôi đoán thử nghiệm nhỏ này có thể loại trừ khả năng SQL Server chọn kế hoạch thực hiện sai và làm chậm mọi thứ.

Một điểm đáng chú ý khác là thực thể thực hiện bởi EF. Tôi nghĩ rằng đây cũng không phải là một nút cổ chai, bởi vì khi tôi chạy một truy vấn tương tự với kết quả kích thước tương tự được thiết lập trên một SQL Express cục bộ - tôi nhận được kết quả gần như ngay lập tức trong cả hai trường hợp.

Vì vậy, dự đoán tiếp theo của tôi là sự cố mạng. Tôi đã cài đặt Microsoft Network Monitor 3.4 và theo dõi lưu lượng mạng cho cả SSMS và EF. Điều quan tâm tôi phát hiện ra là vì một số lý do có nhiều gói kích thước nhỏ hơn và cũng có một số gói TLS trong phiên bản EF. Trong kích thước gói phiên bản SSMS ổn định hơn và không có gói TLS.

Câu hỏi đặt ra là: có thể tăng tốc phiên bản EF không? Các gói TLS là gì, có thể loại bỏ chúng không?

SSMS traffic EF traffic

Cập nhật
Entity Framework v6.1.3
NET v4.5.1
SQL Server v10.50.2550.0
Local SQLExpress v12.0.4213.0
Windows 7 Pro

Cập nhật

using (var connection = new SqlConnection(DbContext.Database.Connection.ConnectionString)) 
using (var cmd = new SqlCommand(script, connection)) 
{ 
    connection.Open(); 

    cmd.CommandType = CommandType.Text; 
    using (SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     reader.Read(); 
     do 
     { 
     } while (reader.Read()); 
    } 
} 

Mã này mang lại kết quả tương tự về thời gian.

Trả lời

3

Tôi đã thực hiện một số nghiên cứu và thử nghiệm, và có vẻ như thêm tùy chọn packet size=32768 (đây là kích thước tối đa) để kết nối chuỗi có xu hướng tăng tốc độ đến hầu hết các cấp SSMS. Thật thú vị, các gói TCP mà tôi nhận được làm không phải là tăng kích thước của chúng.

Tôi cũng đã thử nghiệm với các tùy chọn chuỗi kết nối khác nhưng không nhận được bất kỳ tăng tốc độ đáng chú ý nào.

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