问题描述
嗨,康纳,
谢谢你对我的问题的回答。我有一个关于综合观点的后续问题。我做了以下建议:
这是意料之中的还是我错过了什么?
这里有更多详细信息,其中对合并视图的查询比直接在基表上执行等效项要慢,因此
基表p4_1777_rev中的行数是632M。
合并视图p4_rev_view中的行数为2B。
合并视图p4_rev_view创建为:
你问
嗨,康纳和克里斯 (欢迎玛丽亚),
我已经阅读了一些有关存储过程和ref cursor的条目,以支持参数化视图。然而我的情况略有不同。
在我的情况下,我给了n个表 (TBL_1,TBL_2,...),每个表都使用相同的模式定义,分别保存产品1,产品2,... 的数百万条记录。出于抽象目的,是否有可能编写一个流水线函数/存储过程,该过程将根据参数选择基础表。
在报告 (示例) 中:
从表中选择 * (whatsup(1)) w左连接w.col1 = s.col2上的其他表s-whatsup将动态返回TBL_1。
即使这是可能的,它会表现出来吗?作为替代方案,我已经尝试创建一个视图合并所有表以简化事情,但查询太慢。
非常感谢!
我们说...
我会重新审视你的整合方法。如果定义视图以便优化器可以消除表,那么事情应该以最佳方式运行,例如
SQL> drop表t1级联约束清除;
表掉了。
SQL> drop表t2级联约束清除;
表掉了。
SQL> drop表t3级联约束清除;
表掉了。
SQL> drop表t4级联约束清除;
表掉了。
SQL> 从dba_objects创建表t1作为select *;
创建的表。
SQL> 从dba_objects创建表t2作为select *;
创建的表。
SQL> 从dba_objects创建表t3作为select *;
创建的表。
SQL> 从dba_objects创建表t4为select *;
创建的表。
SQL>
SQL> 创建或替换
2查看V as
3选择 “T1” tname,t1。* 从T1
4联合全部
5选择 “T2” tname,t2。* 从T2
6联合全部
7选择 “T3” 名称,t3。* 从T3
8联盟全部
9选择 “T4” tname,t4。* 从T4
10/
视图创建。
SQL>
SQL> 设置自动跟踪仅解释
SQL> 从v中选择 *
2其中tname = 't2';
执行计划
-
计划哈希值: 289899379
--------------------
| Id | 操作 | 名称 | 行 | 字节 | 成本 (% CPU)| 时间 |
--------------------
| 0 | SELECT语句 | | 104K | 36M | 312 (1)| 00:00:01 |
| 1 | 视图 | V | 104K | 36M | 312 (1)| 00:00:01 |
| 2 | 联盟-所有 |
| * 3 | 过滤器 |
| 4 | 表访问完全 | T1 | 104K | 11M | 312 (1)| 00:00:01 |
| 5 | 表访问完全 | T2 | 104K | 11M | 312 (1)| 00:00:01 |
| * 6 | 过滤器 |
| 7 | 表访问完全 | T3 | 104K | 11M | 312 (1)| 00:00:01 |
| * 8 | 过滤器 |
| 9 | 表访问完全 | T4 | 104K | 11M | 312 (1)| 00:00:01 |
--------------------
谓词信息 (由操作id标识):
---------------------------------------------------
3-过滤器 (NULL不为NULL)
6-过滤器 (NULL不为NULL)
8-过滤器 (NULL不为NULL)
SQL> 设置自动跟踪关闭
谢谢你对我的问题的回答。我有一个关于综合观点的后续问题。我做了以下建议:
create or replace 2查看V as 3选择 “T1” tname,t1。* 从T1 4联合全部 5选择 “T2” tname,t2。* 从T2 6联合全部 7选择 “T3” 名称,t3。* 从T3 8联盟全部 9选择 “T4” tname,t4。* 从T4 t3 and t4 tables each have about 500M rows. However I observe that select * from V where tname='T4" and V.col1 = 'foo' is slower than select * from t4 where t4.col1 = 'foo' -- note table t4 has an index复制
这是意料之中的还是我错过了什么?
这里有更多详细信息,其中对合并视图的查询比直接在基表上执行等效项要慢,因此
>EXPLAIN PLAN SET STATEMENT_ID = 'testview' FOR select count(*) from p4_1777_rev where dfile is not null >SELECT * FROM TABLE(dbms_xplan.display) Plan hash value: 2349164066 ------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------- | 0 | SELECT STATEMENT | | 1 | 517 | 2285K (1)| 07:37:12 | | 1 | SORT AGGREGATE | | 1 | 517 | | | | 2 | VIEW | P4_REV_VIEW | 628M| 302G| 2285K (1)| 07:37:12 | | 3 | UNION-ALL | | | | | | |* 4 | FILTER | | | | | | | 5 | INDEX FAST FULL SCAN| P4_1666_REV_DFILE | 519M| 45G| 1674K (1)| 05:34:51 | |* 6 | FILTER | | | | | | | 7 | INDEX FAST FULL SCAN| P4_1700_REV_DFILE | 22M| 2010M| 73400 (1)| 00:14:41 | | 8 | INDEX FAST FULL SCAN | P4_1777_REV_DFILE | 628M| 62G| 2285K (1)| 07:37:12 | |* 9 | FILTER | | | | | | | 10 | INDEX FAST FULL SCAN| P4_1888_REV_DFILE | 120M| 9770M| 354K (1)| 01:10:59 | |* 11 | FILTER | | | | | | | 12 | INDEX FAST FULL SCAN| P4_1999_REV_DFILE | 76M| 9140M| 321K (1)| 01:04:16 | |* 13 | FILTER | | | | | | | 14 | INDEX FAST FULL SCAN| P4_7004_REV_DFILE | 27M| 1889M| 70084 (1)| 00:14:02 | ------------------------------------- 谓词信息 (由操作id标识): --------------------------------------------------- 4 - filter(NULL IS NOT NULL) 6-过滤器 (NULL不为NULL) 9 - filter(NULL IS NOT NULL) 11 - filter(NULL IS NOT NULL) 13 - filter(NULL IS NOT NULL) vs. >EXPLAIN PLAN SET STATEMENT_ID = 'testview' FOR select count(*) from p4_1777_rev where dfile is not null >SELECT * FROM TABLE(dbms_xplan.display) Plan hash value: 4011998830 ---------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | ---------------------- | 0 | SELECT STATEMENT | | 1 | 297K (2)| 00:59:26 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FAST FULL SCAN| SYS_C00288006 | 628M| 297K (2)| 00:59:26 | ----------------------复制
基表p4_1777_rev中的行数是632M。
合并视图p4_rev_view中的行数为2B。
合并视图p4_rev_view创建为:
"SELECT 1666 P4PORT, p1666."REVID",p1666."DFILE",p1666."REV",p1666."TYPE",p1666."ACTION",p1666."CHANGE",p1666."DATE",p1666."MODTIME" from P4_1666_REV p1666 union all SELECT 1700 P4PORT, p1700."REVID",p1700."DFILE",p1700."REV",p1700."TYPE",p1700."ACTION",p1700."CHANGE",p1700."DATE",p1700."MODTIME" from P4_1700_REV p1700 union all SELECT 1777 P4PORT, p1777."REVID",p1777."DFILE",p1777."REV",p1777."TYPE",p1777."ACTION",p1777."CHANGE",p1777."DATE",p1777."MODTIME" from P4_1777_REV p1777 union all SELECT 1888 P4PORT, p1888."REVID",p1888."DFILE",p1888."REV",p1888."TYPE",p1888."ACTION",p1888."CHANGE",p1888."DATE",p1888."MODTIME" from P4_1888_REV p1888 union all SELECT 1999 P4PORT, p1999."REVID",p1999."DFILE",p1999."REV",p1999."TYPE",p1999."ACTION",p1999."CHANGE",p1999."DATE",p1999."MODTIME" from P4_1999_REV p1999 union all SELECT 7004 P4PORT, p7004."REVID",p7004."DFILE",p7004."REV",p7004."TYPE",p7004."ACTION",p7004."CHANGE",p7004."DATE",p7004."MODTIME" from P4_7004_REV p7004"复制
你问
嗨,康纳和克里斯 (欢迎玛丽亚),
我已经阅读了一些有关存储过程和ref cursor的条目,以支持参数化视图。然而我的情况略有不同。
在我的情况下,我给了n个表 (TBL_1,TBL_2,...),每个表都使用相同的模式定义,分别保存产品1,产品2,... 的数百万条记录。出于抽象目的,是否有可能编写一个流水线函数/存储过程,该过程将根据参数选择基础表。
在报告 (示例) 中:
从表中选择 * (whatsup(1)) w左连接w.col1 = s.col2上的其他表s-whatsup将动态返回TBL_1。
即使这是可能的,它会表现出来吗?作为替代方案,我已经尝试创建一个视图合并所有表以简化事情,但查询太慢。
非常感谢!
我们说...
我会重新审视你的整合方法。如果定义视图以便优化器可以消除表,那么事情应该以最佳方式运行,例如
SQL> drop表t1级联约束清除;
表掉了。
SQL> drop表t2级联约束清除;
表掉了。
SQL> drop表t3级联约束清除;
表掉了。
SQL> drop表t4级联约束清除;
表掉了。
SQL> 从dba_objects创建表t1作为select *;
创建的表。
SQL> 从dba_objects创建表t2作为select *;
创建的表。
SQL> 从dba_objects创建表t3作为select *;
创建的表。
SQL> 从dba_objects创建表t4为select *;
创建的表。
SQL>
SQL> 创建或替换
2查看V as
3选择 “T1” tname,t1。* 从T1
4联合全部
5选择 “T2” tname,t2。* 从T2
6联合全部
7选择 “T3” 名称,t3。* 从T3
8联盟全部
9选择 “T4” tname,t4。* 从T4
10/
视图创建。
SQL>
SQL> 设置自动跟踪仅解释
SQL> 从v中选择 *
2其中tname = 't2';
执行计划
-
计划哈希值: 289899379
--------------------
| Id | 操作 | 名称 | 行 | 字节 | 成本 (% CPU)| 时间 |
--------------------
| 0 | SELECT语句 | | 104K | 36M | 312 (1)| 00:00:01 |
| 1 | 视图 | V | 104K | 36M | 312 (1)| 00:00:01 |
| 2 | 联盟-所有 |
| * 3 | 过滤器 |
| 4 | 表访问完全 | T1 | 104K | 11M | 312 (1)| 00:00:01 |
| 5 | 表访问完全 | T2 | 104K | 11M | 312 (1)| 00:00:01 |
| * 6 | 过滤器 |
| 7 | 表访问完全 | T3 | 104K | 11M | 312 (1)| 00:00:01 |
| * 8 | 过滤器 |
| 9 | 表访问完全 | T4 | 104K | 11M | 312 (1)| 00:00:01 |
--------------------
谓词信息 (由操作id标识):
---------------------------------------------------
3-过滤器 (NULL不为NULL)
6-过滤器 (NULL不为NULL)
8-过滤器 (NULL不为NULL)
SQL> 设置自动跟踪关闭
专家解答
“我错过了什么吗?”
是的 :-)
您的脚本向我们展示了每个测试的性能和响应时间!
向我们展示:
设置时间开启
将自动跟踪设置为on
从V中选择 *,其中tname = 't4 "和V.col1 = 'foo'
从t4中选择 *,其中t4.col1 = 'foo'
=
你没有显示执行,你有显示执行计划。执行将 * 看起来 * 更复杂,因为我们正在做过滤器等,但请参阅 “null不是null” 行-这意味着大多数东西永远不会运行。
* 运行 * 他们,对结果进行时间
是的 :-)
您的脚本向我们展示了每个测试的性能和响应时间!
向我们展示:
设置时间开启
将自动跟踪设置为on
从V中选择 *,其中tname = 't4 "和V.col1 = 'foo'
从t4中选择 *,其中t4.col1 = 'foo'
=
你没有显示执行,你有显示执行计划。执行将 * 看起来 * 更复杂,因为我们正在做过滤器等,但请参阅 “null不是null” 行-这意味着大多数东西永远不会运行。
* 运行 * 他们,对结果进行时间
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
598次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
577次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
492次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
475次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
459次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
437次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
435次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
421次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
368次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05