【发布时间】:2010-12-01 14:34:26
【问题描述】:
在我的 SQL Server 2005 数据库中,我在表 RMA 中有一个数据类型为 char(10) 的列 RMA_Number。
该值是一个递增的数字,格式为RMA0002511。在插入时获得最大数字以增加它的最快方法是什么?
我的第一个方法是:
SELECT TOP (1) RMA_Number
FROM RMA
WHERE (RMA_generated = 1)
ORDER BY Creation_Date DESC
但这很容易出错,因为更高的 RMA_Number 可能有更早的创建日期。作为一种解决方法,按主键排序有效:
SELECT TOP (1) RMA_Number
FROM RMA
WHERE (RMA_generated = 1)
ORDER BY idRMA DESC
但也许这也是一个可能的错误来源。
从逻辑上讲,最好的方法是ORDER BY RMA_Number DESC。
但是因为我不确定这是否总是给出正确的结果,并且认为如果记录数量增加,对 char 列进行排序可能会变慢,所以我选择按 Date 列排序。
所以,
- 按 char(10) 列排序是个好主意(性能和准确性)吗?
- 最好
SELECT MAX( RMA_Number ) FROM RMA获得最高数字(性能和准确性) - 如果前两点有误,我应该坚持使用主键排序,还是应该使用
int列并在应用程序中格式化数字?
编辑:
我想我必须澄清一些我没有提到的事情。 RMA_Number 不是在每次插入时生成的。所以也许有很多没有编号的记录。 Martin 使用主键来构建数字。那会是个问题,因为差距太大了。
提前谢谢你。
【问题讨论】:
-
值中偶尔出现间隙是否重要?例如,有 RMA0002511 和 RMA0002513,但没有 RMA0002512 是否可以?
-
那没问题。实际上,如果我删除较旧的记录,就会发生这种情况。
-
由于差距没问题,我会推荐一个身份列,就像@Martin 的回答一样。
-
我想我必须澄清一些我没有提到的事情。 RMA_Number 不是在每次插入时生成的。所以可能有很多没有编号的记录。 Martin 使用主键来构建数字。这将是一个问题,因为差距太大。
-
@Tim Schmelter - 有 RMA_Number 的记录和没有 RMA_Number 的记录有什么区别?当时是否插入了任何其他值?将所有这些东西放在一个单独的表中,并带有 RMA 表的外键不是更好吗?对您的数据进行适当的规范化可能会解决这个问题。
标签: sql-server performance sql-server-2005 database-design sql-order-by