Sql server 字符列上的最大/订单数量

Sql server 字符列上的最大/订单数量,sql-server,performance,sql-server-2005,database-design,sql-order-by,Sql Server,Performance,Sql Server 2005,Database Design,Sql Order By,在我的SQL Server 2005数据库中,表RMA中有一个数据类型为char(10)的列RMA\u Number 该值是一个递增的数字,格式为RMA00002511。插入时增加最大数量的最快方法是什么 我的第一个方法是: SELECT TOP (1) RMA_Number FROM RMA WHERE (RMA_generated = 1) ORDER BY Creation_Date DESC 但这很容易出错,因为在某种程度上,更高的RMA_编号可能具有更

在我的SQL Server 2005数据库中,表
RMA
中有一个数据类型为char(10)的列
RMA\u Number

该值是一个递增的数字,格式为
RMA00002511
。插入时增加最大数量的最快方法是什么

我的第一个方法是:

SELECT     TOP (1) RMA_Number
FROM         RMA
WHERE     (RMA_generated = 1)
ORDER BY Creation_Date DESC
但这很容易出错,因为在某种程度上,更高的RMA_编号可能具有更早的创建日期。作为一种解决方法,按主键排序可以:

SELECT     TOP (1) RMA_Number
FROM         RMA
WHERE     (RMA_generated = 1)
ORDER BY idRMA DESC
但也许这也是一个可能的错误来源

从逻辑上讲,最好的方法是按照RMA\u编号说明进行订购

但因为我不确定这是否总是给出正确的结果,并且认为如果记录数增加,对char列的排序可能会变慢,所以我选择按日期列排序

所以

  • 按字符(10)列排序(性能和准确性)是个好主意吗
  • 从RMA中选择MAX(RMA\U编号)以获得最高编号(性能和精度)是否更好
  • 如果前两点错误,我应该继续使用主键排序,还是应该使用
    int
    列并在应用程序中设置数字格式
  • 编辑

    我想我必须澄清一些我没有提到的事情。RMA_编号并非在每次插入时生成。所以可能有很多没有数字的记录。Martin使用主键生成数字。这将是一个问题,因为差距太大了

    提前谢谢。

    最快和最安全的(并发)方法是根本不存储
    RMA000…
    前缀

    只需创建一个整数标识列,并通过计算列添加前缀

    create table #RMA
    (
    id int identity(2511,1) primary key,
    RMA_Number as 'RMA' + RIGHT('000000' + CAST(id as varchar(7)),7)
    )
    
    insert into #RMA
    default values
    
    select * from #RMA
    
    或者根据并非所有记录都有
    RMA\U编号的新信息,您可以使用这种方法来实现非阻塞、高效和并发安全的解决方案

    CREATE TABLE dbo.Sequence(
     val int IDENTITY (2511, 2) /*Seed this at 1 + whatever your current max value is*/
     )
    
    GO
    
    /*Call this procedure to get allocated the next sequence number to use*/     
    CREATE PROC dbo.GetSequence
    @val AS int OUTPUT
    AS
    BEGIN TRAN
        SAVE TRAN S1
        INSERT INTO dbo.Sequence DEFAULT VALUES
        SET @val=SCOPE_IDENTITY()
        ROLLBACK TRAN S1 /*Rolls back just as far as the save point to prevent the 
                           sequence table filling up. The id allocated won't be reused*/
    COMMIT TRAN
    
    最快和最安全的(并发)方法是根本不存储
    RMA000…
    前缀

    只需创建一个整数标识列,并通过计算列添加前缀

    create table #RMA
    (
    id int identity(2511,1) primary key,
    RMA_Number as 'RMA' + RIGHT('000000' + CAST(id as varchar(7)),7)
    )
    
    insert into #RMA
    default values
    
    select * from #RMA
    
    或者根据并非所有记录都有
    RMA\U编号的新信息,您可以使用这种方法来实现非阻塞、高效和并发安全的解决方案

    CREATE TABLE dbo.Sequence(
     val int IDENTITY (2511, 2) /*Seed this at 1 + whatever your current max value is*/
     )
    
    GO
    
    /*Call this procedure to get allocated the next sequence number to use*/     
    CREATE PROC dbo.GetSequence
    @val AS int OUTPUT
    AS
    BEGIN TRAN
        SAVE TRAN S1
        INSERT INTO dbo.Sequence DEFAULT VALUES
        SET @val=SCOPE_IDENTITY()
        ROLLBACK TRAN S1 /*Rolls back just as far as the save point to prevent the 
                           sequence table filling up. The id allocated won't be reused*/
    COMMIT TRAN
    
    首先,你看到的是一个严重的赛况。

    当我们在一起工作的项目中需要它时,我们有一个单独的表,其中存储了当前值,还有一个生成下一个值的函数。我们实现了锁定以保持多个呼叫以获取下一个号码。我记得,这是因为我们必须使用字母数字标识号(函数负责复杂的递增)

    然而,我最喜欢@Martin的解决方案:使用和
    IDENTITY
    field。您可以按照他的建议删除前缀,也可以简单地从列中删除前缀,然后在
    从表中选择
    时将其重新添加。

    首先,您看到的是严重的竞争状况。

    当我们在一起工作的项目中需要它时,我们有一个单独的表,其中存储了当前值,还有一个生成下一个值的函数。我们实现了锁定以保持多个呼叫以获取下一个号码。我记得,这是因为我们必须使用字母数字标识号(函数负责复杂的递增)


    然而,我最喜欢@Martin的解决方案:使用和
    IDENTITY
    field。正如他所建议的,您可以删除前缀,也可以简单地从列中删除前缀,然后在
    从表中选择
    时将其追加回去。

    为什么这样做会更快?
    INT
    s是否比字符串快?较小的数据字段比较大的数据字段快吗?即使索引正确?@Brad。是的,整数比较比字符串快。如果对其进行了索引,则该成本可能在插入时支付,而不是在查找时支付(至少对于查找
    max
    值的特定情况)。使用identity也比自制的并发安全解决方案快,因为它是一种非阻塞解决方案。@Martin,感谢您的澄清。我喜欢
    IDENTITY
    解决方案。当我们开发我们的时,我们不得不(为什么?我不知道)使用字母数字ID。@Martin:我想我必须澄清一些我没有提到的事情。RMA_编号并非在每次插入时生成。所以可能有很多没有数字的记录。您可以使用主键生成号码。这将是一个问题,因为差距太大。@Martin,一个预先计算好的RMA编号表,然后使用
    proc
    提取
    MAX
    序列号,然后删除它怎么样?为什么这样会更快?
    INT
    s是否比字符串快?较小的数据字段比较大的数据字段快吗?即使索引正确?@Brad。是的,整数比较比字符串快。如果对其进行了索引,则该成本可能在插入时支付,而不是在查找时支付(至少对于查找
    max
    值的特定情况)。使用identity也比自制的并发安全解决方案快,因为它是一种非阻塞解决方案。@Martin,感谢您的澄清。我喜欢
    IDENTITY
    解决方案。当我们开发我们的时,我们不得不(为什么?我不知道)使用字母数字ID。@Martin:我想我必须澄清一些我没有提到的事情。RMA_编号并非在每次插入时生成。所以可能有很多没有数字的记录。您可以使用主键生成号码。这将是一个问题,因为差距太大。@Martin,那么先用一个预先计算好的RMA数字表,然后用你的
    proc
    拉取
    MAX
    序列号,然后删除它怎么样?如果值中偶尔出现差距,这有关系吗?例如,使用RMA00002511和RMA00002513是否可以,但n