sql-server – 为什么UPDATE比SELECT要花费更长的时间?

前端之家收集整理的这篇文章主要介绍了sql-server – 为什么UPDATE比SELECT要花费更长的时间?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下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秒

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

在更新语句结束时将写入次数减少到零,需要相同的时间.

我在这里做错了吗?为什么会有这么大的差异?

解决方法

>事务日志文件写入
>索引更新
>外键查找
>外键级联
>索引视图
>计算列
>检查约束
>锁
>闩锁
>锁定升级
>快照隔离
> DB镜像
>文件增长
>其他流程读/写
>页面拆分/不合适的聚集索引
>转发指针/行溢出事件
>指数差
>统计数据已过期
>糟糕的磁盘布局(例如一个大的RAID)
>使用具有表访问权限的UDF检查约束
> ……

虽然,通常的嫌疑人是触发器……

此外,您的条件额外没有意义:sql Server如何知道忽略它?大部分行李仍然会产生更新……即使触发器仍然会触发.例如,在搜索行以查找其他条件时,必须保持锁定

2011年9月和2012年2月编辑,提供更多选项

猜你在找的MsSQL相关文章