sqlserver-合理化CTFP(cost threshold for parallelism)

news2024/10/8 17:59:04

文章目录

  • About CTFP
  • CTFP 默认值的意义
  • 合理化CTFP值
    • 1.查看高使用次数的执行计划
    • 2.调整CTFP值

About CTFP

CTFP (Cost Threshold for Parallelism) 是 SQL Server 中的一项配置,用于控制查询执行计划何时使用并行处理。具体来说,它表示执行计划的“子树成本”(StatementSubTreeCost)需要达到的阈值,才能触发 SQL Server 使用多核 CPU 来并行执行查询。
查询CTFP的设定值

sp_configure 'show advanced options',1
reconfigure
sp_configure 'cost threshold for parallelism'

在这里插入图片描述

CTFP 默认值的意义

这个默认值是5,他意指什么呢?他是否如上面所说的“子树成本”(StatementSubTreeCost),我们验证一下
先创建一张表,并插入1000000行

CREATE TABLE dbo.t1(ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, Stuffing VARCHAR(20));
INSERT INTO dbo.t1(Stuffing)
  SELECT TOP 1000000 'Stuff'
  FROM sys.all_columns ac1
  CROSS JOIN sys.all_columns ac2;
GO

执行非常快,cpu time 191ms,产生4545个逻辑读


set statistics io,time on

SELECT COUNT(*) FROM dbo.t1 
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(1 row affected)
Table 't1'. Scan count 17, logical reads 4545, 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 = 191 ms,  elapsed time = 61 ms.

CPU time 大于 elapsed time,说明查询在使用并行执行计划。这意味着 SQL Server 在执行查询时使用了多个 CPU 核心,同时并行处理任务。每个 CPU 核心会为这次查询消耗一定的时间,而这些核心之间的时间是并行的,不会相互累加到 elapsed time 中。

查看执行计划,可以看到使用了parallelism,且执行计划成本是3.55082
在这里插入图片描述
看起来可能有点令人困惑,SQL Server 默认的并行成本(Cost Threshold for Parallelism)阈值是 5,高于 3。为什么这个查询会并行?
这其实因为sqlserver决定是否并行化,是依据串行执行计划(serial plan)的成本
我们将maxdop降到1

SELECT COUNT(*) FROM dbo.t1 option(maxdop 1);

很快执行完成,elapsed time(138ms) 高于 CPU time(125ms),这可能意味着sql执行花费了138ms,其中cpu time花费了125ms,其他的时间可能在等待 I/O 操作、锁或者系统负载等。

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

(1 row affected)
Table 't1'. Scan count 1, logical reads 4483, 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 = 125 ms,  elapsed time = 138 ms.

在下图显示的执行计划中,已经看不到parallelism的节点,说明sql使用了串行执行计划(serial plan),而且cost是5.00995,大于CTFP(cost throshold for parallelism,默认为5)的值,这也是上述cost=3.55082的情况下,也采用了平行化的原因
在这里插入图片描述

合理化CTFP值

过去,微软开发人员将查询成本与当时的电脑性能挂钩,但这些标准没有随着硬件性能的提升而更新。如今,查询成本的计算方式依然沿用老旧的标准,导致在现代高性能服务器上,很多简单查询仍然会触发并行执行。而服务器硬件的巨大进步使得默认的并行设置和成本阈值(如“cost threshold for parallelism”)不再适应当前的环境,很多性能问题源于没有根据硬件调整这些配置。

所以合理化CTFP的目標有2個:

1.查看高使用次数的执行计划

看看执行计划是否有优化的空间,比如是否有缺失的索引导致这些查询的成本上升。如果能调优这些高频率执行的查询并降低它们的成本,那无论如何都是一个好结果。

