ORACLE 查询SQL优化

1 使用EXPLAIN PLAN

        使用EXPLAIN PLAN查看查询的执行计划,这可以帮助你理解查询是如何被Oracle执行的。基于执行计划,你可以确定是否存在索引缺失、不必要的全表扫描等问题。

        以下是几种使用EXPLAIN PLAN的方法:

         使用EXPLAIN PLAN FOR:

        你可以在SQL*Plus、SQL Developer或其他Oracle工具中运行以下命令:

EXPLAIN PLAN FOR SELECT * FROM your_table WHERE your_column = 'some_value';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

        第一条命令为指定的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来自动显示查询的执行计划:

SET AUTOTRACE ON

EXPLAIN SELECT * FROM your_table WHERE your_column = 'some_value';

        这将执行查询并显示其执行计划。

        使用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提供了多种分区方法,包括范围分区、列表分区、散列分区和复合分区等。以下是各种分区方法的简要说明:

  1. 范围分区:根据表中某个列的值的范围将数据划分为不同的分区。例如,可以根据日期范围将销售数据划分为不同的季度或年份分区。

    • 优点:适用于可以按自然范围进行分区的表,如时间序列数据。
    • 示例:PARTITION BY RANGE (sales_date) (PARTITION p1 VALUES LESS THAN (TO_DATE('2023-01-01','YYYY-MM-DD')))
  2. 列表分区:明确指定要包含在特定分区中的值的列表。与范围分区不同,列表分区支持基于非连续或不规则的值进行分区。

    • 优点:适用于需要明确控制行如何映射到分区的场景。
    • 示例:PARTITION BY LIST (region) (PARTITION reg1 VALUES ('North', 'South'), PARTITION reg2 VALUES ('East', 'West'))
  3. 散列分区:根据指定的散列函数将数据均匀地分布到不同的分区中。这通常用于确保数据的均匀分布和负载平衡。

    • 优点:自动将数据均匀分布到不同的分区中,无需手动指定范围或值。
    • 示例:PARTITION BY HASH (employee_id) (PARTITIONS 4)
  4. 复合分区:结合使用范围分区和列表分区或散列分区的方法。通常首先使用范围分区将数据划分为较大的逻辑部分,然后在每个范围内使用列表或散列分区进行更细粒度的划分。

    • 优点:结合了范围分区和列表/散列分区的优点,提供了更灵活的数据划分方式。

如何对已有表进行分区

对于已经存在的表,Oracle提供了在线重定义表的功能来将其转换为分区表。这通常涉及创建一个新的分区表,然后将原始表的数据复制到新表中,并重新命名或删除原始表。这个过程可以在数据库正常运行时进行,但可能需要一些时间和资源。

查询分区信息

可以使用Oracle提供的数据字典视图(如DBA_TAB_PARTITIONSUSER_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等)来监控数据库的性能并诊断潜在的问题。这些工具可以提供关于查询性能、等待事件、资源消耗等方面的详细信息。

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

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

相关文章

【Epoch,Batch,Iteration】深度学习模型训练相关基础概念光速理解!

🔥模型训练相关基础概念! Epoch: 一次 epoch 代表整个训练数据集已经被完整地送入神经网络进行了一轮训练。通常,模型需要多次 epoch 才能充分学习数据集中的模式。Batch: 由于数据集可能过大,无法一次性全部加载到内存中进行训练…

解决VSCode右键没有Open In Default Browser问题

在VSCode进行Web小程序测试时,我们在新建的HTML文件中输入 !会自动生成页面代码骨架,写入内容后,我们想要右键在浏览器中预览。发现右键没有“Open In Default Browser”选项。原因是没有安装插件。 下面是解决方案:首先在VSCode找…

探索Lora:微调大型语言模型和扩散模型的低秩适配方法【原理解析,清晰简洁易懂!附代码】

探索Lora:微调大型语言模型和扩散模型的低秩适配方法 随着深度学习技术的快速发展,大型语言模型(LLMs)和扩散模型(Diffusion Models)在自然语言处理和计算机视觉领域取得了显著的成果。然而,这…

3d渲染的常用概念和技术,渲染100邀请码1a12

之前我们介绍了3D渲染的基本原理和流程,这次说下几个常用概念和技术。 3D渲染中涉及到很多专业的概念和技术,它们决定了渲染质量和效果,常用的有以下几个。1、光线追踪 光线追踪是一些专业渲染器(如V-Ray和Corona等)…

Android UI控件详细解析(四)

1.UI控件 1.1 TextView控件 常用属性 属性含义id给当前控件定义了一个唯 一标识符layout_width高度,单位:dp (wrap_content, match_parent)layout_height宽度,单位:dp (wrap_content, match_parent)background设置背景图片text…

Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld

