INSERT INTO 表 SELECT 和 SELECT INTO 表之间的性能差异 [重复]

Posted

技术标签:

【中文标题】INSERT INTO 表 SELECT 和 SELECT INTO 表之间的性能差异 [重复]【英文标题】:Performance difference between INSERT INTO table SELECT and SELECT INTO table [duplicate] 【发布时间】:2016-08-01 08:32:17 【问题描述】:

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

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) 

对于相同数量的记录(大约 2500 条),第一个查询需要大约 5 分钟才能执行,而第二个查询需要 3 秒。您能告诉我为什么这两个查询会有所不同吗?

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

我需要验证表格中的每条记录。有没有循环和游标的替代品。

【问题讨论】:

现有表的索引? 其实我想知道为什么第一次查询需要更多时间。它不是重复的问题,我已经解决了这个问题。 两个查询的发布执行计划,理想情况下选择应该需要一些时间,因为它已经创建了所有的元数据 如果您切换这些查询的执行顺序 - 结果相同? 使用 SELECT INTO 结果集可能会自动成为表,因为所有选定的数据都必须在表中有效,INSERT INTO 每行都必须检查插入的有效性 - 这只是一个可供讨论的理论。 【参考方案1】:

我假设性能差异是由于日志记录和表配置。

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

插入:插入适用于已经存在的表。该表可能没有 Select Into 配置那么简单。

【讨论】:

现有表是平表,没有任何主键或索引。

以上是关于INSERT INTO 表 SELECT 和 SELECT INTO 表之间的性能差异 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

select into from 和 insert into select

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句

oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句