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