2013-11-23 93 views
0

我從來沒有在存儲過程中使用索引,所以我在尋求幫助,因爲我的一個報告使用的是運行速度較慢的。我有一份水晶報告,這是一份老齡化報告。在過程本身中,它正在創建一個臨時表。它使用表格臨時表的表格有很多數據,很多信息正在被拖動。最終結果是報告需要永遠運行。除了在臨時表上創建索引之外,還有其他任何建議都值得歡迎,並感謝您閱讀此代碼。代碼如下。在Crystal Report SQL服務器中使用的存儲過程創建索引2008

Create procedure [dbo].[ST_Stored] @AsofDate datetime 
as 
--drop table #rectodate 
declare @rectodate table (transid INT, transrowid INT, reconsum REAL) 


INSERT into @rectodate 
select  transid, transrowid, sum(reconsum) as reconsum 
from itr1 
where reconnum in (select reconnum from oitr where recondate <[email protected]) 
group by transid, transrowid 

select  t0.transid, t2.cardcode, 
      case when t0.debit <> 0 then t0.debit - isnull(t1.reconsum,0) else 0 end as OpenDebit, 
      case when t0.credit <> 0 then t0.credit - isnull(t1.reconsum, 0) else 0 end as OpenCredit, 
      t0.debit, t0.credit,* 
      from jdt1 t0 left outer join @RecToDate t1 
      on t0.transid = t1.transid and t0.line_id= t1.transrowid 
      left join OINV t2 on t2.CardCode=t0.ShortName 
      join oslp on oslp.slpcode = t2.slpcode 

where t0.refdate [email protected] and t2.slpcode=5 
order by t0.transid, t2.cardcode, t0.refdate 

回答

1

1)你可以做最簡單的做法是與包括激活,看看SQL Server的顯示,您可以創建缺失索引的實際執行計劃選項以執行SSMS此存儲過程。如果可以,那麼你應該發佈這個執行計劃。

2)我將創建下列指數(如果沒有):

CREATE /*UNIQUE*/ INDEX IX_jdt1_refdate_#_transid_lineid_debit_credit 
ON dbo.jdt1(refdate) 
INCLUDE (transid,line_id,debit,credit) 
+0

感謝您的建議,我會嘗試。但是,我可以在臨時表上創建索引嗎? – user2363530

+0

@ user2363530:你有沒有試過,至少? –

+0

是的,我試過了,它不推薦任何。 jdt1表上已經有一個聚集索引。 – user2363530

1

正如波格丹說,你必須檢查查詢計劃,瞭解您的查詢是那麼的漫長。 我想說,你必須這樣做之前創建任何索引「au petit bonheur」(我不是說Bogdan建議的索引是錯誤的,但不知道數據......這是一個猜測:)。 您的代碼中有一條註釋,表明您嘗試了臨時表而不是表變量(--drop table #rectodate)。 由於性能方面的原因,我會留在臨時表中,因爲您可以將索引添加到臨時表而不是表變量(以及表格變量在tempdb中創建的方式)。