日期:2014-05-17  浏览次数:20694 次

从 Excel 导入到 SQL 的大数据效率问题
导入数据量:10W。
环境:Sql server 2008 R2
导入用时 29分钟。
每条执行语句:

IF EXISTS(SELECT 1 FROM [CustomerSchedule_Temp] WHERE [ContractNO] = 'F8N37643' AND [BaseData] = '2013-01-21' AND [CompID] = 'KH0001')
BEGIN
    DELETE FROM [CustomerSchedule_Temp] WHERE [ContractNO] = 'F8N37643' AND [BaseData] = '2013-01-21' AND [CompID] = 'KH0001'
END
INSERT INTO [CustomerSchedule_Temp]([OTISWeeks], [Remark1], [Remark2], [Dstation], [OrderNumber], [ShippMethod], [ContractNO], [ContractType], [BaseData], [IsWorry], [PlanType], [PlaceOfDelivery], [ReceiveData], [UnderCust], [DeliveryDate], [Batch], [Area], [OWeight], [Ladder], [LadderRemark], [CompID], [RequestFinishDate], [LeaveFacDate], [ReciveDate], [PartsBuyDate], [DrawDownData], [AssemFinishDate], [InventoryFinishDate], [ProcDownData], [WholeBankDate], [SelfFinishDate], [CancelCause], [CompNumber], [ContactVersionsNo], [contract_stat], [DrawFinishData], [HzFSendData], [ID], [IN_Time], [Inbatches], [Input_ImportInfo], [KeyPartyDesc], [ModifyData], [ModifyPrsn], [PickUpType], [RequestData], [UpInventoryDate], [PType], [SendData], [Attachment], [CompType], [PcData], [FirstDeliDate], [BoxNum], [Series], [TrsptModeID]) VALUES(NULL, NULL, NULL, NULL, NULL, NULL, 'F8N37643', '客梯', '2013-01-21', NULL, '410-1', NULL, ISNULL('2013-01-11', CONVERT(VARCHAR(10),GETDATE(),120)), '泉州市XXXX机械有限公司', '2013-01-21', '1', '福州', '1', 'GeN2-MR', 'CMD', 'KH0001', '2013-01-21', '2013-01-21', NULL, '2013-01-16', '2013-01-14', NULL, '2013-01-15', '2013-01-14', '2013-01-17', '2013-01-16', NULL, NULL, NULL, ISNULL(NULL, ('正常')), NULL, NULL, '0000000000000076', ISNULL(NULL, (CONVERT([varchar](20),getdate(),(120)))), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 76, NULL)

客户一定需要DEL后重复的再插入,不能用UPDATE。在这种情况下,这个速度还有提升的空间吗,这个速度合理吗?用参数导入得多花10分钟。

------解决方案--------------------
那可以先插入到一个临时表(可以是实体临时表),然后再做sql层面的匹配吗?
------解决方案--------------------
USE test	
GO


-->生成表tb

if object_id('tb') is not null 
drop table tb
Go
Create table tb([Type] nvarchar(1))
Insert into tb
Select N'A'
Union all Select N'B'


INSERT INTO TB 
SELECT * FROM OPENROWSET('MICROSOFT.ACE.OLEDB.12.0','EXCEL 12.0;HDR=YES;IMEX=2;DATABASE=H:\test.xls',[Sheet1$]) AS t
WHERE NOT EXISTS(SELECT 1 FROM tb AS x
WHERE x.Type=t.TYPE
)

/*
(4 個資料列受到影響)
*/       

SELECT * FROM tb
/*
Type
----
A
B
C
D
E
F

*/

------解决方案--------------------
不要一条条搞,1000-10000条先取出ID集