代码之家  ›  专栏  ›  技术社区  ›  Craig Walker

这些sys.sp_*存储过程在做什么?

  •  2
  • Craig Walker  · 技术社区  · 16 年前

    我正在跟踪我的SQL Server安装中的一个奇怪的、巨大的性能问题。在我的系统上,执行特定的存储过程需要2分钟;在同事的系统上,执行不到1秒钟。我们有相似的数据库/数据和配置,但显然有一些非常不同的地方。

    我在两个系统的分析器中运行有问题的SP,并注意到一些奇怪的事情。在我的系统中,我看到9个具有以下属性的条目:

    • 与其他行相比,持续时间非常长。我的值高达37698,低达1734。在“快速”系统上,最大持续时间(对于整个SP调用)为259。
    • 它们针对与包含我正在运行的SP的数据库相关的两个数据库执行。(此SP通过链接服务器调用这两个数据库)。
    • 它们是以下系统SP之一的执行:
      • sp_tables_info_90_行集
      • sp_检查constbytable_行集
      • sp_columns_90_行集
      • sp_table_statistics2_行集
      • sp_indexes_90_行集

    我找不到任何 Googleable documentation 关于它们是什么,为什么它们会这么慢,或者为什么它们会在一个系统上运行,而不是在另一个系统上运行。有人知道他们都在干什么吗?

    6 回复  |  直到 13 年前
        1
  •  2
  •   Jon Seigel    16 年前

    我不知道你问题的答案。但是为了解决您遇到的问题(我想,这是您真正感兴趣的问题),我首先要做的是对您查询的表运行一个重新索引。当条件如您所描述的那样(相同的数据库结构、不同的数据/数据库、相同的查询)时,这通常会修复任何类型的缓慢性。

        2
  •  2
  •   Rob Schripsema    16 年前

    尝试手动更新该表的统计信息。

    UPDATE STATISTICS [TableName]

    然后再次检查autoupdateStatistics的数据库选项是否为真。不过,即使是这样,我也看到过这样的情况:向表中添加大量数据并不总是会导致统计信息及时更新,而且查询速度可能很慢。

        3
  •  1
  •   Adithya Kalyan    14 年前

    这些是在进行链接服务器调用时创建的表。这些称为在tempdb中创建的工作表。它们由数据库引擎自动创建,用于假脱机等临时操作。

        4
  •  0
  •   Ian Jacobs    16 年前

    我不熟悉这些特定的过程,但您可以尝试运行:

    SELECT object_definition(object_id('Procedure Name'))
    

    更好地了解引擎盖下面发生了什么。

        5
  •  0
  •   gbn    16 年前

    上次重建索引?上次统计更新?

    否则,SQL Server客户端也会使用这些存储过程…不?可能不会导致这些错误

        6
  •  0
  •   user2108586    13 年前

    这些SP意味着您的查询使用同义词访问链接服务器。应尽可能避免这种情况。