在临时表中循环时如何提高查询性能?

已加入
2018年9月26日
留言内容
22
编程经验
3-5
我在SQL Server 2012上工作

我有临时表从Excel中获取数据,并且基于Excel中存在的数据我在循环内的表中插入

临时表始终有大量数据,可能至少为5000或10000或15000或更多

我需要从临时表中插入的每个迭代增加5000行

所以我需要像这样的速度和内存的最佳解决方案

如果有什么不正确的逻辑请告诉我

我的查询如下:

SQL:
create table #Temp(
    DocumentPartID int identity(1,1),
    CompanyName VARCHAR(4000),
    [AffectedProduct] NVARCHAR(4000),
    [ReplacementPart] VARCHAR(4000) ,
    [ReplacementCompany] VARCHAR(4000) ,
    [Category] VARCHAR(4000) ,
    DocumentID int null,
    CompanyID VARCHAR(4000) null,
    PartID int null,
    ReplacementPartID int null,
    CategoryID  int null,
    [Status]  VARCHAR(4000) null ,
)
insert into #Temp
(
CompanyName ,
[AffectedProduct],
[ReplacementPart],
[ReplacementCompany],
[Category]
)
values
('Nokia','RF1550','RF1550','HTS','HTS'),
('IPHONE','TF1545','TF1545','Corning Incorporated','HTS2')
DECLARE @MaxValue int = ( select Max(DocumentPartID) from #Temp)
DECLARE @Currentindex int =0
DECLARE @Rows  [dbo].[Type_ValidationInPut];
           while @Currentindex < @MaxValue
            begin
              DELETE @Rows
              INSERT  INTO @Rows
                        (
                        RowNumber ,
                 GivenPartNumber ,
                  GivenManufacturer     
                )
            select TOP 5000 DocumentPartID , isnull(AffectedProduct,''), isnull(CompanyName,'') FROM #Temp where
            (CategoryID = 517884 or CategoryID = 1110481)  and (DocumentPartID > @Currentindex) and [Status] is null
                INSERT  INTO @Rows
                        (
                 RowNumber ,
                 GivenPartNumber ,
                  GivenManufacturer     
                )
            select TOP 5000 DocumentPartID, isnull(substring(ReplacementPart,0,70),''), isnull(ReplacementCompany,'') FROM #Temp where 
            (DocumentPartID > @Currentindex) and  [Status] is null and ReplacementPart is not null
            DECLARE @NewID nVARCHAR(4000) =newID()
            insert into [ls30].[validation].[dbo].PartsData (BatchID,RowNumber,GivenPartNumber,givenmanufacturer)
            SELECT  @NewID ,0,GivenPartNumber,GivenManufacturer from  @Rows
            set @Currentindex = @Currentindex +5000
            DELETE @Rows
             end
 
由主持人最后编辑:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
看起来像一个SQL问题而不是C#问题。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
无论如何,只要扫描该SQL脚本,就会想到两件事:
  • DELETE 速度慢,因为需要重建索引。
  • Should use SELECT INTO instead of INSERT.
看到:
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
看起来像一个SQL问题而不是C#问题。

论坛上有一个数据库问题部分,无论使用或不使用C#代码,都可以使用这些问题。 ;)
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
噢亲爱的。他就是其中之一

实际上,看起来他在代码项目上得到的回答是相当简陋的。由于我删除了帐户,因此我没有修改权限,无法改善答案。看来他在其他地方得到了足够的帮助。 (y)
 
最佳 底部