-1

私は2つのテーブルserialNumber、Orgを持っています

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)

シリアル番号 (123456100) を ORG A から ORG B に転送し、転送済みとしてマークしたい transferedStatus = 0 (在庫あり) transferedStatus = 1 (在庫なし)

ここに私のクエリがありますが、それは機能しますが、膨大な数のシリアル番号(10K)を転送したい場合は遅すぎます...他の方法でそれを行う方法があることは知っていますが、どうすれば?!

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

4

1 に答える 1

1

行ごとに実行しているので、10k 行では遅いのも不思議ではありません。int の代わりにテーブル値パラメーターで機能するように手順を変更してみてください。tbv の使用例: http://blog.sqlauthority.com/2008/08/31/sql-server-table-valued-parameters-in-sql-server-2008/ セットベースの操作は確実に高速になります。

于 2013-03-25T10:03:48.013 に答える