CONVERT 从 nvarchar 到 money 的性能影响 (SQL Server)

Dea*_*ean 5 sql-server-2008 sql-server

我有一个美元金额值,由于历史原因,它总是存储在 nvarchar 字段中。现在我们存储的行比过去多得多,并且正在使用这个字段来汇总使用一个会经常自动刷新的应用程序的数量,我担心性能。

但我也担心在开发周期的后期做出这样的改变的成本。

很快,这个数据库将被客户使用,生成数百万行。所有这些行都不会参与此计算。这些行被分成大约 10,000 行的组,组的每个父级将每 10 分钟左右处理一次,这是计算这些总数的时间。

现在将列类型更改为货币是否值得,包括存储过程、UDT、数据层等?

看起来它可能会对性能产生影响,但不幸的是,我无法用我必须进行性能测试的资源生成足够的数量,这将是现实的。所以我希望有人有字符串到数字转换的经验,并且可以让我知道一次对 10,000 行进行这种转换是否会出现问题。

Rem*_*anu 13

演员的表演成本很小。数据库成本通常在 IO 中,并且演员很少在雷达上显示。

但这不是问题。真正的问题将是数据纯度。如果您允许任意nvarchar然后放心,非数字值显示在数据库中。尽管您在应用程序中采取了所有预防措施,但经验告诉我们,在路上某个地方会以某种方式插入“abagft”作为值。然后演员表将开始抛出运行时异常,而您(或当时将运行该节目的任何人)将诅咒、诅咒和诅咒。你会尝试用布尔短路 WHERE 来“修复”它,就像其他人一样,但它不会工作。这条路是由尸体铺成的,相信我。

还存在与数据类型优先级、开发工具中的类型推断(字段最终为 C# string)相关的问题,最重要的是,索引查找 sargability 问题。

对数值使用数值类型。DECIMAL对钱有好处。改变的时间总是您开始接受数百万个价值观之前。现在是代码更改的成本和回归的风险。在 6 个月内,代码更改成本和回归风险加上停机时间和数据大小更新操作的成本将相同。

  • 首先我读了“血液卷曲”并在想“这是一个新的好比喻”:)lol (3认同)
  • 将此更改为已接受的答案,因为它确实包含更多信息和指导。尽管 Max Vernon 首先回答,并且对我也有帮助。 (2认同)

Han*_*non 5

定义“问题”。

如果您的意思是它会花费更长的时间并且成为管理噩梦,那么,是的。

如果您不关心亚美分精度,请将字段转换为 DECIMAL(18,4) 或 (10,2)。

  • 谢谢你。只是想在我必须为此做出的所有更改中感到合理。(这仍然不超过几个小时的工作。)内部 DBA 几乎没有那么乐于助人。 (2认同)