優化

2013-03-28 69 views
0

我已經寫了小的數據庫這個代碼,但知道數據庫的大小增加了代碼,它顯示在優化它 下面超時error.plz幫助代碼: -優化

IF OBJECT_ID('Temp_expo') is not null 
begin 
    drop table Temp_expo 
end 

set @query3 = 'SELECT SPCT_ID_REL_LOW,SPCT_ID_REL_HIGH,ROW_NUMBER() over (order by PDBC_PFX) as TempId 

INTO Temp_expo 
FROM ['+ @FCTServer +'].['[email protected]+'].dbo.CMC_SPCT_SUPP_CONV 
where SPCT_ID_REL_LOW <> '''' and SPCT_ID_REL_HIGH <> ''''' 

exec (@query3) 

Select @minCount= min(TempId) from Temp_expo 
Select @maxCount= max(TempId) from Temp_expo 

create table #ICD9SPCT 
(
    ICD9Code varchar(200) 
} 

while @minCount<[email protected] 
begin 
    select @low=SPCT_ID_REL_LOW,@high=SPCT_ID_REL_HIGH 
    from Temp_expo 
    where [email protected] 
    group by SPCT_ID_REL_LOW,SPCT_ID_REL_HIGH 

    set @loworder = (select ISNULL(OrderId,0) from FCT_ICD9_Diag_ORDER where [email protected]) 
    set @highorder = (select ISNULL(OrderId,0) from FCT_ICD9_Diag_ORDER where [email protected]) 


    insert into #ICD9SPCT 
    select ICD9 from FCT_ICD9_Diag_ORDER ordert 
    left join #ICD9SPCT icdorder on ordert.ICD9 = icdorder.ICD9Code 
    where OrderId between @loworder and @highorder and icdorder.ICD9Code is null 

    set @minCount = @minCount+1; 
end 
+1

由於沒有「我們」可以使用的代碼,因此很難幫助您。如果你可以使用像http://sqlfiddle.com/這樣的東西作爲一個工作示例,它會有很大的幫助 - 作爲一個快速拍攝,我會檢查你是否有適當索引的引用字段。 – 2013-03-28 09:40:26

+0

我必須從表中選擇SPCT_ID_REL_LOW,SPCT_ID_REL_HIGH值並將它們保存在臨時表中並使用它。這個LOW,HIGH是範圍值,大約LAKHS的數量。有沒有什麼辦法,我可以直接使用它的單個select語句而不使用臨時表 – umm 2013-03-28 10:30:02

回答

0

如果這是對於SQL SERVER,您可以嘗試以下一些基本提示: USE:WITH(NOLOCK)在每次選擇後使用。 即 選擇ICD9從(NOLOCK) 左連接上ordert.ICD9 = icdorder.ICD9Code 其中@loworder和@highorder和icdorder.ICD9Code之間的OrderId爲空#ICD9SPCT icdorder FCT_ICD9_Diag_ORDER ordert

您也可以嘗試改變你的臨時表變量表,僅通過改變#爲@,如:

創建表@ ICD9SPCT ( ICD9Code VARCHAR(200) }

你,依舊是使用while循環可能原始你的問題的原因。