2013-01-09 38 views
5

Trước khi bắt đầu, tôi đã đọc một số bài viết ở đây về những người trong quá trình thực hiện quá khứ đã thực hiện các câu lệnh/thủ tục SQL trong ADO và trong SSMS. Tôi đã dành phần tốt hơn trong ngày để tự mình giải quyết vấn đề này ... tái lập chỉ mục, sử dụng sp_recompile, thêm Option(Recompile) vào quy trình của tôi. Không có gì đã làm việc, vì vậy tôi chuyển sang cộng đồng để được trợ giúp.Hiệu suất của SQL Server trong ADO.NET vs SSMS

Tôi có một quy trình được lưu trữ mà một trong các ứng dụng web của tôi thực thi để chạy báo cáo. Thủ tục này đặc biệt được tạo thành từ phần lớn SQL động để cho phép các kết quả báo cáo khác nhau quay trở lại ... sắp xếp một tính năng báo cáo động trên trang web của tôi. Dù sao đi nữa, một số báo cáo có thể được chạy (sử dụng cùng một quy trình) và kết quả trở lại gần như ngay lập tức. Tuy nhiên, các tùy chọn khác có thể được sử dụng và quy trình có thể mất vài phút để chạy. Tuy nhiên, thủ công chạy thủ tục với những tùy chọn tương tự trong SSMS cho kết quả ngay lập tức. Nó giống như một số loại vấn đề bộ nhớ đệm kế hoạch, nhưng sau khi biên dịch lại các thủ tục và thêm WITH(RECOMPILE), nó vẫn chạy dreadfully chậm trong ADO.NET.

Vì vậy, tôi bắt đầu xem xét các cấu hình SQL, có lẽ một trong các lệnh "SET" mà ADO đang sử dụng đang gây ra sự cố. Tuy nhiên, sau khi sử dụng các lệnh SET chính xác, nó vẫn trả về gần như ngay lập tức bằng cách sử dụng SSMS.

Tôi đã thử sử dụng DBCC freeproccache và, DBCC freesystemcache để xóa mọi gói được lưu trữ, tuy nhiên điều này cũng không giúp ích gì.

Một điều khác mà tôi đã thử là lấy SQL động được tạo trong quy trình và chạy nó trực tiếp trong câu lệnh SqlCommand. Không có tham số ở đây, chỉ là SQL thuần túy. Một lần nữa nó chạy ngay lập tức trong SSMS nhưng mất mãi mãi trong ADO.NET.

Có cách nào (chạy ADO.NET) để xem gói được tạo không? Tôi có thể làm điều này trong SSMS, tuy nhiên điều đó sẽ không giúp tôi ở đây vì nó chạy tốt trong SSMS.

Nếu đó là của bất kỳ sự giúp đỡ, đây là câu lệnh SQL thô ...

SELECT sf.ID [FileID], sb.ID [BillID], sb.Client_BillID, sf.BobID [ClientID], c.Name [ClientName], c.Parent_ID [ParentID], pnt.Name [ParentName], Network_ID, Facility_Name, OON, sb.TaxID, Inpatient, sf.ProcessDate, sb.Reversed, sb.State, sb.Product, sb.FormType, n.Direct 
INTO #t1 FROM SubmitterFiles sf WITH(NOLOCK) 
INNER JOIN SubmitterBills sb WITH (NOLOCK) ON sf.ID = sb.FileID 
LEFT JOIN PPORecords r WITH (NOLOCK) ON sb.RecordID = r.ID 
LEFT JOIN PPONetworks n WITH (NOLOCK) ON r.Network_ID = n.ID 
LEFT JOIN PPOProviders p WITH (NOLOCK) ON r.Provider_ID = p.ID 
INNER JOIN Clients c WITH (NOLOCK) ON sf.BobID = c.ID 
LEFT JOIN Clients pnt WITH (NOLOCK) ON c.Parent_ID = pnt.ID 
WHERE sf.ProcessDate BETWEEN 'Dec 1 2012 12:00AM' and 'Dec 31 2012 12:00AM' 
AND ISNULL(sb.Status,'') NOT IN ('E','V') 
AND (c.Parent_ID IN (1989) or c.ID IN (1989)) 
; 

