検索
执行计划顺序不符合一般规则Jun 07, 2016 pm 04:37 PM
oracle一般的に埋め込むルールプラン注文

? 在Oracle performance tuning guide中,对执行计划顺序的描述是最右最上最先执行,然后父步骤执行,也就是最右边的步骤最先执行,如果同等级,那么最上边的最先执行,然后执行其父步骤(文档原文:The execution order in EXPLAIN PLAN output begins with

? 在Oracle performance tuning guide中,对执行计划顺序的描述是最右最上最先执行,然后父步骤执行,也就是最右边的步骤最先执行,如果同等级,那么最上边的最先执行,然后执行其父步骤(文档原文:The execution order in EXPLAIN PLAN output begins with the line that is the?furthest indented to the right. The next step is the parent of that line. If two lines?are indented equally, then the top line is normally executed first)。

? ? ? 在实际应用中,这个规则不是完全正确的。ORACLE的SQL内部步骤的执行顺序与其计划中的展现,会有一定的差别,如果不仔细分析,而且一味相信文档,那么可能会感觉很迷惑。比如在标量子查询中(scalary subquery),执行计划的显示会非常让人困惑,如:

SQL> select * from a;
? ? ? ? ID NAME
———- ———————————-
? ? ? ? ?1 a
? ? ? ? ?2 b
? ? ? ? ?3 c
3 rows selected.

SQL> select * from b;
? ? ? ? ID NAME
———- ———————————-
? ? ? ? ?1 x1
? ? ? ? ?2 x2
2 rows selected.

SQL> SELECT a.ID,a.NAME,(SELECT b.ID FROM b WHERE a.ID=b.ID)?bid FROM a;

执行计划
———————————————————-
Plan hash value: 2657529235
————————————————————————–
| Id ?| Operation ? ? ? ? | Name | Rows ?| Bytes | Cost (%CPU)| Time ? ? |
————————————————————————–
| ? 0 | SELECT STATEMENT ?| ? ? ?| ? ? 3 | ? ?60 | ? ? 3 ? (0)| 00:00:01 |
|* ?1 | ?TABLE ACCESS FULL| B ? ?| ? ? 1 | ? ?13 | ? ? 3 ? (0)| 00:00:01 |
| ? 2 | ?TABLE ACCESS FULL| A ? ?| ? ? 3 | ? ?60 | ? ? 3 ? (0)| 00:00:01 |
————————————————————————–
Predicate Information (identified by operation id):
—————————————————
? ?1 – filter(“B”.”ID”=:B1)

? ? ??如果按照文档的的分析,显然ID=2的与ID=1的是同等级的,ID=1的在ID=2的上面,那么最后执行计划的顺序应该是1—->2—–>0,但是分析下,显然不是这样的顺序,肯定是必须获得a.id之后,才能用a.id去查找B。通过谓词中的”B”.”ID”=:B1可以看出来,:B1,类似于绑定变量,这里就2张表,而且根据SQL查询,肯定来源于A.ID。所以对于标量子查询的计划,应该是2—->1—–>0,而且2与1的操作是类似于NESTED LOOPS(与其不同的是,标量子查询的驱动表是inner table)的操作,每1个A的行,都会执行一次B,当然,ORACLE内部肯定是有优化的,这种优化就是会缓存已经匹配的A.ID值,遇到相同的,不会重复扫描B。可以通过DBMS_XPLAN.DISPLAY_CURSOR详细看看如何执行的:

SQL> @display_cursor
SQL_ID ?caq6tcx266xnq, child number 1
————————————-
SELECT a.ID,a.NAME,(SELECT b.ID FROM b WHERE a.ID=b.ID) bid FROM a

Plan hash value: 2657529235
————————————————————————————
| Id ?| Operation ? ? ? ? | Name | Starts | E-Rows | A-Rows | ? A-Time ? | Buffers |
————————————————————————————
| ? 0 | SELECT STATEMENT ?| ? ? ?| ? ? ?1 | ? ? ? ?| ? ? ?3 |00:00:00.01 | ? ? ? 8 |
|* ?1 | ?TABLE ACCESS FULL| B ? ?| ? ???3?| ? ? ?1 | ? ? ?2 |00:00:00.01 | ? ? ?21 |
| ? 2 | ?TABLE ACCESS FULL| A ? ?| ? ? ?1 | ? ? ?3 | ? ???3?|00:00:00.01 | ? ? ? 8 |
————————————————————————————

Predicate Information (identified by operation id):
—————————————————
? ?1 – filter(“B”.”ID”=:B1)

? ? ??其中A共3行,访问B 3次,返回B 2行,因为有一行不匹配,由A的行驱动访问B。因为这里A.ID无重复值,下面插入一行id=1的,因为id=1已经在A表中存在,因此,标量子查询有缓存,所以对B的扫描还是3次,而不是4次,如下:

SQL> INSERT INTO a VALUES(1,’d');
1 row created.

SQL> COMMIT;
Commit complete.

SQL>??@display_cursor
SQL_ID ?caq6tcx266xnq, child number 0
————————————-
SELECT a.ID,a.NAME,(SELECT b.ID FROM b WHERE a.ID=b.ID) bid FROM a

Plan hash value: 2657529235

————————————————————————————
| Id ?| Operation ? ? ? ? | Name | Starts | E-Rows | A-Rows | ? A-Time ? | Buffers |
————————————————————————————
| ? 0 | SELECT STATEMENT ?| ? ? ?| ? ? ?1 | ? ? ? ?| ? ? ?4 |00:00:00.01 | ? ? ? 8 |
|* ?1 | ?TABLE ACCESS FULL| B ? ?| ? ???3?| ? ? ?1 | ? ? ?2?|00:00:00.01 | ? ? ?21 |
| ? 2 | ?TABLE ACCESS FULL| A ? ?| ? ? ?1 | ? ? ?4 | ? ???4?|00:00:00.01 | ? ? ? 8 |
————————————————————————————

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

? ?1 – filter(“B”.”ID”=:B1)

? ? ?从计划中可以看到,虽然A是4行,但是因为DISTINCT A.ID是3行,所以还是扫描B 3次,其中ID=1的访问一次即缓存结果,通过A-ROWS可以看到B还是返回2行,而不是3行。所以不要看到标量子查询就认为效率不行,标量子查询和FILTER类似,如果能够对标量子查询走索引扫描,甚至UNIQUE INDEX SCAN,如果主表查询的行重复值特别多,效率还是很高的,标量子查询在一定程度上,消除了JOIN,经常在查询这种对应某表的行,需要匹配另一表的某个列值,比JOIN效率高(当然,既然类似于NESTED LOOPS了,结果集肯定不会很大,不然效率会差,这个tom的高效设计上有详细的讲解)。
? ?
? ? 本文主要就是讲解下,执行计划反应了SQL的执行顺序,但是如果通过执行计划准确知道SQL中的执行顺序,并不是只要了解文档中说的规则就可以了,在实际应用中,可能会碰到这样那样的问题,文档当然很少有错误,但是文档大多说的都是普遍的规则,SO,在学习过程中,对不理解的问题,要随时质疑,并论证之。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
每5分钟执行一次的Python脚本每5分钟执行一次的Python脚本Sep 10, 2023 pm 03:33 PM

自动化和任务调度在简化软件开发中的重复任务方面发挥着至关重要的作用。想象一下,有一个Python脚本需要每5分钟执行一次,例如从API获取数据、执行数据处理或发送定期更新。如此频繁地手动运行脚本可能非常耗时并且容易出错。这就是任务调度的用武之地。在这篇博文中,我们将探讨如何安排Python脚本每5分钟执行一次,确保它自动运行而无需手动干预。我们将讨论可用于实现此目标的不同方法和库,使您能够有效地自动化任务。使用time.sleep()函数每5分钟运行一次Python脚本的一种简单方法是利用tim

什么是oracle asm什么是oracle asmApr 18, 2022 pm 04:16 PM

oracle asm指的是“自动存储管理”,是一种卷管理器,可自动管理磁盘组并提供有效的数据冗余功能;它是做为单独的Oracle实例实施和部署。asm的优势:1、配置简单、可最大化推动数据库合并的存储资源利用;2、支持BIGFILE文件等。

如何使用Python在Linux中进行脚本编写和执行如何使用Python在Linux中进行脚本编写和执行Oct 05, 2023 am 11:45 AM

如何使用Python在Linux中进行脚本编写和执行在Linux操作系统中,我们可以使用Python编写并执行各种脚本。Python是一种简洁而强大的编程语言,它提供了丰富的库和工具,使得脚本编写变得更加简单和高效。下面我们将介绍在Linux中如何使用Python进行脚本编写和执行的基本步骤,同时提供一些具体的代码示例来帮助你更好地理解和运用。安装Pytho

怎么关闭oracle触发器怎么关闭oracle触发器Apr 18, 2022 pm 05:34 PM

关闭触发器的方法:1、使用“ALTER TRIGGER 触发器名称 DISABLE;”语句,可关闭指定名称的触发器;2、使用“ALTER TABLE 表名称 DISABLE ALL TRIGGERS;”语句,可关闭指定数据表中的所有触发器。

win11预览体验计划退出不了win11预览体验计划退出不了Jun 29, 2023 pm 12:04 PM

win11预览体验计划退出不了?我们在使用win11系统的时候,电脑中都会推出win11预览体验计划供我们使用,但是有小伙伴不想使用这个预览体验计划,希望可以推出这个预览体验计划,如果你不知道应该如何退出,小编下面整理了退出Win11预览体验计划教程攻略,如果你感兴趣的话,小编下面一起往下看看吧!退出Win11预览体验计划教程攻略1、首先按下快捷键“win+i”进入windows设置点击“更新和安全”。2、然后点击左侧任务栏中的“windows预览体验计划”,如图所示。3、此时可以看到右侧的体验

oracle有临时变量吗oracle有临时变量吗Apr 18, 2022 pm 06:04 PM

oracle有临时变量。在Oracle数据库中,可以使用变量来编写通用的sql语句,如果该变量前使用了“&”和“&&”符号,那么该变量就是一个临时变量,语法为“sql语句>&变量名;”。临时变量只在使用它的sql语句中有效,变量值不能保留。

华为 P70 直接开启先锋计划 正式开售华为 P70 直接开启先锋计划 正式开售Apr 19, 2024 pm 01:58 PM

中关村消息:4月18日早上,华为突然宣布P70系列手机开启先锋计划正式开售,想要购买的朋友要准备行动起来了,按照以往惯例,华为的旗舰手机非常抢手,会一直处于缺货状态。这次华为P70系列改名为Pura,意为纯粹。在此前华为余承东表示:自2012年起,华为P系列智能手机便如同忠实实的伙伴,伴随全球亿万用户度过了无数珍贵时刻,共同见证了生活中的美好与精彩纷呈。他深刻感悟,每一位选择华为P系列的用户所给予的信任与热爱,无异于一股强大的推动力,始终鼓舞着华为在创新之路上坚定前行。Pura的意思是纯粹的。

怎样在浏览器中编写PHP代码并保持代码不被执行?怎样在浏览器中编写PHP代码并保持代码不被执行?Mar 10, 2024 pm 02:27 PM

怎样在浏览器中编写PHP代码并保持代码不被执行?随着互联网的普及,越来越多的人开始接触网页开发,其中对于PHP的学习也越来越受到关注。PHP是一种在服务器端运行的脚本语言,通常用于编写动态网页。然而,在练习阶段,我们希望能够在浏览器中编写PHP代码并查看结果,但又不希望代码被执行。那么,如何实现在浏览器中编写PHP代码并保持不被执行呢?下面将详细介绍。首先,

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール