对C#的查询比SQL上的相同查询需要更多的时间来执行

时间:2014-09-01 13:33:31

标签: c# sql

这就是我在C#上做的事情:

        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 Server上生成并使用相同的参数执行sql,则只需1秒钟。

有人知道什么可以吗?有办法解决吗?

1 个答案:

答案 0 :(得分: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秒。

谢谢大家!