这是在Microsoft SQL Server上。我们有一个查询,我们试图在包含数字数据的字段上连接两个表。
一个表的字段定义为数字(18,2),另一个表的字段定义为十进制(24,4)。当加入本机数据类型时,查询会挂起,并且在它完成之前我们已经没有耐心了(让它运行6分钟......)。因此,我们尝试将两个字段转换为数字(18,2),并在10秒内完成查询。所以我们尝试将这两个字段转换为十进制(18,2)并再次查询挂起。有没有人知道小数和数字数据类型之间的区别会使它们执行得如此不同?
答案 0 :(得分:1)
DECIMAL和NUMERIC数据类型是SQL Server中的同一个东西。
引自BOL:
已修复的数字数据类型 精度和规模。
十进制[(p [,s])]和数字[(p [ ,s])]固定精度和比例 数字。当最大精度是 使用时,有效值来自 - 10 ^ 38 +1 通过10 ^ 38 - 1. ISO同义词 对于十进制,则为dec和dec(p,s)。 数字在功能上等同于 小数。
从那以后,我很惊讶地听到了不同之处。我希望两条路线的执行计划相同,你能查一下吗?
答案 1 :(得分:1)
为什么要使用两种数据类型?如果它们包含相同类型的数据(并且它们加入它们意味着它们),它们应该是相同的数据类型。解决这个问题,你的所有问题都会消失。为什么要浪费服务器资源不断转换以匹配应该定义相同的两个字段?
您当然可能需要调整任何插入或更新查询的输入变量,以匹配您选择作为数据类型的内容。
答案 2 :(得分:0)
我的猜测是,这不是两种数据类型之间的具体差异,而是SQL Server需要隐式转换它们以匹配连接操作的事实。
我不知道为什么会出现与第一个查询有区别的情况,第二个是明确转换的,但我可以看到为什么在转换为不匹配的数据类型时可能会出现问题SQL Server必须隐式转换它们(如第三种情况)。也许在第一种情况下,SQL Server隐式地将两者都转换为十进制(24,4),以免丢失数据,并且该操作比转换另一种方式花费更长的时间。您是否尝试过将数字(18,2)显式转换为小数(24,4)?