【问题标题】:MSSQL stored procedure with sybase linked server getting recompiled for each execution每次执行都重新编译带有 sybase 链接服务器的 MSSQL 存储过程
【发布时间】:2015-02-13 02:19:07
【问题描述】:

我在 MS SQL Server 中有一个使用 Sybase 链接服务器的存储过程。每次执行存储过程时,它都会运行很长时间,并且看起来像是在执行前重新编译。知道如何停止这种重新编译吗?

【问题讨论】:

  • '看起来像'听起来像重新编译是一种反对被认为是真实的理论。您收集到哪些证据表明它是迄今为止的重新编译,而不仅仅是糟糕的查询性能。
  • 存储过程编译大约需要2个小时。存储过程中的第一个查询在独立运行时运行大约 2 分钟。但是,运行存储过程时,相同的查询要等到两个小时后才会运行。
  • 这听起来不像是编译成本,因为编译已经减少了在选择足够好的计划之前愿意花费多少时间进行编译。
  • 那你为什么认为程序在执行它的第一条语句之前运行了 2 个小时?是因为 SET 吗?在第一个查询之前很少有 SET 语句。(如 SET @date =getdate() 等。这会导致任何问题吗?我什至不确定为什么该过程需要 2 小时编译?是因为使用了 db-links在程序内?
  • 好吧,您可以在查询中使用选项 recompile 来检查重新编译的第二次运行是否也需要 2 个小时,这至少会以一种或另一种方式确认。

标签: sql-server sybase linked-server


【解决方案1】:

很难相信重新编译会花费这么多时间。我怀疑这个过程使用了一些未优化的旧计划来执行。

需要检查的几点。

  1. 使用重新编译选项执行。制定新的查询计划。
  2. 检查 proc 中的哪个查询需要很长时间。如果安装了 MDA 表,请检查 mosSysStatement。或在运行该存储过程时检查 master..sysprocesses 表。它将显示当前正在运行的语句编号。它会让您清楚地了解哪种陈述。
  3. 对存储过程使用的表运行更新统计信息。

谢谢, 戈帕尔

【讨论】:

  • 能否告诉我查询计划是否会随着每次数据的变化而变化?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
相关资源
最近更新 更多