我有一个以下查询,由于表非常大,因此需要花费大量时间,该查询还获取伪列 ROWID 和 ORA_ROWSCN。
select ROWID, ORA_ROWSCN, t.C1, t.c2, t.c5, t.c7, t.c9 from tab t
我尝试使用提示 ALL_ROWS 并运行统计信息,但仍然没有太大帮助。请建议。提前非常感谢。
我有一个以下查询,由于表非常大,因此需要花费大量时间,该查询还获取伪列 ROWID 和 ORA_ROWSCN。
select ROWID, ORA_ROWSCN, t.C1, t.c2, t.c5, t.c7, t.c9 from tab t
我尝试使用提示 ALL_ROWS 并运行统计信息,但仍然没有太大帮助。请建议。提前非常感谢。
Rowid 和 ora_rowscn 都驻留在数据块内。
Rowid 由以下部分组成:
对象的数据对象编号
行所在的数据文件中的数据块
该行在数据块中的位置(第一行为0)
行所在的数据文件(第一个文件是 1)。文件号是相对于表空间的。
ora_rowscn 为您提供行所在的块的最后更改编号(不是行本身,请注意这一点)。
这些都不会显着增加从大表中检索所有行的总时间(除非您使用的是 scn_to_timestamp 函数)。
这里的问题是你没有 WHERE 子句,从一个大表中检索所有行确实需要很多时间。如果您确实需要所有行,是否有任何列可用于将查询分成许多较小的查询,所以您可以更快地开始获得结果,甚至可能使整个过程瘫痪(日期列或 ID 列您可以在 where 子句上使用 mod,类似的东西)?