ORACLE 查询SQL优化
1 使用EXPLAIN PLAN
使用EXPLAIN PLAN查看查询的执行计划,这可以帮助你理解查询是如何被Oracle执行的。基于执行计划,你可以确定是否存在索引缺失、不必要的全表扫描等问题。
以下是几种使用EXPLAIN PLAN的方法:
使用EXPLAIN PLAN FOR:
你可以在SQL*Plus、SQL Developer或其他Oracle工具中运行以下命令:
|
|
第一条命令为指定的SQL查询生成执行计划,但它不会直接显示结果。第二条命令使用DBMS_XPLAN.DISPLAY来格式化并显示执行计划。
格式化执行计划输出:
使用DBMS_XPLAN.DISPLAY时,你可以使用各种选项来格式化输出。例如,要显示详细的执行计划并包括统计信息,你可以这样做:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(FORMAT=>'ALLSTATS PREDICATE LAST COST')); |
这将显示执行计划的每个步骤,包括它们的成本、估计的行数、使用的索引等。
FORMAT还有一些附加的选项可用于定制化输出行为,使用中可以通过逗号和空格分隔来声明多个关键字,同时可以使用”+”和”-”符号来包含或排除相应的显示元素,这些附加的选项在官方文档中可以查到:1.ROWS – 显示被优化器估算的记录的行号
2.BYTES – 显示优化器估算的字节数
3.COST – 显示优化器计算的成本信息
4.PARTITION – 显示分区的分割信息
5.PARALLEL – 显示并行执行信息
6.PREDICATE – 显示谓语
7.PROJECTION – 显示列投影部分(每一行的那些列被传递给其父列已经这些列的大小)
8.ALIAS – 显示查询块名称已经对象别名
9.REMOTE – 显示分布式查询信息
10.NOTE – 显示注释
11.IOSTATS – 显示游标执行的IO统计信息
12.MEMSTATS – 为内存密集运算如散列联结,排序,或一些类型的位图运算显示内存管理统计信息
13.ALLSTATS – 与'IOSTATS MEMSTATS'等价
14.LAST – 显示最后执行的执行计划统计信息,默认显示为ALL类型,并且可以累积。
查看特定SQL ID的执行计划:
如果你知道SQL语句的SQL ID(通常可以在AWR报告或V$SQL视图中找到),你可以使用DBMS_XPLAN.DISPLAY_CURSOR来查看其执行计划:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('your_sql_id', 'ALLSTATS')); |
请注意替换'your_sql_id'为你想要查看的SQL语句的ID。
清除之前的执行计划:
如果你之前为多个查询生成了执行计划,并希望清除它们以便为新的查询生成执行计划,你可以使用以下命令:
EXECUTE DBMS_XPLAN.CLEAR_PLAN_TABLE(); |
这将清除PLAN_TABLE$(存储执行计划的地方)中的内容。注意,这可能会影响到其他会话中正在查看的执行计划。
在SQL*Plus中使用AUTOTRACE:
在SQL*Plus中,你可以使用SET AUTOTRACE ON来自动显示查询的执行计划:
|
|
这将执行查询并显示其执行计划。
使用SQL Developer等图形化执行计划
如果你使用Oracle SQL Developer,你可以直接点击查询结果上方的“执行计划”选项卡来查看图形化的执行计划(或者快捷键,如PL/SQL快捷键为“F5”)。SQL Developer会自动为你生成并显示执行计划。
2 索引优化:
- 确保在经常用于搜索、排序和连接的列上创建了索引。
- 避免在索引列上使用函数或表达式,这可能导致索引失效。
- 定期审查和维护索引,删除不必要的索引,因为索引也会占用存储空间并影响插入、更新和删除操作的性能。
- 多表查询关联时,关联条件字段数据类型不一致时,可能会导致索引失效,尽量保证关联的索引字段数据类型保持一致。
3 SQL语句优化
- 尽量减少SELECT语句中选择的列数,只选择需要的列。
- 使用
IN代替多个OR条件。 - 使用连接(JOIN)代替子查询,当可能时。
- 避免在WHERE子句中使用非SARGable(Search ARGumentable)表达式,这些表达式不能有效地利用索引。
-
避免SELECT *,使用
SELECT*会返回表中的所有列,这可能会消耗更多的I/O资源。只选择需要的列。 -
通过创建适当的索引和优化查询来减少全表扫描。
-
对于大型查询,考虑使用Oracle的并行查询功能来加速查询的执行。这可以在多个CPU或磁盘上并行处理查询。
-
当用到子查询时,子查询中的查询条件最好使用主查询中结果集最少的表,避免大结果集匹配子查询;当可能时,可在条件中加入 rownum=1,如:
--使用 select (select itable.col0 from itable where itable.col1 = table1.col1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;--不使用 select (select itable.col0 from itable where itable.col1 = table2.col1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;--使用 select (select itable.col0from itablewhere itable.col1 = table1.col1and rownum = 1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;--不使用 select (select itable.col0 from itable where itable.col1 = table1.col1) as resultfrom table1, table2where table1.col2 = 'xx'and table1.col1 = table2.col1;
4 分区
对于非常大的表,考虑使用分区来提高查询性能。分区允许你将数据分成更小的、更易于管理的片段,每个片段可以独立存储、备份和索引。
Oracle提供了多种分区方法,包括范围分区、列表分区、散列分区和复合分区等。以下是各种分区方法的简要说明:
-
范围分区:根据表中某个列的值的范围将数据划分为不同的分区。例如,可以根据日期范围将销售数据划分为不同的季度或年份分区。
- 优点:适用于可以按自然范围进行分区的表,如时间序列数据。
- 示例:
PARTITION BY RANGE (sales_date) (PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01','YYYY-MM-DD')))
-
列表分区:明确指定要包含在特定分区中的值的列表。与范围分区不同,列表分区支持基于非连续或不规则的值进行分区。
- 优点:适用于需要明确控制行如何映射到分区的场景。
- 示例:
PARTITION BY LIST (region) (PARTITION reg1 VALUES ('North', 'South'), PARTITION reg2 VALUES ('East', 'West'))
-
散列分区:根据指定的散列函数将数据均匀地分布到不同的分区中。这通常用于确保数据的均匀分布和负载平衡。
- 优点:自动将数据均匀分布到不同的分区中,无需手动指定范围或值。
- 示例:
PARTITION BY HASH (employee_id) (PARTITIONS 4)
-
复合分区:结合使用范围分区和列表分区或散列分区的方法。通常首先使用范围分区将数据划分为较大的逻辑部分,然后在每个范围内使用列表或散列分区进行更细粒度的划分。
- 优点:结合了范围分区和列表/散列分区的优点,提供了更灵活的数据划分方式。
如何对已有表进行分区
对于已经存在的表,Oracle提供了在线重定义表的功能来将其转换为分区表。这通常涉及创建一个新的分区表,然后将原始表的数据复制到新表中,并重新命名或删除原始表。这个过程可以在数据库正常运行时进行,但可能需要一些时间和资源。
查询分区信息
可以使用Oracle提供的数据字典视图(如DBA_TAB_PARTITIONS、USER_TAB_PARTITIONS等)来查询有关分区表的信息,包括分区的名称、大小、存储参数等。
5 数据库统计信息
确保定期收集表和索引的统计信息,因为Oracle优化器使用这些统计信息来选择最佳的执行计划。
6 使用绑定变量
在PL/SQL代码或JDBC/ODBC等接口中,使用绑定变量而不是硬编码值,这可以减少硬解析的数量,并提高性能。
7 使用Oracle的SQL调优顾问
Oracle提供了SQL调优顾问(SQL Tuning Advisor),它可以分析SQL语句并提供可能的优化建议。
8 考虑物化视图
对于复杂的查询或聚合操作,考虑使用物化视图来存储预计算的结果。这可以加快查询速度,但请注意,物化视图需要定期刷新以保持数据的准确性。
硬件和配置优化
确保数据库服务器具有足够的RAM、CPU和磁盘I/O资源。此外,检查Oracle的配置参数,如SGA(系统全局区)的大小,以确保它们已针对你的工作负载进行了优化。
定期维护
定期运行数据库维护任务,如重新构建索引、更新统计信息、清理碎片化的数据等,以保持数据库的最佳性能。
监控和诊断
使用Oracle的性能监控工具(如AWR、ASH、ADDM等)来监控数据库的性能并诊断潜在的问题。这些工具可以提供关于查询性能、等待事件、资源消耗等方面的详细信息。
相关文章:
ORACLE 查询SQL优化
1 使用EXPLAIN PLAN 使用EXPLAIN PLAN查看查询的执行计划,这可以帮助你理解查询是如何被Oracle执行的。基于执行计划,你可以确定是否存在索引缺失、不必要的全表扫描等问题。 以下是几种使用EXPLAIN PLAN的方法: 使用EXPLAIN PLAN FOR: 你可以…...
Ansible03-Ansible Playbook剧本详解
目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包,安装软件包,启动服务5.3.3.1 任务拆解…...
Qt-qrencode生成二维码
Qt-qrencode开发-生成二维码📀 文章目录 Qt-qrencode开发-生成二维码📀[toc]1、概述📸2、实现效果💽3、编译qrencode🔍4、在QT中引入编译为静态库的QRencode5、在Qt中直接使用QRencode源码6、在Qt中使用QRencode生成二…...
长安链使用Golang编写智能合约教程(三)
本篇主要介绍长安链Go SDK写智能合约的一些常见方法的使用方法或介绍 资料来源: 官方文档官方示例合约库 官方SDK接口文档 教程一:智能合约编写1 教程二:智能合约编写2 一、获取参数、获取状态、获取历史记录的方法解析 注意! …...
Vercel deploy- Nextjs project error-URL link-env variable
Vercel deploy- Nextjs project error-URL link-env variable Error Check Database URL Check next-auth URL NEXTAUTH_URLhttps://yourappname.vercel.app/ 依次排查可能性 Application error: a server-side exception has occurred (see the server logs for more in…...
Java | Leetcode Java题解之第123题买卖股票的最佳时机III
题目: 题解: class Solution {public int maxProfit(int[] prices) {int n prices.length;int buy1 -prices[0], sell1 0;int buy2 -prices[0], sell2 0;for (int i 1; i < n; i) {buy1 Math.max(buy1, -prices[i]);sell1 Math.max(sell1, b…...
Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...
Redis实现延迟队列
最近用到一个延迟消息的功能,第一时间想到使用MQ或者MQ的插件,因为数据量不大,所以尝试使用Redis来实现了,毕竟Redis也天生支持类似MQ的队列消费,所以,在这里总结了一下Redis实现延迟消息队列的方式。 一、…...
如何准确查找论文数据库?
在学术研究过程中,查找相关论文是获取最新研究成果、支持自己研究的重要途径。准确查找论文数据库不仅可以节省时间,还能确保找到高质量的学术资源。本文将介绍一些有效的方法和策略,帮助您准确查找论文数据库。 1. 选择合适的数据库 不同的…...
翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)
What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件(IStream 版本) 上一次,我们看…...
【FPGA】Verilog语言从零到精通
接触fpga一段时间,也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇:Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架:模块的结构 类比:c语言的基础…...
unity打包的WebGL部署到IIS问题
部署之后会出错,我遇到的有以下几种; 进度条卡住不动 明明已经部署到了IIS上,为什么浏览网页的时候还是过不去或者直接报错。 进度条卡住不动的问题其实就是wasm和data的错误。 此时在浏览器上按F12进入开发者模式查看错误(下图…...
GPT-4o:人工智能的新里程碑
GPT-4o,作为OpenAI最新推出的人工智能技术,无疑在人工智能领域掀起了新一轮的浪潮。这款新型的语言模型不仅继承了GPT系列的核心优势,更在多个方面实现了突破性的进展。以下,我们将从版本间的对比分析、GPT-4o的技术能力以及个人整…...
发现一个ai工具网站
网址 https://17yongai.com/ 大概看了下,这个网站收集的数据还挺有用的,有很多实用的ai教程。 懂ai工具的可以在这上面找找灵感。...
第二十五章新增H5基础(以及视频~兼容)
1.HTML5中新增布局标签 HTML5新增了页眉,页脚,内容块等文档结构相关标签,可以使文档结构更加清晰明了。 1.新增的结构标签 1、<header>标签 定义文档或者文档中内容块的页眉。通常可以包含整个页面或一个内容区域的标题,…...
[英语单词] production quality
Our goal is to implement a production quality switch platform that supports standard management interfaces and opens the forwarding functions to programmatic extension and control. 说在openswitch的文档里有说这两词,含义是产品质量。是production修…...
windows安装nodeJs,以及常用操作
1. 官网(Node.js — Run JavaScript Everywhere (nodejs.org))下载想要安装的node版本 的安装包完成安装 2.环境变量设置: 系统变量: Path新增:D:\Program Files\nodejs (node安装目录) 3.设置淘宝源: npm config set registr…...
MySql part1 安装和介绍
MySql part1 安装和介绍 数据 介绍 什么是数据库,数据很好理解,一般来说数据通常是我们所认识的 描述事物的符号记录, 可以是数字、 文字、图形、图像、声音、语言等,数据有多种形式,它们都以经过数字化后存入计算机…...
SpringBoot打war包并配置外部Tomcat运行
简介 由于其他原因,我们需要使用SpringBoot打成war包放在外部的Tomcat中运行,本文就以一个案例来说明从SpringBoot打war包到Tomcat配置并运行的全流程经过 环境 SpringBoot 2.6.15 Tomcat 8.5.100 JDK 1.8.0_281 Windows 正文 一、SpringBoot配置打war包 第一步&a…...
2024.5.31每日一题
LeetCode 找出缺失的重复数字 题目链接:2965. 找出缺失和重复的数字 - 力扣(LeetCode) 题目描述 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次ÿ…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
