有引号和没有引号的更新查询总运行时间差异太大

3
我可以帮您进行翻译。以下是类似于此查询的查询:

我有一个类似于下面的查询

Update Table1 
 Set colum1 = 'XYZ'
 Where column2 in (1,2,3,....so on)

这里Column2的数据类型是varchar。在我的实际查询中,IN子句包含从10000到60000个值,即查询将更新10000到60000行记录。

当我不使用引号提供这些值时,查询执行需要10分钟。同样的查询,当我加上引号(如下所示),只需要不到一分钟。

Update Table1*
 Set colum1 = 'XYZ'
 Where column2 in ('1','2','3',....so on)

这个查询是自然的吗?上面两个查询之间唯一的区别在于前者需要隐式转换 IN 子句中的值。可以有人解释一下吗?谢谢。


你比较过执行计划了吗? - Szymon
2
比较两个查询的执行计划 - 您会发现当SQL需要转换值时,无法使用索引扫描(用于IN子句)。 - Lanorkin
是的,我注意到当 SQL 进行转换时会使用索引扫描,而在不需要转换的情况下会使用索引搜索。然后我发现索引搜索更快。我猜隐式转换可能是罪魁祸首。 - nlkasyap
1个回答

0

在编程中,有时会将数字键存储为字符字符串,这会导致一个常见问题。虽然 SQL Server 会执行隐式转换并返回正确的结果,但代价是性能较差,并且不能正确地使用索引进行扫描而不是查找。-> 来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接