呵呵,如果是插入多条,那insert into ...values 需要执行多个语句而 insert ...select 可以一个语句;另外insert into ...values需要把数据通过网络传输过去,而insert ...select在服务器操作,受网络的影响要小得多。

解决方案 »

  1.   

    差的很多,如果插入100000条记录 ,insert into values 是20分
              insert ...select 是不到一分
    原因应该是i/o时间的差别.
    是不是每个insert into values 每次都读叶,然后在存储?????????????
    那位大虾说清楚一些!
      

  2.   

    SQLSERVER对每个INSERT 都进行检测,比如触发器等等。
    而在INSERT  SELECT 中只有一个INSERT 所以只检测一次,而INSERT INTO 。。 VALUES 就进行了若干次检测,所以相比起来速度相差很大(特别是在记录很多的情况下)。
      

  3.   

    你怎么检测的,用一个循环来INSERT INTO 。。 VALUES ?可能你的循环耗费了大部分时间。
      

  4.   


    我定义变量 @i int 循环累加 ,插入到表tablename(id int)
    10000个记录都会很长时间
    是不是i/o影响的速度
      

  5.   

    我说的是每次INSERT的时候SQLSERVER都会做这个检测,不是我自己检测。
    所以相比起来insert values 比 insert select 慢很多。
      

  6.   

    你可以对你的表增加一个触发器看看,用另外一个表记录这个表里有多少记录数。
    create trigger updaterecnum on TableA for insert
    as
      declare @nums int
      select count(*) from inserted
      update mytable set nums = nums + @nums如果用INSERT ... VALUES 的话,nums的值是正确的,而insert ... select 时nums 的值为1
      

  7.   

    select @nums=count(*) from inserted 这个你要这么改
    因为sqlserver不是组行触发
      

  8.   

    上面的触发器是我顺手写的,没有测试,但是肯定是这个道理,如果用INSERT  SELECT 肯定是插入了多条记录,但是COUNT(*)还是只有一条。
    你为什么不自己试试再看?
      

  9.   

    你看SQL2K的帮助,你的情况不应该出现
      

  10.   

    但是我用的确实是SQLSERVER2000并且是正版的。
      

  11.   

    to: mrzho(mrzhou) 我用下面的触发器进行测试:
    create trigger TestTmp
    on tmp
    for insert 
    as
    begin
      declare @i int
      select @i=count(*) from inserted
      print @i
      update tmp1 set i=i+@i
    end
    对于TMP1表的取值用INSERT INTO 。SELECT 。所的到的结果和用WHILE 循环所得到的结果是一样的!
    不过@i的值是不同!用WHILE 是1,1,1,1 而INSERT 。SELECT 是4
    说明用INSERT 。SELECT 的时候只触发了一次触发器
      

  12.   

    而insert into values 比insert into select 慢的很多可能的原因是
    你每一次执行insert into values 都需要服务器预先编译解释一次,而insert into select却只需要编译一次,
    还有就是损耗在循环上的时间。
      

  13.   

    慢不慢、慢在哪里用查詢計划或用SQL Profile傎測就會知道得一清二楚。你自己把你的代碼分稀一下吧。
      

  14.   

    啊?
    可能是sql对values要进行类型判断吧。。
      

  15.   

    应该前者快,因为如果用SELECT 从其它表中查,需要重新把别表的数据凋入缓冲池
      

  16.   

    各位大哥:做没做过实验,难道不知道insert into select 速度很快
    在SQL Profile,唯一区别是i/o写的数目比insert into values小。
    不知道的不要谁边说!!!!!!!!!!!!!
    大家有概念吗,循环不是很慢的,慢在i/o操作!!
    我只是想知道SQLSERVER的写操作如何执行!
    难道是日志写多拉?
    还是有几种存储方法?