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

指定全局表提示

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

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

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

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

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

示例3使用全局提示示例

CREATE OR REPLACE VIEW v ASSELECT e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_salFROM employees e1, ( SELECT * FROM employees e3) e2, job_history jWHERE e1.employee_id = e2.manager_idAND e1.employee_id = j.employee_idAND e1.hire_date = j.start_dateAND e1.salary = ( SELECT max(e2.salary) FROM employees e2WHERE e2.department_id = e1.department_id )GROUP BY e1.first_name, e1.last_name, j.job_idORDER 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, vWHERE a.id = v.id;

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

SELECT /*+ LEADING(A@SEL$1 B@SEL$2 C@SEL$2) */FROM a a, v vWHERE 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 ASSELECT *FROM employeesWHERE employee_id < 150;CREATE OR REPLACE VIEW v2 ASSELECT v1.employee_id employee_id, departments.department_id department_idFROM v1, departmentsWHERE v1.department_id = departments.department_id;SELECT /*+ NO_MERGE(v2) INDEX(v2.v1.employees emp_emp_id_pk)FULL(v2.departments) */ *FROM v2WHERE 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 ASSELECT last_name, department_name FROM employees e, departments dWHERE e.department_id=d.department_id;

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

SELECT * FROM emp_view;

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

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

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

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

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

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

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

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

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

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

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

提示和不可合并的视图

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

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

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

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

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

相关文章

Python 文本探秘:正则表达式的易错迷宫穿越 -- 7. 正则表达式

正则表达式是 Python 中处理文本的强大武器&#xff0c;但它复杂的语法和规则构成了一个易错迷宫。本文深入剖析了正则表达式模式编写的错误、匹配规则的误解、性能优化的忽视等问题。通过大量的文本处理实例&#xff0c;展示了错误的正则表达式使用方式以及正确的解决方案。帮…

PPT工具集

PPT模版 免费下载 爱PPT优品PPTPPT之家第一PPTOfficePlus部分免费 AI生成PPT Kimi秘塔搜索 可以输入内容生成PPT大纲。

rocketmq-netty通信设计-request和response

1、NettyRemotingServer启动分析 org.apache.rocketmq.remoting.netty.NettyRemotingServer#start public void start() {this.defaultEventExecutorGroup new DefaultEventExecutorGroup(nettyServerConfig.getServerWorkerThreads(),new ThreadFactory() {private AtomicI…

Datawhale 数学建模导论二 笔记1

第6章 数据处理与拟合模型 本章主要涉及到的知识点有&#xff1a; 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论&#xff0c;如果对这部分内容不熟悉&#xff0c;可以参考相关概率论与数理统计的…

git如何下载指定版本

要使用Git下载指定版本&#xff0c;可以通过以下步骤进行操作‌&#xff1a; ‌1. 使用Git命令行下载指定版本‌&#xff1a; 1.1 首先&#xff0c;使用git clone命令克隆整个git库到本地。例如&#xff1a;git clone [库的URL]。这将下载最新的代码到本地。‌ 1.2 进入克隆…

安卓基础(持续更新的笔记)

为什么要这样&#xff1a; // 创建请求体RequestBody body RequestBody.create(MediaType.parse("application/json; charsetutf-8"),jsonObject.toString()); jsonObject 就包含了一个 JSON 数据&#xff0c;它其实就是&#xff1a; {"name": "张…

Spring Boot应用开发

一、了解Spring Boot Spring Boot是一个基于Spring框架的开源Java基础框架&#xff0c;它可以帮助我们快速开发独立的、基于生产级的基于Spring框架的应用程序。简单来说&#xff0c;它就像是一个“超级助手”&#xff0c;帮你把很多复杂的配置都简化了&#xff0c;让你能更轻…

算法笔记——字典树

什么是字典树&#xff1f; 一棵字典树树就像一个小型字典一样&#xff0c;当你拿到一个字想去字典上查的时候&#xff08;以拼音查法为例&#xff09;&#xff0c;你会先查这个拼音的开头字母&#xff0c;然后在按需查找他下一个字母直到找到相对应的拼音才可以。字典树也是如此…

