0

我的表 serialNumber, Org 我想将 serialNumber (123456100) 从 ORG A 转移到 ORG B 并将其标记为已转移转移状态 = 0(有库存)转移状态 = 1(无库存)

这是我的查询,它可以工作,但是当我要传输大量序列号(10K)时它太慢了……我知道还有其他方法可以做到,但是怎么做?!

create table org(
  org_id  INT NOT NULL IDENTITY(1,1)PRIMARY KEY CLUSTERED,
  orgName VARCHAR(10)
  )
create table serialNumber(id  INT NOT NULL IDENTITY(1,1)PRIMARY KEY CLUSTERED,
                          org_id INT FOREIGN KEY REFERENCES org,
                          serialNumber BIGINT,
                          transferedStatus INT DEFAULT(0),
                          parentID INT NULL FOREIGN KEY REFERENCES serialNumber)

insert into org values('ORG A')
insert into org values('ORG B')
insert into org values('ORG C')
insert into org values('ORG D')
insert into org values('ORG E')

insert into serialNumber values(1,123456100,0,NULL)
insert into serialNumber values(1,123456101,0,NULL)
insert into serialNumber values(1,123456102,0,NULL)
insert into serialNumber values(1,123456103,0,NULL)
insert into serialNumber values(1,123456104,0,NULL)
insert into serialNumber values(1,123456105,0,NULL)





declare @parentID int
declare @From_org_id  int 
declare @To_org_id  int 
declare @serialNumber BIGINT

set  @From_org_id  = 1
set  @To_org_id  = 2
set @serialNumber = 123456101

/* mark the serialNumber as transfered */

UPDATE serialNumber                             
set
transferedStatus = 1 
Where   
org_id              = @From_org_id
AND serialNumber    = @serialNumber 

/* find ID of the source of Serial Number */
select TOP 1 @parentID = id
FROM serialNumber
Where org_id            = @From_org_id 
  AND transferedStatus  = 1
    AND serialNumber    = @serialNumber 
ORDER BY id DESC


insert into serialNumber values(@To_org_id,@serialNumber,0,@parentID)

sqlfiddle 链接

4

2 回答 2

0

您可能不会为您的插入进行单独的插入,例如可能更多,但这对于大量插入更有效:

insert into #serialNumber 
values
(1,123456100,0,NULL)
,(1,123456101,0,NULL)
,(1,123456102,0,NULL)
,(1,123456103,0,NULL)
,(1,123456104,0,NULL)
,(1,123456105,0,NULL)

接下来,对于您的实际更新,运行它,使用 OUTPUT 子句我们可以一举完成更新和插入,节省一些查找,这可能是昂贵的。

UPDATE serialNumber                             
    set transferedStatus = 1 
OUTPUT @To_Org_id, INSERTED.serialNumber, 0, INSERTED.Id  into serialNumber
Where   
    org_id = @From_org_id
    AND serialNumber    = @serialNumber 
于 2013-03-28T01:37:03.087 回答
0

首先,当您在已提高索引的表中插入大量数据时,这可能会减慢您的插入批处理。

禁用表上的聚集索引,serialNumber然后重试。如果您有更多索引,请将它们全部禁用,插入数据并重建索引。重建索引将使它们全部启用。

于 2013-03-27T11:06:51.943 回答