请教 存储过程 百万级别的数据插入 优化

kuhaner 2010-11-29 04:04:37
有两个存储过程
其中第一个 是执行插入表数据的

另外一个是为第一个存储过程传递参数


1、SP_Insert

CREATE PROCEDURE SP_Insert
(
@ID INT,
@value1 INT,
@value2 INT
)
AS
BEGIN
--这里 是插入数据的业务逻辑 这里业务逻辑比较复杂 目前难于优化
--每次执行大概需要插入10条记录
--INSERT INTO
END


2、SP_Select_Insert 查询 并循环 执行SP_Insert 的插入功能

CREATE PROCEDURE SP_Select_Insert
(
@value1 INT,
@value2 INT
)
AS
BEGIN
DECLARE @SIDs TABLE(ID INT)

BEGIN
INSERT INTO @SIDs
SELECT ID FROM TABLE1 --这里有10万左右的数据
END

DECLARE c CURSOR FAST_FORWARD FOR SELECT ID FROM @SIDs

OPEN c
DECLARE @Id INT
FETCH NEXT FROM c INTO @Id

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC SP_Insert @Id,@value1,@value2
FETCH NEXT FROM c INTO @Id
END

CLOSE c
DEALLOCATE c
END

--SP_Select_Insert '1','2'
--10*10万条左右的数据 总耗时大概 25 分钟 汗!


请问 第二个存储过程有哪些优化空间


...全文
99 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
天-笑 2010-11-29
  • 打赏
  • 举报
回复

第一:
DECLARE @maxRow INT
DECLARE @SIDs TABLE(ID INT)
换成 创建 临时表 :create table #SIDs (uID INT identity(1,1),id int primary key(uid))

INSERT INTO #SIDs (id)
SELECT ID FROM TABLE1 --这里有10万左右的数据
select @maxRow = @@rowcount

第二:
不申明游标:DECLARE c CURSOR FAST_FORWARD FOR SELECT ID FROM @SIDs
set @i = 1
while (@i <= @maxRow)
begin
select id from #SIDs where uid = @i
EXEC SP_Insert
set @i = @i+1
end




天-笑 2010-11-29
  • 打赏
  • 举报
回复
第一:
DECLARE @SIDs TABLE(ID INT)
换成 创建 临时表 :create table #SIDs (uID INT identity(1,1),id int)

INSERT INTO #SIDs (id)
SELECT ID FROM TABLE1 --这里有10万左右的数据
select @maxRow = @@rowcount

第二:
不申明游标:DECLARE c CURSOR FAST_FORWARD FOR SELECT ID FROM @SIDs
set @i = 1
while (@i <= @maxRow)
begin
EXEC SP_Insert
end


22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