SqlCommand 使用参数,但仍然为一个查询创建多个计划

Iva*_*nno 0 sql-server execution-plan parameter sql-server-2019

我有下面的代码,我正在使用参数,但它仍然生成许多重复的 SQL 执行计划。请问出了什么问题以及如何修复?

    string cmdString = @"INSERT INTO tb_RA_GLID (glid_StoreNumber, 
                                          glid_StoreName, 
                                          glid_FirstBusinessDate, 
                                          glid_LastBusinessDate, 
                                          glid_DateCreated, 
                                          glid_TimeCreated, 
                                          glid_ExportVersion, 
                                          glid_GLMappingVersion, 
                                          glid_POSModelOrType, 
                                          glid_POSVersion) 
                                          VALUES (@StoreNumber    , @StoreName    , @FirstBusinessDate    , @LastBusinessDate    , @DateCreated     , @TimeCreated   , @ExportVersion    , @GLMappingVersion    , @POSModelOrType    , @POSVersion     );
                                                 "; //SELECT SCOPE_IDENTITY();";
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.ConnectionString = connectionString;
        using (SqlCommand comm = new SqlCommand())
        {
            comm.Connection = conn;
            comm.CommandText = cmdString;
            comm.Parameters.AddWithValue("@StoreNumber", columns[1]);
            comm.Parameters.AddWithValue("@StoreName", columns[2]);
            comm.Parameters.AddWithValue("@FirstBusinessDate", DateTime.ParseExact(columns[3], "yyyyMMdd", CultureInfo.InvariantCulture));
            comm.Parameters.AddWithValue("@LastBusinessDate", DateTime.ParseExact(columns[4], "yyyyMMdd", CultureInfo.InvariantCulture));
            comm.Parameters.AddWithValue("@DateCreated", DateTime.ParseExact(columns[5], "yyyyMMdd", CultureInfo.InvariantCulture));
            comm.Parameters.AddWithValue("@TimeCreated", DateTime.ParseExact(columns[6], "HHmmss", CultureInfo.InvariantCulture));
            comm.Parameters.AddWithValue("@ExportVersion", columns[7]);
            comm.Parameters.AddWithValue("@GLMappingVersion", columns[8]);
            comm.Parameters.AddWithValue("@POSModelOrType", columns[9]);
            comm.Parameters.AddWithValue("@POSVersion", columns[10]);
            try
            {
                conn.Open();
                comm.ExecuteNonQuery();
                //object returnObj = comm.ExecuteScalar();
                //if (returnObj != null)
                //{
                //    int.TryParse(returnObj.ToString(), out glid);
                //}
                conn.Close();
            }
            catch (SqlException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

Run Code Online (Sandbox Code Playgroud)

Dan*_*man 8

不要使用AddWithValue向集合添加参数。SqlClient将根据.NET类型推断SqlDbType,并根据实际值长度而不是最大长度定义字符串类型的参数长度。同一查询的不同参数/长度的每次排列都会产生不同的计划并使缓存膨胀

此外,对 SqlDbType 的错误猜测可能会对性能产生负面影响。例如,.NETstring将产生nvarchar参数类型。这对于 varchar 列和旧版 SQL 排序规则来说是不可控制的,从而导致列上的索引无法被有效使用。