2014-03-31 4 views
0

그래서 VB.NET 프로그램 내에서 사용할 저장 프로 시저를 만들었습니다. 이렇게하면 여러 테이블이 있는지 확인한 다음 관련 테이블을 만들고 데이터베이스 내의 다른 테이블을 사용하여 관련 테이블에 데이터를 삽입합니다. 원래는 저장 프로 시저가 잘 실행되었지만 최근에 변경된 사항이 있습니다. 실행 시간이 5 분 이상 걸리므로 시간 지연으로 인해 프로그램이 멈추는 문제가 있습니다. 따라서 저장 프로 시저를 실행하는 데 걸리는 시간을 줄여야합니다. 아래에 나는 오랜 시간이 걸리는 저장 프로 시저의 두 부분을 확인했습니다. 이들은 :느린 저장 프로 시저 - SQL Server

Customers1 테이블

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Customers1') 
drop table Customers1 

Create Table Customers1 
(ID int identity(1,1), 
[AccountNumber] NVARCHAR(20), 
[AddressNo] int, 
[Name] NVARCHAR(50), 
[Address] NVARCHAR(50), 
[Address2] NVARCHAR(50), 
[Town] NVARCHAR(50), 
[County] nvarchar(20), 
[Postcode] nvarchar(15), 
[Country] nvarchar(20), 
[Contact] nvarchar(81), 
[Phone] nvarchar(30), 
[FaxNo] NVARCHAR(30), 
[CurrentBalance] MONEY, 
[CreditLimit] MONEY, 
[Rep] NVARCHAR (50), 
[EmailAddress] NVARCHAR(225), 
[shiptoid] int default(0)) 

insert into Customers1([AccountNumber], [AddressNo],[Name],[Address],[Address2],[Town],[County],[Postcode],[Country],[Contact],[Phone],[FaxNo],[CurrentBalance],[CreditLimit],[Rep],[EmailAddress],[shiptoid]) 
select 
[AccountNumber] 
,0 as AddressNo 
,[Company] 
,[Address] 
,[Address2] 
,[city] 
,[State] 
,[ZIP] 
,[Country] 
,[FirstName]+ ' ' +[lastname] 
,[PhoneNumber] 
,[FaxNumber] 
,[AccountBalance] 
,[CreditLimit] 
,case when customtext2 = '' then 'HOUSE' else customtext2 end AS Rep 
,EmailAddress 
,0 
from customer 

union all 

select 
[AccountNumber] 
,0 as AddressNo 
,shipto.[Company] 
,shipto.[Address] 
,shipto.[Address2] 
,shipto.[city] 
,shipto.[State] 
,shipto.[ZIP] 
,shipto.[Country] 
,customer.[FirstName]+ ' ' +customer.[lastname] 
,shipto.[PhoneNumber] 
,shipto.[FaxNumber] 
,customer.[AccountBalance] 
,customer.[CreditLimit] 
,case when customtext2 = '' then 'HOUSE' else customtext2 end AS Rep 
,customer.EmailAddress 
,shipto.id 
from customer left join shipto 
on customer.id= shipto.customerid 
where shipto.company is not null 
order by customer.accountnumber 

declare @tableid int 
declare @lasttableid int 
declare @AccountNumber nvarchar(25) 
declare @LineNumber int 

set @tableID = 1 
set @lasttableID = (select max([id]) from Customers1) 
set @LineNumber = 1 
set @AccountNumber = (select AccountNumber from customers1 where id = @tableid) 

while @tableID <= @lasttableid 
begin 
    while @AccountNumber = (select AccountNumber from Customers1 where id = @tableid) 
     begin 
      update Customers1 
      set [AddressNo] = @LineNumber 
      where [id] = @tableid 
      set @LineNumber = @LineNumber + 1 
      set @tableid = @tableid + 1 
     end 
    set @LineNumber = 1 
    set @AccountNumber = (select AccountNumber from customers1 where id = @tableid) 
