SSMS 2019 大型查询调试

SSMS 2019 large queries debugging

我最近参与支持具有非常大的 MSSQL 数据库(TB)的客户,这意味着有时查询可能需要数小时才能完成。

调试 sql 查询的最佳方法是什么?我的意思是,假设您有一个 1000 行的 sql 查询,其中包含子查询等,需要一个小时才能完成,您最终会收到“转换 varchar 值时转换失败 '2021-03-01 00:00:00' 到数据类型 int".

SMSS 的实时查询统计突然在执行到 88% 时出现此错误。查询中包含该日期的语句遍布整个查询。 SMSS 是否有水平步调试器的任何方式,您可以在其中查看查询的哪一行是错误的?

我知道存储过程调试功能,但简单查询呢?人们如何设法更好地了解执行死刑时发生的情况? sql 查询中没有步骤调试器或其他东西,对吗?

这是比具体的 SMSS 建议更笼统的 sql 建议(因为我不使用该程序)

您可以单独测试子查询以查看它们是否有效。

您还应该在较小的本地化数据集上测试您的查询。这将使您快速响应并让您更轻松地 test/debug。您永远不应该针对实时数据集测试查询。 (你真的不想和你的老板讨论上次备份的时间,相信我)

性能将使用更准确的数据集或多个尺寸来完成,以获得性能缩放的准确感觉。

使用 EXPLAIN 和 ANALYZE 更深入地了解数据库将如何处理您的查询。

"Conversion failed when converting the varchar value '2021-03-01 00:00:00' to data type int"

根据个人经验,这是一个必须处理的可怕错误。

基本上,您需要修复数据或查询。这需要一些工作。如果幸运的话,您的查询没有隐式转换。如果是这种情况,您只需将 cast()/convert() 替换为 try_cast()try_convert().

很遗憾,您的查询中可能存在隐式转换。这意味着数据模型中有问题,通常使用字符串来存储数字或日期——并且数据的用户没有意识到使用了错误的类型 os。在此过程中的某个地方,有人在 table.

中输入了不合适的值

这需要大量调试。我将从调查所使用的每一列的数据类型开始,并查看 operators/functions 以确保它们适合该数据类型。

很可能你有一个隐式转换抛出错误。

发现这一点的最简单方法,尤其是在大型或长查询中,是生成一个估计的执行计划。

那你可以看看下面的其中一项:

  • SELECT节点上,你会发现Warnings,这会告诉你它是哪个表达式,虽然它没有告诉你它是计划的哪一部分是
  • 您可以逐一搜索节点
  • 你可以右击,打开XML,在里面搜索CONVERT_IMPLICIT,这样就可以得到准确的节点。您可能需要稍微了解一下才能确定它与查询的哪一部分相关。
    SentryOne Plan Explorer 可以向您显示 XML 在图形计划中的相关位置。

最有可能的原因是:

  • 不小心比较了错误的列,或者
  • DATEADDDATEDIFF 参数不正确,或
  • UNION ALLVALUES 子句结合了两种不同的数据类型