【问题标题】:Why my query become too slow when number of records increased为什么当记录数增加时我的查询变得太慢
【发布时间】:2021-08-26 17:48:44
【问题描述】:

我在 SQL Server 中有一个插入语句。

我尝试了一个较小的子集,速度很快

将数量增加到 100 万条记录,并且速度快 1 分 10 秒

现在我把它翻了一番,它似乎卡住了,它已经运行了 10 分钟,没有结果

我在 5 分钟时加入了计划。

https://www.brentozar.com/pastetheplan/?id=r15MPuC5u

也许有人可以告诉我如何改进这个过程。

PS。我在 Tag (RepID) 上添加了非聚集索引。

Tag(iiD) 是主键

Reps(RepID) 是主键。

在我写这篇文章的时候。过程于 11:47 结束

https://www.brentozar.com/pastetheplan/?id=HJd9uOCcu

这是我的代码

insert into R3..Tags (iID,DT,RepID,Tag,xmiID,iBegin,iEnd,Confidence,Polarity,Uncertainty,Conditional,Generic,HistoryOf,CodingScheme,Code,CUI,TUI,PreferredText,ValueBegin,ValueEnd,Value,Deleted,sKey,RepType)
SELECT T.iID,T.DT,T.RepID,T.Tag,T.xmiID,T.iBegin,T.iEnd,T.Confidence,T.Polarity,T.Uncertainty,T.Conditional,T.Generic,T.HistoryOf,T.CodingScheme,T.Code,T.CUI,T.TUI,T.PreferredText,T.ValueBegin,T.ValueEnd,T.Value,T.Deleted,T.sKey,R.RepType
FROM Recovery..tags  T inner join Recovery..Reps R on T.RepID = R.RepID
where T.iID between 2000001 and 4000000

【问题讨论】:

  • “恢复”是链接服务器吗?
  • 这些是由 3 部分组成的名称,因此它们都应该是当前实例中的数据库。做出假设,但Recovery..tagsRecovery.dbo.tags 相同——我们可以在计划细节中看到。执行计划说 200 万行,而不是 100 万行。
  • @SM 或者确切地说它们是同一个实例中的 3 个 DB。他们都住在我的笔记本电脑里
  • 尝试获取并行插入,此时实际插入未并行化。可能需要跟踪标志 610,以及目标表上的 TABLOCK 提示。见docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/… 也见sqlperformance.com/2019/05/sql-performance/…

标签: sql sql-server tsql sql-execution-plan


【解决方案1】:

(不能评论,放在这里)

我认为,您对此几乎无能为力,取决于您的硬件,11 分钟实际上可能还不错,在执行计划中,我可以看到一切正常。

但是为了您的信息,该插入语句的瓶颈是从 T"Recovery..tags" 表中读取数据,这需要 07 分钟的查询时间。(它使用了全扫描,考虑到它需要读取 2百万行并返回很多列)

所以你唯一能做的就是找到一种方法来加快从链接服务器“恢复”中读取的速度。 链接的服务器通常是性能不佳的根源,特别是庞大的数据,这可能是由于网络不佳或网络繁忙等......

无论如何,一种解决方案是:

  • 将数据从链接服务器拉到一个表中(直接)到 R3 服务器中,服务器在中间。这取决于您可以使用的方案
  • 将查询更改为针对该表

这可以显着缩短您的查询时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多