end 

Orderlinehistory1 테이블

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'OrderLineHistory1') 
drop table OrderLineHistory1  

Create Table OrderLineHistory1 
(ID int identity(1,1), 
[OrderNumber] nvarchar(25), 
[LineNo] INT, 
[ProductCode] nvarchar(25), 
[DueDate] DATETIME, 
[GrossSellingPrice] money, 
[OrderedQty] float, 
[DeliveredQty] float) 

insert into OrderLineHistory1([OrderNumber],[LineNo],[ProductCode],[DueDate],[GrossSellingPrice],[OrderedQty],[DeliveredQty]) 
--select 
--purchaseorder.ponumber 
--,0 as [LineNo] 
--,item.itemlookupcode 
--,Purchaseorder.RequiredDate 
--,item.price 
--,purchaseorderentry.quantityordered 
--,purchaseorderentry.quantityreceivedtodate 

--from PurchaseOrder,PurchaseOrderEntry,item 
--where PurchaseOrder.id = PurchaseOrderEntry.PurchaseOrderID 
--and purchaseorderentry.itemid = item.id 
--and purchaseorder.potype = 0 
--order by purchaseorder.ponumber,purchaseorderentry.id 

select 
[orderentry].orderID 
,0 as [LineNo] 
,item.itemlookupcode 
,[order].expirationorduedate 
,orderentry.price 
,orderentry.quantityonorder + orderentry.quantityRTD 
,orderentry.quantityRTD 
from orderentry left join [order] on orderentry.orderid = [order].ID 
       left join item on orderentry.itemid = item.id 
where orderentry.orderid >= (select min([ordernumber]) from pastorders) 
order by [orderentry].orderID, [orderentry].ID     


declare @tableid1 int 
declare @lasttableid1 int 
declare @OrderNumber1 nvarchar(25) 
declare @LineNumber1 int 

set @tableID1 = 1 
set @lasttableID1 = (select max([id]) from OrderLineHistory1) 
set @LineNumber1 = 1 
set @OrderNumber1 = (select OrderNumber from OrderLineHistory1 where id = @tableid1) 

while @tableID1 <= @lasttableid1 
begin 
    while @OrderNumber1 = (select OrderNumber from OrderLineHistory1 where id = @tableid1) 
     begin 
      update OrderLineHistory1 
      set [LineNo] = @LineNumber1 
      where [id] = @tableid1 
      set @LineNumber1 = @LineNumber1 + 1 
      set @tableid1 = @tableid1 + 1 
     end 
    set @LineNumber1 = 1 
    set @OrderNumber1 = (select OrderNumber from OrderLineHistory1 where id = @tableid1) 
end 

이 사람이를 작성하는보다 효율적인 방법을 생각할 수 있는가? 나는 그냥 루프 동안 하나를 사용하여 반복 논리를 다시 쓸 수 있다고 생각

ALTER Procedure sp_retreatHomes 
AS 
--SET NOCOUNT ON 

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'FamilyCode') 
drop table FamilyCode 

Create Table FamilyCode 
(ID int identity(1,1), 
[Code] nvarchar(17), 
[Name] nvarchar(30)) 

insert into FamilyCode([code],[name]) 
values ('Code','Name') 

insert into FamilyCode([code],[name]) 

select Code,[name] 
from category 

union 
select Code,[name] 
from department 
order by [name] 

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Customers1') 
drop table Customers1 

Create Table Customers1 
(ID int identity(1,1), 
[AccountNumber] NVARCHAR(20), 
[AddressNo] int, 
[Name] NVARCHAR(50), 
[Address] NVARCHAR(50), 
[Address2] NVARCHAR(50), 
[Town] NVARCHAR(50), 
[County] nvarchar(20), 
[Postcode] nvarchar(15), 
[Country] nvarchar(20), 
[Contact] nvarchar(81), 
[Phone] nvarchar(30), 
[FaxNo] NVARCHAR(30), 
[CurrentBalance] MONEY, 
[CreditLimit] MONEY, 
[Rep] NVARCHAR (50), 
[EmailAddress] NVARCHAR(225), 
[shiptoid] int default(0)) 

