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 / 问题 / 310102
Accepted
Joe Obbish
Joe Obbish
Asked: 2022-03-24 15:01:43 +0800 CST2022-03-24 15:01:43 +0800 CST 2022-03-24 15:01:43 +0800 CST

为什么并行 top N 排序明显比串行 top N 排序更高效?

  • 772

我正在针对 SQL Server 2019 CU14 进行测试。我有一个纯行模式查询,可以从复杂视图中选择前 50 行。完整的查询在 MAXDOP 1 处需要 25426 毫秒的 CPU 时间,在 MAXDOP 2 处需要 19068 毫秒的 CPU 时间。并行查询总体上使用更少的 CPU 时间并不感到惊讶。并行查询适用于位图运算符,并且查询计划在一些方面有所不同。但是,我对前 N 个排序的操作员时间的巨大差异感到惊讶。

在串行计划中,根据算子执行统计,前 N 个排序报告了大约 10 秒的 CPU 时间:

在此处输入图像描述

MAXDOP 2 计划为相同的前 N ​​排序报告大约 1.6 秒的 CPU 时间:

在此处输入图像描述

我不明白为什么两个不同的查询计划之间会报告如此大的差异。父运算符中的计算标量非常简单,无法解释运算符时间的差异。这是他们的样子:

[Expr1055] = Scalar Operator(CASE WHEN COLUMN_1 IS NULL THEN (0) ELSE datediff(day,COLUMN_1,getdate()) END),
[Expr1074] = Scalar Operator(CASE WHEN [Expr1074] IS NULL THEN (0) ELSE [Expr1074] END)

在计划的不同部分还有其他计算标量。如果有人想查看它们,我上传了串行计划和并行计划的匿名实际计划。

当我将没有 TOP 的完整查询结果加载到临时表中并在临时表上执行 TOP 50 排序时,并行和串行计划都需要大约 1200 毫秒的 CPU 时间来执行排序。因此,在完整查询中报告的并行排序操作员时间对我来说是合理的。串行查询的十秒没有。

为什么串行前 N 排序报告的 CPU 时间比并行排序高得多?它的效率真​​的低很多吗?或者这可能是操作执行统计的错误?

sql-server query-performance
  • 1 1 个回答
  • 761 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2022-03-25T02:58:43+08:002022-03-25T02:58:43+08:00

    很难根据没有重现的匿名计划来确定,但首先想到的机制是延迟表达式评估。

    在串行计划中,排序可能负责评估大量从早期运算符延迟的表达式。这包括必须在排序缓冲区中具体化的值,而不仅仅是排序键。因此,计算表达式的成本由排序承担。

    在并行计划中,可能必须更早地评估这些表达式,例如,当值必须在Parallelism运算符的交换缓冲区中实现时。表达式评估的成本分散在计划运算符中,而不是集中在Sort中。

    在Sort中有大量的表达式(Exprxxxx)。下面显示了一个选择(它们不会都适合单个屏幕截图):

    一些表达

    我没有试图追踪其中哪些可能是负责任的,因为该计划的规模和匿名性质使得这不可行。

    有许多运算符可以定义表达式,而不仅仅是Compute Scalar。引用我之前链接的文章:

    计算标量不是唯一可以定义表达式的运算符。您可以在许多查询计划运算符中找到带有 [Expr1008] 等标签的表达式定义,包括常量扫描、流聚合......

    表达式评估可以跨许多运算符延迟很长时间。关键点是评估被推迟到另一个运算符需要表达式的结果,或者甚至直到服务器需要组装行以返回给客户端。阻塞或半阻塞运算符只是可能需要实现表达式评估的一个示例。

    其他语言的用户可能熟悉名为“惰性评估”的概念。计算在逻辑上尽可能推迟。

    自然地,将结果具体化到临时表中意味着对所有表达式进行求值。这解释了为什么您会看到从临时表源执行的预期 CPU 时间。

    • 13

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

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

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