Sql server 字符列上的最大/订单数量
在我的SQL Server 2005数据库中,表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_编号可能具有更
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列的排序可能会变慢,所以我选择按日期列排序
所以
int
列并在应用程序中设置数字格式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