正确使用MS SQL

时间:2012-09-04 14:21:24

标签: c# database dataadapter

我有一个从SQL server表中获取数据的程序。代码如下:

SqlConnection conn=new SqlConnection(...);//correct
conn.Open();
DataTable dt=new DataTable();
SqlCommand selectCMD = new SqlCommand("SELECT * FROM TABLE WHERE Condition", conn);
SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;
custDA.Fill(dt);
Datagridview1.DataSource=dt;
Datagridview1.DataBind();

但问题是,当在SQL Server管理工作室中执行相同的查询时,执行所需的时间少于秒。同时使用程序时,需要半分钟才能得到结果。使用调试器我看到,程序“认为”很长时间的主行是数据适配器填充DataTable的时候。有什么建议如何减少时间?我的代码有什么问题?

4 个答案:

答案 0 :(得分:3)

Managaement studio只显示文本结果。 SqlDataAdapter必须将每个结果列值映射到DataGridView列值。一个人比另一个人花更多的时间。使用Management Studio,它还可以虚拟化结果 - 当您向下滚动查找大量结果集时,它不会立即显示所有结果。

答案 1 :(得分:1)

您可以创建索引并设置选项以加速查询执行。您可以使用此方法加载数据SqlDataAdapter.Fill - Asynchronous approach

create index condition_idx on table (condition)

new SqlCommand("set nocount on;SELECT * FROM TABLE WHERE Condition", conn);

答案 2 :(得分:1)

检查您是否需要对所需列进行适当的索引。当您从SQL运行查询时,它可能正在使用与.Fill方法正在执行时相比更优化的执行计划。

您可以尝试使用SSMS清除程序缓存和内存缓冲区:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

在测试查询之前执行此操作可防止使用缓存的执行计划和以前的结果缓存。

答案 3 :(得分:0)

感谢大家的帮助。我在SqlCommand对象中使用了参数。不幸的是我没有提到,所以你无法帮助我。但是当James发布了一个链接时,我发现当SqlCommand使用参数时,则使用存储过程sp_execute执行。因为服务器必须编译它,所以它需要这么长时间。删除参数后,一切都运行良好。另一种方法是每次执行存储过程时都可以关闭自动重新编译。再次感谢大家。每个人+1。