问题一: Insert Into table1 (select * from table2) 的具体执行顺序是怎么样的?
       
          我的理解是先执行(select * from table2) 得到全部的结果集N1,然后将N1的数据插入到table1中,而不是:select一条数据接着insert该条数据。
为什么不是呢?我理解就是

解决方案 »

  1.   

    先执行select * from table2,然后把结果一次性的写入table1中
      

  2.   

    很简单,建一个表TEST,随便添加几条数据,然后建一个触发器ALTER TRIGGER [test_trigger]
       ON  [dbo].[Test]
       AFTER INSERT,DELETE,UPDATe
    AS 
    BEGIN
    SET NOCOUNT ON;declare @a varchar(100)
    set @a='delete:' + convert(char(5),isnull((select count(*) from deleted ),0)) 
        + ' insert:' + convert(char(5),isnull((select count(*) from inserted),0))
    raiserror(@a,16,1)
    rollbackEND然后运行一下insert into test select * from test,看看错误信息就知道
      

  3.   


    假设test表中有三条记录insert into test select * from test 这样,触发器只触发一次
    改成游标方法后,每插入一次则触发一次,也就是共触发三次
      

  4.   

    select一条数据接着insert该条数据
    我是这么认为的
      

  5.   

    理论上讲不是先读完结果集(N),然后再Insert到目标table中,这个过程是连续的。因为Table Scan并不是一个Stop-and-Go 的操作,它并不会引起封锁 。试想一下,当系统中存在多个CPU而且Table数据量很大时,SQLServer一般都会生成并行执行计划,如果要等所有的资料全部扫描完然后再做下一步操作,并行的目的那不是白搭了。
      

  6.   

    有一个 HALLOWEEN 的过程...
      

  7.   

    这个有必要讨论吗?
    从性能分析,DBMS肯定会有优化的,是一行一行插入还是一页一页插入似乎取决于DBMS的算法,怎么最优,不过可以肯定用游标一行一行的插入肯定是最差的。
    从锁定分析,这个分析不来,但感觉不会锁定原表,目的表会被整表锁定(应该是根据记录的多少逐步升级锁。)
      

  8.   

    先执行select * from table2,然后把结果一次性的写入table1中
      

  9.   

    关于第一个问题,
    应该是批量写入的,
    DBMS也不至于这么低级吧,
    按照每行逐次插入,
    这样对于系统大批量的插入来说,
    效率可想而知.
    关于第二个问题,
    游标在这里并没有起到很好的作用.
    反而在启用游标的过程中会增加系统的资源占用.