2014-09-01 52 views
0

相同的查詢,這是C#做什麼IM執行:質疑C#需要更多的時間比SQL

 public static decimal ObterSaldoEstoqueEntrarProdutosFamilia(this IRepositorio<SaldoEstoqueProduto> saldoEstoqueRepositorio, string empresaUsuario, Int64 tipoEstoqueUsuario, string filial, string familia) 
     { 

      //TODO: Trocar por consulta pelo LINQ quando os objetos de programação estiverem criados no C# 
      decimal resultado = 0; 

      try 
      { 
       string connString = saldoEstoqueRepositorio.StringConexao(); 
       SqlConnection conexaoSql = new SqlConnection(connString); 
       StringBuilder queryItens = new StringBuilder(); 

       queryItens.Append("SELECT isnull(SUM(T2.ProTrfQtd - T2.ProTrfCol),0) as Saldo "); 
       queryItens.Append("FROM EST250 T1 (NOLOCK) "); 
       queryItens.Append("INNER JOIN EST2501 T2 (NOLOCK) ON T2.EmpCod = T1.EmpCod AND T2.EstTip = T1.EstTip AND T2.ProTrfNum = T1.ProTrfNum AND T2.FilOriCod = T1.FilOriCod AND T2.FilDstCod = T1.FilDstCod "); 
       queryItens.Append("LEFT JOIN EST2503 T3 (NOLOCK) ON T3.EmpCod = T1.EmpCod AND T3.EstTip = T1.EstTip AND T3.ProTrfNum = T1.ProTrfNum AND T3.FilOriCod = T1.FilOriCod AND T3.FilDstCod = T1.FilDstCod "); 
       queryItens.Append("LEFT JOIN NTF006 T4 (NOLOCK) ON t4.EmpCod = t3.EmpCod and t4.FisOpe = 'E' and t4.FilCod = t3.FilOriCod and t4.FisEspCod = t3.ProTrfEspC and t4.FisSerCod = t3.ProTrfSerC and t4.FisEntCod = t3.ProTrfFisE and t4.FisCod = t3.ProTrfFisC and t4.NopCod = t3.ProTrfNopC "); 
       queryItens.Append("LEFT JOIN EST020 T5 (NOLOCK) ON T5.EmpCod = t2.EmpCod and t5.EstTip = t2.EstTip and t5.ProCod = t2.ProCod "); 
       queryItens.Append("LEFT JOIN EST023 T6 (NOLOCK) ON T6.EmpCod = t2.EmpCod and t5.EstTip = t2.EstTip and t6.ProFamCod = t5.ProFmlCod "); 
       queryItens.Append("WHERE T1.EmpCod = @EmpCod AND T1.EstTip = @EstTip AND T1.FilDstCod = @FilCod AND"); 
       queryItens.Append(" ("); 
       queryItens.Append("  T6.ProFamCod like @ProFamCodLike OR T6.ProFamCod = @ProFamCod "); 
       queryItens.Append(" ) "); 
       queryItens.Append("AND T1.ProTrfOdfC = 0 AND T2.ProTrfQtd > T2.ProTrfCol AND "); 
       queryItens.Append(" ("); 
       queryItens.Append("  (T1.ProTrfSta = 1 OR T1.ProTrfSta = 2 OR T1.ProTrfSta = 4 OR T1.ProTrfSta = 7 OR T1.ProTrfSta = 9) "); 
       queryItens.Append("  OR (T1.ProTrfSta = 6 AND t4.FisSta in (1, 2, 3, 4, 5, 6, 12)) "); //Não considera o saldo a entrar de notas que estão em conclusão pendente, pois esta saldo já está contando no lógico,ou das programações Em recebimento que não possuem nota relacionada 
       queryItens.Append(" ) "); 

       conexaoSql.Open(); 
       SqlCommand comando = new SqlCommand(queryItens.ToString(), conexaoSql); 

       comando.Parameters.AddWithValue("@EmpCod", empresaUsuario); 
       comando.Parameters.AddWithValue("@EstTip", tipoEstoqueUsuario); 
       comando.Parameters.AddWithValue("@ProFamCod", familia); 
       comando.Parameters.AddWithValue("@ProFamCodLike", familia + ".%"); 
       comando.Parameters.AddWithValue("@FilCod", filial); 

       resultado = Convert.ToDecimal(comando.ExecuteScalar()); 
       conexaoSql.Close(); 
      } 
      catch (Exception) 
      { 

      } 

      return resultado; 
     } 

comando.ExecuteScalar()需要4秒執行。但是,如果我得到的SQL生成和SQL Server上執行相同的參數,它只需要1秒。

有人知道最新情況可以嗎?有辦法解決它嗎?

+1

你怎麼知道它需要4秒?你在使用Sql Profiler嗎?我沒有看到任何時間代碼... – ojf 2014-09-01 13:35:33

+1

不用去查看你的SQL代碼的細節,你正在捕獲一個具有空處理塊的Exception。這是一個非常糟糕的設計。 – kevin 2014-09-01 13:38:19

+1

這個查詢實際上在做什麼?似乎相當極端?這可能是你追加'查詢'字符串的方式 - 在你的SQL中,我想你已經建立了查詢了?在這裏,你似乎正在創造那麼執行命令? (我也不能真正看到你實際上是在上面的代碼執行命令(除非我記錯了) – jbutler483 2014-09-01 13:39:25

回答

0

我解決了我的問題,改變了我添加參數到我的查詢的方式!

我在做這樣的:

comando.Parameters.AddWithValue("@EmpCod", empresaUsuario); 
    comando.Parameters.AddWithValue("@EstTip", tipoEstoqueUsuario); 
    comando.Parameters.AddWithValue("@ProFamCod", familia); 
    comando.Parameters.AddWithValue("@ProFamCodLike", familia + ".%"); 
    comando.Parameters.AddWithValue("@FilCod", filial); 

後來我改變這樣的:

SqlParameter sqlParmInsLeitura1 = new SqlParameter("EmpCod", SqlDbType.VarChar); 
    sqlParmInsLeitura1.Value = (object)empresaUsuario.Trim(); 
    SqlParameter sqlParmInsLeitura2 = new SqlParameter("EstTip", SqlDbType.BigInt); 
    sqlParmInsLeitura2.Value = (object)tipoEstoqueUsuario; 
    SqlParameter sqlParmInsLeitura3 = new SqlParameter("ProFamCod", SqlDbType.VarChar); 
    sqlParmInsLeitura3.Value = (object)familia.Trim(); 
    SqlParameter sqlParmInsLeitura4 = new SqlParameter("ProFamCodLike", SqlDbType.VarChar); 
    sqlParmInsLeitura4.Value = (object)familia.Trim() + ".%"; 
    SqlParameter sqlParmInsLeitura5 = new SqlParameter("FilCod", SqlDbType.VarChar); 
    sqlParmInsLeitura5.Value = (object)filial.Trim(); 

    comando.Parameters.Add(sqlParmInsLeitura1); 
    comando.Parameters.Add(sqlParmInsLeitura2); 
    comando.Parameters.Add(sqlParmInsLeitura3); 
    comando.Parameters.Add(sqlParmInsLeitura4); 
    comando.Parameters.Add(sqlParmInsLeitura5); 

現在執行1秒。而不是4秒。

謝謝大家!