0

我有一个从 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 Management Studio 中执行相同的查询时,执行时间不到一秒。同时在使用程序时,需要半分钟才能得到结果。使用调试器,我看到,程序“思考”很多时间的主行是数据适配器填充 DataTable 的时候。有什么建议可以减少时间吗?我的代码有什么问题?

4

4 回答 4

3

Management studio 只显示文本结果。 SqlDataAdapter必须将每个结果列值映射到DataGridView列值。一个将比另一个花费更多的时间。使用 Management Studio,它还可以虚拟化结果——当您向下滚动查看大型结果集时,它不会一次显示所有结果,检索到更多数据。

于 2012-09-04T14:27:23.870 回答
1

您可以创建索引并设置选项以加速查询执行。您可以使用这种方法来加载数据SqlDataAdapter.Fill - 异步方法

create index condition_idx on table (condition)

new SqlCommand("set nocount on;SELECT * FROM TABLE WHERE Condition", conn);
于 2012-09-04T14:28:34.177 回答
1

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

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

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

于 2012-09-04T14:28:43.417 回答
0

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

于 2012-09-04T15:05:52.163 回答