我第一次遇到这个问题: 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
我已经准备好在我的笔记本电脑上找到问题,但我很惊讶在恢复备份(到新的测试数据库)后,所有工作都按预期工作。
我希望我表达自己。
答案 0 :(得分:0)
根据您提供的信息,其主要是查询(执行)计划的问题,通常称为参数嗅探。请检查此here
虽然执行计划可以加快查询速度,但某些相同的计划可能不适合2种不同的情况。当您在其他系统上进行恢复和执行时,该实例没有查询计划,因此它正在创建新计划并且执行速度很快。所以尝试清除你的缓存并再次执行...如果它快速执行那么它肯定是参数嗅探的问题。但没有人去解决这个问题...转到上面的链接你可能会找到一个合适的解决方案。