gpt4 book ai didi

sql - Oracle中间连接表大小

转载 作者:行者123 更新时间:2023-12-03 04:35:28 26 4
gpt4 key购买 nike

当我们连接 2 个以上的表时,Oracle 或任何数据库都会决定连接 2 个表并使用结果与后续表连接。有没有办法确定中间连接大小。我对甲骨文特别感兴趣。我知道的一种解决方案是在 sqldeveloper 中使用 Autotrace,其中包含 LAST_OUTPUT_ROWS 列。但是对于通过pl/sql和其他方式执行的查询,oracle是否在某个表中记录中间连接大小?

我问这个是因为最近我们遇到了一个问题,有人删除了统计信息并且无法重新生成它,当追踪时我们发现oracle在到达6行的最终结果之前形成了一个1.8亿行的中间表,并且查询速度相当慢。

最佳答案

Oracle 可以在为 session 设置的临时段中具体化表连接的中间结果。

由于它是一个一次性表,在查询完成后被删除,因此不会存储其统计信息。

但是,您可以通过构建查询计划并查看相应操作的 ROWS 参数来估计其大小:

EXPLAIN PLAN FOR
WITH q AS
(
SELECT /*+ MATERIALIZE */
e1.value AS val1, e2.value AS val2
FROM t_even e1, t_even e2
)
SELECT COUNT(*)
FROM q

SELECT *
FROM TABLE(DBMS_XPLAN.display())

Plan hash value: 3705384459

---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 43G (5)|999:59:59 |
| 1 | TEMP TABLE TRANSFORMATION | | | | | |
| 2 | LOAD AS SELECT | | | | | |
| 3 | MERGE JOIN CARTESIAN | | 100T| 909T| 42G (3)|999:59:59 |
| 4 | TABLE ACCESS FULL | T_ODD | 10M| 47M| 4206 (3)| 00:00:51 |
| 5 | BUFFER SORT | | 10M| 47M| 42G (3)|999:59:59 |
| 6 | TABLE ACCESS FULL | T_ODD | 10M| 47M| 4204 (3)| 00:00:51 |
| 7 | SORT AGGREGATE | | 1 | | | |
| 8 | VIEW | | 100T| | 1729M (62)|999:59:59 |
| 9 | TABLE ACCESS FULL | SYS_TEMP_0FD9D6604_2660595 | 100T| 909T| 1729M (62)|999:59:59 |
---------------------------------------------------------------------------------------------------------

此处,物化表名为 SYS_TEMP_0FD9D6604_2660595,估计记录数为 100T(100,000,000,000,000 条记录)

关于sql - Oracle中间连接表大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com