insert into Customers1([AccountNumber], [AddressNo],[Name],[Address],[Address2],[Town],[County],[Postcode],[Country],[Contact],[Phone],[FaxNo],[CurrentBalance],[CreditLimit],[Rep],[EmailAddress],[shiptoid]) 
select 
[AccountNumber] 
,0 as AddressNo 
,[Company] 
,[Address] 
,[Address2] 
,[city] 
,[State] 
,[ZIP] 
,[Country] 
,[FirstName]+ ' ' +[lastname] 
,[PhoneNumber] 
,[FaxNumber] 
,[AccountBalance] 
,[CreditLimit] 
,case when customtext2 = '' then 'HOUSE' else customtext2 end AS Rep 
,EmailAddress 
,0 
from customer 

union all 

select 
[AccountNumber] 
,0 as AddressNo 
,shipto.[Company] 
,shipto.[Address] 
,shipto.[Address2] 
,shipto.[city] 
,shipto.[State] 
,shipto.[ZIP] 
,shipto.[Country] 
,customer.[FirstName]+ ' ' +customer.[lastname] 
,shipto.[PhoneNumber] 
,shipto.[FaxNumber] 
,customer.[AccountBalance] 
,customer.[CreditLimit] 
,case when customtext2 = '' then 'HOUSE' else customtext2 end AS Rep 
,customer.EmailAddress 
,shipto.id 
from customer left join shipto 
on customer.id= shipto.customerid 
where shipto.company is not null 
order by customer.accountnumber 

declare @tableid int 
declare @lasttableid int 
declare @AccountNumber nvarchar(25) 
declare @LineNumber int 

set @tableID = 1 
set @lasttableID = (select max([id]) from Customers1) 
set @LineNumber = 1 
set @AccountNumber = (select AccountNumber from customers1 where id = @tableid) 

while @tableID <= @lasttableid 
begin 
    while @AccountNumber = (select AccountNumber from Customers1 where id = @tableid) 
     begin 
      update Customers1 
      set [AddressNo] = @LineNumber 
      where [id] = @tableid 
      set @LineNumber = @LineNumber + 1 
      set @tableid = @tableid + 1 
     end 
    set @LineNumber = 1 
    set @AccountNumber = (select AccountNumber from customers1 where id = @tableid) 
end 



IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CatalogueProducts1') 
drop table CatalogueProducts1 

Create Table CatalogueProducts1 
(ID int identity(1,1), 
[CatalogueCode] nvarchar(25), 
[ProductCode] nvarchar(25), 
[DisplaySequence] int) 

insert into CatalogueProducts1([CatalogueCode],[ProductCode], [DisplaySequence]) 

SELECT case when left(SubDescription1,4) = '' then 'NA' else left(SubDescription1,4) end 
,[ItemLookupCode] 
,0 
from dbo.Item 
Order by left(SubDescription1,4) asc 

declare @tableid2 int 
declare @lasttableid2 int 
declare @CatalogueCode nvarchar(25) 
declare @DisplaySequence int 

set @tableID2 = 1 
set @lasttableID2 = (select max([id]) from CatalogueProducts1) 
set @DisplaySequence = 1 
set @CatalogueCode = (select CatalogueCode from CatalogueProducts1 where id = @tableid2) 

while @tableID2 <= @lasttableid2 
begin 
    while @CatalogueCode = (select CatalogueCode from CatalogueProducts1 where id = @tableid2) 
     begin 
      update CatalogueProducts1 
      set [DisplaySequence] = @DisplaySequence 
      where [id] = @tableid2 
      set @DisplaySequence = @DisplaySequence + 1 
      set @tableid2 = @tableid2 + 1 
     end 
    set @DisplaySequence = 1 
    set @CatalogueCode = (select CatalogueCode from CatalogueProducts1 where id = @tableid2) 
