为什么UPDATE需要比SELECT更长的时间?

Nod*_*dja 8 t-sql sql-server performance triggers sql-server-2005

我有以下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  
Run Code Online (Sandbox Code Playgroud)

但是,等效的更新语句需要1分40秒

declare @weekending varchar(6)
set @weekending = 100103
update InvoicesCharges  
set InvoicesCharges.orderaccnumber = Accountnumbersorders.accountnumber  
from Accountnumbersorders, storeinformation, routeselecttable,InvoicesCharges, 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),Invoice.bill_to,12) = @weekending
Run Code Online (Sandbox Code Playgroud)

即使我添加:

and InvoicesCharges.orderaccnumber <> Accountnumbersorders.accountnumber
Run Code Online (Sandbox Code Playgroud)

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

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

gbn*_*gbn 23

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

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

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

编辑2011年9月和2012年2月有更多选择

  • 是的,触发器是原因.我是新手,"代码"不是我的.谢谢你的提醒.我添加了额外的条件,因为我认为写入磁盘可能需要很长时间,因此没有不必要的写入磁盘.再一次,非常感谢. (2认同)

Ray*_*Ray 6

更新必须锁定和修改表中的数据,并将更改记录到事务日志中.选择不必做任何这些事情.