【问题标题】:Is it possible to apply no lock at DB/Table level for all queries hitting on thd DB /TBL是否可以在数据库/表级别为所有查询在 thd DB /TBL 上应用不锁定
【发布时间】:2016-07-18 13:52:32
【问题描述】:

我什至不确定这是一个有效的问题。但我会解释我的情况,并可能会从像你这样的专家那里得到答案。

我们已在 primes 上安装了 MS Dynamics。我们观察到性能非常缓慢。 我们正在查看 APP Log 服务器。 我们注意到每秒有 4-5 条警告消息关于“查询执行时间超过 10.seconds 阈值”

这是错误和相关查询的示例。 27.7 秒的查询执行时间超过了 10 秒的阈值。线程:109;数据库:Main_MSCRM;

select 
top 5001 "systemuser0".QueueId as "queueid"
, "systemuser0".CreatedBy as "createdby"
, "systemuser0".Address1_Latitude as "address1_latitude"
, "systemuser0".Address2_StateOrProvince as "address2_stateorprovince"
, "systemuser0".Address1_County as "address1_county"
, "systemuser0".Address2_Country as "address2_country"
, "systemuser0".Address2_PostOfficeBox as "address2_postofficebox"
, "systemuser0".PreferredPhoneCode as "preferredphonecode"
, "systemuser0".new_RegistrationNumer as "new_registrationnumer"
, "systemuser0".YammerUserId as "yammeruserid"
, "systemuser0".Title as "title"
, "systemuser0".SetupUser as "setupuser"
, "systemuser0".FirstName as "firstname"
, "systemuser0".EmployeeId as "employeeid"
, "systemuser0".Address1_Line2 as "address1_line2"
, "systemuser0".Address1_City as "address1_city"
, "systemuser0".YomiFirstName as "yomifirstname"
, "systemuser0".ExchangeRate as "exchangerate"
, "systemuser0".Address1_ShippingMethodCode as "address1_shippingmethodcode"
, "systemuser0".YomiMiddleName as "yomimiddlename"
, "systemuser0".Address2_Line2 as "address2_line2"
, "systemuser0".DefaultFiltersPopulated as "defaultfilterspopulated"
, "systemuser0".ModifiedOnBehalfBy as "modifiedonbehalfby"
, "systemuser0".Address2_Line3 as "address2_line3"
, "systemuser0".DefaultMailboxName as "defaultmailboxname" 
from
 SystemUser as "systemuser0" 
where
 (("systemuser0".IsDisabled = 0)) order by
 "systemuser0".SystemUserId asc

现在,当我在 SQL 级别运行此查询时,不到 2 秒就得出了结果。 所以我的困惑是为什么在 CRM 前端需要更多时间? 除了在 CRM 前端级别进行数据呈现所花费的时间之外,我想不出别的了。

我的第二个困惑是当我运行此查询以及其他我收到警告消息但查询本身没有锁定的情况时,它甚至比 2 秒还要快。

我的想法是编写将在数据库级别应用的逻辑,并且默认情况下,数据库中的任何查询都将具有 NO LOCK。

有可能吗?请让我知道如何摆脱这些警告信息。

谢谢。

【问题讨论】:

  • 对所有内容都应用 nolock 很可能是个坏主意。您最好对数据库进行分析以识别锁并检查昂贵的查询是什么并找到问题的根源,而不是把它刷到地毯下。
  • 这是有道理的,我只是对那个特定的数据库进行了数据分析。仅在 1 分钟内,我就获得了数以千计的“锁定获得”和“锁定释放”。根据您的分析想法,我下一步应该做什么!
  • 您可以为此使用 READ UNCOMMITTED 隔离级别,但我强烈建议您不要这样做。除非您当然可以随机获取重复和/或丢失的行。换句话说,如果您在大多数时间都能获得大部分准确的结果,那可能没问题。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
  • 我同意你的观点,我不想走这条路,因为我们想要报告中的准确结果以及我们在 MS Dynamics 中的搜索。

标签: sql sql-server tsql dynamics-crm-2013


【解决方案1】:

通过运行查询at SQL level,我不知道您的意思是不是直接从SQL Server 控制台运行它,但我想我可以提供一些关于为什么运行on CRM Front end side 似乎需要更长的时间的见解。当您直接从 SQL Server 运行查询时,大多数时候您已经与数据库建立了活动连接。这意味着您不必等待建立连接,两个大阻塞将等待查询执行,并等待接收结果集。

但是,当您从 CRM 前端运行查询时,您可能必须在开始查询之前建立连接。建立连接所需的时间可能比您想象的要长。

因此,一个好的测试应该是这样的:从 CRM 前端背靠背地执行两次查询,并记录每个查询的运行时间。如果第二个查询运行得快得多,那么您可能已经发现与 SQL Server 建立连接的成本。

【讨论】:

  • 糟糕的查询计划
  • 您是绝对正确的,但问题是您现在有超过 300 名用户在 Dynamics 上使用。现在我想有办法找出我在上面发布的查询的用户,然后去找那个用户并再次重复整个过程。在应用程序日志中,它不会加载有关用户的任何信息。
  • 有什么方法可以将此警告消息与特定用户联系起来,而不是像 Tim 提到的那样,我可以去那个用户那里找出他当时正在搜索的确切内容,并可以要求他做同样的事情来自两个不同的浏览器。
【解决方案2】:

也许这与我们在 ado.net 中命令超时但在 Management Studio 中正常工作时通常遇到的相同问题。我认为那里有几个修复程序,但是由于您无法控制查询,因此请在有问题的数据库上尝试这两个命令

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

【讨论】:

  • 好的,让我试试这个。
【解决方案3】:

我强烈建议您运行一个查询执行计划,以便它告诉您是否可以通过添加索引来改进任何查询。

另外,你为什么要一次提取 5k 条记录?是从自定义代码生成的还是什么? CRM 视图远少于此,即 50-200 条记录。通过一次提取如此多的记录,您增加了数据库锁定的可能性。

【讨论】:

  • Jordi 说的对,它是自定义代码。当我在 SQL Server 中运行查询时,我只得到 27 行。此查询是从始终具有 TOP 5001 的 CRM 生成的,我什至不知道为什么。我想把它拿出来,因为我不是 CRM 人,我不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多