Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用rownum查看Oracle性能_Database_Performance_Oracle_View_Rownum - Fatal编程技术网

Database 使用rownum查看Oracle性能

Database 使用rownum查看Oracle性能,database,performance,oracle,view,rownum,Database,Performance,Oracle,View,Rownum,我使用的是Oracle10g,我有一个连接两个大表(数百万条记录)的视图。我试图为用户选择一个有限的数据“样本”,如下所示: select * from VIEW_NAME where ROWNUM < 5; CREATE OR REPLACE VIEW VIEW_NAME AS ( select e.id as ID, e.somefield as something, ... (some similar selects from e) c.f

我使用的是Oracle10g,我有一个连接两个大表(数百万条记录)的视图。我试图为用户选择一个有限的数据“样本”,如下所示:

select * from VIEW_NAME where ROWNUM < 5; 
CREATE OR REPLACE VIEW VIEW_NAME AS
(
    select
    e.id as ID,
    e.somefield as something,
    ... (some similar selects from e)
    c.field as anotherthing,
   ... (lots of other fields from c)
    from SCHEMA.TABLE1 e
    inner join SCHEMA.TABLE2 c on e.key = c.key
)
Explain计划提到两个表都有一个完整的表访问,这并不奇怪,因为仅仅返回前几行不会花费很长时间

编辑2:这是完整的计划

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2644394598

----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |             |     4 |  1252 |       | 43546   (1)| 00:08:43 |       |       |        |      |            |
|*  1 |  COUNT STOPKEY            |             |       |       |       |            |          |       |       |        |      |            |
|   2 |   PX COORDINATOR          |             |       |       |       |            |          |       |       |        |      |            |
|   3 |    PX SEND QC (RANDOM)    | :TQ10002    |   696K|   207M|       | 43546   (1)| 00:08:43 |       |       |  Q1,02 | P->S | QC (RAND)  |
|*  4 |     COUNT STOPKEY         |             |       |       |       |            |          |       |       |  Q1,02 | PCWC |            |
|*  5 |      HASH JOIN BUFFERED   |             |   696K|   207M|    49M| 43546   (1)| 00:08:43 |       |       |  Q1,02 | PCWP |            |

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
|   6 |       BUFFER SORT         |             |       |       |       |            |          |       |       |  Q1,02 | PCWC |            |
|   7 |        PX RECEIVE         |             |   696K|    90M|       |  5137   (1)| 00:01:02 |       |       |  Q1,02 | PCWP |            |
|   8 |         PX SEND HASH      | :TQ10000    |   696K|    90M|       |  5137   (1)| 00:01:02 |       |       |        | S->P | HASH       |
|   9 |          TABLE ACCESS FULL| TABLE1      |   696K|    90M|       |  5137   (1)| 00:01:02 |       |       |        |      |            |
|  10 |       PX RECEIVE          |             |   892K|   149M|       |  5260   (1)| 00:01:04 |       |       |  Q1,02 | PCWP |            |
|  11 |        PX SEND HASH       | :TQ10001    |   892K|   149M|       |  5260   (1)| 00:01:04 |       |       |  Q1,01 | P->P | HASH       |
|  12 |         PX BLOCK ITERATOR |             |   892K|   149M|       |  5260   (1)| 00:01:04 |     1 |   140 |  Q1,01 | PCWC |            |
|  13 |          TABLE ACCESS FULL| TABLE2      |   892K|   149M|       |  5260   (1)| 00:01:04 |     1 |   140 |  Q1,01 | PCWP |            |
----------------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------

   1 - filter(ROWNUM<5)
   4 - filter(ROWNUM<5)
   5 - access("E"."KEY"="C"."KEY")

27 rows selected.
SQL>select*from表(dbms\u xplan.display);
计划表输出
------------------------------------------------------------------------------------------------------------------------------------------------------
计划哈希值:2644394598
----------------------------------------------------------------------------------------------------------------------------------------------
|Id |操作|名称|行|字节|临时SPC |成本(%CPU)|时间| Pstart | Pstop | TQ |输入输出| PQ分发|
----------------------------------------------------------------------------------------------------------------------------------------------
|0 |选择语句| 4 | 1252 | 43546(1)| 00:08:43 | | | ||
|*1 |计数停止键| | | | | | | | ||
|2 | PX协调员| | | | | | | | ||
|3 | PX发送质控(随机):TQ10002 | 696K | 207M | 43546(1)00:08:43 | | | Q1,02 | P->S |质控(兰德)|
|*4 |计数停止键| | | | | | | | | Q1,02 | PCWC ||
|*5 |散列连接缓冲| 696K | 207M | 49M | 43546(1)| 00:08:43 | | Q1,02 | PCWP ||
计划表输出
------------------------------------------------------------------------------------------------------------------------------------------------------
|6 |缓冲区排序| | | | | | | | | Q1,02 | PCWC ||
|7 | PX接收| 696K | 90M | 5137(1)| 00:01:02 | Q1,02 | PCWP ||
|8 | PX发送散列:TQ10000 | 696K | 90M | 5137(1)| 00:01:02 | | | | S->P |散列|
|9 |表格访问全部|表格1 | 696K | 90M | 5137(1)| 00:01:02 | | | ||
|10 | PX接收| 892K | 149M | 5260(1)| 00:01:04 | Q1,02 | PCWP ||
|11 | PX发送散列:TQ10001 | 892K | 149M | 5260(1)| 00:01:04 | | | Q1,01 | P->P |散列|
|12 | PX块迭代器| 892K | 149M | 5260(1)| 00:01:04 | 1 | 140 | Q1,01 | PCWC ||
|13 |表格访问完整|表格2 | 892K | 149M | 5260(1)| 00:01:04 | 1 | 140 | Q1,01 | PCWP ||
----------------------------------------------------------------------------------------------------------------------------------------------
谓词信息(由操作id标识):
计划表输出
------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------

1-filter(ROWNUM您可以尝试向查询添加非并行提示

select /*+ NOPARALLEL */ * from VIEW_NAME where ROWNUM < 5; 
从ROWNUM<5的视图名称中选择/*+NOPARALLEL*/*;
这是一种选择并行执行的情况,但可能对性能不利,因为它将使用更多的CPU和I/O。

是否有连接索引(索引嵌套循环应该是优化器选择的访问路径)?尝试禁用哈希连接(与排序合并连接一起)为了了解替代平面的成本,如果您看到普通的嵌套循环,那么优化器出于某种原因忽略了索引


在使用视图内联视图定义优化查询时,请尝试暗示所需的访问路径。当您发现神奇提示(例如基数)时,有时可以将其移动到查询块外部(对于较新的oracle版本尤其如此).

根据GuiGi的回答,我将看到
/*+NOPARALLEL*/
提示的作用。另一件要尝试的事情是查看为此生成的计划:

select /*+ FIRST_ROWS(10)*/ * from VIEW_NAME where ROWNUM < 5;
从视图名称中选择/*+第一行(10)*/*其中ROWNUM<5;
您也可以尝试:

select * FROM 
(SELECT rownum ROW_NUMBER, YOUR_VIEW.* FROM  YOUR_VIEW) 
WHERE ROW_NUMBER> 2

视图到底在做什么?能否发布视图的源代码?此语句的查询计划是什么?什么是“非常慢”你的意思是——你是说返回结果需要几个小时?分钟?5秒,当你认为它应该是一个亚秒响应时?在测试数据库中非常慢是15秒,但在生产数据库中(我没有访问权限)有3倍多的数据。我很快会在问题中添加更多的信息。你能发布实际的查询计划吗?它是在做散列连接吗?嵌套循环连接?当你说“从e中选择类似的内容”时你说的是内联查询吗?还是仅仅引用
e
中的列?它正在进行哈希连接,并且它只是引用e中的列,没有隐藏的子选择或其他技巧…我试图发布整个计划。iirc-rownum总是在将rownum条件应用于返回的r之前计算完整的结果集esultset。换句话说,通过使用ROWNUM进行限制,您不会看到任何性能提升。非常感谢您,第一行极大地提高了性能(到0.05秒)。第一行提示来自ROWNUM谓词(在以后的版本中)