0

私のテーブルserialNumber、Orgシリアル番号(123456100)をORGAからORGBに転送し、転送済みとしてマークしますtransferedStatus = 0(在庫あり)transferedStatus = 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

まず、インデックスを上げたテーブルに大量のデータを挿入すると、挿入バッチの速度が低下する可能性があります。

テーブルのクラスター化インデックスを無効にしてserialNumber、再試行してください。さらにインデックスがある場合は、それらをすべて無効にし、データを挿入して、インデックスを再構築します。インデックスを再構築すると、それらすべてが有効になります。

于 2013-03-27T11:06:51.943 に答える
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 に答える