DELETE查询性能

2023-12-25

原始查询

delete B from 
TABLE_BASE B , 
TABLE_INC  I 
where B.ID = I.IDID and B.NUM = I.NUM;

上述查询的性能统计数据

+-------------------+---------+-----------+
|    Response Time  | SumCPU  | ImpactCPU |
+-------------------+---------+-----------+
|   00:05:29.190000 |   2852  |  319672   |
+-------------------+---------+-----------+

优化查询1

DEL FROM TABLE_BASE WHERE (ID, NUM) IN 
(SELECT ID, NUM FROM TABLE_INC);

上述查询的统计信息

+-----------------+--------+-----------+
|   QryRespTime   | SumCPU | ImpactCPU |
+-----------------+--------+-----------+
| 00:00:00.570000 |  15.42 |     49.92 |
+-----------------+--------+-----------+

优化查询2

DELETE FROM TABLE_BASE B WHERE EXISTS
(SELECT * FROM TABLE_INC I WHERE B.ID = I.ID AND B.NUM = I.NUM);

上述查询的统计信息

+-----------------+--------+-----------+
|   QryRespTime   | SumCPU | ImpactCPU |
+-----------------+--------+-----------+
| 00:00:00.400000 |  11.96 |     44.93 |
+-----------------+--------+-----------+

我的问题 -

  • 优化查询 1 和 2 如何/为何对性能影响如此之大?
  • 此类 DELETE 查询的最佳实践是什么?
  • 我应该选择查询 1 还是查询 2?哪一个是理想的/更好的/可靠的?我觉得查询 1 是理想的,因为而不是SELECT *我在用SELECT ID,NUM减少到只有两列,但查询 2 显示了更好的结果。

QUERY 1

 This query is optimized using type 2 profile T2_Linux64, profileid 21.
  1) First, we lock TEMP_DB.TABLE_BASE for write on a
     reserved RowHash to prevent global deadlock.
  2) Next, we lock TEMP_DB_T.TABLE_INC for access, and we
     lock TEMP_DB.TABLE_BASE for write.
  3) We execute the following steps in parallel.
       1) We do an all-AMPs RETRIEVE step from
          TEMP_DB.TABLE_BASE by way of an all-rows scan
          with no residual conditions into Spool 2 (all_amps), which is
          redistributed by the hash code of (
          TEMP_DB.TABLE_BASE.NUM,
          TEMP_DB.TABLE_BASE.ID) to all AMPs.  Then
          we do a SORT to order Spool 2 by row hash.  The size of Spool
          2 is estimated with low confidence to be 168,480 rows (
          5,054,400 bytes).  The estimated time for this step is 0.03
          seconds.
       2) We do an all-AMPs RETRIEVE step from
          TEMP_DB_T.TABLE_INC by way of an all-rows scan
          with no residual conditions into Spool 3 (all_amps), which is
          redistributed by the hash code of (
          TEMP_DB_T.TABLE_INC.NUM,
          TEMP_DB_T.TABLE_INC.ID) to all AMPs.  Then
          we do a SORT to order Spool 3 by row hash and the sort key in
          spool field1 eliminating duplicate rows.  The size of Spool 3
          is estimated with high confidence to be 5,640 rows (310,200
          bytes).  The estimated time for this step is 0.03 seconds.
  4) We do an all-AMPs JOIN step from Spool 2 (Last Use) by way of an
     all-rows scan, which is joined to Spool 3 (Last Use) by way of an
     all-rows scan.  Spool 2 and Spool 3 are joined using an inclusion
     merge join, with a join condition of ("(ID = ID) AND
     (NUM = NUM)").  The result goes into Spool 1 (all_amps),
     which is redistributed by the hash code of (
     TEMP_DB.TABLE_BASE.ROWID) to all AMPs.  Then we do
     a SORT to order Spool 1 by row hash and the sort key in spool
     field1 eliminating duplicate rows.  The size of Spool 1 is
     estimated with no confidence to be 168,480 rows (3,032,640 bytes).
     The estimated time for this step is 1.32 seconds.
  5) We do an all-AMPs MERGE DELETE to
     TEMP_DB.TABLE_BASE from Spool 1 (Last Use) via the
     row id.  The size is estimated with no confidence to be 168,480
     rows.  The estimated time for this step is 42.95 seconds.
  6) We spoil the parser's dictionary cache for the table.
  7) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> No rows are returned to the user as the result of statement 1.

