问题一: Insert Into table1 (select * from table2) 的具体执行顺序是怎么样的?
我的理解是先执行(select * from table2) 得到全部的结果集N1,然后将N1的数据插入到table1中,而不是:select一条数据接着insert该条数据。
为什么不是呢?我理解就是
我的理解是先执行(select * from table2) 得到全部的结果集N1,然后将N1的数据插入到table1中,而不是:select一条数据接着insert该条数据。
为什么不是呢?我理解就是
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,看看错误信息就知道
假设test表中有三条记录insert into test select * from test 这样,触发器只触发一次
改成游标方法后,每插入一次则触发一次,也就是共触发三次
我是这么认为的
从性能分析,DBMS肯定会有优化的,是一行一行插入还是一页一页插入似乎取决于DBMS的算法,怎么最优,不过可以肯定用游标一行一行的插入肯定是最差的。
从锁定分析,这个分析不来,但感觉不会锁定原表,目的表会被整表锁定(应该是根据记录的多少逐步升级锁。)
应该是批量写入的,
DBMS也不至于这么低级吧,
按照每行逐次插入,
这样对于系统大批量的插入来说,
效率可想而知.
关于第二个问题,
游标在这里并没有起到很好的作用.
反而在启用游标的过程中会增加系统的资源占用.