文章目录 前言一、Django环境配置1、python 环境2、Django环境3、mysql环境4、IDE:pycharm 二、第一次创建Django项目1、创建项目door_web_django_system2、运行启动 三、Django项目介绍1、介绍Django项目结构2、第一个helloword4、django的项目逻辑(和j…

React + Taro 项目 实际书写 感受

之前我总结了部分react 基础 根据官网的内容 以及Taro 框架的内容 今天我试着开始写了一下页面和开发 说一下我的感受 我之前写的是vue3 今天是第一次真正根据需求做页面开发 和逻辑功能 代码的书写 主体就是开发了这个页面 虽说这个页面 很简单 但是如果你要是第一次写 难说…

CATIA入门操作案例——压缩弹簧绘制,螺旋线的使用,法则曲线应用

目录 引出画压缩弹簧画等距部分画两端的压缩部分曲线缝合和扫掠封闭曲面得实体 总结异形弹簧新建几何体草图编辑,画一条样条线进行扫掠,圆心和半径画出曲面上的螺旋线再次选择扫掠,圆心和半径 其他自定义信号和槽1.自定义信号2.自定义槽3.建立…

Aigtek功率放大器的主要性能要求有哪些

功率放大器是电子系统中的重要组件,用于将低功率信号放大到高功率水平。功率放大器的性能直接影响到信号的放大质量和系统的整体性能。下面西安安泰将介绍功率放大器的主要性能要求。 增益:功率放大器应当具有足够的增益,即将输入信号的幅度放…

【仿真建模-anylogic】指定服务端口

Author:赵志乾 Date:2024-05-31 Declaration:All Right Reserved!!! 问题:anylogic动画模型可以在浏览器中进行展示,且访问端口在模型启动时随机生成;为了将其动画页面嵌…

读取YUV数据到AVFrame并用多线程控制帧率

文件树: 1.xvideo_view.h class XVideoView { public:// 像素格式枚举enum Format { RGBA 0, ARGB, YUV420P };// 渲染类型枚举enum RenderType { SDL 0 };// 创建渲染对象的静态方法static XVideoView* Create(RenderType type SDL);// 绘制帧的方法bool DrawF…

影响生产RAG流水线5大瓶颈

检索增强生成(Retrieval Augmented Generation,RAG)已成为基于大型语言模型的生成式人工智能应用的关键组成部分。其主要目标是通过将通用语言模型与外部信息检索系统集成,增强通用语言模型的能力。这种混合方法旨在解决传统语言模…

无法删除dll文件

碰到xxxxxx.dll文件无法删除不要慌! 通过Tasklist /m dll文件名称 去查看它和哪个系统文件绑定运行,发现是explorer.exe。 我们如果直接通过del命令【当然需要在该dll文件所在的路径中】。发现拒绝访问 我们需要在任务管理器中,将资源管理器…

如何处理网安发出的网络安全监督检查限期整改通知

近期,很多客户都收到了网安发出的限期整改通知。大家都比较关心的问题是,如何应对处理这些限期整改通知。后续是否有其他的影响,需要如何做进一步的优化整改和调整。今天就这些问题给大家做一些分享。 一. 为什么会有网安的网络安全检查 主…

大多数JAVA程序员都干不到35岁吗?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!不少人认为的程序员吃青春饭…

边缘计算:推动智能时代的前沿技术

边缘计算:推动智能时代的前沿技术 引言 随着物联网(IoT)、5G通信和人工智能(AI)技术的迅猛发展,边缘计算(Edge Computing)成为现代计算架构中的一个重要组成部分。边缘计算通过将数据处理和存储移至网络边缘,靠近数据生成源头,从而显著提高响应速度、降低延迟和带宽…

项目VS运营

一、项目与运营的定义与区别 项目与运营是企业管理中的两个重要概念,尽管在实际运作中它们常被视为同义词,但它们之间存在明显的区别。 项目,指的是为达到特定目标,通过临时性、系统性、有计划的组织、协调、控制等系列活动&…

基于深度学习的端到端语音识别时代

随着深度学习的发展,语音识别由DNN-HMM时代发展到基于深度学习的“端到端”时代,这个时代的主要特征是代价函数发生了变化,但基本的模型结构并没有太大变化。总体来说,端到端技术解决了输入序列长度远大于输出序列长度的问题。 采…

Visual Studio中调试信息格式参数:/Z7、/Zi、/ZI参数

一般的调试信息都保存在pdb文件中。 Z7参数表示这些调试信息保存到OBJ目标文件中,这样的好处是不需要单独分发PDB文件给下游。Zi就是把所有的调试信息都保存在pdb文件中,以缩小发布文件的大小。ZI和Zi类似,但是增加了热重载的能力&#xff1…

Django admin后台创建密文密码

Django admin后台创建密文密码 如题现在有一张用户表User # user/models.py from django.db import models from django.contrib.auth.models import AbstractUserclass User(AbstractUser):SEX_CHOICES [(0, 男),(1, 女),]sex models.IntegerField(choicesSEX_CHOICES, de…