查询在数据库上失败,但在恢复备份后工作正常

时间:2014-10-29 21:13:39

标签: sql-server sql-server-2008-r2

我第一次遇到这个问题: 1)在生产数据库上,查询需要永远完成 2)我备份数据库,将其恢复到我的笔记本电脑上进行调试:查询工作正常,并在1秒内返回

我的直觉是某些东西被腐蚀了(比如索引),这种情况从未发生在我身上,所以我只是在猜测。

您能否建议一种检查此类错误的方法?

仅供参考我在这里粘贴查询,但它没有多大意义。

在生成db中如果我在CROSS APPLY之后完全删除了子查询,则查询执行正常:

SELECT
  CA.ID_CESPITE,  CASE WHEN child.count > 0 THEN 'Y' ELSE 'N' END AS HAVE_CHILD_PRG,
  CA.ID_CESPITE_PADRE,
      CA.ID_TIPO_CESPITE,
      CA.COD_CESPITE,
      CA.DESCR_CESPITE,
      CA.ID_STATO_CESPITE,
      CA.ID_REFERENTE, 
      VUD.ID_UTENTE AS ID_UTENTE_RESPONSABILE,VUD.ID_DIPENDENTE,
      ISNULL(CP.V, 'N') AS V,
      ISNULL(CP.O, 'N') AS O,
      ISNULL(CP.I, 'N') AS I,
      ISNULL(CP.A, 'N') AS A,
      CTCS.ID_TIPO_CESPITE AS ID_TIPO_CES, 0 AS LEVELO,
      CA.PROF_ID,CA.ISLOCKED,CTCS.DESCR_TIPO_CESPITE
FROM
  CES_ANAGRAFICA CA LEFT OUTER JOIN CES_PERMESSI CP  ON ((CA.ID_CESPITE = CP.ID_CESPITE) AND (CP.ID_UTENTE = 4654 ))
 LEFT JOIN CES_TIPI_CESPITE CTCS  ON CA.ID_TIPO_CESPITE = CTCS.ID_TIPI_INFRSTR
LEFT OUTER JOIN V_UTENTI_DIPENDENTI VUD  ON CA.ID_RESPONSABILE = VUD.ID_DIPENDENTE 
CROSS APPLY (  SELECT [Count] = COUNT(*)  FROM V_CESPITE_TREE VCA  JOIN MAN_PRG_OPERAZIONI MPO
    ON MPO.ID_CESPITE = VCA.ID_CHILD  WHERE VCA.ID_PARENT = CA.ID_CESPITE AND MPO.ID_FATHER is not null) child

我已经准备好在我的笔记本电脑上找到问题,但我很惊讶在恢复备份(到新的测试数据库)后,所有工作都按预期工作。

我希望我表达自己。

1 个答案:

答案 0 :(得分:0)

根据您提供的信息,其主要是查询(执行)计划的问题,通常称为参数嗅探。请检查此here

虽然执行计划可以加快查询速度,但某些相同的计划可能不适合2种不同的情况。当您在其他系统上进行恢复和执行时,该实例没有查询计划,因此它正在创建新计划并且执行速度很快。所以尝试清除你的缓存并再次执行...如果它快速执行那么它肯定是参数嗅探的问题。但没有人去解决这个问题...转到上面的链接你可能会找到一个合适的解决方案。