如果我的问题太愚蠢或者是重复,我道歉,但我没有找到解决问题的方法。感谢您的任何建议或解答!
在我的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
表,它的工作速度会快得多,但它不适用于存储过程。
所以我想知道的是,我可以使用并行性发送到服务器存储过程,还是可以发送参数化查询而不是像存储过程一样,但只是命令?
编辑:我添加了执行计划,希望它有所帮助。
答案 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
这导致查询在我的系统上运行速度提高了两倍。