【问题标题】:How to diagnose high scan count如何诊断高扫描计数
【发布时间】:2018-01-15 00:34:31
【问题描述】:

我很好奇如何诊断永久表和临时表中的高扫描计数。我在运行存储过程时打开了统计信息,我试图弄清楚为什么扫描计数如此之高。我有实际的查询计划,SSMS 建议添加一些缺少的索引,但此时没有别的了。我可以考虑哪些策略来诊断这些问题?

https://www.brentozar.com/pastetheplan/?id=HksFRMLw-

SQL Server Execution Times:
CPU time = 0 ms,  elapsed time = 0 ms.
Table 'disbursement_check'. Scan count 9, logical reads 2281, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'cif'. Scan count 9, logical reads 490, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'voucher'. Scan count 9, logical reads 3067, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'cif_loan_relationship'. Scan count 9, logical reads 890, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'loanacct'. Scan count 45, logical reads 44124, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'loanacct_trans_history'. Scan count 1166870, logical reads 3654129, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#B17AB456'. Scan count 8, logical reads 1180568, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#BAD74620'. Scan count 2423794, logical reads 2486442, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#BBCB6A59'. Scan count 62661, logical reads 125306, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'loan_class'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'lookup_table'. Scan count 2, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'loanacct_detail'. Scan count 9, logical reads 1348, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 59160 ms,  elapsed time = 9877 ms.
Table '#TargetTransactions_________________________________________________________________________________________________0000000019E6'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

【问题讨论】:

  • I have the actual query plan, and SSMS has suggested a few indexes to add that were missing, but at this point nothing else你能把执行计划分享为xml吗
  • @TheGameiswar 你有什么建议吗,因为它有 250 万个字符?
  • 尝试 pastebin 或 brentozar.com/pastetheplan 发布实际执行计划(未估计) - 如果可能的话。
  • @BogdanSahlean 已添加。必须删除空格,因为该网站只允许 2 MB。
  • @TheGameiswar 添加

标签: sql-server


【解决方案1】:

好问题。

根据一些统计数据,我倾向于认为存在一些索引或缺少索引,这是有问题的。查询计划可能会有所启发,尽管截至发帖时我还没有。

我认为可以安全地假设loanacct_trans_history 表是建议索引的表。此外,这 3 个临时表似乎也做了很多工作......

下面的链接将帮助您充分了解索引以回答您的问题。

请观看这个由世界级 DBA Brent Ozar 主持的 90 分钟免费网络研讨会:https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free-open-source/

【讨论】:

  • 添加了查询计划。
【解决方案2】:

我正试图弄清楚为什么扫描计数如此之高。

表“loanacct_trans_history”。扫描计数 1166870,逻辑读取 3654129,物理读取 0,预读读取 0,lob 逻辑读取 0, lob 物理读取 0,lob 预读读取 0。表 '#B17AB456'。扫描 计数 8,逻辑读取 1180568,物理读取 0,预读读取 0, lob 逻辑读取 0,lob 物理读取 0,lob 预读读取 0。

因为我们(还没有)实际的执行计划,最好的假设是

[ 1 ] 一些Index Seek 产生大量范围扫描(很可能),其中Execution Count 数量很多(可能是FORCESEEK 表提示强制)

[ 2 ] 和/或由以下运算符组合生成的范围扫描或全扫描

... - Nested Loops (Join) - Any Data Access Operator
           |
           ---------------- Index Seek / *Scan loanacct_trans_history 

在这种情况下,我假设 Estimated execution count 是 1 由实际/真实 Execution Count 高。

[ 3 ] 从演示点 [1] 和 [2] 的执行计划中裁剪,这与表 loanacct_trans_history 上的高扫描计数有关:

表“loanacct_trans_history”。扫描计数 1166870,...

似乎以下语句会产生如此高的扫描计数:

INSERT INTO #TargetTransactions (Id, CreditServiceFeeTransactionId, CustomerCifNo, VoucherId)
 SELECT mt.transrefno, rt.CreditServiceFeeTransactionId, contact.cifno, rt.VoucherId
 FROM dbo.getMyTransactions
 (
 @AssignedDealerIds,
 @DealerIds
 ) mt
 JOIN loanacct_trans_history th ON th.transrefno = mt.transrefno
...

几个简单的解决方案:在此语句的末尾,我将尝试添加以下 查询 提示:

INSERT #T...
SELECT ...
...
OPTION(HASH JOIN)
-- Or OPTION(MERGE JOIN)
-- Or OPTION(HASH JOIN, MERGE JOIN)

【讨论】:

  • 我在您输入此内容时添加了计划。
  • @KyleW:见 [3]。
  • 将该提示添加到主选择中会给我Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN. 在视图中添加提示的任何地方,编译器都会抱怨。
  • 从玩它,这似乎来自所涉及的观点 - AND NOT EXISTS ( SELECT acctrefno FROM loanacct_trans_history WITH (NOLOCK) WHERE acctrefno = th.acctrefno AND participant_detail_flag = 1 ) 它正在对每一个可能的价值进行新的寻找
  • 同样的事情,无法生成查询计划
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多