我目前正在使用Microsoft Enterprise Library Data Access 5.0来执行存储过程。
Database myDatabase = DatabaseFactory.CreateDatabase();
using (DbCommand command = myDatabase.GetStoredProcCommand("myStoredProc"))
{
//Add parameters here
using (IDataReader dataReader = myDatabase.ExecuteReader(command))
{
while (dataReader.Read())
{
}
}
}
一切正常但运行需要很长时间。当我打开SQL事件探查器时,我可以看到存储过程大约需要50秒才能运行。但是,如果我从Profiler中获取相同的脚本并在SQL Management Studio中运行它,则返回所有行只需要大约480毫秒。
有没有人遇到过这个问题?为什么会有很大的不同?
答案 0 :(得分:1)
很容易成为Parameter Sniffing。
答案 1 :(得分:0)
尝试将字符串参数类型更改为DbType.AnsiString
,看看是否有帮助
问题可能是,如果数据库列是varchar(...)并且具有索引并且与该列匹配的参数是nvarchar(...),则SQL Server将忽略索引并执行表扫描。
解决方案是强制参数键入AnsiString,以便SQL Server使用索引。