我在表2中做一个简单的Select col1, col2, col22 from Table1 order by col1
和相同的Select语句。Select col1, col2, col22 from Table2 order by col1
.
我使用Pentaho ETL工具从Oracle 19c复制数据到SQL Server。从表1读取要比从表2读取慢得多。它们的列数和行数几乎相同。两者都存在于同一个模式中。表1的读取速度为每秒10行,而表2的读取速度为每秒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')
这取决于许多因素。首先要检查的是表索引:
select
uic.table_name,
uic.index_name,
utc.column_name
from USER_TAB_COLUMNS UTC,
USER_IND_COLUMNS UIC
where utc.table_name = uic.table_name
and utc.column_name = uic.column_name
and utc.table_name in ('TABLE1', 'TABLE2')
order by 1, 2, 3;