2009-03-19 43 views
6

Tôi đã thực hiện truy vấn ~ 2 giây trong MSSMS (trả lại 25K hàng)Hiệu suất chậm của SqlDataReader

Truy vấn giống nhau được sử dụng trong .NET (sqlReader) xuất hiện vài phút!

Tôi cũng đã cố gắng để thực hiện chỉ đọc

(nhận xét tất cả các mã trong vòng lặp while chỉ để lại reader.Read()) - vẫn cùng!

Có ý tưởng gì không?

+0

Bạn có thể đăng một số mã không? –

+0

Trình lược tả truy vấn Sql có tiết lộ bất kỳ gợi ý nào về vấn đề này không? –

+0

EJB: mã không phải là để đăng. Vấn đề là giống nhau ngay cả khi chúng ta sử dụng lệnh đọc Execute reader (avaiable trong MS help) – Maciej

Trả lời

2

Tôi không phải là DBA và không được riêng tư để chơi với Profiler - sẽ hỏi DBA của tôi và cho mọi người biết.

Trong khi đó tôi chú ý tăng hiệu suất cần thiết sau khi thêm "VỚI biên dịch lại" param để SP Tôi đang nói

Vì vậy, từ quan điểm của tôi nó có vẻ là trường hợp với kế hoạch thực hiện ... Bạn nghĩ sao?

[EDIT] Ngoài ra những gì tôi đã kiểm tra được thực hiện dưới đây truy vấn từ QA và .NET

select @@options 

hiểu biết của tôi là nó sẽ trở lại cùng một giá trị cho cả environements. (Nếu không sử dụng các gói exnet khác nhau) Tôi có đúng không?

[EDIT2] Tôi đã đọc (từ http://www.sqldev.net/misc/fn_setopts.htm) mà ARITHABOIRT = ON trong QA (trong NET nó là off)

Liệu enybody biết làm thế nào để buộc ARITHABOIRT = ON cho mỗi. Kết nối NET?

+3

@Maciej - Bạn có thể SET ARITHABORT ON bằng cách thực hiện một lệnh với văn bản đó bằng cách sử dụng đối tượng Connection của bạn trước khi gọi ExecuteReader. Tùy chọn thiết lập sẽ có hiệu lực đối với tuổi thọ của kết nối đó. –

+0

Điều tương tự cũng xảy ra với tôi. SP nhấp nháy nhanh, cuộc gọi từ .NET đã được thực hiện mãi mãi. Tôi đã thêm SET ARITHABORT = ON và mọi thứ nhanh hơn ... – abx78

0

Tôi sẽ kiểm tra xem thời gian thực hiện truy xuất thực tế.

ví dụ:

Private Sub timeCheck() 
    'NOTE: Assuming you have a sqlconnection object named conn 

    'Create stopwatch 
    Dim sw As New System.Diagnostics.Stopwatch 

    'Setup query 
    Dim com As New SqlClient.SqlCommand("QUERY GOES HERE", conn) 

    sw.Start() 

    'Run query 
    Dim dr As SqlClient.SqlDataReader = com.ExecuteReader() 

    sw.Stop() 

    'Check the time 
    Dim sql_query_time As String = CStr((sw.ElapsedMilliseconds/1000)) & " seconds" 
    End Sub 

này sẽ cho phép bạn để xem liệu các tổ chức-up là trong việc thu hồi, hoặc trong việc thực hiện của người đọc.

0

Nếu bạn ar thi người đọc trong vòng một, nơi mà nó thực hiện nhiều lần, thì chắc chắn rằng bạn đang sử dụng CommandBehavior.CloseConnection

SqlCommand cmd = new SqlCommand(); 
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection) 

Nếu bạn không, mỗi lần vòng lặp xử lý dòng, khi nó kết thúc và rdr và đối tượng kết nối rơi ra khỏi phạm vi, đối tượng kết nối sẽ không được đóng một cách rõ ràng, vì vậy nó sẽ chỉ đóng và phát hành trở lại hồ bơi khi Garbage Collector cuối cùng được xung quanh để hoàn thành nó ...

Sau đó, nếu vòng lặp của bạn đủ nhanh, (rất có thể), bạn sẽ hết kết nối. (Hồ bơi có giới hạn tối đa mà nó có thể tạo ra)

Điều này sẽ gây thêm độ trễ và sự chậm trễ khi mã tiếp tục tạo thêm kết nối không cần thiết, (tối đa tối đa) và chờ GC bắt kịp với vòng lặp đang sử dụng chúng ...

+0

Câu hỏi ban đầu chỉ đề cập đến việc chạy một truy vấn có độ tuổi, không có gì về việc tạo nhiều đối tượng SqlConnection và thực hiện nhiều truy vấn. – sisve

+5

dude, truy vấn ban đầu đề cập đến một vòng lặp ... những gì đang xảy ra với mọi người trên trang web này? nó không phải là chức năng của bạn để xác định mọi nit nhỏ trong phản ứng của người khác. Trừ khi ai đó nói điều gì đó sai, hãy bình luận của bạn về một lưu ý tích cực xin vui lòng. –

+0

Tôi nghĩ Simon nghĩa là nó sẽ tốt đẹp nếu câu trả lời gợi ý có liên quan đến câu hỏi gốc. Anh ta đúng, câu hỏi ban đầu không liên quan gì đến các kết nối, nó phải làm với mã được thực hiện trong vòng lặp .Read(), có nghĩa là chỉ có một kết nối. Vì vậy, về mặt kỹ thuật bạn đã nói điều gì đó sai, trong đó bạn trả lời một câu hỏi mà không được hỏi. –

4

Tôi sẽ thiết lập một dấu vết trong SQL Server Profiler để xem cài đặt tùy chọn SET nào đang sử dụng khi kết nối từ mã .NET và cài đặt nào đang được sử dụng trong SSMS. Bằng cách thiết lập tùy chọn SET, ý tôi là

ARITHABORT 
ANSI_NULLS 
CONCAT_NULL_YIELDS_NULL 
//etc 

Hãy xem MSDN cho một bảng các tùy chọn

Tôi đã thấy vấn đề trước khi nơi các tùy chọn là khác nhau (trong trường hợp đó, ARITHABORT) và sự khác biệt hiệu suất là rất lớn.

0

Ngoài ra, trình phân tích truy vấn không tải xuống toàn bộ nội dung của văn bản lớn hoặc trường nhị phân lớn. SqlDataReader của bạn có thể mất nhiều thời gian hơn vì nó tải xuống toàn bộ nội dung.

3

Tôi đã gặp sự cố đó. Chọn cài đặt "abithmetic abort" trong Cài đặt kết nối của máy chủ DB.

+0

Trong trường hợp của bạn đã giúp kiểm tra hoặc bỏ chọn tùy chọn này? – Maciej

+0

Bạn muốn bật nó lên như vậy, 'MyCommand.CommnadText =" SET ARITHABORT ON; "+ MyCommand.CommnadText;' – JasonRShaver

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