end 

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'CatalogueProducts') 
drop table CatalogueProducts 

Create Table CatalogueProducts 
(ID int identity(1,1), 
[CatalogueCode] nvarchar(25), 
[ProductCode] nvarchar(25), 
[DisplaySequence] nvarchar(25)) 

insert into CatalogueProducts([CatalogueCode],[ProductCode], [DisplaySequence]) 
values('CatalogueCode','ProductCode', 'DisplaySequence') 

insert into CatalogueProducts([CatalogueCode],[ProductCode], [DisplaySequence]) 
select CatalogueCode,ProductCode,convert(nvarchar,DisplaySequence) 
from CatalogueProducts1 
order by id 


IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'PastOrders') 
drop table PastOrders 

Create Table PastOrders 
(ID int identity(1,1), 
[OrderNumber] NVARCHAR(25), 
[AccountCode] nvarchar(20), 
[AddressNo] nvarchar(10), 
[OrderDate] NVARCHAR(50), 
[DueDate] NVARCHAR(50), 
[RepCode] NVARCHAR(50)) 
insert into PastOrders([OrderNumber],[AccountCode],[AddressNo],[OrderDate],[DueDate],[RepCode]) 
values ('OrderNumber','AccountCode','AddressNo','OrderDate','DueDate','RepCode') 

insert into PastOrders([OrderNumber],[AccountCode],[AddressNo],[OrderDate],[DueDate],[RepCode]) 

SELECT 
CONVERT(VARCHAR,[Order].ID) AS OrderNumber 
,Customer.AccountNumber 
,case when shiptoid = 0 then 1 else shiptoid end AS AddressNo 
,isnull(convert(nvarchar,(datepart(dd,[order].ExpirationOrDueDate))) 
+ '/' + convert(nvarchar,(datepart(mm,[order].ExpirationOrDueDate))) 
+ '/' + convert(nvarchar,(datepart(yy,[order].ExpirationOrDueDate))),'') 
,isnull(convert(nvarchar,(datepart(dd,[order].LastUpdated))) 
+ '/' + convert(nvarchar,(datepart(mm,[order].LastUpdated))) 
+ '/' + convert(nvarchar,(datepart(yy,[order].LastUpdated))),'') 
,case when customer.customtext2 = '' then 'HOUSE' else customer.customtext2 end 
FROM [Order] 
LEFT JOIN Customer ON [order].customerID = customer.ID 
where Customer.AccountNumber is not null 
and [order].[time] > (select getdate() - 550) 



update PastOrders 
set [AddressNo] = convert(nvarchar,customers1.addressno) 
from PastOrders,customers1 
where PastOrders.[AddressNo] = customers1.shiptoid 
and PastOrders.[AddressNo] <> 'AddressNo' 

update PastOrders 
set [AddressNo] = 1 
where [AddressNo] not in (select id from shipto) 
and PastOrders.[AddressNo] <> 'AddressNo' 







--fix customers 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Customers') 
drop table Customers 

Create Table Customers 
(ID int identity(1,1), 
[AccountNumber] NVARCHAR(20), 
[AddressNo] nvarchar(30), 
[Name] NVARCHAR(50), 
[Address] NVARCHAR(50), 
[Address2] NVARCHAR(50), 
[Town] NVARCHAR(50), 
[County] nvarchar(20), 
[Postcode] nvarchar(15), 
[Country] nvarchar(20), 
[Contact] nvarchar(81), 
[Phone] nvarchar(30), 
[FaxNo] NVARCHAR(30), 
[CurrentBalance] NVARCHAR(225), 
[CreditLimit] NVARCHAR(225), 
[Rep] NVARCHAR (255), 
[EmailAddress] NVARCHAR(225)) 

