我的sql脚本出了什么问题? (sql server)

时间:2013-03-27 09:30:02

标签: sql-server performance sql-server-2005

我的表serialNumber,Org   我想从ORG A转移serialNumber(123456100)到ORG B并标记           它被转移了           transferedStatus = 0(有货)           transferedStatus = 1(缺货)

这是我的查询它的工作,但是当我想要传输大量的serialNumber(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 LINK

2 个答案:

答案 0 :(得分:0)

首先,当您在表中插入具有引发索引的大量数据时,这可能会降低插入批处理的速度。

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

答案 1 :(得分: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