C#:如何使用并行性设置存储过程执行或改善执行时间?

时间:2018-03-22 15:53:21

标签: c# sql-server

如果我的问题太愚蠢或者是重复,我道歉,但我没有找到解决问题的方法。感谢您的任何建议或解答!

在我的ASP.NET MVC 5项目中,我从SQL Server表中获取了超过150万条记录的数据。

为了防止SQL注入,我总是只使用参数化查询并生成存储过程。

例如我发送给服务器的一个查询:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand sqlCommand = new SqlCommand("SELECT TOP 5 NAME
                                            FROM TABLE_NAME 
                                            WHERE COLUMN_NAME LIKE @Param", connection);
    sqlCommand.Parameters.AddWithValue("@Param", "someValue");

    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
    sqlDataAdapter.SelectCommand = sqlCommand;

    sqlDataAdapter.Fill(dataSet);
}

SQL Server Profiler中的结果:

exec sp_executesql N'SELECT TOP 5 NAME FROM TABLE_NAME WHERE COLUMN_NAME LIKE @Param',N'@Param nvarchar(11)',@Param=N'%someValue%'

如果表中只有少数记录适合搜索条件,则必须在返回结果前检查所有1.5百万个订单。

我注意到如果我选择前1000条记录,SQL Server会使用并行搜索orders表,它的工作速度会快得多,但它不适用于存储过程。

所以我想知道的是,我可以使用并行性发送到服务器存储过程,还是可以发送参数化查询而不是像存储过程一样,但只是命令?

编辑:我添加了执行计划,希望它有所帮助。

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以创建以下索引:

create index idx_test on MyTable (Column_Name) include(Name)

使用索引提示修改您的查询:

SELECT TOP 5 NAME FROM TABLE_NAME with(index(idx_test)) WHERE COLUMN_NAME LIKE @Param

这导致查询在我的系统上运行速度提高了两倍。