问题描述
嗨
我有两个表和索引如下在Oracle Database 12c标准版12.1.0.2.0-64bit生产中描述。snapshot_id上的索引不是唯一的,因为我认为它会引起问题
在我的实际环境中,表创建设置如下
表格选项
立即创建细分市场
PCTFREE 10 pct二手40 INITRANS 1 MAXTRANS 255
NOCOMPRESS日志记录
存储 (初始65536下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0自由主义者1自由主义者组1
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
表空间 “XXXXXXX”
索引选项
PCTFREE 10 INITRANS 2 MAXTRANS 255计算统计
存储 (初始65536下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0自由主义者1自由主义者组1
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
表空间 “XXXXXX”;
我运行以下sql
一旦在表1上运行统计信息,表1和表2之间的连接就是哈希。优化器没有拾取嵌套循环的任何原因?似乎应该这样,特别是当我的实际表而不是测试的18,000,000行。即使当我移动到测试表的表在100,000行下也会发生这种情况。事实证明,SNAPSHOT_ID在两个表中都是不同的值。
现在,use_n1(s1 s2) 确实在sqldeveloper中选择了它,但是无论出于何种原因,我实际上正在开发的时间都较慢,而我似乎是哈希连接时间。
我有两个表和索引如下在Oracle Database 12c标准版12.1.0.2.0-64bit生产中描述。snapshot_id上的索引不是唯一的,因为我认为它会引起问题
create table TABLE1 ( SNAPSHOT_ID varchar2(50), FLEET_BUCKET_ID number(3,0) ); CREATE INDEX TABLE1_IDX1 ON TABLE1 ("SNAPSHOT_ID"); CREATE TABLE TABLE2 ( "SNAPSHOT_ID" VARCHAR2(50 BYTE), "VRM_ID" VARCHAR2(50 BYTE), "SNAP_TIME_ID" NUMBER(4,0), "SNAP_DATETIME" TIMESTAMP (6), "ETL_LOG_ID" VARCHAR2(12 BYTE) ); / CREATE INDEX TABLE2_IDX2 ON TABLE2("SNAP_DATETIME"); / CREATE INDEX TABLE2_IDX1 ON TABLE2("SNAPSHOT_ID"); /复制
在我的实际环境中,表创建设置如下
表格选项
立即创建细分市场
PCTFREE 10 pct二手40 INITRANS 1 MAXTRANS 255
NOCOMPRESS日志记录
存储 (初始65536下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0自由主义者1自由主义者组1
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
表空间 “XXXXXXX”
索引选项
PCTFREE 10 INITRANS 2 MAXTRANS 255计算统计
存储 (初始65536下一个1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
Pct增加0自由主义者1自由主义者组1
BUFFER_POOL默认FLASH_CACHE默认CELL_FLASH_CACHE默认)
表空间 “XXXXXX”;
我运行以下sql
SELECT s1.SNAPSHOT_ID, s1.FLEET_BUCKET_ID FROM TABLE1 s1, TABLE2 s2 WHERE 1 = 1 AND s2.SNAP_DATETIME >= TO_DATE('2020-08-16 02:20:00','YYYY-MM-DD HH24:MI:SS') AND s2.SNAP_DATETIME <= TO_DATE('2020-08-16 02:20:01','YYYY-MM-DD HH24:MI:SS') AND s2.snapshot_id = s1.snapshot_id复制
一旦在表1上运行统计信息,表1和表2之间的连接就是哈希。优化器没有拾取嵌套循环的任何原因?似乎应该这样,特别是当我的实际表而不是测试的18,000,000行。即使当我移动到测试表的表在100,000行下也会发生这种情况。事实证明,SNAPSHOT_ID在两个表中都是不同的值。
现在,use_n1(s1 s2) 确实在sqldeveloper中选择了它,但是无论出于何种原因,我实际上正在开发的时间都较慢,而我似乎是哈希连接时间。
专家解答
Any reason why the optimizer is not picking up the nested loop?
任何原因should选择嵌套循环?
这些最适合在每个表上连接一小部分行时。示例脚本仅插入几行,因此很难得出有关性能的有意义的结论。特别是如果你有1800万行在真实的表!
而且-正如您在12c上一样-优化器可能正在为此查询使用自适应联接。这意味着它同时考虑了哈希连接和嵌套循环。然后在运行时根据从外部表中获取的行数选择一个。
因此,哈希联接很可能是此查询和数据集的最佳方法。
与自适应详细信息共享查询的执行计划,我们可以进一步调查。使用以下内容获取此信息:
任何原因should选择嵌套循环?
这些最适合在每个表上连接一小部分行时。示例脚本仅插入几行,因此很难得出有关性能的有意义的结论。特别是如果你有1800万行在真实的表!
而且-正如您在12c上一样-优化器可能正在为此查询使用自适应联接。这意味着它同时考虑了哈希连接和嵌套循环。然后在运行时根据从外部表中获取的行数选择一个。
因此,哈希联接很可能是此查询和数据集的最佳方法。
与自适应详细信息共享查询的执行计划,我们可以进一步调查。使用以下内容获取此信息:
set serveroutput off alter session set statistics_level = all; select * from; select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST +ADAPTIVE')); 复制
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
940次阅读
2025-03-17 11:33:53
Oracle DataGuard高可用性解决方案详解
孙莹
399次阅读
2025-03-26 23:27:33
墨天轮个人数说知识点合集
JiekeXu
342次阅读
2025-04-01 15:56:03
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
333次阅读
2025-04-08 09:12:48
Oracle SQL 执行计划分析与优化指南
Digital Observer
303次阅读
2025-04-01 11:08:44
风口浪尖!诚通证券扩容采购Oracle 793万...
Roger的数据库专栏
282次阅读
2025-03-24 09:42:53
Oracle 19c RAC更换IP实战,运维必看!
szrsu
279次阅读
2025-04-08 23:57:08
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
278次阅读
2025-03-19 14:41:51
oracle定时任务常用攻略
virvle
272次阅读
2025-03-25 16:05:19
Oracle NetSuite 客户说|健合(H&H)集团部署 Oracle NetSuite,全面提升全球运营效率
甲骨文中国
254次阅读
2025-03-28 15:00:30