我需要执行一个存储过程,其中包含3个引用同一个表的查询:
MERGE ......
SELECT X FROM TABLE WHERE {BLA BLA}
从表格中更新Y {BLA BLA}
存储过程应该是线程安全的,并且应该作为原子操作执行。
目前,我正在使用具有可序列化隔离级别的事务和每个查询的WITH(XLOCK,TABLOCK)提示。
有没有办法在不使用导致性能下降的事务的情况下维持存储过程的时间跨度的表锁?
干杯, 多伦
答案 0 :(得分:3)
每当开发人员选择TABLOCKX或(XLOCK,TABLOCK)时,它就立即失去了对性能提出问题的权利。
该交易不会导致性能下降。拿着锁。所以你的问题确实是:
有没有办法产生表现 没有效果的惩罚 产生性能损失?
答案是否定的,没有这样的方式。
答案 1 :(得分:0)
现在我经常工作和设计数据库,每秒必须维持大约80K的交易,这样你就可以学到一些技巧。我建议你做的是退后一步,重新评估你的查询和表架构,如果这是一个高度事务性的数据库,我建议的第一个是摆脱任何外键约束,这是一个性能点击任何交易数据库。
另一件事是看索引,你有正确的索引,你是否可能过度索引必须插入和更新的表?这可能会导致大量冲击!
也许我可以建议你是否不能重新构建表格等,在框外思考一下,也许选择你想要的数据(使用nolock)到临时表中,然后执行你的合并等。
也许如果你给我一个更具体的例子,我可以提供更多帮助。
但是现在,告诉我你能做什么,不能做什么。希望它有所帮助!