- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 Oracle 中为使用表函数在 exists 子句中使用某些 Collection 的查询生成计划
例如
CREATE TYPE TYP_EMP AS OBJECT(
EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2));
/
创建类型。
CREATE TYPE TYP_EMP_COLL AS TABLE OF TYP_EMP;
/
创建类型。
CREATE OR REPLACE VIEW VW_EMP
OF TYP_EMP
WITH OBJECT IDENTIFIER(EMPNO) AS
SELECT
EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM EMP
/
查看已创建
CREATE TYPE TYP_DEPT AS OBJECT(
DEPTNO NUMBER(2),
DNAME VARCHAR2(14),
LOC VARCHAR2(13));
/
类型创建
CREATE TYPE TYP_DEPT_COLL AS TABLE OF TYP_DEPT;
/
类型创建
CREATE OR REPLACE VIEW VW_DEPT
OF TYP_DEPT
WITH OBJECT IDENTIFIER(DEPTNO) AS
SELECT
DEPTNO, DNAME, LOC
FROM DEPT
/
CREATE OR REPLACE PROCEDURE SP_EMPTEST AS
V_EMP TYP_EMP_COLL;
V_DEPT TYP_DEPT_COLL;
BEGIN
SELECT VALUE(V) BULK COLLECT INTO V_EMP FROM VW_EMP V;
SELECT VALUE(VD)
BULK COLLECT INTO V_DEPT FROM VW_DEPT VD
WHERE EXISTS
(SELECT 1 FROM TABLE(V_EMP) VV WHERE VD.DEPTNO = VV.DEPTNO);
END;
/
********************************************************************************
SQL ID: 7c02yjs9q5kqr
Plan Hash: 2616009478
SELECT VALUE(VD)
FROM
VW_DEPT VD WHERE EXISTS (SELECT 1 FROM TABLE(:B1 ) VV WHERE VD.DEPTNO = VV.DEPTNO)
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 19 0 0
Fetch 1 0.00 0.00 0 7 0 3
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.00 0.00 0 26 0 3
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84 (mac) (recursive depth: 1)
Rows Row Source Operation
------- ---------------------------------------------------
3 HASH JOIN SEMI (cr=7 pr=0 pw=0 time=6 us cost=33 size=32 card=1)
4 TABLE ACCESS FULL DEPT (cr=7 pr=0 pw=0 time=0 us cost=3 size=120 card=4)
14 COLLECTION ITERATOR PICKLER FETCH (cr=0 pr=0 pw=0 time=0 us cost=29 size=28 card=14)
error during execute of EXPLAIN PLAN statement
ORA-22905: cannot access rows from a non-nested table item
parse error offset: 129
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
asynch descriptor resize 1 0.00 0.00
********************************************************************************
最佳答案
获取解释计划的方法有很多种。这不仅仅是一个详尽的列表。我认为这些方法之间存在重要差异,值得将它们都包含在您的工具包中。
1 - 跟踪对过程的调用。
如您的错误所示,从 PL/SQL block 中提取 SQL 可能很棘手。尽管 PL/SQL 和 SQL 旨在一起工作,但有时它们之间的交互可能很奇怪。
跟踪过程肯定会得到正确的上下文,并且还可以向您显示正在发生的其他重要事情。虽然我通常会避免跟踪,因为它会产生太多无用的信息,而且通常(莫名其妙地)很难访问服务器。
2 - 在 SQL 中实例化类型
创建一个空集合,然后您的常规解释计划方法应该起作用:
SELECT VALUE(VD)
FROM
VW_DEPT VD WHERE EXISTS (SELECT 1 FROM TABLE(typ_emp_coll() ) VV WHERE VD.DEPTNO = VV.DEPTNO);
或填充实际值:
SELECT VALUE(VD)
FROM
VW_DEPT VD WHERE EXISTS (SELECT 1 FROM TABLE(typ_emp_coll(typ_emp(null,null,null,null,null,null,null,null)) ) VV WHERE VD.DEPTNO = VV.DEPTNO);
用有意义的值填充它可能需要一些大量的 SQL 语句。但有时将所有内容放在一个地方会很有帮助。此外,正如我稍后将解释的那样,使用空集合实际上并不重要。 Oracle 无法区分空集合和大集合。
3 - 使用已执行查询的 SQL_ID。
在 V$SQL
中找到 SQL_ID。这可能会返回超过 1 行,您可能需要手动选择正确的行。
select * from v$sql where upper(sql_text) like '%SELECT 1 FROM TABLE(%';
sql_id可以通过多种方式获取计划,例如:
select * from table(dbms_xplan.display_cursor(sql_id => '7c02yjs9q5kqr'));
SQL_ID 7c02yjs9q5kqr, child number 0
-------------------------------------
SELECT VALUE(VD) FROM VW_DEPT VD WHERE EXISTS (SELECT 1 FROM TABLE(:B1
) VV WHERE VD.DEPTNO = VV.DEPTNO)
Plan hash value: 2616009478
-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 32 (100)| |
|* 1 | HASH JOIN SEMI | | 1 | 32 | 32 (4)| 00:00:01 |
| 2 | TABLE ACCESS FULL | DEPT | 1 | 30 | 2 (0)| 00:00:01 |
| 3 | COLLECTION ITERATOR PICKLER FETCH| | 8168 | 16336 | 29 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("DEPTNO"=SYS_OP_ATG(VALUE(KOKBF$),8,9,2))
获取类似信息的相关方法有很多:使用/*+ gather_plan_statistics */
提示,v$sql_monitor
,v$sql_plan
、dbms_sqltune.report_sql_monitor(sql_id => '7c02yjs9q5kqr', type => 'active')
等。每一个都有不同的优缺点。就个人而言,我会尽可能使用 report_sql_monitor
。这是一个很好的查询图形表示, 尽管它需要一些额外的许可。
4 - 使用函数代替变量。
create or replace package test_pkg is
v_emp typ_emp_coll;
function get_v_emp return typ_emp_coll;
end;
/
create or replace package body test_pkg is
function get_v_emp return typ_emp_coll is
begin
return v_emp;
end;
end;
/
现在您可以将查询作为独立的 SQL 语句运行,并使用真正的集合数据。您的正常解释计划方法应该可以正常工作:
select * from table(test_pkg.get_v_emp);
为什么计划总是那么糟糕?
无论您使用哪种方法,您都可能会看到与我生成的几乎相同的解释计划。这是因为函数和集合对优化器是不可见的,它每次只会猜测 8168
行。
要调整这些查询,您可能需要查看这篇文章,setting cardinality for pipelined and table functions .
这是一个使用动态采样的解决方案的简单示例:
select /*+ dynamic_sampling(5) */ * from table(test_pkg.get_v_emp)
关于sql - Oracle Explain Plan for Query with Collection 使用表函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10292460/
我目前正在学习 LINUX 命令,我想知道如何在 .plan 文件中运行命令。例如,我想要从 ~stepp/cosway 程序输出的消息。我输入了 ~stepp/cosway "HELLO"但它没有用
我想深入了解 SendGrid(GoDaddy SMTP 太糟糕了)。 但我不明白免费计划和精简计划之间的区别。 当然,Lite 计划确实很便宜,但似乎功能比 Free 计划少,后者是……免费的。 我
使用Optaplanner,是否可以同时定义一个类作为规划实体和规划变量? 示例: @PlanningEntity(difficultyComparatorClass = NodeDifficul
我正在尝试制作 Django-plans应用程序工作。一切似乎都正常,除了 /admin/plans/plan/ (/admin/plans/order/, /admin/plans/userplan
在为App Service Plan编写配置时,我遇到了terraform documentation中保留的参数 reserved - (Optional) Is this App Service
有人知道如何将“消费计划”上的 Azure Functions 更改为“高级计划”吗?我无法再次重新部署它们,我需要将它们切换到高级计划。我没有找到任何相关手册如何操作。 最佳答案 您可以使用azur
我写这篇文章是为了在我 Shiny 的应用程序中使用计划(多进程)或计划(多核)并杀死长时间运行的进程寻求一些帮助。该应用程序有多个 future 事件(长时间运行的进程),这些事件在单击其相应的 a
我正在使用 Azure SQL Server 数据库。 看来无论是否选择选项(保留计划),Azure SQL Server 数据库都会创建多个执行计划。 CREATE PROCEDURE Select
我需要在 weblogic server 10.3 上部署一个带有部署计划的 EAR当我在 weblogic 控制台上手动部署 EAR 和计划时,一切正常。当我尝试使用 ANT wldeploy 任务
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
我从来没有写过功能规范,我更喜欢边走边写代码和设计东西。到目前为止,它运行良好,但对于最近的个人项目,我正在编写一些规范,这些规范描述了产品的所有功能,以及它应该如何“工作”,而没有详细说明它将如何实
您如何估计实现用户故事所需的时间?如果这是您在知道需要多长时间之前已经完成的事情。但是,如果它对您来说是全新的呢?你为“惊喜”预留了多少时间? 最佳答案 一个很好的技巧是将故事分解为更小的任务,并相互
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我很好奇其他开发团队如何指定新功能。我刚刚升任领导的团队没有真正的规范流程。我刚刚通过 CI、自动部署和使用 Trac 记录所有错误实现了一个适当的开发过程,现在我正在处理更改。 我有一份 list
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 12 年前。 Improve thi
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
有没有人知道一篇文章或者可以给我一些创建新网络项目时要遵循的提示? 这个项目是我自己在业余时间做的,不是给客户做的。 最佳答案 这家伙写了一些关于它的非常好的文章。 Pragmatic Web Pro
也许是因为我现在已经编写了大约两个学期的代码,但我目前遇到的主要障碍是将教授的项目描述和要求转换为实际代码。由于我目前在 Algorithms 101 中,我基本上是自下而上的过程,从空白白板开始,画
当您开始一个新项目时,您如何计划或需要多长时间? 伪代码? 流程图? 您是否尝试提前考虑所有类(class)? TBH,我从不计划任何事情。我直截了当,并在出现问题时思考解决方案。主要是因为有几次尝试
37 Signal 的 Getting Real 让我确信,线框图和编写功能规范文档是构建 Web 应用程序和动态网站所不需要的中间步骤。 这些步骤的开销值得吗?在 HTML/CSS 甚至 Photo
我是一名优秀的程序员,十分优秀!