日期:2014-05-18  浏览次数:20556 次

Delete和select 执行速度有明显区别,请问什么原因?
A语句:
delete from 表A
where cast(sid as varchar)+','+cast(cid as varchar)
not in (select cast(oid as varchar)+','+cast(cid as varchar) from 视图A)

其中表A数据量有2000,视图A由3个表组成,表的数据应该有:1、10万,2、2万、3、1万

我执行上面操作和执行:
B语句:
select * from 表A
where cast(sid as varchar)+','+cast(cid as varchar)
not in (select cast(oid as varchar)+','+cast(cid as varchar) from 视图A)

其中A语句很快执行完成,B语句需要10几分钟

问一下为什么?



------解决方案--------------------
那是一定的:
索引可以提高相应的select的效率,同时降低了 insert 、 update 、delete 的效率,因为有可能会重建索引
clustered 索引记录的物理存储顺序
避免更新clustered索引列,该列改变将导致整个表记录的顺序的调整
------解决方案--------------------
查询和增加\删除\更新是两回事.

查询,不对表做任何改动.
增加\删除\更新完成后一般还要重新建立索引等工作.
------解决方案--------------------
我猜想是因为内存不够用
select 是把查到的数据放入内存

delete每次都拿1行去比较 找不到匹配删除就行 不会占用太多内存

主要是保存 
select cast(oid as varchar)+ ', '+cast(cid as varchar) from 视图A
这句查询结果在内存中

纯猜想


------解决方案--------------------
比较一下delete一行和select一行速度。