INSERT INTO表SELECT和SELECT INTO表之间的性能差异

时间:2016-08-01 08:32:17

标签: sql-server query-optimization temp-tables

我有两个问题。 第一个是:

SELECT  
       Tbl.Col.value('ID[1]','INT') AS ID,   
       Tbl.Col.value('SPACE_CODE[1]', 'VARCHAR(100)') AS SPACE_CODE,  
       Tbl.Col.value('SPACE_TYPES[1]', 'INT') AS SPACE_TYPES,  
       Tbl.Col.value('IS_CORPORATE[1]', 'BIT') AS IS_CORPORATE,
       Tbl.Col.value('IS_HOTELLING[1]', 'BIT') AS IS_HOTELLING,
       Tbl.Col.value('AREA_NAME[1]', 'VARCHAR(50)') AS AREA_NAME,
       Tbl.Col.value('OPERATION[1]', 'varchar(20)') AS OPERATION,
       Tbl.Col.value('REMARKS[1]', 'varchar(200)') AS REMARKS,
       CAST('' AS VARCHAR(20)) AS RESULT,
       CAST('' AS VARCHAR(200)) AS COMMENTS
       INTO #temp_space
FROM   @XML_Data.nodes('//row') Tbl(Col)  

另一个问题是:

CREATE TABLE #temp_space
    (
    id int identity(1,1),
    AREA_NAME VARCHAR(20),
    IS_CORPORATE BIT,
    IS_HOTELLING BIT,
    OPERATION VARCHAR(20),
    REMARKS VARCHAR(200),
    SPACE_CODE VARCHAR(100),
    SPACE_TYPES INT,
    RESULT VARCHAR(20),
    COMMENTS VARCHAR(100)
    )
 INSERT INTO #temp_space(SPACE_CODE ,SPACE_TYPES ,IS_CORPORATE ,IS_HOTELLING,AREA_NAME ,OPERATION ,REMARKS )
SELECT  
       Tbl.Col.value('ID[1]','INT') AS ID,   
       Tbl.Col.value('SPACE_CODE[1]', 'VARCHAR(100)') AS SPACE_CODE,  
       Tbl.Col.value('SPACE_TYPES[1]', 'INT') AS SPACE_TYPES,  
       Tbl.Col.value('IS_CORPORATE[1]', 'BIT') AS IS_CORPORATE,
       Tbl.Col.value('IS_HOTELLING[1]', 'BIT') AS IS_HOTELLING,
       Tbl.Col.value('AREA_NAME[1]', 'VARCHAR(50)') AS AREA_NAME,
       Tbl.Col.value('OPERATION[1]', 'varchar(20)') AS OPERATION,
       Tbl.Col.value('REMARKS[1]', 'varchar(200)') AS REMARKS,
       CAST('' AS VARCHAR(20)) AS RESULT,
       CAST('' AS VARCHAR(200)) AS COMMENTS
FROM   @XML_Data.nodes('//row') Tbl(Col) 

第一个查询需要大约5分钟才能执行,而第二个查询需要3秒才能获得相同数量的记录(大约2500个)。你能告诉我为什么两个查询都有差异。

我知道在哪里使用这两个查询,只是好奇为什么第一个需要花费太多时间。

我需要验证表格中的每条记录。是否有循环和游标的替代方法。

1 个答案:

答案 0 :(得分:0)

由于记录和表格配置,我假设性能不同。

选择INTO:select into创建一个具有最小配置的表,保留索引和触发器(如果有)并将信息复制到目标表。

Insert Into:insert into适用于已存在的表。该表可能不像Select Into configuration那样简单。