mi consulta es rápido en SSMS, sino que va en 1 hora en mi aplicación

votos
-1

Tengo un problema con una consulta lenta en mi aplicación, pero es tan rápido en SSMS. Después de ver alguna respuesta, me di cuenta de que el plan de ejecución parece ser diferente.

Noté que cuando uso SSMS algo se llama [Paralelismo (Répartition Streams)] se utiliza, pero no veo que en el plan de ejecución que viene de mi aplicación de C # (yo uso el Monitor de actividad en SSMS ver que). También, Cuando uso mi aplicación veo que la consulta aparece en la lista de activos Consultas caros, pero ese no es el caso cuando lo ejecuto desde el SSMS.

Voy a añadir mi consulta, pero tratar de ocultar un texto sólo para mi empresa privacidad:

SELECT  [REC_INVENT_LIST_ID]
      , ril.[NOTE_TYPE_ID]
      , ril.[TRANS_ID] 
      , [QUANTITIES]
      , [AMOUNT]
      , nt.[CU_TYPE]
      , nt.[CASH_TYPE]
      , nt.[NOTE_VALUE]
      , nt.[UNIT_ID]
      , t.RECYCLER_ID
FROM [D].[dbo].[RecyclerInventoryList] ril
JOIN [S].[dbo].[NoteType] nt ON nt.NOTE_TYPE_ID = ril.NOTE_TYPE_ID
JOIN [D].[dbo].[Transaction] t ON ril.TRANS_ID = t.TRANS_ID
WHERE QUANTITIES <> 0
AND ril.TRANS_ID IN (
        SELECT sub.TRANS_ID FROM (SELECT *, MAX(CREATE_DATE) 
        OVER(PARTITION BY t.RECYCLER_ID) AS _max
        FROM [D].[dbo].[Transaction] AS t
        WHERE TRANS_ID <= @lastTransId) AS sub
        WHERE CREATE_DATE = _max
                 )
ORDER BY t.RECYCLER_ID, CU_TYPE 

Lo que hice es:

1- Me trataron de quitar la parte donde dice WHERE TRANS_ID <= @lastTransIdpara asegurarse de que no es un problema de conversión de parámetros, pero eso no ayuda.

2- quité la parte donde dice WHERE CREATE_DATE = _maxllegué resultado de nuevo en la aplicación RÁPIDO !, pero no es el resultado que quiero. Esto donde es muy importante para mí.

3- utilicé el PERFIL DE SQL SERVER para ver cuál es la consulta exacta que trata de correr detrás de mis tiempos de espera de aplicación y los accidentes (1 hora de tiempo de espera de comandos) lo veo como esto

exec sp_executesql N'SELECT [REC_INVENT_LIST_ID], ril.[NOTE_TYPE_ID], ril.[TRANS_ID], [QUANTITIES], [AMOUNT], nt.[CU_TYPE], nt.[CASH_TYPE], nt.[NOTE_VALUE], nt.[UNIT_ID], t.[RECYCLER_ID] FROM[RCMDYNAMIC].[dbo].[RecyclerInventoryList] ril JOIN[RCMSTATIC].[dbo].[NoteType] nt ON nt.NOTE_TYPE_ID = ril.NOTE_TYPE_ID JOIN[RCMDYNAMIC].[dbo].[Transaction] t ON ril.TRANS_ID = t.TRANS_ID  WHERE QUANTITIES<> 0 AND ril.TRANS_ID IN (SELECT sub.TRANS_ID FROM (SELECT TRANS_ID, CREATE_DATE , MAX(CREATE_DATE) OVER(PARTITION BY t.RECYCLER_ID) AS _max FROM[RCMDYNAMIC].[dbo].[Transaction] AS t WHERE TRANS_ID <= @lastTransId ) AS sub WHERE CREATE_DATE = _max) ORDER BY t.RECYCLER_ID, CU_TYPE',N'@lastTransId int',@lastTransId=XXXXX

Cuando ejecuto esto en SSMS, sigue siendo muy rápido (milisegundos) y el plan de ejecución parece ser el mismo que cuando corro la consulta directamente de SSMS.

¿Algunas ideas?

EDITAR:

Mi código C #:

public Dictionary<int, List<RCMBalanceTransactionModel>> getBalanceTransactions(int transId) {

        SqlCommand command;
        SqlDataReader reader;
        command = new SqlCommand(getBalanceTransactionInfoQuery(), con);
        command.CommandTimeout = 3600;
        command.Parameters.AddWithValue(@lastTransId, transId);
        reader = command.ExecuteReader();


  //the rest is omitted the application is stuck here at ExecutedReader();
}
Publicado el 07/11/2018 a las 22:50
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Basado en su comentario de la otra respuesta, si usted está tratando de obtener la última TRANS_ID por recycler_id, probablemente podría hacerlo con la consulta a continuación. Esto supone que los ID se generan en orden. Usted podría hacer básicamente lo mismo con create_date también si usted puede estar seguro de que no hay dos transacciones de la misma reciclador tienen el mismo create_date. No estoy seguro de su objetivo de @lastTransId lo que es posible que tenga que añadir que a la cláusula where.

SELECT  
    [REC_INVENT_LIST_ID]
      , ril.[NOTE_TYPE_ID]
      , ril.[TRANS_ID] 
      , [QUANTITIES]
      , [AMOUNT]
      , nt.[CU_TYPE]
      , nt.[CASH_TYPE]
      , nt.[NOTE_VALUE]
      , nt.[UNIT_ID]
      , t.RECYCLER_ID
FROM 
    [D].[dbo].[RecyclerInventoryList] ril
    JOIN [S].[dbo].[NoteType] nt 
        ON nt.NOTE_TYPE_ID = ril.NOTE_TYPE_ID
    JOIN [D].[dbo].[Transaction] t 
        ON ril.TRANS_ID = t.TRANS_ID
    LEFT OUTER JOIN [D].[dbo].[Transaction] t2
        ON t.RECYCLER_ID = t2.RECYCLER_ID AND t.TRANS_ID < t2.TRANS_ID
WHERE
    t2.TRANS_ID IS NULL AND /* This is null only for t.TRANS_ID that have no records greater than itself, ie the latest one */
    QUANTITIES <> 0
ORDER BY 
    t.RECYCLER_ID, CU_TYPE 
Respondida el 08/11/2018 a las 02:43
fuente por usuario

votos
1

Traté de escribir la consulta, pero sin datos no estoy seguro si lo hizo bien

SELECT  [REC_INVENT_LIST_ID]
      , ril.[NOTE_TYPE_ID]
      , ril.[TRANS_ID] 
      , [QUANTITIES]
      , [AMOUNT]
      , nt.[CU_TYPE]
      , nt.[CASH_TYPE]
      , nt.[NOTE_VALUE]
      , nt.[UNIT_ID]
      , t.RECYCLER_ID
FROM [D].[dbo].[RecyclerInventoryList] ril
JOIN [S].[dbo].[NoteType] nt ON nt.NOTE_TYPE_ID = ril.NOTE_TYPE_ID
JOIN [D].[dbo].[Transaction] t ON ril.TRANS_ID = t.TRANS_ID
WHERE QUANTITIES <> 0
AND t.TRANS_ID <= @lastTransId
AND NOT EXISTS(SELECT 1 FROM [D].[dbo].[Transaction] AS t2 
    WHERE t2.RECYCLER_ID = t.RECYCLER_ID 
      AND t2.CREATE_DATE > t.CREATE_DATE 
          AND t2.TRANS_ID <= @lastTransId)

ORDER BY t.RECYCLER_ID, CU_TYPE 
Respondida el 08/11/2018 a las 01:43
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more