我有以下select语句几乎立即完成.
declare @weekending varchar(6) set @weekending = 100103 select InvoicesCharges.orderaccnumber,Accountnumbersorders.accountnumber from Accountnumbersorders,storeinformation,routeselecttable,InvoicesCharges,invoice where InvoicesCharges.pubid = Accountnumbersorders.publication and Accountnumbersorders.actype = 0 and Accountnumbersorders.valuezone = 'none' and storeinformation.storeroutename = routeselecttable.istoreroutenumber and storeinformation.storenumber = invoice.store_number and InvoicesCharges.invoice_number = invoice.invoice_number and convert(varchar(6),Invoice.bill_to,12) = @weekending
但是,等效的更新语句需要1分40秒@H_404_5@
declare @weekending varchar(6) set @weekending = 100103 update InvoicesCharges set InvoicesCharges.orderaccnumber = Accountnumbersorders.accountnumber from Accountnumbersorders,invoice where InvoicesCharges.pubid = Accountnumbersorders.publication and Accountnumbersorders.actype = 0 and dbo.Accountnumbersorders.valuezone = 'none' and storeinformation.storeroutename = routeselecttable.istoreroutenumber and storeinformation.storenumber = invoice.store_number and InvoicesCharges.invoice_number = invoice.invoice_number and convert(varchar(6),12) = @weekending
and InvoicesCharges.orderaccnumber <> Accountnumbersorders.accountnumber
在更新语句结束时将写入次数减少到零,需要相同的时间.@H_404_5@
我在这里做错了吗?为什么会有这么大的差异?@H_404_5@
解决方法
>事务日志文件写入
>索引更新
>外键查找
>外键级联
>索引视图
>计算列
>检查约束
>锁
>闩锁
>锁定升级
>快照隔离
> DB镜像
>文件增长
>其他流程读/写
>页面拆分/不合适的聚集索引
>转发指针/行溢出事件
>指数差
>统计数据已过期
>糟糕的磁盘布局(例如一个大的RAID)
>使用具有表访问权限的UDF检查约束
> ……
>索引更新
>外键查找
>外键级联
>索引视图
>计算列
>检查约束
>锁
>闩锁
>锁定升级
>快照隔离
> DB镜像
>文件增长
>其他流程读/写
>页面拆分/不合适的聚集索引
>转发指针/行溢出事件
>指数差
>统计数据已过期
>糟糕的磁盘布局(例如一个大的RAID)
>使用具有表访问权限的UDF检查约束
> ……
虽然,通常的嫌疑人是触发器……@H_404_5@
此外,您的条件额外没有意义:sql Server如何知道忽略它?大部分行李仍然会产生更新……即使触发器仍然会触发.例如,在搜索行以查找其他条件时,必须保持锁定@H_404_5@
2011年9月和2012年2月编辑,提供更多选项@H_404_5@