首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游标或While循环是处理6,00,000+行数据的好选择

游标或While循环是处理6,00,000+行数据的好选择
EN

Stack Overflow用户
提问于 2017-08-26 03:03:04
回答 3查看 1.3K关注 0票数 1

我有一个从.csv文件导入数据的table_A。我想将table_A中的一些列与table_B进行比较,并相应地将数据插入到表中,并将状态更新为table_A。请务必提个建议

代码语言:javascript
复制
DECLARE @A_2 VARCHAR(10), @A_3 VARCHAR(50), @A_4 VARCHAR(100)
    DECLARE db_cursor CURSOR FOR  
    SELECT A_2, A_3, A_4 FROM Temp_table

OPEN db_cursor  
    FETCH NEXT FROM db_cursor   
    INTO @A_2, @A_3, @A_4 
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
    If @A_2 <> (SELECT C_2 FROM Table_C where C_2= @A_2)
        UPDATE Temp_table SET [Status]='Not Exits in Table_C'
    ELSE BEGIN
       IF @A_3=(Select B_3 from Table_B where B_3=@A_3) AND @A_2=(SELECT B_2              FROM Table_B where B_2= @A_2)
       UPDATE Temp_table SET [Status]='Duplicate Row, Already Exists'
       ELSE 
            IF (@A_4 <>'B_4 '+'B_5')
            UPDATE Temp_table SET [Status]=' Format is not accepted '
            ELSE
            INSERT INTO Table_B(B_2, B_3, B_4) VALUES(@A_2, @A_3, @A_4)

    END
  CLOSE db_cursor  DEALLOCATE db_cursor    
  FETCH NEXT FROM db_cursor  INTO @A_2, @A_3, @A_4
    END   

这里的Temp_table是我将从.csv文件中导入数据的表,比较将使用Table_B、Table_C和Temp_Table的列来完成,这样做正确吗?

EN

回答 3

Stack Overflow用户

发布于 2017-08-26 03:09:52

我对性能不是很熟悉,但我不建议使用while循环,因为它会非常慢。我会做一些类似这样的事情:

代码语言:javascript
复制
UPDATE table1
SET table1.column1 = table2.column1,
    table1.column2 = table2.column2
WHERE (do a select statement or column comparison)

这只是一个一般性的指南,我希望它能帮助你入门。否则,你将不得不更加具体。

更新和比较的参考资料:

How do I UPDATE from a SELECT in SQL Server?

Microsoft UPDATE

票数 0
EN

Stack Overflow用户

发布于 2017-08-26 03:29:04

都不是。

要执行您希望执行的操作,请使用MERGEhttps://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql

设置

代码语言:javascript
复制
IF OBJECT_ID('tempdb..#table_A') IS NOT NULL
  DROP TABLE #table_A

CREATE TABLE #table_A (col1 int, col2 int, colX int, checkme bit DEFAULT 0) ;
INSERT INTO #table_A (col1, col2, colX)
VALUES 
      (1,1,1)
    , (2,2,2)
    , (3,3,3)
    , (4,4,4)
;

IF OBJECT_ID('tempdb..#table_B') IS NOT NULL
  DROP TABLE #table_B

CREATE TABLE #table_B (col1 int, col2 int, colX int) ;
INSERT INTO #table_B (col1, col2, colX)
VALUES 
      (0,0,1)
    , (0,0,2)
;

之前的

代码语言:javascript
复制
SELECT * FROM #table_A ;     
SELECT * FROM #table_B ; 

查询时间

代码语言:javascript
复制
MERGE #table_B AS target  
USING ( SELECT col1, col2, colX FROM #table_A ) AS source (col1, col2, colX)  
ON (target.colX = source.colX)  
WHEN MATCHED THEN   
    UPDATE SET col1 = source.col1
        , col2 = source.col2 
WHEN NOT MATCHED THEN  
    INSERT (col1, col2)  
    VALUES (source.col1, source.col2) 
;

之后的

代码语言:javascript
复制
SELECT * FROM #table_A ;     
SELECT * FROM #table_B ;

我认为您也可以使用MERGE来更新#table_A中的标志,但我不知道正确的语法。如果需要,也可以在MERGE之后运行另一个UPDATE

标记TABLE_A标志

代码语言:javascript
复制
UPDATE #table_A
SET flag = 1
FROM #table_B
WHERE #table_A.col1 = #table_B.col1
    AND #table_A.col2 = #table_B.col1
    AND #table_B.colX IS NOT NULL
;

后选择** FROM #table_A;

更多MERGE好东西:http://www.made2mentor.com/2012/07/got-the-urge-to-merge/

票数 0
EN

Stack Overflow用户

发布于 2017-08-26 03:14:31

如果你想提高性能,那么你需要考虑基于集合的操作。While循环和游标基本上是一回事。

有关更多详细信息,请参阅以下链接

代码语言:javascript
复制
http://www.techrepublic.com/blog/the-enterprise-cloud/comparing-cursor-vs-while-loop-performance-in-sql-server-2008/
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45887954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档