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
Trong tiêu đề 'ADO' trong thẻ' ADO.NET'. Xin vui lòng chính xác. –
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ó. –
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