首页 > 其他分享 >SELECT和DELETE执行计划的不同选择

SELECT和DELETE执行计划的不同选择

时间:2023-06-19 12:34:30浏览次数:38  
标签:00 01 回表 索引 执行 SELECT DELETE


模拟表名,A表的数据量约1000万,B表的数据量约500万,进行连接,其中这几个条件字段,都创建了索引,



SQL> SELECT * from A a inner join B b on a.ID = b.id
     where b.C_DATE <= trunc(sysdate)-1000;




我们知道在CBO优化器模式下,Oralce会基于Cost成本,来选择执行计划。从执行计划看,全表扫描用的Hash Join,被驱动表只扫描一次,HINT使用索引则用的嵌套循环连接Nested Loop,两个表的记录都很多,哪个表做被驱动表都会导致扫描次数过多,回表也过多,而且索引的CF高,索引扫描的成本,会更高些,SELECT返回所有列,需要考虑回表,因此干脆不回表,选择全表扫描,从Cost能看出,HINT索引的值更高。

从10053能看到SELECT的执行计划成本计算,根本没考虑索引,鉴于SELECT *和较高的CF,能不回表就不回表了,

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT               |               | 10000 |   195K|  5040   (1)| 00:01:01 |
|   1 |  DELETE                        | A             |       |       |            |          |
|*  2 |   COUNT STOPKEY                |               |       |       |            |          |
|   3 |    NESTED LOOPS                |               | 85666 |  1673K|  5040   (1)| 00:01:01 |
|   4 |     TABLE ACCESS BY INDEX ROWID| B             | 85666 |  1171K|  5034   (1)| 00:01:01 |
|*  5 |      INDEX RANGE SCAN          | IDX_B_01      | 85666 |       |   232   (1)| 00:00:03 |
|*  6 |     INDEX UNIQUE SCAN          | PK_A_ID       |     1 |     6 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(ROWNUM<=10000)
   5 - access("B"."C_DATE"<=TRUNC(SYSDATE@!)-1000)
   6 - access("A"."ID"="B"."ID")



DELETE的时候,毕竟要删除数据,因此回表势在必行的,只能在回表的各种路径中找一个合适的,所以会考虑索引路径,

SELECT和DELETE执行计划的不同选择_执行计划

SELECT和DELETE即使条件相同,相应的执行计划,可能还是有差别,归根结底在于Cost的计算和判断,如上例所示,可能会考虑是否需要回表、CF值高低等因素,所以Oracle在这方面还是很智能的,优化器的算法,作为他的核心商业机密,也就不足为奇了。

标签:00,01,回表,索引,执行,SELECT,DELETE
From: https://blog.51cto.com/u_13950417/6512386

相关文章

  • MySQL中SQL语句的执行顺序(详细)
    一:SQL语句的执行顺序作为一个开发人员,在开发中基本上每时每刻都要和数据库打交到;虽然写过无数的SQL语句,但是写好一个SQL可不是这么简单的,它涉及到各式各样的优化和书写方式;但下面我以MySQL中的SQL执行顺序来作为讲解,对其进行剖析。1:SQL数据的准备为了可以为下文做铺垫,......
  • 对select()参数fdset的完整理解
    虽然写了很多代码,但select我就从没有完整理解过,要用时不过copypaste而已。惭愧!今天决定要对select()参数fdset有一个完整理解。Go!先上一段代码(代码1-1),这段代码做的事情是1.创建一个socket来listen请求2.调用select等待新请求、等待已有请求的数据收发状态READY3.当有新连接请求......
  • Linux ELF文件装入与执行概述
    ELF是linux中使用最广泛的一种应用程序格式,为了弄清楚Linux内核是如何讲ELF文件精确映射到指定内存空间,上周末把内核sys_execve部分好好看了一遍,小结如下:1.ELF格式ELF指定了进程中text段、bss段、data段等应该放置到进程虚拟内存空间的什么位置,以及记录了进程需要用到的各种动......
  • shell 登录linux服务器并执行命令
    注意里边(eeooff区域)不能定义变量#!/bin/bashscpdist.zipm-p:/data/wwwroot/medical-shop-websshm-p>/dev/null2>&1<<eeooffcd/data/wwwrootrm-rfdist_bakmvdistdist_bakunzipdist.zipexiteeooffechodone!进入容器操作不能用次方法,应该用docker......
  • DataX在Windows上实现Mysql到Mysql同步数据以及配置多个job/多个表同步定时执行bat
    场景DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步:DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步_sqlserver数据同步工具_霸道流DataX-在Windows上实现postgresql同步数据到mysql:DataX-在Windows上实现postgres......
  • Linux 多路转接 —— select
    目录传统艺能......
  • 在执行建表语句时提示:Row size too large (> 8126)
    在执行建表语句时提示:在mysqld节点下添加以下配置,然后重启mysql[mysqld]innodb_log_file_size=500Minnodb_log_buffer_size=800Minnodb_strict_mode=0 ......
  • 执行存储过程报错:User does not have access to metadata required to determine stor
    在执行存储过程中,报错详细信息如下:java.sql.SQLException:Userdoesnothaveaccesstometadatarequiredtodeterminestoredprocedureparametertypes.Ifrightscannotbegranted,configureconnectionwith"noAccessToProcedureBodies=true"tohavedrivergener......
  • oracle固定执行计划
    文档课题:oracle固定执行计划.本文介绍oracle固定执行计划的2种方法,outline,SQLProfile,其中SQLProfile是重点。1、outline1.1、相关概念开发环境中SQL的执行无问题,但在生产环境执行效率却异常缓慢。若此时更改SQL需重新修改及编译源程序,成本非常高。此时可使用outline在不改变......
  • c#代码的执行过程及反射的应用
    1.反射是什么?是微软提高的一个类包,访问dll里面的metadata,IL2.为什么要用反射?程序可配置和可以突破方法的权限限制3.反射调用方法?反射创建对象?Assemblyassembly=Assembly.LoadFrom("xxx.dll");//dll名称(需要后缀)Typetype=assembly.GetType("aaa.ReflectionTest");object......