2017-06-14 52 views
-1

我已經運行了一個執行計劃並注意到查詢在插入臨時表時需要時間。我們有多個查詢插入到臨時表中。我在下面分享了其中兩個。如何通過storedprocedure查詢將聚集索引添加到臨時表中。它需要動態創建索引,並摧毀它在臨時表上添加聚簇索引以提高性能

if object_id('tempdb..#MarketTbl') is not null drop table #MarketTbl else 

     select 
      mc.companyId, 
      mc.pricingDate, 
      mc.tev, 
      mc.sharesOutstanding, 
      mc.marketCap 
     into #MarketTbl 
     from ciqMarketCap mc 
     where mc.pricingDate > @date 
     and mc.companyId in (select val from @companyId) 
     ---- pricing table: holds pricing data for the stock pprice 

if object_id('tempdb..#PricingTbl') is not null drop table #PricingTbl else 
     select 
      s.companyId, 
      peq.pricingDate, 
      ti.currencyId, 
      peq.priceMid 
     into #PricingTbl 
     from ciqsecurity s 
      join ciqtradingitem ti on s.securityid = ti.securityid 
      join ciqpriceequity peq on peq.tradingitemid = ti.tradingitemid 
     where s.primaryFlag = 1 
      and s.companyId in (select val from @companyId) 
      and peq.pricingDate> @date 
      and ti.primaryflag = 1 

執行計劃 enter image description here

+0

你嘗試過CREATE INDEX嗎? –

+0

[臨時表上的聚集索引]的可能重複(https://stackoverflow.com/questions/7663967/clustered-index-on-temp-table) –

+0

您是否嘗試將臨時表或SELECT中的INSERT改進爲臨時表? –

回答

0

你在做什麼是純粹的無稽之談。你必須加快你的選擇,而不是插入。 爲了加快速度,您(可能)需要您選擇的表格上的索引。

你現在正在做的是試圖將一個聚集索引添加到不存在(錯誤告訴你吧!),因爲如果它存在,你把它

+0

我已經使用執行計劃更新了文章。它顯示更多的插入。你對選擇的建議有什麼改進。你可以給我一個例子 – Tom

+1

即使「如果它顯示更多的插入」,這並不意味着你應該插入到聚集索引。將索引添加到目標只會將SORT添加到您的計劃中,排序不是免費的 – sepupic

+0

例如,在第一個查詢中,將pricingDate編入索引。不知道我可以在選擇 – Tom

0

表不存在的表1.首先,你的數據不超過5到10萬,不要使用臨時表,使用表類型變量。 2.您可以在插入數據後創建索引,使用alter table語法。

+0

上執行哪些改進我試着創建一個表變量並在表聲明中將第一個字段聲明爲主鍵。該表在查詢中的下一行被引用。與臨時表方法相比,這需要更多的時間。將近一分鐘 – Tom

相關問題