Dav_笔记14:优化程序提示 HINTs -4

news2025/5/19 15:30:15

指定全局表提示

指定表的提示通常是指发生提示的DELETE,SELECT或UPDATE查询块中的表,而不是指语句引用的任何视图中的表。 如果要为显示在视图中的表指定提示,Oracle建议使用全局提示,而不是在视图中嵌入提示。 您可以使用包含具有表名的视图名称的扩展tablespec语法,将本章中描述的表提示转换为全局提示。

此外,可选的查询块名称可以在tablespec语法之前。 请参见“在提示中指定查询块”。

指定表的提示使用以下语法,其中view指定视图名称,table指定表的名称或别名:

如果指定了视图路径,则数据库将从左向右解析提示,其中第一个视图必须存在于FROM子句中,并且必须在前一视图的FROM子句中指定每个后续视图。

例3创建了一个视图v,用于返回员工的姓名,他或她的第一份工作,以及该员工在其所在部门工资最高的每位员工的所有直接报告的总工资。 在查询数据时,您希望在视图e2中强制使用索引emp_job_ix作为表e3。

示例3使用全局提示示例

CREATE OR REPLACE VIEW v AS

SELECT e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal

FROM employees e1, ( SELECT * FROM employees e3) e2, job_history j

WHERE e1.employee_id = e2.manager_id

AND e1.employee_id = j.employee_id

AND e1.hire_date = j.start_date

AND e1.salary = ( SELECT max(e2.salary) FROM employees e2

WHERE e2.department_id = e1.department_id )

GROUP BY e1.first_name, e1.last_name, j.job_id

ORDER BY total_sal;

通过使用全局提示结构,您可以避免使用视图主体e2中的索引提示的规范来修改视图v。 要强制使用表e3的索引emp_job_ix,可以使用以下语句之一:

SELECT /*+ INDEX(v.e2.e3 emp_job_ix) */ * FROM v;

SELECT /*+ INDEX(@SEL$2 e2.e3 emp_job_ix) */ * FROM v;

SELECT /*+ INDEX(@SEL$3 e3 emp_job_ix) */ * FROM v;

注意:

Oracle数据库忽略引用多个查询块的全局提示。 例如,在以下查询中忽略LEADING提示,因为它使用点表示法来包含表a和查询查询块v的主查询块:

SELECT /*+ LEADING(v.b a v.c) */ *

FROM a, v

WHERE a.id = v.id;

为避免此问题,Oracle建议您使用@SEL表示法在提示中指定查询块:

SELECT /*+ LEADING(A@SEL$1 B@SEL$2 C@SEL$2) */

FROM a a, v v

WHERE a.id = v.id;

---------------------------------------------------------------------------------------------------------------------------------

Example 4 Using Global Hints with NO_MERGE

The global hint syntax also applies to unmergeable views as in Example 19–4.

CREATE OR REPLACE VIEW v1 AS

SELECT *

FROM employees

WHERE employee_id < 150;

CREATE OR REPLACE VIEW v2 AS

SELECT v1.employee_id employee_id, departments.department_id department_id

FROM v1, departments

WHERE v1.department_id = departments.department_id;

SELECT /*+ NO_MERGE(v2) INDEX(v2.v1.employees emp_emp_id_pk)

FULL(v2.departments) */ *

FROM v2

WHERE department_id = 30;

提示导致v2不合并,并为employee和department表指定访问路径提示。 这些提示被下推到(非合并)视图v2中。

指定复杂的索引提示

指定索引的提示可以使用简单索引名称或带括号的列列表,如下所示:

语义如下:

■table指定名称

■column指定指定表中列的名称

- 列可以选择以表限定符作为前缀,允许提示指定位图连接索引,其中索引列与索引表位于不同的表上。如果存在表限定符,则它们必须是基表,而不是查询中的别名。

- 索引规范中的每个列必须是指定表中的基本列,而不是表达式。除非索引规范中指定的列形成基于函数的索引的前缀,否则不能使用列规范提示基于函数的索引。

■index指定索引名称

当tablespec在提示规范中后跟indexspec时,允许使用逗号分隔表名和索引名,但不是必需的。也允许逗号(但不是必需的)分隔多次出现的indexspec。

提示解析如下:

■如果指定了索引名称,则数据库仅考虑指定的索引。

■如果指定了列列表,并且存在其列与数字和顺序中的指定列匹配的索引,则数据库仅考虑此索引。如果不存在此类索引,则会考虑表中具有指定列作为指定顺序的前缀的任何索引。在任何一种情况下,行为都与用户在所有匹配索引上单独指定相同提示完全相同。

例如,在示例3中,job_history表在employee_id列上具有单列索引,在employee_id和start_date列上具有连接索引。要专门指示优化器使用索引,可以按如下方式提示查询:

SELECT /*+ INDEX(v.j jhist_employee_ix (employee_id start_date)) */ * FROM v;

使用视图提示

Oracle不鼓励在视图(或子查询)内部或视图(或子查询)上提示,因为您可以在一个上下文中定义视图并在另一个上下文中使用它们。此外,此类提示可能会导致意外的执行计划。特别是,视图内部或视图上的提示处理方式不同,具体取决于视图是否可合并到顶级查询中。