insert into Customers([AccountNumber], [AddressNo],[Name],[Address],[Address2],[Town],[County],[Postcode],[Country],[Contact],[Phone],[FaxNo],[CurrentBalance],[CreditLimit],[Rep],[EmailAddress]) 
values ('AccountNumber', 'AddressNo','Name','Address','Address2','Town','County','Postcode','Country','Contact','Phone','FaxNo','CurrentBalance','CreditLimit','Rep','EmailAddress') 


insert into Customers([AccountNumber], [AddressNo],[Name],[Address],[Address2],[Town],[County],[Postcode],[Country],[Contact],[Phone],[FaxNo],[CurrentBalance],[CreditLimit],[Rep],[EmailAddress]) 
select [AccountNumber], 
convert(nvarchar,[AddressNo]) 
,[Name] 
,[Address] 
,[Address2] 
,[Town] 
,[County] 
,[Postcode] 
,[Country] 
,[Contact] 
,[Phone] 
,[FaxNo] 
,convert(nvarchar,[CurrentBalance]) 
,convert(nvarchar,[CreditLimit]) 
,[Rep] 
,[EmailAddress] 
from customers1 
order by [id] asc 


IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Products') 
drop table Products 

Create Table Products 
(ID int identity(1,1), 
[ProductCode] NVARCHAR(25), 
[Description] NVARCHAR(30), 
[UOM] NVARCHAR(4), 
[Carton] NVARCHAR(30), 
[StdPrice] NVARCHAR(25), 
    [SalesPrice] NVARCHAR(25), 
[StockQty] NVARCHAR(25), 
[PODueIn] NVARCHAR(25), 
[OnSOQty] NVARCHAR(25), 
[DueDate] NVARCHAR(25), 
[Barcode] NVARCHAR(25), 
[FamilyCode1] NVARCHAR(30), 
[FamilyCode2] NVARCHAR(30)) 


insert into Products([ProductCode] 
,[Description] 
,[UOM] 
,[Carton] 
,[StdPrice] 
,[SalesPrice] 
,[StockQty] 
,[PODueIn] 
,[OnSOQty] 
,[DueDate] 
,[Barcode] 
,[FamilyCode1] 
,[FamilyCode2]) 

Values('ProductCode','Description','UOM','Carton','StdPrice','SalesPrice','StockQty','PODueIn','OnSOQty','DueDate','Barcode','FamilyCode1','FamilyCode2') 

insert into Products([ProductCode] 
,[Description] 
,[UOM] 
,[Carton] 
,[Barcode] 
,[StdPrice] 
,[StockQty] 
,[PODueIn] 
,[OnSOQty] 
,[DueDate] 
,[FamilyCode1] 
,[FamilyCode2] 
,[SalesPrice]) 

select [ItemLookupCode] 
,[Description] 
,CASE [UnitOfMeasure] WHEN '' THEN 'EACH' ELSE UnitOfMeasure END AS UOM 
,[SubDescription3] 
, [Alias] 
, convert(nvarchar,item.[Price]) 
, convert(nvarchar,item.[quantity]) 
, isnull(View_PO.PODueIn,0) as PODueIN 
, convert(nvarchar,item.[QuantityCommitted]) 
, isnull(convert(nvarchar,(datepart(dd,View_PO.DueDate))) 
+ '/' + convert(nvarchar,(datepart(mm,View_PO.DueDate))) 
+ '/' + convert(nvarchar,(datepart(yy,View_PO.DueDate))),'') as DueDate 
, isnull(department.[name],'') as Department 
, isnull(category.[name],'') as Category 
, convert(nvarchar,item.[SalePrice]) 
from Item 
LEFT JOIN Alias ON alias.ItemID = Item.id 
left join View_PO on item.id = View_PO.itemid 
inner join firstAlias on alias.ID=firstAlias.id and firstAlias.ItemID=item.id 
left join department on item.departmentid = department.id 
left join category on item.categoryid = category.id 
WHERE SubDescription3 NOT IN ('0','') 
order by item.id asc 



IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'OrderLineHistory1') 
drop table OrderLineHistory1  

Create Table OrderLineHistory1 
(ID int identity(1,1), 
[OrderNumber] nvarchar(25), 
[LineNo] INT, 
[ProductCode] nvarchar(25), 
[DueDate] DATETIME, 
[GrossSellingPrice] money, 
[OrderedQty] float, 
[DeliveredQty] float) 

insert into OrderLineHistory1([OrderNumber],[LineNo],[ProductCode],[DueDate],[GrossSellingPrice],[OrderedQty],[DeliveredQty]) 
--select 
--purchaseorder.ponumber 
--,0 as [LineNo] 
--,item.itemlookupcode 
--,Purchaseorder.RequiredDate 
--,item.price 
--,purchaseorderentry.quantityordered 
--,purchaseorderentry.quantityreceivedtodate 

--from PurchaseOrder,PurchaseOrderEntry,item 
--where PurchaseOrder.id = PurchaseOrderEntry.PurchaseOrderID 
--and purchaseorderentry.itemid = item.id 
--and purchaseorder.potype = 0 
--order by purchaseorder.ponumber,purchaseorderentry.id 

select 
[orderentry].orderID 
,0 as [LineNo] 
,item.itemlookupcode 
,[order].expirationorduedate 
,orderentry.price 
,orderentry.quantityonorder + orderentry.quantityRTD 
,orderentry.quantityRTD 
from orderentry left join [order] on orderentry.orderid = [order].ID 
       left join item on orderentry.itemid = item.id 
where orderentry.orderid >= (select min([ordernumber]) from pastorders) 
order by [orderentry].orderID, [orderentry].ID     


declare @tableid1 int 
declare @lasttableid1 int 
declare @OrderNumber1 nvarchar(25) 
declare @LineNumber1 int 

set @tableID1 = 1 
set @lasttableID1 = (select max([id]) from OrderLineHistory1) 
set @LineNumber1 = 1 
set @OrderNumber1 = (select OrderNumber from OrderLineHistory1 where id = @tableid1) 

while @tableID1 <= @lasttableid1 
begin 
    while @OrderNumber1 = (select OrderNumber from OrderLineHistory1 where id = @tableid1) 
     begin 
      update OrderLineHistory1 
      set [LineNo] = @LineNumber1 
      where [id] = @tableid1 
      set @LineNumber1 = @LineNumber1 + 1 
      set @tableid1 = @tableid1 + 1 
     end 
    set @LineNumber1 = 1 
    set @OrderNumber1 = (select OrderNumber from OrderLineHistory1 where id = @tableid1) 
end 


IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'OrderLineHistory') 
drop table OrderLineHistory 

Create Table OrderLineHistory 
(ID int identity(1,1), 
[OrderNumber] nvarchar(25), 
[LineNo] nvarchar(25), 
[ProductCode] nvarchar(25), 
[DueDate] nvarchar(25), 
[GrossSellingPrice]nvarchar(25), 
[OrderedQty] nvarchar(25), 
[DeliveredQty] nvarchar(25)) 

insert into OrderLineHistory([OrderNumber],[LineNo],[ProductCode],[DueDate],[GrossSellingPrice],[OrderedQty],[DeliveredQty]) 
values('OrderNumber','LineNo','ProductCode','DueDate','GrossSellingPrice','OrderedQty','DeliveredQty') 

insert into OrderLineHistory([OrderNumber],[LineNo],[ProductCode],[DueDate],[GrossSellingPrice],[OrderedQty],[DeliveredQty]) 
select [OrderNumber],convert(varchar(25),[LineNo]),[ProductCode] 
,isnull(convert(nvarchar,(datepart(dd,DueDate))) 
+ '/' + convert(nvarchar,(datepart(mm,DueDate))) 
+ '/' + convert(nvarchar,(datepart(yy,DueDate))),'') 
,[GrossSellingPrice],[OrderedQty],[DeliveredQty] 
from OrderLineHistory1 
order by id asc 