QUERY 2 EXPLAIN PLAN

 This query is optimized using type 2 profile T2_Linux64, profileid 21.
  1) First, we lock TEMP_DB.TABLE_BASE for write on a reserved RowHash to
     prevent global deadlock.
  2) Next, we lock TEMP_DB_T.TABLE_INC for access, and we
     lock TEMP_DB.TABLE_BASE for write.
  3) We execute the following steps in parallel.
       1) We do an all-AMPs RETRIEVE step from TEMP_DB.TABLE_BASE by way of
          an all-rows scan with no residual conditions into Spool 2
          (all_amps), which is redistributed by the hash code of (
          TEMP_DB.TABLE_BASE.NUM, TEMP_DB.TABLE_BASE.ID) to all AMPs.
          Then we do a SORT to order Spool 2 by row hash.  The size of
          Spool 2 is estimated with low confidence to be 168,480 rows (
          5,054,400 bytes).  The estimated time for this step is 0.03
          seconds.
       2) We do an all-AMPs RETRIEVE step from
          TEMP_DB_T.TABLE_INC by way of an all-rows scan
          with no residual conditions into Spool 3 (all_amps), which is
          redistributed by the hash code of (
          TEMP_DB_T.TABLE_INC.NUM,
          TEMP_DB_T.TABLE_INC.ID) to all AMPs.  Then
          we do a SORT to order Spool 3 by row hash and the sort key in
          spool field1 eliminating duplicate rows.  The size of Spool 3
          is estimated with high confidence to be 5,640 rows (310,200
          bytes).  The estimated time for this step is 0.03 seconds.
  4) We do an all-AMPs JOIN step from Spool 2 (Last Use) by way of an
     all-rows scan, which is joined to Spool 3 (Last Use) by way of an
     all-rows scan.  Spool 2 and Spool 3 are joined using an inclusion
     merge join, with a join condition of ("(NUM = NUM) AND
     (ID = ID)").  The result goes into Spool 1 (all_amps), which
     is redistributed by the hash code of (TEMP_DB.TABLE_BASE.ROWID) to all
     AMPs.  Then we do a SORT to order Spool 1 by row hash and the sort
     key in spool field1 eliminating duplicate rows.  The size of Spool
     1 is estimated with no confidence to be 168,480 rows (3,032,640
     bytes).  The estimated time for this step is 1.32 seconds.
  5) We do an all-AMPs MERGE DELETE to TEMP_DB.TABLE_BASE from Spool 1 (Last
     Use) via the row id.  The size is estimated with no confidence to
     be 168,480 rows.  The estimated time for this step is 42.95
     seconds.
  6) We spoil the parser's dictionary cache for the table.
  7) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> No rows are returned to the user as the result of statement 1.

对于 TABLE_BASE

+----------------+----------+
|  table_bytes   | skewness |
+----------------+----------+
| 16842085888.00 |    22.78 |
+----------------+----------+

对于 TABLE_INC

+-------------+----------+
| table_bytes | skewness |
+-------------+----------+
|  5317120.00 |    44.52 |
+-------------+----------+

之间有什么关系TABLE_BASE and TABLE_INC?

如果是一对多,Q1 可能首先创建一个巨大的线轴,而 Q2&3 可能适用DISTINCT在加入之前。

关于IN vs. EXISTS应该几乎没有什么区别,你检查过 dbc.QryLogStepsV 吗?

Edit:

If (ID,Num)是目标表的 PI 重写为 MERGE DELETE 应提供最佳性能:

