AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 161194
Accepted
RayofCommand
RayofCommand
Asked: 2017-01-17 01:48:43 +0800 CST2017-01-17 01:48:43 +0800 CST 2017-01-17 01:48:43 +0800 CST

当我有 6 个核心并且它们进行表扫描并在之后合并时,每个核心都会扫描整个表吗?

  • 772

我记得我曾经在一张表上丢失了一个索引,并且一个查询需要很长时间。在执行计划中,我看到完成了表扫描和合并。来自 IO 的统计数据显示每个核心都进行了一次表扫描,或者更好的是我进行了 6 次表扫描。现在我想知道是每个核心都进行全扫描,还是每个核心都粗略地进行 1/6 表扫描?我确信如果我有一个合适的索引,我要么只进行一次查找,要么将它拆分为每个核心。

我希望你能理解我在这里的意思,不幸的是我无法提供任何信息,因为这个问题刚刚出现,我的问题在几年前就已经解决了。

performance sql-server-2012
  • 1 1 个回答
  • 220 Views

1 个回答

  • Voted
  1. Best Answer
    Joe Obbish
    2017-01-17T17:41:56+08:002017-01-17T17:41:56+08:00

    坦率地说,我不太确定“合并已完成”是什么意思。你在谈论合并连接吗?也许你的意思是并行运算符?至少我可以回答有关并行表扫描的问题。

    来自 IO 的统计数据显示每个核心都进行了一次表扫描,或者更好的是我进行了 6 次表扫描。

    我假设你的意思是你SET STATISTICS IO ON在运行查询之前运行并且部分输出包含如下内容:

    表“你的表”。扫描计数 6,...

    “扫描计数”标签有点误导。如果报告 6 次扫描,您不应该得出结论,即STATISTICS IO表中的所有行都被扫描了 6 次。考虑以下对名为 的堆表的简单示例查询heap_table:

    SELECT TOP 1 *
    FROM heap_table
    OPTION (MAXDOP 1);
    

    对于该查询,STATISTICS IO应该报告扫描计数为 1,对吗?但是 SQL Server 显然不需要读取表中的所有行。查看扫描计数标签的定义也很有帮助:

    在任何方向到达叶级别后开始的搜索/扫描次数,以检索所有值以构建输出的最终数据集。

    ...

    扫描计数为 N,当 N 是在使用索引键定位键值后在叶级别向左侧或右侧开始的不同搜索/扫描的数量。

    因此,如果您的查询进行了并行扫描,我希望看到的扫描计数至少为 6,但这并不一定意味着表中的所有行都被读取了六次。你怎么知道这些行是如何分布在你的 CPU 核心之间的?

    最简单的方法是只看一个实际的执行计划。如果您查看并行扫描的详细信息,SQL Server 将显示每个 CPU 线程处理了多少行。下面是一张您可能会从 Paul White 的文章并行执行计划 – 分支和线程中看到的图片:

    线程行数示例

    正如您所说,您多年前遇到过此查询,因此该方法对您没有帮助。相反,我们需要查看 SQL Server 可用于并行计划处理的技术。Craig Freedman 有一系列关于这个主题的博客文章。来自并行扫描文章:

    并行扫描如何工作?

    构成并行扫描的线程协同工作以扫描表中的所有行。没有针对特定线程的先验分配或行或页。相反,存储引擎动态地将页面分发给线程。并行页面供应商协调对表页面的访问。并行页面供应商确保每个页面都分配给一个线程,因此只处理一次。

    那么,你有它。正如我之前所说,您可以通过使用并行扫描运行查询并检查实际执行计划中并行扫描运算符的详细信息来轻松测试它。

    从另一种角度来看,请尝试考虑一个场景,在该场景中,SQL Server 对每个核心进行全表扫描是有益的。

    假设您碰巧有一个UNION ALL查询引用了您的表六次。原则上,SQL Server 可以独立地用一个内核进行每个表扫描,最后合并结果。但是,SQL Server 不会这样做,因为它不会进行管道并行处理。即使可以,我个人也想不出在这里这样做有什么好处,除了避免一些与并行相关的开销。

    您可能会阅读广播类型的并行执行,并想知道在那种情况下 SQL Server 是否可以对表进行六次完整扫描,每个内核一次。对于广播类型的交换,SQL Server 将所有行发送到所有消费者线程。然而,这可以通过对表进行串行扫描,然后进行分布式流类型的并行交换来实现。事实上,这就是您在散列连接示例中看到的。我真的想不出并行扫描有什么好处,尤其是当广播类型只用于相对较小的表时。

    我认为可能会发生这种情况的一种情况是,如果您有一个并行嵌套循环连接,其中包含一个包含 6 行的外部表,并且在连接的内侧进行了表扫描。在那种情况下,我相信表扫描将由独立的串行线程完成,因此您可以有效地让每个核心执行自己的表扫描。当然,这样的查询可能执行得非常差并且不是目标,尤其是当外表超过六行时。

    • 4

相关问题

  • 使用存储过程处理数据与在检索后将其输入函数相比是否有性能提升?

  • 您如何针对繁重的 InnoDB 工作负载调整 MySQL?

  • 如何确定是否需要或需要索引

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve