表A有一个记录号字段,记录号字段使用事务控制唯一性
生成唯一记录号过程如下:
BEGIN TRANSACTION
  declare @maxid int
  set @maxid=0
  select *from A
  if @@rowcount>0
  begin
declare @max varchar(50)
select @max=max(记录号) from A
select @maxid=right(@max,9) 
  end
  ...
  set @ID=@ID+convert(varchar(20),@maxid)
  insert into A(记录号) values(@ID)
COMMIT当A中数据很庞大时(如20W条记录),生成一条记录,sqlservr CPU占用率很高(不能满足实际需求),其中表A中的数据也不能随便删除,请问该如何解决?

解决方案 »

  1.   

    搞不明白为什么这么多用锁表方法生成记录号真的需要的话,建议修改一下,表a可以有两个字段,一个是类别,一个是最大记录号,这样可以减少表a的数据量。另外,你的用法能达到目的吗,select *from A返回数据太多不说,也没有加锁,应该是
    select top 1 * from A with (tablock) order by ...
      

  2.   


    BEGIN TRANSACTION
      declare @maxid int
      set @maxid=0
      select * from A
      if @@rowcount>0
      begin
        --declare @max varchar(50)
        select top 1 @maxid=right(记录号,9) from A order by 记录号 desc
        --select =right(@max,9) 
      end
      ...
      set @ID=@ID+convert(varchar(20),@maxid)
      insert into A(记录号) values(@ID)
    COMMIT
    --没经验的改了一下,不晓得会不会好点
      

  3.   

     select *from A
    这句话有问题。如果A表数据量大,那么就影响效率要替换掉,用exits等都可以。
      

  4.   

    我需要生成varchar类型的记录号

    00001
    00002
    ...
    00100