要为视图或子查询中的表指定提示,最好使用全局提示语法。请参见“指定全局表提示”。

如果您决定使用带有视图的提示,则以下部分将描述该行为。

提示和复杂视图

默认情况下,提示不会在复杂视图中传播。例如,如果在查询中指定一个提示来选择复杂视图,则不会遵循此提示,因为它不会被推入视图中。

除非提示位于基本视图中,否则它们可能不会受到针对视图的查询的影响。

提示和可合并的视图

可合并视图是Oracle数据库可以用定义视图的查询替换的视图。例如,假设您创建一个视图,如下所示:

CREATE OR REPLACE VIEW emp_view AS

SELECT last_name, department_name FROM employees e, departments d

WHERE e.department_id=d.department_id;

此视图是可合并的,因为数据库可以优化以下查询以使用定义视图的SELECT语句,从而避免使用视图本身。

SELECT * FROM emp_view;

视图中的优化方法和目标提示

优化方法和目标提示可以在顶级查询或内部视图中进行。

■如果顶级查询中存在此类提示,则数据库将使用此提示,而不管视图中是否有任何此类提示。

■如果没有顶级优化程序模式提示,则只要视图中的所有模式提示都一致,数据库就会在引用的视图中使用模式提示。

■如果引用视图中的两个或多个模式提示冲突,则数据库将丢弃视图中的所有模式提示,并使用会话模式,无论是默认还是用户指定。

访问路径和视图上的联接提示

除非视图包含单个表或引用带有单个表的Additional Hints视图,否则将忽略对引用视图的访问路径和连接提示。对于此类单表视图,视图上的访问路径提示或连接提示适用于视图内的表。

内部视图中的访问路径和连接提示

访问路径和连接提示可以显示在视图定义中。

■如果视图是内联视图(即,如果它出现在SELECT语句的FROM子句中),则当视图与顶级查询合并时,将保留视图内的所有访问路径和连接提示。

■对于非内联视图的视图,仅当引用查询不引用其他表或视图时(即,如果SELECT语句的FROM子句仅包含视图),才会保留视图中的访问路径和连接提示。

提示和不可合并的视图

使用不可合并的视图,忽略视图内的优化方法和目标提示;顶级查询决定优化模式。

由于不可合并的视图与顶级查询分开优化,因此将保留视图内的访问路径和连接提示。出于同样的原因,将忽略顶级查询中视图的访问路径提示。

但是,保留顶级查询中视图的连接提示,因为在这种情况下,不可合并的视图类似于表。

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

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

相关文章

桥接模式 Bridge Pattern

桥接模式Abstraction 和 Implementor 的理解 在图书馆看到一本 通过电商项目真正实战《贯穿设计模式》。拿起来翻到了 桥接模式&#xff0c;感觉味道不对&#xff0c;和我印象中不一样。 感谢这位同学提供的源码 贯穿设计模式-适配器模式桥接模式_-CSDN博客GitHub - WeiXiao…

Ubuntu 安装 OpenCV (C++)

版本详情&#xff1a; Ubuntu: 22.04 5.15.0-133-generic gcc: 11.4.0 g: 11.4.0 OpenCV: 4.7.0 1. 卸载 OpenCV 进入原先编译 opencv 的 build 目录&#xff0c;在该目录下打开终端&#xff0c;执行以下代码&#xff08;如果 build 已经删除了&#xff0c;可以重新编译一…

前端模板引擎

前言 正常渲染拿到数据后渲染&#xff0c;三步走&#xff1a;格式化数据、编译模板、渲染数据 如下例 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice…

长尾词SEO优化软件:企业官网流量提升的软件【实测】

搜索引擎流量中68%来自长尾关键词&#xff08;数据来源&#xff1a;Ahrefs 2025&#xff09;&#xff0c;但83%企业仍困于「高价值长尾词难挖掘内容生产跟不上」的双重困境。当同行用智能工具批量布局「孕妇防辐射服哪个牌子好」等精准词时&#xff0c;手动分析数据的你可能还在…

用自己的数据训练yolov11目标检测

文章目录 概要理论知识整体架构流程架构优化多任务支持多参数体量 操作实操环境配置数据准备数据标注数据放置路径 训练预测 概要 YOLOv11 是 Ultralytics 团队于 2024 年 9 月 30 日发布的最新目标检测模型&#xff0c;延续了 YOLO 系列实时推理特性&#xff0c;同时通过架构优…

gsoap实现webservice服务

gsoap实现webservice服务 在实现Web服务时&#xff0c;使用gSOAP是一个很好的选择&#xff0c;因为它提供了强大的工具和库来创建SOAP和RESTful服务。gSOAP是一个C和C语言开发的库&#xff0c;它支持SOAP协议的各种版本&#xff0c;包括SOAP 1.1和SOAP 1.2。下面是如何使用gSO…

项目2 数据可视化--- 第十五章 生成数据

