日期:2014-05-17  浏览次数:20512 次

关于sql server临时表的问题
在使用一个将多个表连接后的查询结果INSERT到一个表时,语法类似于:
第1种写法:
INSERT INTO A(Col1,Col2,Col3)
SELECT B.Col1,C.Col2,C.Col3
FROM B JOIN C ON B.ID=C.ID
JOIN D ON B.NAME=D.NAME


第2种写法:

SELECT B.Col1,C.Col2,C.Col3
INTO #tmp
FROM B JOIN C ON B.ID=C.ID
JOIN D ON B.NAME=D.NAME;

INSERT INTO A(Col1,Col2,Col3)
SELECT Col1,Col2,Col3
FROM #tmp


现在测试的时候发现第2种的效率比第1种更高,尤其数据量越大越明显,但不知是什么原因?

------解决方案--------------------
每次执行语句的时候,清空内存了没有?
按照道理来说应该不会出现这种情况
------解决方案--------------------
给出明显有差异时候的执行计划跟时间,否则不容易判断。
set statistics profile on
Go
set statistics time on
Go
------解决方案--------------------
给执行计划吧
------解决方案--------------------
从我的使用过程中看,
1 有这种可能性,实际导出数据会发现 SELECT INTO。。。性能会更好些,打开开关看,经常产生更少的逻辑读 ;
2。 但从二者执行计划的执行计划和开销看, 均要生成表插入操作执行计划,二者的成本开销,会根据不同的情况产生不同的大小,可以完全一致,但也会出现 INSERT ...SELECT操作开销接近会是0.59766.。。。,而SELECT * INTO TABLE 的表插入操作开销会是这样的数字0.1655。。。的情况,而且情况还不少 。
3。无论是INSERT 。。还是SELECT INTO...,I/O开销都是主要的,CPU开销要看SELECT查询语句的复杂程度而定。