v17 tutorial studio management gratuita espaƱol sql-server sql-server-2008 ado.net

sql-server - tutorial - ssms sql 2017 download



Rendimiento del servidor SQL en ADO.NET vs SSMS (2)

Antes de comenzar, he leído varias publicaciones aquí con respecto a las personas con problemas de desempeño anteriores que tuvieron la ejecución de sentencias / procedimientos SQL en ADO vs SSMS. Pasé la mayor parte del día tratando de resolver este problema por mi cuenta ... reindexando, usando sp_recompile , agregando Option(Recompile) a mi procedimiento. Nada ha funcionado, así que me dirijo a la comunidad en busca de ayuda.

Tengo un procedimiento almacenado que una de mis aplicaciones web ejecuta para ejecutar informes. Este procedimiento, en particular, se compone principalmente de SQL dinámico para permitir que vuelvan los diferentes resultados del informe ... una especie de función de informe dinámica en mi sitio. De todos modos, algunos informes se pueden ejecutar (utilizando el mismo procedimiento) y los resultados regresan casi de inmediato. Sin embargo, se pueden usar otras opciones y el procedimiento puede tardar varios minutos en ejecutarse. Sin embargo, ejecutar manualmente el procedimiento con esas mismas opciones en SSMS da resultados inmediatos. Suena como un tipo de problema de almacenamiento en caché de plan, pero después de WITH(RECOMPILE) compilar el procedimiento y agregar WITH(RECOMPILE) , sigue funcionando terriblemente lento en ADO.NET.

Así que comencé a buscar en los perfiles de SQL, quizás uno de los comandos "SET" que está utilizando ADO está causando el problema. Sin embargo, después de usar los mismos comandos exactos de SET todavía se devuelve casi de inmediato usando SSMS.

Traté de usar DBCC freeproccache y, DBCC freesystemcache para borrar cualquier plan almacenado, sin embargo, esto no ayudó también.

Otra cosa que probé fue tomar el SQL dinámico que se genera en el procedimiento y ejecutarlo directamente en la instrucción SqlCommand. No hay parámetros aquí, simplemente SQL. De nuevo, se ejecuta inmediatamente en SSMS, pero tarda una eternidad en ADO.NET.

¿Hay alguna manera (ejecutar ADO.NET) para ver el plan que se genera? Puedo hacer esto en SSMS, sin embargo eso no me ayudará aquí ya que funciona bien en SSMS.

Si es de alguna ayuda, aquí está la declaración SQL sin formato ...

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



Este fue uno de esos problemas que me mantuvieron despierto anoche, así que comencé a revisar todo nuevamente. Finalmente me di cuenta de que en SSMS, mi cuenta de fila predeterminada está establecida en 1000. Sin embargo, el tipo de errores que tengo es cuando ejecuté un rastreo en SQL Profiler, esto no apareció con los otros SET. Devolver el ROWCOUNT a 0 me permitió reproducir esto en SSMS, lo que me permite ver el plan de ejecución y solucionar el problema, lo que hace que la consulta se ejecute lentamente.

Al final del día, no fue un problema de ADO: fue una configuración que puse en SSMS para limitar el número de filas que normalmente me gustaría devolver. Como parte de mi consulta construye una tabla temporal de un conjunto de resultados más grande, esa tabla temporal solo se completó con 1000 filas.