我正在尝试执行查询,如下所示
select * from tableName where rownum=1这个查询基本上是获取table.There的列名,在table.When中有超过百万条记录,我把上面的条件放在上面,它花了这么多的时间来获取第一个row.Is,还有任何替代方法来获取第一行。
发布于 2011-03-15 12:52:31
试试这个:
select * from tableName where rownum<=1有一些奇怪的ROWNUM错误,有时稍微改变查询就可以修复它。我以前见过这种情况,但我不能重现。
下面是关于类似问题的一些讨论:http://jonathanlewis.wordpress.com/2008/03/09/cursor_sharing/和http://forums.oracle.com/forums/thread.jspa?threadID=946740&tstart=1
发布于 2011-03-15 21:12:33
这个问题已经回答了,我只会解释为什么有时filter ROWNUM=1或ROWNUM <= 1可能会导致很长的响应时间。
当遇到ROWNUM筛选器(在单个表上)时,优化器将使用COUNT STOPKEY生成完全扫描。这意味着Oracle将开始读取行,直到遇到前N行(这里是N=1)。完全扫描读取从第一个范围到高水位线的数据块。Oracle无法预先确定哪些块包含行,哪些块不包含行,因此所有块都将被读取,直到找到N行。如果第一个块是空的,可能会导致多次读取。
请考虑以下几点:
SQL> /* rows will take a lot of space because of the CHAR column */
SQL> create table example (id number, fill char(2000));
Table created
SQL> insert into example
2 select rownum, 'x' from all_objects where rownum <= 100000;
100000 rows inserted
SQL> commit;
Commit complete
SQL> delete from example where id <= 99000;
99000 rows deleted
SQL> set timing on
SQL> set autotrace traceonly
SQL> select * from example where rownum = 1;
Elapsed: 00:00:05.01
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=7 Card=1 Bytes=2015)
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (FULL) OF 'EXAMPLE' (TABLE) (Cost=7 Card=1588 [..])
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
33211 consistent gets
25901 physical reads
0 redo size
2237 bytes sent via SQL*Net to client
278 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed正如您所看到的,一致gets的数量非常高(对于单行)。在某些情况下可能会遇到这种情况,例如,您使用/*+APPEND*/提示插入行(因此高于高水位线),并且还定期删除最旧的行,从而导致在段的开头有大量空白空间。
发布于 2011-03-15 11:22:08
甲骨文肯定有元数据表可以用来获取列名,就像DB2中的sysibm.syscolumns表一样?
而且,在quick web search之后,情况似乎就是这样:参见ALL_TAB_COLUMNS。
我会使用这些,而不是去实际的表,类似于(未测试):
SELECT COLUMN_NAME
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = "MYTABLE"
ORDER BY COLUMN_NAME;如果您执意要找出查询速度慢的原因,那么您应该回到标准方法:要求DBMS为您解释查询的执行计划。有关Oracle,请参阅this document的第9节。
在Ask Tom - Oracle上有一个对话,似乎建议行号是在select阶段之后创建的,这可能意味着查询无论如何都会检索所有行。explain可能会帮助建立这一点。如果它包含没有COUNT STOPKEY的FULL,那么这可能解释了性能。
除此之外,我对甲骨文细节的了解就会减少,您将不得不进一步分析explain。
https://stackoverflow.com/questions/5307152
复制相似问题