【发布时间】:2015-01-30 07:30:53
【问题描述】:
我面临一个大问题,以下存储过程需要大量时间才能执行。请帮我找出以下存储过程的问题。
我们需要将批量订阅者列表从 excel 插入到数据库中。但是一分钟内只有 60 个订阅者被插入到 db。
请帮我解决问题。
USE [SMS]
GO
/****** Object: StoredProcedure [dbo].[SP_ProcessFile] Script Date: 01/30/2015 12:56:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_ProcessFile]
@JobCode varchar(25)
WITH RECOMPILE
AS
declare
@jobCode1 Varchar(50),
@count int,@Code varchar(50),@Name [varchar](50),@Date Datetime,@Status int,
@i int,@EUCount int,@SubCount int,
@Add1 nvarchar(3000) ,
@Add2 nvarchar(500) ,
@Add3 nvarchar(500)
,@refdate [varchar](50) ,
@reference [varchar](50) ,
@Joined [varchar](50),
@Joinmonth [nvarchar](50),
@Activated [varchar](50),
@ActivMonth [nvarchar](50),
@Center [varchar](50) ,
@Region [varchar](50) ,
@Area [varchar](50) ,
@Modem [varchar](50) ,
@Adomstatus [varchar](50)
, @AddCode [varchar](50)
set @i = 1
Set @jobCode1 =@JobCode
BEGIN
SET NOCOUNT ON
Set @Status = (Select Distinct(status) from TSMST1005 where Jobcode = @jobCode1)
if (@Status = 0)
begin
Select '1' as res
end
else
begin
CREATE TABLE #tblSMS(pID int identity(1,1),
[Reference] [nvarchar](50) NULL,
[Date] [varchar](50) NOT NULL,
[Code] [nvarchar](50) NULL,
[Subname] [varchar](500) NULL,
[Address1] [nvarchar](3000) NULL,
[Address2] [nvarchar](500) NULL,
[Address3] [nvarchar](500) NULL,
[Joined] [varchar](50) NULL,
[Joinmonth] [varchar](50) NULL,
[Activated] [varchar](50) NULL,
[ActivMonth] [nvarchar](50) NULL,
[Center] [varchar](50) NULL,
[Region] [varchar](50) NULL,
[Area] [varchar](50) NULL,
[Modem] [varchar](50) NULL,
[Adomstatus] [varchar](50) NULL,
[RefDate] [varchar](50) NOT NULL)
insert into #tblSMS
SELECT Reference,[Date],
Code,Subname ,Address1 ,Address2 ,Address3 ,
Joined , Joinmonth ,Activated, ActivMonth ,
Center,Region,Area,Modem,Adomstatus ,refdate FROM TSMST1005 where jobcode = @jobCode1 and Status =1
WHILE @i <= (SELECT COUNT(*) FROM #tblSMS)
BEGIN
SELECT
@Code =Code,
@Name = Subname,
@Date =[Date],
@Add1 =Address1 ,
@Add2 =Address2 ,
@Add3= Address3,
@reference =Reference ,
@Joined = Joined,
@Joinmonth =Joinmonth,
@Activated =Activated,
@ActivMonth =ActivMonth,
@Center = Center,
@Region = Region,
@Area= Area,
@Modem = Modem ,
@Adomstatus =Adomstatus,
@refdate = RefDate
From #tblSMS where pID = @i
Insert into TCMST5001 (CompanyCode , Address1,Address2 ,Address3 ,CreatedDate ,Status) values('001',@Add1 ,@Add2,@Add3,GETDATE(),1)
Set @count = SCOPE_IDENTITY()
Set @AddCode = 'ADD' + Cast(@count As Varchar(10))
Update TCMST5001 Set Code =@AddCode Where AddressID =@count
Set @EUCount = (Select COUNT(*) from TCCOM0005 where EnterpriseUnitCode = @Center)
if (@EUCount = 0)
Begin
Insert into TCCOM0005(AddressCode,CompanyCode,EnterpriseUnitCode,EnterpriseUnitName,Status) values(@count ,'001',@Center,@Center ,1)
END
Set @SubCount = (Select COUNT(*) from TSMST1001 where Subscriber = @Code)
if (@SubCount =0)
begin
Insert into TSMST1001(ActivationDate ,refdate , Address ,AlternateName ,Area ,Region ,Subscriber,Name ,date ,CreatedDate ,EnterpriseUnit ,Status)
values(@Activated,@refdate ,@count ,@Name,@Area,@Region,@Code,@Name ,@Joined ,GETDATE(),@Center,@Adomstatus)
end
Insert into TSMST1003 (Device ,CreatedDate ,Subscriber,StartDate) values
(@Modem,GETDATE(),@Code,@Activated)
SET @i = @i + 1
Update TSMST1005 Set Status = 0 where Jobcode = @jobCode1
Select '3' as res
END
END
Drop table #tblSMS
end
【问题讨论】:
-
Bad habits to kick : choosing the wrong data type - 你应该始终使用最合适的数据类型 - 毕竟这就是它们的用途!不要只是因为懒惰而将
VARCHAR(n)用于一切! -
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀!
标签: sql sql-server stored-procedures