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 两种表复制语句详解