SELECT NULL, SUM(a), SUM(b) FROM @t
性能测试结果 id a b --- ------- ------- 1 3410 2063 2 1703 1656 3 1763 1656 4 1800 1793 5 1643 1856
NULL 10319 9024
从结果看,两者的性能差异很小,所以两者从性能上比较,可以视为没有差异
问题所在
虽然在性能上,两者没有什么差异,但另一个问题也许你从来没有考虑过,那就是对表的访问的问题,在方法A中,肯定只会访问到一个表;而在方法B中,情况还是如此吗?答案是否定的,方法B始终会扫描两个表。而这样的潜台词是,即使在我的查询中,只会用到A表,但如果B表被下了锁的话,整个查询就会被阻塞,而方法A不会。
为了证明这个问题,我们再做下面的测试
BLOCK 的测试—为表A加锁 (查询窗口A) BEGIN TRAN UPDATE A SET [ITEM] = RIGHT(NEWID(), 4) WHERE [ITEM] BETWEEN '9' AND 'A' --ROLLBACK TRAN -- 不回滚事务,让锁一直保持
BLOCK 的测试—测试查询方法A(查询窗口B) -- run query windows 2 DECLARE @a int SET @a = 1 IF @a = 0 SELECT [TranNumber] FROM A WHERE [ITEM] < 'A' ELSE IF @a = 1 SELECT [ItemNumber] FROM B WHERE [ItemNumber] < 'A'
BLOCK 的测试—测试查询方法B(查询窗口C) -- run query windows 3 DECLARE @a int SET @a = 1 SELECT [ITEM] FROM A WHERE @a = 0 AND [ITEM] < 'A' UNION ALL SELECT [ItemNumber] FROM B WHERE @a = 1 AND [ItemNumber] < 'A'
结果
你会看到,查询窗口B中的查询会及时地完成,而查询窗口C的查询会一直等待,你可以通过执行存储过程 sp_who2,查看当前的BLOCK状况来确定查询窗口C的查询是否被查询窗口A的查询BLOCK住
结论
不要使用查询方法B,它看起来很棒,实际的结果即是会增加被BLOCK的机会
文章来源于领测软件测试网 https://www.ltesting.net/