oracle - 为什么从 Oracle 中的某个表读取比同一数据库中的其他表慢
问题描述
我Select col1, col2, col22 from Table1 order by col1
在 Table2 中做了一个简单且相同的 Select 语句。Select col1, col2, col22 from Table2 order by col1
.
我使用 Pentaho ETL 工具将数据从Oracle 19c 复制到 SQL Server。从 Table1 读取比从 Table2 读取慢得多。两者的列数几乎相同,行数几乎相同。两者都存在于同一架构中。Table1 以每秒 10 行的速度读取,而 Table2 以每秒 1000 行的速度读取。
什么会导致这种缓慢?
解决方案
两个表的索引是否相同?如果索引覆盖了一个表中的所有相关列,则 Oracle 可能正在使用快速全索引扫描(如表的精简版本),或者可能正在使用全索引扫描按 COL1 进行预排序。检查执行计划以确保语句使用相同的访问方法:
explain plan for select ...;
select * from table(dbms_xplan.display);
表段大小是否相同?尽管数据可能相同,但有时一张表可能会浪费大量空间。例如,如果表曾经包含 10 亿行,然后 99.9% 的行被删除,但表从未重建。将段大小与如下查询进行比较:
select segment_name, sum(bytes)/1024/1024 mb
from all_segments
where segment_name in ('TABLE1', 'TABLE2')
推荐阅读
- javascript - CSS 变量不工作/工作奇怪
- android - Android 风格:在特定风格上添加外部库
- java - 在 JUnit 测试(java)中如何使用 Assertj 库检查数组数组?
- xaml - uwp 应用程序文件关联目录无效错误
- .htaccess - Htaccess 删除 .php 并重定向特定的 URL
- airflow - 如何从“关闭”的 dags 中停止 Airflow 运行任务
- ios - 来自 IQKeyboardManager 的完成按钮操作在 Swift 中不起作用
- javascript - 找不到 React 模块:无法解析 '../utils/api'
- django - django celery SQS “没有配置结果后端。”
- machine-learning - CNN中内核大小与输入大小之间的关系