本人有一个管理系统,数据库使用的MSSQL,
建立库的时候使用的是MSSQL2000,
后来将库备份并还原到另一个服务器,那台服务器上安装的MSSQL2008,结果出现了问题,
在SQL2000下对数据库进行如下操作如需要9S
update n_number
set is_used=1
where number_id='MM24NY0002'同样的操作在SQL2008下对数据库进行操作(两个数据库大小一样),需要4分钟,
(说明一下,我已经在将数据库还原到SQL2008环境下后进行了“重新建立索引”。)说明一下,我在数据库里对这个表n_number字段is_used设置了触发器(触发器用来应用权限,对其它表进行写入操作)请教一下SQL高手,这是怎么回事?如何解决?

解决方案 »

  1.   

    首先,跟你的版本没有关系,越高级的版本执行速度应该更高,因为新版本必然做了优化。
    第二:的确把你的代码和执行计划弄出来会比较好分析,而且即使建了索引,也不见得是建的对。
    最后:影响性能很可能在阻塞和锁方面,有时候如果有阻塞,那么即使一个表有一条语句而已,都会slelect不出来。另外建议先检查一下两个版本数据库配置是否一样,会不会有些新选项影响了
      

  2.   

    出差一段时间回来,发现本问题得到了众多高手热心的帮忙。
    非常感谢各位大牛们的支持和指点!此问题我已经通过详细测试排查出了原因。我的触发中有类似:A字段+B字段 not in (select C字段+D字段 from pwr)之类的语句,后来将此语句修改为not exists (select b.* from pwr b where a.A字段=b.C字段 and a.B字段=b.D字段)类似的代码后,问题解决。以下是我的估计的原因,麻烦哪位大牛确认并详细解释下。
    可能是in 或者not in 语句在两种版本SQL中的执行效率的原因吧?
      

  3.   


    这个你得看你的执行计划。not in 跟not exists生成的执行计划在你这个例子中肯定是不一样的,你的:A字段+B字段 not in 会造成查询的时候不能走索引,而你改写成not exists的写法后又可以走索引了,两者之间肯定存在速度快慢之分
      

  4.   


    楼上的说得有道理,我也是认为not in 造成无法走索引,只是有些奇怪的是,sql2000和sql2008同样的代码都使用到了not in,同样的不走索引,MSSQL2000还快过MSSQL2008?这就不知道是咋回事了?