MERGE INTO TABLE_BASE AS tgt
USING TABLE_INC AS src
ON src.ID = tgt.ID,
AND src.Num = tgt.Num
WHEN MATCHED 
THE DELETE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DELETE查询性能 的相关文章

  • 我应该使用平面表还是标准化数据库?

    我目前正在开发一个使用 MySQL 数据库作为后端的 Web 应用程序 在继续下一步之前 我需要知道什么更适合我的情况 简而言之 在这个应用程序中 用户将能够使用任何数字字段 他们决定 构建自己的表单 现在我将其全部存储在通过外键链接的几个
  • SQL UPDATE 语句根据另一个现有行更新列

    基本上我有一个与下表具有相似格式的表格 我想做的是根据这个逻辑更新 Col4 如果 Col2 为空 则用 Col3 更新 Col4 如果 Col2 不为 null 则在 Col1 中查找与 Col2 中的值匹配的值 使用 col3 中的相应
  • 如何进行数据透视并计算列平均值

    我承认这是迄今为止我必须面对的最复杂的 SQL 语句之一 我在这件事上碰壁了 我希望有人能帮我一把 我在数据库中有这张表 Item ActiveTime sec DateTime 1 10 2013 06 03 17 34 22 gt Mo
  • 删除表的重复项

    In my activity logs 它包含列 material name user id mod result 这标志着测试是否通过 失败 cert links 不知何故 用户生成了两倍的条目material name与cert lin
  • 如何在 Spring Data 中选择不同的结果

    我在使用简单的 Spring Data 查询或 Query 或 QueryDSL 在 Spring Data 中构建查询时遇到问题 如何选择三列 研究 国家 登录 不同的行 并且查询结果将是用户对象类型的列表 Table User Id S
  • SQLite (Android):使用 ORDER BY 更新查询

    Android SQLite 我想要在 myTable 中的其他行之间插入行在android中使用SQLite 为此 我尝试增加从第 3 行开始的所有行的 id 这样 我就可以在位置 3 处插入新行 myTable 的主键是列 id 表中没
  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • 如何连续添加起始行和下一行的值

    我只想创建一个 sql 查询 结果就像图片上的那样 类似于 SQL 中的斐波那契数列 Ex Column 1 10 则 Result 列的值为 Result 10 因为这是第一行 然后假设column1第二行的值为50 那么Result第二
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 一个表可以有多个主键吗?

    我现在很困惑 也许你可以帮助我更好地理解这个问题 即一个表可以有两个主键 如果是 那么如何 如果没有 那为什么 您询问是否可以有多个主键field你当然可以 您只能有一个主键 但它可以包含唯一标识行所需的任意数量的列 创建表时使用类似这样的
  • 包含列和行总计的 SQL 数据透视表

    我正在尝试将行和列总计添加到该数据透视表中 create table test4 city nvarchar 10 race nvarchar 30 sex nvarchar 10 age int insert into test4 val
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • 使用 g++ 5.3.1 编译的程序运行速度比使用 g++ 4.8.4 编译的相同程序慢 3 倍,相同的命令

    最近 我开始使用 Ubuntu 16 04 和 g 5 3 1 并检查我的程序是否运行慢3倍 在此之前我使用过 Ubuntu 14 04 g 4 8 4 我用相同的命令构建它 CFLAGS std c 11 Wall O3 我的程序包含循环
  • 为 PostgreSQL 查询选择正确的索引

    简化表 CREATE TABLE products product no integer PRIMARY KEY sales integer status varchar 16 category varchar 16 CREATE INDE
  • SQL Server:为什么 ISO-8601 格式的日期依赖于语言?

    我需要一些帮助来理解 SQL Server 中的日期格式处理 如果您尝试以下操作 它将返回正确的结果 SET LANGUAGE English SELECT CAST 2013 08 15 AS DATETIME 2013 08 15 00
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM

