临时表与X锁给tempdb带来的压力
近日,和同事讨论一个性能的问题时,发现临时表在insert等操作时会在tempdb中产生X锁,数量随insert的数目不同而不同。
之前我总以为,临时表很好用,用完就drop,或者存储过程执行完了,临时表会自动drop掉,多轻松啊,完全不留一丝痕迹!
经测试,事实并非如此,用临时表也是有代价的!其中之一就是X锁,这个种锁如果不做commit或rollback操作,是不会释放的。本地l临时表在存储过程执行完后并不会自动删除,只有当用户与 SQL Server 实例断开连接后,本地临时表才会删除。如果大量的报表使用存储过程,用到临时表,且有insert等操作,执行就会产生X锁。如并发很多,或执行多次,岂不是会产生大量的X锁?如不及时释放,那不是越积越多?会给SQL Server增加大量的维护成本?而且,这种并发很多或执行很多的情况是存在的,例如很多报表,用户每天要查,而且可能查很多次,而且事务又不会commit或rollback。
所以,看来用到临时表处理的报表也要在性能上注意锁的问题了。以免一不小心给tempdb造成巨大的压力!