数据分析是使用代码来探索数据内的规律和关联。 数据可视化是通过可视化表示来 探索和呈现数据集内的规律。 好的数据可视化&#xff0c;可以发现数据集中未知的规律和意义。 一个流行的工具是Matplotlib&#xff0c;他是一个数据绘图库&#xff1b; 还有Plotly包&#xff…

QT (四)模型/视图 QFileSystemModel,QStringListModel,QStandardItemModel

思考&#xff1a;QTableWidget 在某种程度上可以等价为QStandardItemModel&#xff0c;同理&#xff0c;其他的功能也有类似的等价&#xff0c;但是以当前的QTableWidget 和QStandardItemModel为例的话&#xff0c;两者都是用于实现建立表格的相关组件&#xff0c;只不过QStand…

. Unable to find a @SpringBootConfiguration(默认软件包中的 Spring Boot 应用程序)

解决&#xff1a; 新建一个包即可 问题&#xff1a; 默认软件包中的 Spring Boot 应用程序。 原因&#xff1a; 默认包的定义 &#xff1a; 如果一个 Java 类没有使用 package 声明包名&#xff0c;则该类会被放置在默认包中。Spring Boot 遵循 Java 的包管理约定&#xff…

FRRouting配置与OSPF介绍,配置,命令,bfd算法:

文章目录 1、frrouting的配置&#xff1a;2、ospf2.1、检测和维护邻居关系2.2、ospfDR和BDR2.3、odpf邻居表2.4、ospf常用命令2.5、bfd配置 1、frrouting的配置&#xff1a; sudo service zebra start sudo service ospfd start telnet localhost 2604 en configure termina…

【MyBatis】预编译SQL与即时SQL

目录 1. 以基本类型参数为例测试#{ }与${ }传递参数的区别 1.1 参数为Integer类型 1.2 参数为String类型 2. 使用#{ }传参存在的问题 2.1 参数为排序方式 2.2 模糊查询 3. 使用${ }传参存在的问题 3.1 SQL注入 3.2 对比#{ } 与 ${ }在SQL注入方面存在的问题 3.3 预编译…

Python数据可视化 - Matplotlib教程

文章目录 前言一、Matplotlib简介及安装1. Matplotlib简介2. 安装Matplotlib 二、Matplotlib Pyplot1. Pyplot介绍2. Pyplot中方法介绍2.1 创建和管理图形2.2 绘制图形2.3 设置图形属性2.4 保存和展示 三、Matplotlib绘图标记1. 介绍2. 基本用法3. 标记大小与颜色4. 标记样式列…

DeepSeek R1 与 OpenAI O1:机器学习模型的巅峰对决

我的个人主页 我的专栏&#xff1a;人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞&#x1f44d;收藏❤ 一、引言 在机器学习的广袤天地中&#xff0c;大型语言模型&#xff08;LLM&#xff09;无疑是最…

内容中台重构企业内容管理流程驱动智能协作升级

内容概要 内容中台作为企业数字化转型的核心基础设施&#xff0c;通过技术架构革新与功能模块整合&#xff0c;重构了传统内容管理流程的底层逻辑。其核心价值在于构建动态化、智能化的内容生产与流转体系&#xff0c;将分散的创作、存储、审核及分发环节纳入统一平台管理。基…

STM32 Flash详解教程文章

目录 Flash基本概念理解 Flash编程接口FPEC Flash擦除/写入流程图 Flash选项字节基本概念理解 Flash电子签名 函数读取地址下存放的数据 Flash的数据处理限制部分 编写不易&#xff0c;请勿搬运&#xff0c;感谢理解&#xff01;&#xff01;&#xff01; Flash基本概念…

小米 R3G 路由器刷机教程(Pandavan)

小米 R3G 路由器刷机教程&#xff08;Pandavan&#xff09; 一、前言 小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而&#xff0c;原厂固件的功能相对有限&#xff0c;难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能&#xff0c;还能通过第三方固…

红队视角出发的k8s敏感信息收集——Kubernetes API 扩展与未授权访问

针对 Kubernetes API 扩展与未授权访问 的详细攻击视角分析&#xff0c;聚焦 Custom Resource Definitions (CRD) 和 Aggregated API Servers 的潜在攻击面及利用方法&#xff1a; ​ 攻击链示例 1. 攻击者通过 ServiceAccount Token 访问集群 → 2. 枚举 CRD 发现数据库配…

11. Docker 微服务实战(将项目打包生成镜像,在 Docker 当中作为容器实例运行)

11. Docker 微服务实战(将项目打包生成镜像&#xff0c;在 Docker 当中作为容器实例运行) 文章目录 11. Docker 微服务实战(将项目打包生成镜像&#xff0c;在 Docker 当中作为容器实例运行)2. 最后&#xff1a; 建 Module - docker_boot 编辑 pom <?xml version"1.0&…

计算机视觉:卷积神经网络(CNN)基本概念(二)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络 接上一篇《计算机视觉&am…

【数据结构-红黑树】

文章目录 红黑树红黑树介绍红黑树的五个基本性质红黑树的平衡原理红黑树的操作红黑树的操作 代码实现节点实现插入和查询操作 红黑树 红黑树介绍 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉查找树&#xff08;Binary Search Tree, BST&#xff09;&…