【问题标题】:what's wrong with my sql script? (sql server)我的 sql 脚本有什么问题? (SQL服务器)
【发布时间】:2013-03-27 09:30:01
【问题描述】:

我的表序列号,Org 我想将序列号(123456100)从 ORG A 转移到 ORG B 并标记 它被转移 已转移状态 = 0(有货) transferStatus = 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 LINK

【问题讨论】:

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


【解决方案1】:

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

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 

【讨论】:

  • 感谢您的回复,问题是,插入序列号的拥抱号的最佳方法是什么(例如从 12300000 到 12310000),我使用循环 while() { insert.. .}(php) 逐行插入 ...
  • 您是在询问初始插入序列号表还是转移。你原来的问题问两个。
  • 初始插入序列号
  • 使用我上面展示的方法,使用一个选择和多个值行,比为每一行发出单独的插入语句更有效。
  • 我真的不明白怎么做,我用 php 和 sqlServer 2005
【解决方案2】:

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

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

【讨论】:

  • 10K 行对于索引来说确实不算多,这种大小的东西甚至可能不会使用索引,所以这个建议可能比它的价值更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多