BI-SQL丨WITH NOLOCK

WITH(NOLOCK)在SQL查询中用于提高性能,避免表锁,但可能导致脏读、不可重复读和幻读。它等同于ReadUncommitted隔离级别,适合某些允许脏数据的场景或对性能有高要求的历史数据查询。文章探讨了其使用场景及示例。

WITH(NOLOCK)

企业在搭建数仓的时候,对于数仓的负载性能和运行速度都是纳入考量标准的。特别是并发性较高的情况下,如何规避因用户使用量较多而导致死锁卡死的问题呢?其实,这些可以通过WITH(NOLOCK)来解决。

WITH(NOLOCK)顾名思义,不锁的意思。它的目的是为了避免因为查询表,而导致表被锁死,从而提高查询的速度。

WITH(NOLOCK)有两个特点:

1.使用WITH(NOLOCK)查询时,不会被其他排他锁阻拦;

2.使用WITH(NOLOCK)查询时,不会发布锁,阻拦其他事务操作。

概念延申

当数据库中并发较高的时候,容易出现以下几类现象:

  • **脏读:**指某张表,被A管理员读取访问,并且进行了修改,但是还没有进行提交操作;而同时B管理员也读取了这个数据,这种情况下,B读到的是未更新的数据,也被称为脏数据。依据脏数据进行后续的操作,肯定是不对的。

  • **不可重复读:**指的是某个事务中,多次对某张表进行读取操作,在A事务进程还没结束的情况下,B事务对数据进行了修改,这样A事务两次读取到的数据不一致,这种情况就是不可重复读。

PS:通常发生在两个SQL工程师,同时开发的过程中。

  • **幻读:**一个事务查询某张表,两次读取到的数据总量不一致,这种情况下就称为幻读。

数据库为了避免上述的三种情况,有4种特殊的隔离机制,分别是:Read uncommitted(读未提交),Read committed(读已提交),Repeatable read(可重复读),Serizable(序列化)。

4种机制可解决的场景如下:

类型脏读不可重复读幻读
Read  uncommitted
Read  committed
Repeatable  read
Serizable
看到这里,可能小伙伴们会很懵,为什么会讲到这里?

因为WITH(NOLOCK)的效果,等同于Read uncommitted,使用了WITH(NOLOCK)虽然可以解决并发导致的性能问题,但是会导致脏读、不可重复读、幻读这三种情况的产生。

虽然使用WITH(NOLOCK)会导致各种问题,但是并不代表其无用,它的使用场景有如下三种:

  1. 数据的使用场景是允许脏数据存在的情况,例如:A和B同时对某张表进行修改操作,但是A和B谁提交都行,且提交一次,另外的人就不允许提交了或者允许多次修改。

  2. 如果只追求性能,不考虑数据安全性,那么可以使用此方法。

  3. 历史数据或不允许进行修改的事实表,可以使用此方法提高查询性能。

使用实例

例子:

查询数据库中的某张表,使用WITH(NOLOCK)。

SELECT TOP (1000) [Date]
      ,[Year]
      ,[Quarter]
      ,[Month]
      ,[Day]
      ,[DATEKEY]
  FROM [CaseData].[dbo].[Dim_Date] WITH(NOLOCK)

结果如下:

这里是白茶,一个PowerBI的初学者。

你是一个sql server大师,下面这段代码帮忙进行改写,可以输入多个Externorderkey,进行分页,一页20行,分别计算每个externorderkey的总页数和页数。比如Externorderkey 有30行,则总页数为2,页码分别为1、2. WITH BaseData AS ( SELECT AL2.StorerKey, AL2.OrderKey, AL2.LoadKey, AL6.PickHeaderKey, AL2.C_Company, AL5.Sku, AL5.DESCR, AL7.CaseCnt, SUM(AL3.Qty) as qty, AL2.ExternOrderKey, SUM(AL3.qty / cast(AL7.casecnt AS INT)) case_number, SUM(AL3.qty % cast(AL7.casecnt AS INT)) fraction_number, case when Substring( AL2.Buyerpo, 10, 3 )='Tes' then 'B'+ AL5.retailsku else AL5.retailsku end as N'国际条码', N'' AS N'单位', AL2.Facility, AL4.Lottable02, AL4.Lottable03, AL2.Notes, AL4.Lottable04, AL2.BuyerPO, AL5.RETAILSKU, AL8.ExtendedField01, AL5.SUSR2, AL2.M_Company, '' AS N'实收支数', '' AS N'备注', ROW_NUMBER() OVER(PARTITION BY AL2.ExternOrderKey ORDER BY AL5.Sku) AS ExternOrderRowNum, COUNT(*) OVER(PARTITION BY AL2.ExternOrderKey ) AS TotalRowsPerExternOrder FROM BI.V_ORDERS(nolock) AL2 INNER JOIN BI.V_PICKDETAIL(nolock) AL3 ON AL2.OrderKey = AL3.OrderKey INNER JOIN BI.V_LOTATTRIBUTE(nolock) AL4 ON AL3.Lot = AL4.Lot INNER JOIN BI.V_SKU(nolock) AL5 ON AL3.Storerkey = AL5.StorerKey AND AL3.Sku = AL5.Sku INNER JOIN BI.V_PICKHEADER(nolock) AL6 ON AL2.LoadKey = AL6.ExternOrderKey AND AL6.OrderKey = AL2.OrderKey INNER JOIN BI.V_PACK(nolock) AL7 ON AL5.PACKKey = AL7.PackKey INNER JOIN BI.V_SkuInfo(nolock) AL8 ON AL8.Sku = AL5.Sku AND AL8.Storerkey = AL5.StorerKey WHERE AL3.Storerkey = 'Rituals' AND AL2.ExternOrderKey IN ('760-T002184','760-T002183','760-T002186')--:FX_Rituals_ExternOrderkey GROUP BY AL2.StorerKey, AL2.OrderKey, AL2.LoadKey, AL6.PickHeaderKey, AL2.C_Company, AL5.Sku, AL5.DESCR, AL7.CaseCnt, AL2.ExternOrderKey, AL2.Facility, AL4.Lottable02, AL4.Lottable03, AL2.Notes, AL4.Lottable04, AL2.BuyerPO, AL5.RETAILSKU, AL8.ExtendedField01, AL5.SUSR2, AL2.M_Company ), PagedData AS ( SELECT *, CEILING(CAST(ExternOrderRowNum AS FLOAT) / 20) AS PageNumber, CEILING(CAST(TotalRowsPerExternOrder AS FLOAT) / 20) AS TotalPages FROM BaseData ) SELECT ROW_NUMBER() OVER(ORDER BY ExternOrderKey, Sku) as RowNum, StorerKey, OrderKey, LoadKey, PickHeaderKey, C_Company, Sku, DESCR, CaseCnt, qty, ExternOrderKey, case_number, fraction_number, [国际条码], [单位], Facility, Lottable02, Lottable03, Notes, Lottable04, BuyerPO, RETAILSKU, ExtendedField01, SUSR2, M_Company, [实收支数], [备注], PageNumber, TotalPages FROM PagedData WHERE PageNumber = 1 ORDER BY RowNum
最新发布
09-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fabric丨白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值