-- Reps 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Reps') 
drop table Reps 

Create Table Reps 
(ID int identity(1,1), 
[Code] nvarchar(17), 
[Name] nvarchar(30)) 

insert into Reps([code],[Name]) 
values ('Code','Name') 

insert into Reps([code],[Name]) 
select distinct customtext2,customtext2 
from customer 
where customtext2 <> '' 
order by customtext2 

--Catalogues 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Catalogues') 
drop table Catalogues 

Create Table Catalogues 
(ID int identity(1,1), 
[Code] nvarchar(17), 
[Description] nvarchar(30)) 

insert into Catalogues([code],[Description]) 
values ('Code','Description') 

insert into Catalogues([code],[Description]) 
select distinct left(subdescription1,4),subdescription1 
from item 
where subdescription1 <> '' 

union 

select 'NA', 'Not Assigned' 
order by subdescription1 



-- select * from reps 
-- select * from Catalogues 
-- select * from FamilyCode 
-- select * from CatalogueProducts 
-- select * from customers 
-- select * from products 
-- select * from pastorders 
-- select * from orderlinehistory 
+0

그냥 사람들이 그가 테이블이 실행하는 약 5 분 정도 복용과 함께 customers1 테이블이 약 30 초 정도 소요, 주요 문제를 일으키는 OrderLineHistory1 알려하지만 난 여전히이 함께 할 수있는 더 효율적입니다 –

+0

SP가 천천히 실행되도록 변경 한 것은 무엇입니까? –

+0

테이블에 가입하시는 열에 orderentry, order, pastorders가 색인되어 있습니까? –

답변

1

:

전체 저장 프로 시저 주셔서 감사합니다. 정확한 비즈니스 요구 사항을 알지 못해 어떤 데이터에서도 테스트 할 수 없기 때문에 확신 할 수 없습니다. 그것을 시도하고 알려 :

set @tableID = 1 
set @lasttableID = (select max([id]) from Customers1) 
set @LineNumber = 1 
set @AccountNumber = (select AccountNumber from customers1 where id = @tableid) 

while @AccountNumber = (select AccountNumber 
         from Customers1 
         where id = @tableid) 
begin 
    update Customers1 
    set [AddressNo] = @LineNumber 
    where [id] = @tableid 

    set @LineNumber = @LineNumber + 1 
    set @tableid = @tableid + 1 
    set @AccountNumber = (select AccountNumber from customers1 where id = @tableid) 

    if (@tableId <= @lasttableid) 
     BREAK 
    else 
     CONTINUE 
end 
+0

고객 1 테이블 만위한 것입니까? :) 감사하고 도움을 주셔서 감사합니다 :) –

+0

기본적으로 당신의 while 루프는 비슷한 패턴을 따릅니다. 모든 경우에 위 사항을 적용하고 SP의 속도를 높이면 알려주십시오. 또한 앞서 언급 한 다른 전략을 시도하십시오. 하지만 한 번에 하나씩 시도해보고 반복적 인 쿼리를 변경하여 패턴을 따라 테스트 해보십시오. 그렇지 않다면 앞에서 언급 한 것처럼 색인을 추가하십시오. 그렇지 않다면 SP를 나눕니다. 그 후에는 문제를 완전히 다르게 접근해야 할 수도 있습니다. –

+0

또한 위의 코드를 사용하여 Customers1에 대한 이전 코드를 바꾼 후에는 어떤 이유로 느리게 실행됩니다./while 루프가 아닌 집합 기반 쿼리를 사용하여 수행 할 수 있다고 생각합니다. 어떻게 작성해야할지 모르겠습니다. –