随机推荐

  • JSON.NET 反序列化对象/对象数组中的对象

    我遇到的情况是 我使用的 API 返回不一致的 JSON 我想使用 JSON NET 对其进行反序列化 在一种情况下 它返回一个包含对象的对象 注意外面的 1 可以是任何数字 1 0 db id 12835424 title XXX 1 d
  • 以编程方式评估 somaxconn 的值,以设置监听积压参数

    对于服务器端编程 我使用监听函数 int listen int sockfd int backlog 我知道积压工作应该小于或等于我将运行服务器程序的主机系统上设置的 somaxconn 如果我使用 SOMAXCONN 作为积压工作 则相当
  • 逐行扫描谷歌文档

    所以基本上 我尝试使用 node js 扫描 google 文档 然后如果 ROBLOX id 在那里 它就会跟踪它 当它跟踪它时 如果它加入了 id 列表中的某个组 它就会自动将其放逐 有什么帮助吗 我在逐行扫描谷歌文档时有点卡住了 我不
  • 如何在创建文件之前测试文件是否存在

    我想看看文件是否存在 如果它不存在 那么我想创建它 顺便说一句 我正在使用Linux 你不能可靠地做到这一点 在您检查文件是否存在和创建文件之间 另一个进程可能会创建它 您应该继续创建该文件 根据您尝试执行的较大操作 如果文件已存在 您可能
  • 子div高度与父div高度不同

    我有一个7divs包裹在 3divs 除第一个之外的所有div被设置为width 0 并且它们都设置为inline block 最外面的div有一个设定的高度166px 结果出来了 独生子 7 divs你看 是第一个 问题是 第三个包装器
  • 如何使用ProxyPass通过Express提供静态文件?

    我正在使用 Apachemod proxy使用 Express 为我的 Node 应用程序提供服务 ProxyPass nodeapp http localhost 3000 ProxyPassReverse nodeapp http lo
  • 使用 MATLAB 解析 HTML 中的锚点 URL,帮助快速

    我有严格的时间限制 我真的需要一个正则表达式来解析这种类型的锚点 它们都是这种格式 a href 20120620 0512 c2 1024 jpg 20120620 0512 c2 102 gt a 对于网址 20120620 0512
  • 使用 xcode 6.1 (OSX) 的 Swift 中的 NSTextField 出现问题

    我开始使用 Swift 但没有使用 Objective C 有人可以教我如何获取和设置NSTextField在 OSX 下使用 xcode 6 1 的 Swift 中 您获取并设置一个值NSTextField与stringValue财产 例
  • 登录控制:WebForms UnobtrusiveValidationMode 需要“jquery”的 ScriptResourceMapping。添加名为 jquery 的 ScriptResourceMapping

    我正在开发一个 ASP NET 网站 我有一个没有任何控制的网络表单 当我向此表单添加登录控件并在浏览器中查看此表单时 显示错误 WebForms UnobtrusiveValidationMode 需要 jquery 的 ScriptRe
  • qt moc.exe错误

    我正在使用 QT Creator 1 3 1 并尝试编译 但出现此错误 请帮我摆脱它 mingw32 make 1 Leaving directory C Documents and Settings eyalk My Documents
  • 向量迭代器不兼容

    我目前正在开发 C 图形库 现在陷入了运行时在调试模式下出现断言错误的问题 我还在这里查看了其他一些问题 但没有一个问题和答案能引导我找到解决方案 在阅读了一些论坛后 我的印象是 发生此错误是因为一旦向量内容发生更改 迭代器就会变得无效 例
  • 使用 ActiveMerchant 自定义 Paypal Express 的评论页面

    我正在使用 ActiveMerchant 让我的 Rails 应用程序能够访问 Paypal 的 Express Checkout 我想在评论页面上添加订单详细信息 如下所述 这可以做到吗 目前 我的控制器代码如下所示 def paypal
  • 如果函数是对象,那么函数体在哪里?

    如果函数是对象 那么函数体在哪里 让我澄清一下我所困惑的事情 函数就是对象 好吧 我可以将对象视为由字符串键和任意类型值组成的哈希映射 我可以做这个 function Square size Rectangle call this size
  • 构建没有依赖项的 MSBuild 目标

    有什么方法可以告诉 MSBuild 4 0 构建目标 但忽略任何依赖项 我只想建立这个目标本身 没有别的 我想重申 EMP 的解决方案 由于我的名声微薄 我不能投票给他 避免 MSBuild 重建项目文件中列出的所有依赖项的默认行为的正确方
  • 避免当一个块出现故障时关闭整个数据流网络

    我在用数据流Ex https github com gridsum DataflowEx我想知道如果抛出异常 如何避免关闭整个数据流 我有一个系统 任务会随机进入 我希望网络记录故障 放弃该特定任务并继续执行其他任务 在阅读有关 TPL 和
  • 如何在android中使用不同的父节点解析xml

    在我的 xml 文件中 我有两个或多个父节点 例如 父节点pizza 属性是1 Veg Pizza 父节点汉堡 属性是1个素食汉堡 每当用户点击披萨时listviewitem 那么用户应该只能查看另一个活动中的披萨项目列表listview
  • 使用 python 3 读取十六进制字符并将其转换为 utf-8

    我有一个包含以下字符串的文件 data txt M xc3 xbchle x0astra xc3 x9fe 现在需要读取该文件并将十六进制代码解释为 utf 8 到目前为止 这是我的尝试 usr bin python3 import os
  • 为什么 STL 文件需要法向量?

    STL 是最流行的 3D 打印 3D 模型文件格式 它记录构成 3D 形状的三角形表面 我阅读了 STL 文件格式的规范 这是一种相当简单的格式 每个三角形由12个浮点数表示 前 3 个定义法向量 接下来的 9 个定义三个顶点 但这里有一个
  • Windows 上的 PEAR:如何更改 pear.ini 位置

    我正在尝试将 PEAR 包安装到 Windows 7 64 位上最近安装的 XAMPP PHP PHP 5 3 1 中 安装新软件包失败 因为 PEAR 尝试访问c windows pear ini而不是现有的c path to xampp
  • DELETE查询性能

    原始查询 delete B from TABLE BASE B TABLE INC I where B ID I IDID and B NUM I NUM 上述查询的性能统计数据 Response Time SumCPU ImpactCPU