Python实现AWS Fargate自动化部署系统

一、背景介绍 在现代云原生应用开发中,自动化部署是提高开发效率和保证部署质量的关键。AWS Fargate作为一项无服务器计算引擎,可以让我们专注于应用程序开发而无需管理底层基础设施。本文将详细介绍如何使用Python实现AWS Fargate的完整自动化部署流程。 © ivwdcwso (ID…

单元测试整理

在国外软件开发中&#xff0c;单元测试必不可少&#xff0c;但是国内并不太重视这一块&#xff0c;一个好的单元测试可以提前发现很多问题&#xff0c;也减去和测试battle的时间 Spring单元测试 JUnit4 RunWith 指明单元测试框架 e.g. RunWith(SpringJUnit4ClassRunner.cla…

Unity Shader Graph 2D - Procedural程序化图形之渐变的正弦波形

前言 正弦波形也是一种常用、常见的程序化图形&#xff0c;合理的使用正弦波形会创作出一些有趣、美观和丰富的效果&#xff0c;本文将使用Unity Shader Graph来实现一个正弦波形效果&#xff0c;帮助理解和实践Unity Shader Graph以及正弦函数。 创建一个名为SineWave的Shader…

【WPSOffice】汇总

写在前面 PPT篇 幻灯片母版 通过母版功能统一幻灯片的样式、字体、颜色等&#xff0c;提高整体一致性。 智能抠图 选中图片&#xff0c;图片工具-》智能抠图。 统一设置模板样式 字体安装 查找到字体并安装。 在WPS PPT&#xff08;WPS演示&#xff09;中&#xff0c;以…

DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Windows环境搭建ES集群

搭建步骤 下载安装包 下载链接&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-windows-x86_64.zip 解压 解压并复制出3份 es-node1配置 config/elasticsearch.yml cluster.name: xixi-es-win node.name: node-1 path.data: D:\\wor…

网站地址栏怎么变成HTTPS开头?

在当今的数字世界中&#xff0c;网络安全已成为不可或缺的一部分。对于网站管理员和所有者来说&#xff0c;确保访问者数据的安全和隐私至关重要。HTTPS是一种加密的通信协议&#xff0c;通过在客户端和服务器之间建立安全连接来保护数据传输。将网站从HTTP升级到HTTPS不仅提升…

CSS Grid 网格布局,以及 Flexbox 弹性盒布局模型,它们的适用场景是什么?

CSS Grid网格布局和Flexbox弹性盒布局模型都是现代CSS布局的重要工具&#xff0c;它们各自具有独特的优势和适用场景。 作为前端开发工程师&#xff0c;理解这些布局模型的差异和适用场景对于编写高效、可维护的代码至关重要。 CSS Grid网格布局 适用场景&#xff1a; 复杂…

什么是HTTP Error 429以及如何修复

为了有效管理服务器资源并确保所有用户都可以访问&#xff0c;主机提供商一般都会对主机的请求发送速度上做限制&#xff0c;一旦用户在规定时间内向服务器发送的请求超过了允许的限额&#xff0c;就可能会出现429错误。 例如&#xff0c;一个API允许每个用户每小时发送100个请…

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…

基于若依开发的工程项目管系统开源免费,用于工程项目投标、进度及成本管理的OA 办公开源系统,非常出色!

一、简介 今天给大家推荐一个基于 RuoYi-Flowable-Plus 框架二次开发的开源工程项目管理系统&#xff0c;专为工程项目的投标管理、项目进度控制、成本管理以及 OA 办公需求设计。 该项目结合了 Spring Boot、Mybatis、Vue 和 ElementUI 等技术栈&#xff0c;提供了丰富的功能…

某大型业务系统技术栈介绍【应对面试】

微服务架构【图】 微服务架构【概念】 微服务架构&#xff0c;是一种架构模式&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0c;为用户提供最终价值。在微服务架构中&#xff0c;服务与服务之间通信时&#xff0c;通常是…