各位大神看看下面两段SQL的效率不一样还是?

0
请看图:
QQ图片20151104105319.png
已邀请:
3

gogodiy - 天善智能数据库专家、Tableau爱好者 2015-11-04 回答

第一种方式:使用默认隔离级别(已提交读,如果没人为更改的话),因此数据库会为这个查询申请一个共享锁(S),如果对象表正被INSERT、UPDATE、DELETE的话,你的查询就需要等待,因为此时表处于排他锁(X),共享锁级别低,被排他锁排斥,必须等待操作完毕才能执行查询。但可以保证得到的数据是最新的。同时由于只有表名,没有其他标志,如果系统在同一个实例下,在其他数据库、其他架构下也有同名数据表,那么实际查询的会是dbo.contract表,不一定是你真正想要查询的。在高并发情况下,容易发生阻塞。
第二种方式:使用with(nolock)后,等于是强制将隔离级别从默认的已提交读,被降级为未提交读,也即是系统不会为了这个查询申请一个共享锁(S),避免被排他锁(X)排斥,但是查询到的数据有可能是修改之前的版本。
总结:
方法1适合对数据准确性要求高的OLTP中
方法2适合数据量小,对数据准确性要求不高的系统中,比如报表统计等等。
另外说一点:
查询的表名,最好还是按照数据库名.架构名.表名的方式。
 
2

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-11-04 回答

nolock是针对锁用的,也就是说如果你这条TSQL去查询的时候 你需要的数据正在被执行Update也无需等待
但是数据可能是脏的

要回复问题请先登录注册