代码之家  ›  专栏  ›  技术社区  ›  Iain Hoult

为什么数据库查询只在应用程序中进行得很慢?

  •  3
  • Iain Hoult  · 技术社区  · 14 年前

    我有一个网页,对一个数据库运行一个查询需要10分钟,但从SQLServerManagementStudio运行时,同一个查询不到一秒钟就会返回。

    该网页只是在执行存储过程的数据库上触发SQL,而存储过程又对四个表执行非常简单的选择。同样,代码是基本的ADO,在SqlCommand上设置CommandText,然后执行ExecuteReader来获取数据。

    网页通常工作得很快,但当它变慢时,唯一加快速度的方法就是整理被查询表上的索引(不同的索引,不同的时间),当同一个查询手动执行得如此之快时,这似乎没有意义。

    this question 但这并不适用,因为网页实际上只是向数据库发送文本。

    有没有人有什么好主意,为什么这是一个缓慢的方式,而不是其他? 谢谢

    2 回复  |  直到 7 年前
        1
  •  4
  •   Martin Smith    14 年前

    我会怀疑参数嗅探。

    用于应用程序连接的缓存执行计划可能无法由SSMS连接使用,因为 set

    您可以使用下面的查询来检索存储过程的缓存计划。然后进行比较,看看它们是否不同(例如,速度慢的一个是否在另一个进行扫描的地方进行索引查找和书签查找?)

    Use YourDatabase;
    
    SELECT *
    FROM sys.dm_exec_cached_plans 
    CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
    CROSS APPLY sys.dm_exec_query_plan(plan_handle) 
    cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
    where sys.dm_exec_sql_text.OBJECTID=object_id('YourProcName') 
             and attribute='set_options'
    
        2
  •  1
  •   Roger Harvest    14 年前

    应用程序中查询的命令文本与您手动执行的查询之间是否存在差异?既然您说过重新编制索引有助于提高性能(这也会更新统计数据),那么听起来它可能陷入了一个糟糕的执行计划。