【问题标题】:Correct work with MS SQL正确使用 MS SQL
【发布时间】:2012-08-29 05:34:48
【问题描述】:

我有一个从 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 的时候。有什么建议可以减少时间吗?我的代码有什么问题?

【问题讨论】:

  • 您的查询返回了多少行?
  • 您的应用程序是否使用了与此问题无关的角色或可能需要大量时间的东西?
  • 这是在请求数据之前不执行查询所花费的时间。我无法解释为什么它比 Management Studio 慢,但这就是为什么它在 Fill 调用时很慢。如果这不是您花费时间的地方,则与 SQL 无关
  • 我的应用程序没有使用任何角色。查询可能不返回行、一行或多行
  • @SoneshDabhi 谢谢,我会看看,但我没有使用存储过程或用户定义的函数。

标签: c# database dataadapter


【解决方案1】:

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

【讨论】:

  • 与单排情况相同。真的是因为datagridview吗?
  • 真的,单行需要30秒?那里还有其他事情发生,因为我从未遇到过这样的事情。
  • 也许如果这很重要,该表有超过 200 万行。但我正在使用索引 - SQL 管理工作室正在快速执行此查询。
  • 如果将查询更改为"SELECT TOP 1 * FROM TABLE WHERE Condition" 会发生什么?如果您只返回一行,那么时间不是数据映射——它是 SQL Server。
【解决方案2】:

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

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

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

【讨论】:

  • 我试过了。有轻微的减速 - 查询在 4 秒内执行。但不是一分钟。
  • where子句中使用的字段有索引
【解决方案3】:

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

create index condition_idx on table (condition)

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

【讨论】:

  • 还有set nocountAsynchronous approach?。您问题的答案是@PeterRitchie 所说的,解决方案是多种因素的组合。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 2010-10-27
    • 2014-09-04
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多