SELECT TOP 100 0 as [placeholder],NULL AS BillID, NULL AS Client_BillID, NULL AS DOS 
,NULL AS Network_ID 
,NULL AS Client_ID 
,NULL AS Client_Name 
,NULL As ProcessDate 
,NULL As ProcessMonth 
,NULL AS SubClientID 
,NULL AS SubClientName 
,Product 
,TaxID 
, FacilityName 
, LastName 
, FirstName 
,State 
,County 
,NULL As ProcCode 
,NULL As FormType 
,NULL As Inpatient, NULL AS Outpatient 
,COUNT(DISTINCT sb.BillID) AS [Total_Bills] 
,SUM(sl.Amount) AS [Total_Charges] 
,SUM(sl.StateSavings) AS [Total_StateSavings] 
,SUM(sl.PPOSavings) AS [Total_PPOSavings] 
,COUNT(DISTINCT TaxID) AS [Total_Unique_TaxIds] 
,0,0,0,0,0 
,COUNT(DISTINCT CASE WHEN sb.OON = 1 THEN sb.BillID ELSE NULL END) AS [Out_Bills] 
,SUM(CASE WHEN sb.OON = 1 THEN sl.Amount ELSE 0 END) AS [Out_Charges] 
,SUM(CASE WHEN sb.OON = 1 THEN sl.StateSavings ELSE 0 END) AS [Out_StateSavings] 
,COUNT(DISTINCT CASE WHEN sb.OON = 1 THEN sb.TaxID ELSE NULL END) AS [Out_Unique_TaxIds] 
,0,0,0,0,0 
,0,0,0,0,0 
FROM SubmitterLines sl WITH (NOLOCK, INDEX(IX_SubmitterLines_BillID)) 
INNER JOIN #t1 sb WITH(NOLOCK) ON sl.BillID = sb.BillID 
INNER JOIN SubmitterBillProviders sbp WITH(NOLOCK) ON sb.BillID = sbp.ID 
INNER JOIN SubmitterBillZipCounty sbc WITH(NOLOCK) ON sb.BillID = sbc.ID 
WHERE 1 = 1 
GROUP BY Product 
,TaxID 
,FacilityName, LastName, FirstName 
,State 
,County 
ORDER BY [Out_Bills] DESC 
+2

Trong tiêu đề 'ADO' trong thẻ' ADO.NET'. Xin vui lòng chính xác. –

+1

Tôi khuyên bạn nên bỏ qua SQL động trong sproc của bạn, nếu không kế hoạch thực hiện sẽ luôn tối ưu hóa cho nhiệm vụ. Tương tự như cách SQL không thể lập kế hoạch tốt trong việc thực thi các hàm vô hướng, SQL động sẽ luôn là một sự ngạc nhiên và hệ thống sẽ gặp khó khăn trong việc tối ưu hóa việc thực thi nó. –

+1

Darth - SQL động có vị trí của nó. Tôi biết nó sẽ không được tối ưu, tuy nhiên nó không có vẻ là nguyên nhân của vấn đề hiện tại. Việc trích xuất SQL và thực thi vẫn tái tạo vấn đề. – Brosto

Trả lời

1

Đây là một trong những vấn đề đã khiến tôi thức giấc đêm qua nên tôi bắt đầu lại tiếp tục mọi thứ. Nó cuối cùng đã tấn công tôi rằng trong SSMS, tôi có số hàng mặc định của tôi được đặt là 1000. Loại lỗi của tôi là khi tôi chạy một dấu vết trong SQL Profiler, điều này không hiển thị với các SET khác. Đặt ROWCOUNT trở lại 0 cho phép tôi tạo lại điều này trong SSMS cho phép tôi xem kế hoạch thực hiện và khắc phục sự cố khiến truy vấn chạy chậm.

Vào cuối ngày, đó không phải là vấn đề ADO - đó là cài đặt mà tôi đặt trong SSMS để giới hạn số hàng tôi thường muốn trả lại. Vì một phần truy vấn của tôi xây dựng một bảng tạm thời của một tập kết quả lớn hơn, bảng tạm thời đó chỉ được điền với 1000 hàng.

+1

Lưu ý liên quan cho người đọc trong tương lai từ đây http://msdn.microsoft.com/en-us/library/ms188774.aspx: rõ ràng Microsoft đang thực hiện một số thay đổi liên quan đến điều này trong các phiên bản tương lai của SQL Server: "Sử dụng SET ROWCOUNT sẽ không ảnh hưởng Các câu lệnh DELETE, INSERT và UPDATE trong bản phát hành kế tiếp của SQL Server. Tránh sử dụng SET ROWCOUNT với các câu lệnh DELETE, INSERT và UPDATE trong công việc phát triển mới và có kế hoạch sửa đổi các ứng dụng hiện đang sử dụng nó. " – Kprof

+0

@Kprof - Cảm ơn bạn đã chỉ ra điều đó. – Brosto

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