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秒。
有人知道最新情況可以嗎?有辦法解決它嗎?
你怎麼知道它需要4秒?你在使用Sql Profiler嗎?我沒有看到任何時間代碼... – ojf 2014-09-01 13:35:33
不用去查看你的SQL代碼的細節,你正在捕獲一個具有空處理塊的Exception。這是一個非常糟糕的設計。 – kevin 2014-09-01 13:38:19
這個查詢實際上在做什麼?似乎相當極端?這可能是你追加'查詢'字符串的方式 - 在你的SQL中,我想你已經建立了查詢了?在這裏,你似乎正在創造那麼執行命令? (我也不能真正看到你實際上是在上面的代碼執行命令(除非我記錯了) – jbutler483 2014-09-01 13:39:25