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 在图形计划中的相关位置。
最有可能的原因是:
- 不小心比较了错误的列,或者
DATEADD
或 DATEDIFF
参数不正确,或
UNION ALL
或 VALUES
子句结合了两种不同的数据类型
我最近参与支持具有非常大的 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 在图形计划中的相关位置。
最有可能的原因是:
- 不小心比较了错误的列,或者
DATEADD
或DATEDIFF
参数不正确,或UNION ALL
或VALUES
子句结合了两种不同的数据类型