如下的sql帮助确认高价且执行频繁的sql语句以及它们的执行计划

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
WITH XMLNAMESPACES   
(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')  
select * from (
SELECT  
     query_plan AS CompleteQueryPlan, 
     n.value('(@StatementText)[1]', 'VARCHAR(4000)') AS StatementText, 
     n.value('(@StatementOptmLevel)[1]', 'VARCHAR(25)') AS StatementOptimizationLevel, 
     cast(n.value('(@StatementSubTreeCost)[1]', 'VARCHAR(128)') as float) AS StatementSubTreeCost, 
     n.query('.') AS ParallelSubTreeXML,  
     ecp.usecounts, 
     ecp.size_in_bytes 
FROM sys.dm_exec_cached_plans AS ecp 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS eqp 
CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS qn(n) 
WHERE  n.query('.').exist('//RelOp[@PhysicalOp="Parallelism"]') = 1 
) a
order by StatementSubTreeCost desc

在这里插入图片描述

2.调整CTFP值

如果经过上述的处理,仍然有一些成本非常高的查询,可能无法将它们的成本降低到5以下,那么可以考虑增加CTFP的值,因为一些简单的query也频繁使用并行化执行,这个设定可以帮助坚守这种可能,让那些cost比较搞,真正需要并行化的sql采用并行化如下的sql帮助检查当前数据库中sql语句大致的成本分布,作为判断CTFP设置的基准

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
WITH XMLNAMESPACES   
(DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')  
select ctfp_gp.cost_range_distribution,count(1) as subtotal_num_sqlstmt,sum(ctfp_gp.usecounts) subtoal_usecount,
cast(count(1)*1.0/max(ctfp_gp.total_num_sqlstmt) as decimal(10,2)) as ratio_sqlstmt,
cast(sum(ctfp_gp.usecounts)*1.0/max(ctfp_gp.total_useconts) as decimal(10,2)) as ratio_useconts,
max(ctfp_gp.total_num_sqlstmt) AS total_num_sqlstmt,max(ctfp_gp.total_useconts) AS total_usecounts
from (
SELECT 
ctfp.CompleteQueryPlan,
ctfp.StatementText,
ctfp.StatementOptimizationLevel,
case when cast(cast (ctfp.StatementSubTreeCost as float) as int) <=10 then 'less then 10'
when cast(cast (ctfp.StatementSubTreeCost as float) as int) between 10 and 20 then '10'
when cast(cast (ctfp.StatementSubTreeCost as float) as int) between 20 and 30 then '20'
when cast(cast (ctfp.StatementSubTreeCost as float) as int) between 30 and 40 then '30'
when  cast(cast (ctfp.StatementSubTreeCost as float) as int) between 40 and 50 then '40'
when  cast(cast (ctfp.StatementSubTreeCost as float) as int) between 50 and 60 then '50'
when  cast(cast (ctfp.StatementSubTreeCost as float) as int) between 60 and 70 then '60'
when  cast(cast (ctfp.StatementSubTreeCost as float) as int) between 70 and 80 then '70'
when  cast(cast (ctfp.StatementSubTreeCost as float) as int) between 80 and 90 then '80'
when  cast(cast (ctfp.StatementSubTreeCost as float) as int) between 90 and 100 then '90'
when cast(cast (ctfp.StatementSubTreeCost as float) as int) >100 then 'more then 100'
end as cost_range_distribution,
ctfp.ParallelSubTreeXML,
ctfp.usecounts,
sum(ctfp.usecounts) over () as total_useconts,
count(1) over () as total_num_sqlstmt,
ctfp.size_in_bytes
from ( 
SELECT  
     query_plan AS CompleteQueryPlan, 
     n.value('(@StatementText)[1]', 'VARCHAR(4000)') AS StatementText, 
     n.value('(@StatementOptmLevel)[1]', 'VARCHAR(25)') AS StatementOptimizationLevel, 
     n.value('(@StatementSubTreeCost)[1]', 'VARCHAR(128)') AS StatementSubTreeCost, 
     n.query('.') AS ParallelSubTreeXML,  
     ecp.usecounts, 
     ecp.size_in_bytes 
FROM sys.dm_exec_cached_plans AS ecp 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS eqp 
CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS qn(n) 
WHERE  n.query('.').exist('//RelOp[@PhysicalOp="Parallelism"]') = 1 
) as ctfp
) ctfp_gp group by cost_range_distribution

在这里插入图片描述
从上述输出,我们可以看出:
成本10区间的sql有17%,执行次数占到全库的27%
成本40区间的sql有10%,执行次数占到全库的14%
成本50区间的sql有20%,执行次数占到全库的21%
因此我将选择将CTFP值设定在50,我认为是合理的选择

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python系统教程005(字符串的格式化输出)

知识回顾 1、默认情况下&#xff0c;input函数接收的数据是字符串类型。 2、字符串类型的关键词是str。 3、\n和\t都是转义字符&#xff0c;\n用来换行&#xff0c;\t用来留出一段固定长度的空白。 4、type函数能够用来查看变量的数据类型 5、数据类型的转换&#xff0c;举…

MySQL从0到1基础语法笔记(上)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 MySQL笔记&#xff1a; 一、注释&#xff1a; 二、SQL四大类&#xff…

鸿蒙开发(NEXT/API 12)【应用加密】程序访问控制

能力简介 为了保护应用代码安全&#xff0c;保护开发者的核心资产&#xff0c;HarmonyOS提供了端到端的应用代码保护机制&#xff0c;该机制以系统安全为基础&#xff0c;构建内核级应用生命周期内的代码安全保护能力。 开发者向应用市场提交上架申请&#xff0c;上传应用包后…

<Rust>iced库(0.13.1)学习之番外:如何为窗口添加初始值?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的番外篇,主要介绍一下新…

国产测径仪的发展历史

关键字:国产测径仪,进口测径仪,蓝鹏测控,测径仪厂家,测径仪品牌 国产测径仪的发展史是一段从引进技术到自主创新、从依赖进口到逐步国产替代的历程。以下是国产测径仪发展史上的几个关键阶段和里程碑&#xff1a; 起步与引进阶段 在早期&#xff0c;国内测径仪技术相对落后&a…

AI Agent现状:为何企业落地AI应用这么难

本文旨在探讨一个关键问题&#xff1a;为何在企业AI应用场景中&#xff0c;大模型应用在用户眼中显得乏善可陈&#xff0c;以至于未能激发出足够的实施意愿。简要来说&#xff0c;当前大多数文本相关应用所提供的智能增值不足&#xff0c;用户需要至少100次以96%准确率进行的LL…

虚拟化数据恢复—互斥不当导致vmfs卷损坏的数据恢复案例

虚拟化数据恢复环境&#xff1a; 某企业信息管理平台&#xff0c; 几台VMware ESX Server主机共享一台存储设备&#xff0c;大约有几十台虚拟机。 虚拟化故障&原因&#xff1a; Vcenter报告虚拟磁盘丢失。管理员通过ssh远程到ESX中执行fdisk -l命令查看磁盘&#xff0c;发…

第二十天|二叉搜索树的公共祖先,修改与构造| 235. 二叉搜索树的最近公共祖先, 701. 二叉搜索树中的插入操作,450. 删除二叉搜索树中的节点

关于二叉搜索树的题目&#xff0c;貌似普遍用迭代法比递归法简单。目前做到的除了98验证二叉搜索树都是如此。 701其实很简单&#xff0c;只是之前自己想不到直接添加到叶子节点这个方法。 注意一个问题&#xff1a;判断需要返回 root 还是 newRoot 返回 root&#xff1a;当操…

超好用的数据库连接工具-DBeaver连接ClickHouse后找不到系统表?

一、前言 公司内部禁止使用Navicat&#xff0c;又不想装JetBrains的DataGrip。找了半天找到这款完全开源的数据库连接工具&#xff0c;几乎可以连接市面上所有的数据库&#xff0c;功能非常强大 二、工具简介 对关系数据库的基本支持&#xff1a;MySQL、SQL Server、PostgreS…

双十一好物清单!这5款高端又实用的双十一好物千万别错过!

随着双十一购物狂欢节的临近&#xff0c;空气中开始弥漫着一股热烈而兴奋的购物气氛。在这个日子里&#xff0c;商品的折扣与优惠的都比较大&#xff0c;很多人都想挑选一款产品&#xff0c;但是&#xff0c;面对琳琅满目的好物&#xff0c;如何选择变成了一个难题&#xff0c;…

数组综合应用(下标计数)C++

第1题 铅笔 时限&#xff1a;1s 空间&#xff1a;256m 桌面有n个盒子&#xff0c;第i个盒子有a[i]支铅笔。 你想要得到尽量多的铅笔&#xff0c;但是如果某两个盒子有相同数量的铅笔&#xff0c;那么你是不能同时拥有这两个盒子的。 问你最多可以得到多少支铅笔。 输入…

Css flex布局下 两端对齐与居中对齐

两端对齐 <view class"top"><view class"history"><image src"../../static/avatar/history.png" mode"" style"width: 70rpx;height: 70rpx;;"></image></view><view class"title…

【LeetCode】每日一题 2024_10_8 旅行终点站(哈希)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 国庆结束了 . . . 力扣的每日一题也来到了终点站 题目&#xff1a;旅行终点站 代码与解题思路 func destCity(paths [][]string) string { // 国庆结束&#xff0c;旅途到了终点// 今天这道题算是一个小…

Qt Qml Map-地图绘制点与圆的切线

基于此源码替换 main.qml 文件https://download.csdn.net/download/qq_38159549/89860109https://download.csdn.net/download/qq_38159549/89860109 import QtQuick 2.5 import QtQuick.Window 2.2 import QtQuick.Controls 1.3 import QtLocation 5.3 import QtPositi…

【Linux】进程间通信——System V消息队列和信号量

一、消息队列 1.1 概念 进程间通信的原理是让不同进程看到同一份资源&#xff0c;资源种类的不同就决定了通信方式的差异。如果用管道通信&#xff0c;则资源是文件缓冲区&#xff1b;如果用共享内存&#xff0c;则资源是内存块 消息队列是由操作系统提供的资源&#xff0c;…

注意!新增一本期刊解除On Hold!仍有37本无法检索慎投!

On Hold期刊 2024年9月29日&#xff0c;小编从WOS数据库查到新增一本ESCI期刊《SOCAR Proceedings》解除On Hold标识 目前共37本期刊被标记&#xff0c;期刊整理如下&#xff0c;请注意避雷&#xff01; 01 解除风险期刊 SOCAR Proceedings • ISSN&#xff1a;2218-6867 •…

RAR解压缩软件的全面指南:压缩、加密、修复功能一应俱全

在日常文件管理中&#xff0c;压缩文件格式与解压缩工具是不可或缺的组成部分。而RAR格式&#xff0c;凭借其高效的压缩率、丰富的功能和灵活的文件管理方式&#xff0c;成为了用户最常使用的压缩格式之一。 作为处理RAR格式的专业工具&#xff0c;RAR解压缩软件具备压缩、加密…

马哥亲讲k8s集群搭建

文章目录 Docker和K8s安装1.docker安装2.安装cri-dockerd3.安装kubelet、kubeadm、kubectl4.整合kubelet和cri-dockerd 集群节点部署1.配置国内镜像站2.方式一&#xff1a;命令初始化1.kubeadm init2.保存初始化token3.拷贝/etc/kubernetes/admin.conf4.部署网络插件5.kubectl …

reactNative本地调试localhost踩坑

本地调试请求localhost的时候 1.要和电脑处在同一局域网下面&#xff08;同一个wifi&#xff09; 2.把baseURL的localhost改成命令行中ipconfig查询到的IPv4 地址 . . . . . . . . . . . . : &#xff08;例如&#xff09;192.168.1.103 如果报错Net Work Error&#xff0c;可…

算法知识点————贪心

贪心&#xff1a;只考虑局部最优解&#xff0c;不考虑全部最优解。有时候得不到最优解。 DP&#xff1a;考虑全局最优解。DP的特点&#xff1a;无后效性&#xff08;正在求解的时候不关心前面的解是怎么求的&#xff09;&#xff1b; 二者都是在求最优解的&#xff0c;都有最优…