微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SSMS 2019 大查询调试

如何解决SSMS 2019 大查询调试

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

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

SMSS 的实时查询统计在执行 88% 时突然出现此错误。该查询包含包含该日期的语句在整个查询中。有没有什么水平步进调试器是 SMSS,你可以在其中看到查询的哪一行是错误的?

我知道存储过程调试功能,但简单查询呢?当他们被执行时,如何才能更好地了解正在发生的事情?没有办法在 sql 查询中使用步进调试器或其他东西,对吗?

解决方法

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

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

您还应该在较小的本地化数据集上测试您的查询。这将为您提供快速响应并让您更轻松地进行测试/调试。您永远不应该针对实时数据集测试查询。 (你真的不想和你的老板谈论上次备份是最近多久做的,相信我)

性能需要使用更准确的数据集或多个大小来完成,以便准确了解性能扩展。

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

,

“将 varchar 值 '2021-03-01 00:00:00' 转换为数据类型 int 时转换失败”

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

基本上,您需要修复数据或查询。这需要一些工作。如果你很幸运,那么你的查询没有隐式转换。如果是这种情况,您可以简单地将 cast()/convert() 替换为 try_cast()try_convert()

不幸的是,您的查询中可能存在隐式转换。这意味着数据模型中存在一些问题,通常使用字符串来存储数字或日期——而数据的用户没有意识到使用了错误的类型 os。在此过程中,有人在表格中添加了不适当的值。

这需要大量调试。我将首先调查所使用的每一列的数据类型,并查看运算符/函数以确保它们适合该数据类型。

,

很可能您有一个隐式转换,它引发了错误。

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

然后您可以查看以下内容之一:

  • SELECT 节点上,您会找到警告,这会告诉您它是哪个表达式,尽管它不会告诉您它是计划的哪个部分
  • 可以一一搜索节点
  • 您可以右键单击,打开 XML,然后搜索 CONVERT_IMPLICIT,这将为您提供确切的节点。您可能需要仔细阅读它才能确定它与查询的哪个部分相关。
    SentryOne 计划浏览器可以向您显示 XML 在图形计划中的相关位置。

最有可能的原因:

  • 错误的列之间的意外比较,或
  • DATEADDDATEDIFF 的参数不正确,或
  • UNION ALLVALUES 子句组合了两种不同的数据类型

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。