2012-09-09 20 views
2

我想將大量數據從一個表複製到另一個表。我在存儲過程中使用遊標執行相同的操作。但它僅工作對於少records.If表的表包含它是爲長時間執行和hanged.Please給一些建議,如何能我的快捷方式複製DATAS更多的記錄,我的SP是如下:如何將大量的數據從一個表複製到SQL Server中的其他表

--exec uds_shop 

--select * from CMA_UDS.dbo.Dim_Shop 
--select * from UDS.dbo.Dim_Shop 
--delete from CMA_UDS.dbo.Dim_Shop 

alter procedure uds_shop 
as 
begin 
declare @dwkeyshop int 
declare @shopdb int 
declare @shopid int 
declare @shopname nvarchar(60) 
declare @shoptrade int 
declare @dwkeytradecat int 
declare @recordowner nvarchar(20) 
declare @LogMessage varchar(600) 

Exec CreateLog 'Starting Process', 1 

DECLARE cur_shop CURSOR FOR 
    select 
    DW_Key_Shop,Shop_ID,Shop_Name,Trade_Sub_Category_Code,DW_Key_Source_DB,DW_Key_Trade_Category,Record_Owner 
    from 
    UDS.dbo.Dim_Shop 

    OPEN cur_shop 
    FETCH NEXT FROM cur_shop INTO @dwkeyshop,@shopid,@shopname,@shoptrade, @shopdb ,@dwkeytradecat,@recordowner 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    Set @LogMessage = '' 
    Set @LogMessage = 'Records insertion/updation start date and time : ''' + Convert(varchar(19), GetDate()) + ''''    

    if (isnull(@dwkeyshop, '') <> '') 
     begin 
     if not exists (select crmshop.DW_Key_Shop from CMA_UDS.dbo.Dim_Shop as crmshop where (convert(varchar,crmshop.DW_Key_Shop)+CONVERT(varchar,crmshop.DW_Key_Source_DB)) = convert(varchar,(CONVERT(varchar, @dwkeyshop) + CONVERT(varchar, @shopdb)))) 
     begin 
     Set @LogMessage = Ltrim(Rtrim(@LogMessage)) + ' ' + 'Record for shop table is inserting...'   
       insert into 
       CMA_UDS.dbo.Dim_Shop 
       (DW_Key_Shop,DW_Key_Source_DB,DW_Key_Trade_Category,Record_Owner,Shop_ID,Shop_Name,Trade_Sub_Category_Code) 
       values 
       (@dwkeyshop,@shopdb,@dwkeytradecat,@recordowner,@shopid,@shopname,@shoptrade) 
     Set @LogMessage = Ltrim(Rtrim(@LogMessage)) + ' ' + 'Record successfully inserted in shop table for shop Id : ' + Convert(varchar, @shopid) 

      end 
      else 

      begin 
      Set @LogMessage = Ltrim(Rtrim(@LogMessage)) + ' ' + 'Record for Shop table is updating...' 
      update 
      CMA_UDS.dbo.Dim_Shop 
      set [email protected], 
      [email protected], 
      [email protected],[email protected],[email protected] 

      where  
       [email protected] and [email protected]  
      Set @LogMessage = Ltrim(Rtrim(@LogMessage)) + ' ' + 'Record successfully updated for shop Id : ' + Convert(varchar, @shopid) 
      end 
     end 
     Exec CreateLog @LogMessage, 0 
     FETCH NEXT FROM cur_shop INTO @dwkeyshop,@shopid,@shopname,@shoptrade, @shopdb ,@dwkeytradecat,@recordowner 
    end 
    CLOSE cur_shop 
    DEALLOCATE cur_shop 
End 
+0

您的源表是否具有Identity()列? –

+0

我的源表中沒有標識列 – jeni

回答

1

從我個人的經驗,當你從一個表複製巨大的數據到另一個表(具有類似的約束)時,將約束放在數據被複制的表上。複製完成後,再次恢復所有約束。

我可以在7小時縮短副本時間爲30分鐘,在我的情況(100萬條記錄與6個約束)

+0

嗨,感謝您的答案。它在30分鐘內移動了數百萬條記錄。我已經得到了要求,因爲我不想截斷每張表並插入,因爲它可能會影響。請你一些更詳細我在我的SP?.my源表中沒有任何主鍵,我的目標表有主鍵。請解釋。 – jeni

5

假設targetTabledestinationTable具有相同的架構......

INSERT INTO targetTable t 
SELECT * FROM destinationTable d 
WHERE someCriteria 

避免除非沒有其他方法(罕見)使用遊標。

您可以使用WHERE子句篩選出任何重複的記錄。

如果您有標識列,請使用不包含標識列的明確列列表。

您也可以嘗試禁用約束和刪除索引,只要您替換它們(並確保約束已被選中)。

如果您使用SQL Server 2008(以上版本),則可以使用MERGE語句。

+0

嗨我試過你,我有一些困難,在過濾where的條件,因爲我會比較2列,以獲得獨特的價值,你可以在我的查詢中看到「選擇crmshop.DW_Key_Shop從CMA_UDS.dbo.Dim_Shop作爲crmshop其中(convert( VARCHAR,crmshop.DW_Key_Shop)+ CONVERT(VARCHAR,crmshop。DWW_Key_Source_DB))= convert(varchar,(CONVERT(varchar,@dwkeyshop)+ CONVERT(varchar,@ shopdb)))「 – jeni

0

遊標非常緩慢,RAM可能開始成爲非常大的數據集的問題。

它看起來好像在每次迭代中做了很多日誌記錄,所以你可能會被光標卡住,但我會尋找一種方法將作業分解爲多個調用,以便可以保留你的足跡很小。

如果你有一個自動編號列,我想補充一個「@startIdx BIGINT」的程序,並重新定義你的光標聲明採取了「TOP 1000「WHERE [autonumberFeild] < = @startIdx按訂單[autonumberFeild] 」。然後創建一個新的存儲過程是這樣的:

DECLARE @startIdx bigint = 0 
WHILE select COUNT(*) FROM <sourceTable> > @startIdx 
BEGIN 
    EXEC <your stored procedure> @startIdx 
END 
SET @startIdx = @startIdx + 1000 

此外,請確保您的數據庫文件被設置爲自動增長,而且它在大增量這樣做,這樣你就不會花所有的時間越來越多的數據文件。

0
INSERT INTO targetTable 
SELECT * FROM destinationTable 
WHERE someCriteria (based on Criteria you can copy/move the records) 
+0

可以解釋附加值與@MitchWheat的答案進行比較,特別是因爲'move'錯誤。 – bummi

相關問題