一、 前言

在调查一个性能问题的时候,一个同事问道,为什么数据库有些时候这么不聪明,明明表上有索引,但是在执行一个简单的count的时候居然全表扫描了!难道不知道走索引更快么?

试图从最简单的count来重新了解oracle查询计划的选择,以及最终产生的结果。虽然有些结果会让人觉得有些意外,并且可能会鄙视,这个查询 计划选择真的不够聪明。但稍微用心点的去了解,做的已经足够细致了。大多数情况下,根据我们输入的信息,来自输入的SQL、表结构、索引状况、统计信息, 会得出一个比较优的计划。所以和前面一直试图讲到索引和join方式一样,所有这样的选择不是因为数据库厂商这样规定的,而是基于存储的数据的实际情况, 就应该(甚至说不得不)这么去选择。

二、实验条件

-- Create table
createtableIDOUBA.APP_APPLICATIONAUDIT
(
ID NUMBER,
UNIQUEID NUMBER,
POLICYID NUMBER,
IP VARCHAR2(200)notnull,
IPNUM NUMBERnotnull,
MAC VARCHAR2(200),
USERVISIT VARCHAR2(100),
PHONE VARCHAR2(200),
GROUPNAME VARCHAR2(100),
PORT NUMBER,
APP_URL VARCHAR2(200),
TITLE VARCHAR2(200),
REQUESTS VARCHAR2(1000),
REQIDENTITYCARDVARCHAR2(1000),
REQKEY VARCHAR2(1000),
RESPONSEEKEY VARCHAR2(3000),
UPDATETIME DATE,
AUDITTYPE NUMBER,
TITLEID NUMBER,
SUBTITLEID NUMBER,
SERVERIP VARCHAR2(200),
DOMAINNAME VARCHAR2(200)
)
tablespaceUSERS
pctfree10
initrans1
maxtrans255
storage
(
initial64K
minextents1
maxextentsunlimited
);
-- Create/Recreate indexes
createindexINDEX_UPDATETIMEonIDOUBA.APP_APPLICATIONAUDIT(UPDATETIME)
tablespaceSYSTEM
pctfree10
initrans2
maxtrans255
storage
(
initial64K
minextents1
maxextentsunlimited
);

表中有20001000条记录,有二十多个字段,包括几个长度比较大的字段。为了实验测试,只是讲IP字段设置为not null。在UpdateTime上建了默认的B树索引。

三、输入

分为三种场景来讨论,然后比较其结果,然后分析该结果。说明数据库的执行计划的选择其实是足够聪明的。

场景一:

  • 表结构:只是在有一个可以为null的列UpdateTime上建了一个索引
  • SQL:最简单的Count。
selectcount(*)fromIDOUBA.App_ApplicationAudit;      --count(*)
selectcount(PolicyId)fromIDOUBA.App_ApplicationAudit; --count(可以null的列)
selectcount(IP)fromIDOUBA.App_ApplicationAudit; --count(不可null的列)
selectcount(UpdateTime)fromIDOUBA.App_ApplicationAudit; --count(可以为null并且建了索引的列)

场景二:

  • 表结构:和场景一完全相同,只是在有一个可以为null的列UpdateTime上建了一个索引
  • SQL:多了个Where子句,在Where子句中涉及到建了索引的可以为null的列。
selectcount(*)fromIDOUBA.App_ApplicationAuditwhereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss');      --count(*)
selectcount(PolicyId)fromIDOUBA.App_ApplicationAuditwhereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss'); --count(可以null的列)
selectcount(IP)fromIDOUBA.App_ApplicationAuditwhereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss'); --count(不可null的列)
selectcount(UpdateTime)fromyIDOUBA.App_ApplicationAuditwhereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss'); --count(可以为null并且建了索引的列)

场景三:

  • 表结构:除了有一个可以为null的列UpdateTime上建了一个索引外,设置另外一列IpNum列为not null,并且在其上创建索引。
  • SQL:最简单的Count。
selectcount(*)fromIDOUBA.App_ApplicationAudit;      --count(*)
selectcount(PolicyId)fromIDOUBA.App_ApplicationAudit; --count(可以null的列)
selectcount(IP)fromIDOUBA.App_ApplicationAudit; --count(不可null的列)
selectcount(UpdateTime)fromIDOUBA.App_ApplicationAudit; --count(可以为null并且建了索引的列)

四、实验结果

场景/Count类型 Count(*) Count(PolicyId) 非索引可null的列 Count(IP)非索引not null 的列 Count(Updatetime)可以null的索引列 Count(IPNum) not null 的索引列
执行时间(秒) 物理读 执行操作 执行时间(秒) 物理读 执行操作 执行时间(秒) 物理读 执行操作 执行时间(秒) 物理读 执行操作 执行时间(秒) 物理读 physical reads 执行操作
场景一 50.98 51671 表扫描 47.43 451672 表扫描 47.73 451672 表扫描 8.7 82393 UpdateTime上快速索引扫描
场景二 9.28 82395 UpdateTime上快速索引扫描 48.12 451673 表扫描 9.65 82428 UpdateTime上快速索引扫描 9.03 82394 UpdateTime上快速索引扫描
场景三 5.14 50224 IpNum上快速索引扫描 47.89 451672 表扫描 2.25 15153 IpNum上快速索引扫描 9.06 82393 UpdateTime上快速索引扫描 3.2 82393 IpNum上快速索引扫描

五、结果分析

其实观察查询计划,也就两种,一种快速索引扫描(INDEX FAST FULL SCAN),另外一种是全表扫描(TABLE ACCESS FULL|)。因为实验表中数据量还是不算小,有两千多万,两者的对比还是比较明显。主要体现在总的执行时间,和物理读取上面,差着一个量级。下面对表中 的执行结果逐个进行总结和解释。

场景一:

当表中只在一个可以null的列上建索引的情况下。观察到count(*) 、count not null的列count(IP),count 可以null的列PolicyId的count(PolicyId)的效果一样都是走全表扫描(TABLE ACCESS FULL|);而对于count建了索引并且列可以null的列count(UpdateTime),走快速索引扫描(INDEX FAST FULL SCAN)。即只在索引列UpdateTime上, count会走快速索引扫描(INDEX FAST FULL SCAN),其他都是全表扫描。

解释:因为oracle不会索引null,因此扫描该列上的索引只能知道该列上非null的值,而count(*) 和count(非空列)都是统计总行数,从索引上不能获得该信息,只能全表扫描。而count(可空列)就更不能参照该索引了,建了索引的可空列上非 null的行数,和在count的可空列上非null的行数没有任何关系,因此也只能全表扫描了。

场景二:

比场景一where子句中包含了可以null的列update的条件where updatetime > to_date(’2013-05-01 10:23:44′, ‘yyyy-mm-dd hh24:mi:ss’) 。观察到count(*)和count not null的列count(IP)和count UpdateTime一样都走updatetime上的快速索引扫描(INDEX FAST FULL SCAN);而count 可null列PolicyId的count(PolicyId)还是全表扫描。

解释:满足类似于pdatetime > to_date(’2013-05-01 10:23:44′, ‘yyyy-mm-dd hh24:mi:ss’)这样可空列上的条件,其实隐含的意思是满足该条件并且该列上取值不为null的行的行数。则在这列上的 count,count(*),在其他非null列上的count,表达的都是这个意思,因此可以利用该索引来做索引扫描。而在另外一个可null的列上 的count是表示满足该where条件同时在count列上值非null的记录行数,索引列上不为空的行可能在该列上为空,因此不能参照那个索引,只能 全表扫描。

场景三:

当表中存在一个not null的列IpNum上建了索引。观察到count(*)和count(IP)在非空索引上快速索引扫描(INDEX FAST FULL SCAN),但是count(ProjectId)还是走原来的全表扫描。即:当表上在一个not null列上建了索引,则只有可Null的列的count走全表扫描,其他的都会走这个建了索引的no null 列的快速索引扫描(INDEX FAST FULL SCAN)。

解释:有一个not null的列上建了索引,则这个索引上的记录数就是表的行数,count(*),count(非空列)都是数行数。但是count(可null 列)是数这个列上不为空的记录数,因此不能参照索引,只能全表扫描了。

六、总结

在Oracle中,Count(Column)是计算Column上不为该列取值不为null的行数,Count一个not null的列其实就是总行数。而Count(*)是不区分null或者not null就是所有记录行数。因此二者语义是一样的,实验也证明了在各种情况下其执行计划总是一样的。对于这两种Count,表上无论哪个索引能提供这样的 语义(在例子中场景二和场景三的两个不同索引分别提供了这样的语义),就会走这个索引。如果没有索引能提供这个语义,就不得不走全表扫描了。而Count 一个可以为null的列,因为要数本列上到底有多少行的值不为null,因此不能参照别的列,必须在该列上数数,如果该列上有索引,则会在该列的索引上扫 描,如果该列上没有索引,则不得不全表扫描。

七、附:各种场景的执行计划

1. 只是在有一个可以为null的列UpdateTime上建了一个索引的Count(*)

SQL>selectcount(*)fromIDOUBA.App_ApplicationAudit;

  COUNT(*)
----------
20001000 已用时间: 00:00:50.98 执行计划
----------------------------------------------------------
Planhashvalue:2649150711 -----------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Cost(%CPU)|Time |
-----------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1|99985 (2)|00:20:00|
| 1| SORTAGGREGATE | | 1| | |
| 2| TABLEACCESSFULL|APP_APPLICATIONAUDIT| 19M|99985 (2)|00:20:00|
----------------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
166 recursivecalls
0 dbblockgets
451721 consistentgets
451671 physicalreads
0 redosize
410 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
5 sorts(memory)
0 sorts(disk)
1 rowsprocessed

2. 只是在有一个可以为null的列UpdateTime上建了一个索引的Count一个可以null的列policyId

SQL>selectcount(policyId)fromIDOUBA.App_ApplicationAudit;

COUNT(POLICYID)
---------------
20001000 已用时间: 00:00:47.43 执行计划
----------------------------------------------------------
Planhashvalue:2649150711 -------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
-------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 2| 100K (2)|00:20:02|
| 1| SORTAGGREGATE | | 1| 2| | |
| 2| TABLEACCESSFULL|APP_APPLICATIONAUDIT| 19M| 38M| 100K (2)|00:20:02|
------------------------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
1 recursivecalls
0 dbblockgets
451701 consistentgets
451672 physicalreads
0 redosize
417 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
0 sorts(memory)
0 sorts(disk)
1 rowsprocessed

3. 只是在有一个可以为null的列UpdateTime上建了一个索引的Count一个可以null的索引列updatetime:Count(UpdateTime)

SQL>selectcount(updatetime)fromIDOUBA.App_ApplicationAudit;

COUNT(UPDATETIME)
-----------------
20001000 已用时间: 00:00:08.70 执行计划
----------------------------------------------------------
Planhashvalue:3909306724 ------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 8|18204 (3)|00:03:39|
| 1| SORTAGGREGATE | | 1| 8| | |
| 2| INDEXFASTFULLSCAN|INDEX_UPDATETIME| 19M| 152M|18204 (3)|00:03:39|
------------------------------------------------------------------------------------------ 统计信息
----------------------------------------------------------
164 recursivecalls
0 dbblockgets
82448 consistentgets
82393 physicalreads
0 redosize
419 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
5 sorts(memory)
0 sorts(disk)
1 rowsprocessed

4. 只是在有一个可以为null的列UpdateTime上建了一个索引的Count一个not null的非索引列IP:Count(IP)

SQL>selectcount(Ip)fromIDOUBA.App_ApplicationAudit;

COUNT(IP)
----------
20001000 已用时间: 00:00:47.73 执行计划
----------------------------------------------------------
Planhashvalue:2649150711 -----------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Cost(%CPU)|Time |
-----------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1|99985 (2)|00:20:00|
| 1| SORTAGGREGATE | | 1| | |
| 2| TABLEACCESSFULL|APP_APPLICATIONAUDIT| 19M|99985 (2)|00:20:00|
----------------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
218 recursivecalls
0 dbblockgets
451730 consistentgets
451672 physicalreads
0 redosize
411 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
5 sorts(memory)
0 sorts(disk)
1 rowsprocessed

5. 只是在有一个可以为null的列UpdateTime上建了一个索引,Query的Where子句中包含该UpdateTime列的条件where updatetime > to_date(’2013-05-01 10:23:44′, ‘yyyy-mm-dd hh24:mi:ss’) ,Count(*)

SQL>selectcount(*)fromIDOUBA.App_ApplicationAudit  whereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss');

  COUNT(*)
----------
20001000 已用时间: 00:00:09.28 执行计划
----------------------------------------------------------
Planhashvalue:3909306724 ------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 8|18373 (4)|00:03:41|
| 1| SORTAGGREGATE | | 1| 8| | |
|* 2| INDEXFASTFULLSCAN|INDEX_UPDATETIME| 19M| 152M|18373 (4)|00:03:41|
------------------------------------------------------------------------------------------ PredicateInformation(identifiedbyoperationid):
--------------------------------------------------- 2-filter("UPDATETIME">TO_DATE('2013-05-01 10:23:44','yyyy-mm-dd
hh24:mi:ss')) 统计信息
----------------------------------------------------------
227 recursivecalls
0 dbblockgets
82464 consistentgets
82395 physicalreads
0 redosize
410 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
5 sorts(memory)
0 sorts(disk)
1 rowsprocessed

6. 只是在有一个可以为null的列UpdateTime上建了一个索引,Query的Where子句中包含该UpdateTime列的条件where updatetime > to_date(’2013-05-01 10:23:44′, ‘yyyy-mm-dd hh24:mi:ss’) 。Count一个可以null的列PolicyId:Count(PolicyId)

SQL>selectcount(policyId)fromIDOUBA.App_ApplicationAudit  whereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss');

COUNT(POLICYID)
---------------
20001000 已用时间: 00:00:48.12 执行计划
----------------------------------------------------------
Planhashvalue:2649150711 -------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
-------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 10| 101K (3)|00:20:20|
| 1| SORTAGGREGATE | | 1| 10| | |
|* 2| TABLEACCESSFULL|APP_APPLICATIONAUDIT| 19M| 190M| 101K (3)|00:20:20|
------------------------------------------------------------------------------------------- PredicateInformation(identifiedbyoperationid):
--------------------------------------------------- 2-filter("UPDATETIME">TO_DATE('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss')) 统计信息
----------------------------------------------------------
227 recursivecalls
0 dbblockgets
451737 consistentgets
451673 physicalreads
0 redosize
417 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
5 sorts(memory)
0 sorts(disk)
1 rowsprocessed

7. 只是在有一个可以为null的列UpdateTime上建了一个索引,Query的Where子句中包含该UpdateTime列的条件where updatetime > to_date(’2013-05-01 10:23:44′, ‘yyyy-mm-dd hh24:mi:ss’) 。Count一个not null的列IP:Count(IP)

SQL>selectcount(ip)fromIDOUBA.App_ApplicationAudit  whereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss');

COUNT(IP)
----------
20001000 已用时间: 00:00:09.65 执行计划
----------------------------------------------------------
Planhashvalue:3909306724 ------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 8|18373 (4)|00:03:41|
| 1| SORTAGGREGATE | | 1| 8| | |
|* 2| INDEXFASTFULLSCAN|INDEX_UPDATETIME| 19M| 152M|18373 (4)|00:03:41|
------------------------------------------------------------------------------------------ PredicateInformation(identifiedbyoperationid):
--------------------------------------------------- 2-filter("UPDATETIME">TO_DATE('2013-05-01 10:23:44','yyyy-mm-dd
hh24:mi:ss')) 统计信息
----------------------------------------------------------
1 recursivecalls
0 dbblockgets
82428 consistentgets
82393 physicalreads
0 redosize
411 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
0 sorts(memory)
0 sorts(disk)
1 rowsprocessed

8. 只是在有一个可以为null的列UpdateTime上建了一个索引,Query的Where子句中包含该UpdateTime列的条件where updatetime > to_date(’2013-05-01 10:23:44′, ‘yyyy-mm-dd hh24:mi:ss’) 。Count该可以 null的索引列UpdateTime:Count(UpdateTime)

SQL>selectcount(updatetime)fromIDOUBA.App_ApplicationAuditwhereupdatetime>to_date('2013-05-01 10:23:44','yyyy-mm-dd hh24:mi:ss');

COUNT(UPDATETIME)
-----------------
20001000 已用时间: 00:00:09.03 执行计划
----------------------------------------------------------
Planhashvalue:3909306724 ------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 8|18204 (3)|00:03:39|
| 1| SORTAGGREGATE | | 1| 8| | |
| 2| INDEXFASTFULLSCAN|INDEX_UPDATETIME| 19M| 152M|18204 (3)|00:03:39|
------------------------------------------------------------------------------------------ 统计信息
----------------------------------------------------------
185 recursivecalls
0 dbblockgets
82460 consistentgets
82394 physicalreads
0 redosize
419 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
5 sorts(memory)
0 sorts(disk)
1 rowsprocessed

9. 在一个not null的列IPNum创建索引count(*)

SQL>selectcount(*)fromIDOUBA.App_ApplicationAudit;

  COUNT(*)
----------
20001000 已用时间: 00:00:05.14 执行计划
----------------------------------------------------------
Planhashvalue:2581539037 -----------------------------------------------------------------------------
|Id |Operation |Name |Rows |Cost(%CPU)|Time |
-----------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1|11435 (5)|00:02:18|
| 1| SORTAGGREGATE | | 1| | |
| 2| INDEXFASTFULLSCAN|INDEX_IPNUM| 19M|11435 (5)|00:02:18|
----------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
1 recursivecalls
0 dbblockgets
50253 consistentgets
50224 physicalreads
0 redosize
410 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
0 sorts(memory)
0 sorts(disk)
1 rowsprocessed

10 在一个not null的列IPNum创建索引。Count可null的列PolicyId:Count(PolicyId)

SQL>selectcount(policyId)fromIDOUBA.App_ApplicationAudit;

COUNT(POLICYID)
---------------
20001000 已用时间: 00:00:47.89 执行计划
----------------------------------------------------------
Planhashvalue:2649150711 -------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
-------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 2| 100K (2)|00:20:02|
| 1| SORTAGGREGATE | | 1| 2| | |
| 2| TABLEACCESSFULL|APP_APPLICATIONAUDIT| 19M| 38M| 100K (2)|00:20:02|
------------------------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
1 recursivecalls
0 dbblockgets
451701 consistentgets
451672 physicalreads
0 redosize
417 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
0 sorts(memory)
0 sorts(disk)
1 rowsprocessed

11 在一个not null的列IPNum创建索引。Count not null的列IP:Count(IP)

SQL>selectcount(Ip)fromIDOUBA.App_ApplicationAudit;

COUNT(IP)
----------
20001000 已用时间: 00:00:02.25 执行计划
----------------------------------------------------------
Planhashvalue:2581539037 -----------------------------------------------------------------------------
|Id |Operation |Name |Rows |Cost(%CPU)|Time |
-----------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1|11435 (5)|00:02:18|
| 1| SORTAGGREGATE | | 1| | |
| 2| INDEXFASTFULLSCAN|INDEX_IPNUM| 19M|11435 (5)|00:02:18|
----------------------------------------------------------------------------- 统计信息
----------------------------------------------------------
196 recursivecalls
0 dbblockgets
50290 consistentgets
15153 physicalreads
0 redosize
411 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
5 sorts(memory)
0 sorts(disk)
1 rowsprocessed

12 在一个not null的列IPNum创建索引。Count另外一个建了索引的可null的列UpdateTime:Count(UpdateTime)

SQL>selectcount(updatetime)fromIDOUBA.App_ApplicationAudit;

COUNT(UPDATETIME)
-----------------
20001000 已用时间: 00:00:09.06 执行计划
----------------------------------------------------------
Planhashvalue:3909306724 ------------------------------------------------------------------------------------------
|Id |Operation |Name |Rows |Bytes|Cost(%CPU)|Time |
------------------------------------------------------------------------------------------
| 0|SELECTSTATEMENT | | 1| 8|18204 (3)|00:03:39|
| 1| SORTAGGREGATE | | 1| 8| | |
| 2| INDEXFASTFULLSCAN|INDEX_UPDATETIME| 19M| 152M|18204 (3)|00:03:39|
------------------------------------------------------------------------------------------ 统计信息
----------------------------------------------------------
1 recursivecalls
0 dbblockgets
82428 consistentgets
82393 physicalreads
0 redosize
419 bytessentviaSQL*Nettoclient
385 bytesreceivedviaSQL*Netfromclient
2 SQL*Netroundtripsto/fromclient
0 sorts(memory)
0 sorts(disk)
1 rowsprocessed

完。

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: 从Count看Oracle执行计划的选择

从Count看Oracle执行计划的选择的更多相关文章

  1. 看懂Oracle执行计划

    最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing- 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问 ...

  2. [转]看懂Oracle执行计划

    原文地址:https://www.cnblogs.com/Dreamer-1/p/6076440.html 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径 ...

  3. 看懂Oracle执行计划、表连接方式

    看懂Oracle执行计划  原文:https://www.cnblogs.com/Dreamer-1/p/6076440.html 最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也 ...

  4. 02 看懂Oracle执行计划

    看懂Oracle执行计划   最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing… 一:什么是Oracle执行计划? 执行计划是一条查询语句在 ...

  5. 如何看懂ORACLE执行计划

    如何看懂Oracle执行计划 一.什么是执行计划 An explain plan is a representation of the access path that is taken when a ...

  6. Oracle调优之看懂Oracle执行计划

    @ 目录 1.文章写作前言简介 2.什么是执行计划? 3.怎么查看执行计划? 4.查看真实执行计划 5.看懂Oracle执行计划 5.1 查看explain 5.2 explain执行顺序 5.3 访 ...

  7. (Oracle)看懂Oracle执行计划(转载)

    最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing- 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问 ...

  8. Oracle执行计划 explain plan

    Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...

  9. Oracle执行计划不走索引的原因总结

    在Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下. 不走索引大体有以下几个原 ...

随机推荐

  1. C++:虚基类

    4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在 ...

  2. ossec 常用命令及目录说明

    1. /var/www/html/analogi -> ossec 第三方的web界面的安装目录 [root@ossec-server ~]# cd /var/www/html/analogi/ ...

  3. 海明距离hamming distance

    仔细阅读ORB的代码,发现有很多细节不是很明白,其中就有用暴力方式测试Keypoints的距离,用的是HammingLUT,上网查了才知道,hamming距离是相差位数.这样就好理解了. 我理解的Ha ...

  4. HDU 3757 Evacuation Plan DP

    跟 UVa 1474 - Evacuation Plan 一个题,但是在杭电上能交过,在UVa上交不过……不知道哪里有问题…… 将施工队位置和避难所位置排序. dp[i][j] 代表前 i 个避难所收 ...

  5. php整理(四): mysql

    PHP学习(四)---PHP与数据库MySql 主要有以下的内容: 1.怎么连接数据库 2.怎么操作数据库 (1)怎么执行sql语言 (2)怎么处理返回的结果集 方法一:面向过程(已经过时,只是了解) ...

  6. Oracle 数据集成的实际解决方案

    就针对市场与企业的发展的需求,Oracle公司提供了一个相对统一的关于企业级的实时数据解决方案,即Oracle数据集成的解决方案.以下的文章主要是对其解决方案的具体描述,望你会有所收获. Oracle ...

  7. awk 传入外部参数

    awk 传入外部参数 num1=1.1 num2=2.2 result=$(awk -v n1=$num1 -v n2=$num2 'BEGIN{print (n2>n1)?1:0}')

  8. Bug:java.lang.IllegalStateException

    使用迭代的时候,出现了java.lang.IllegalStateException 代码: for ( TaskInfo info : userTaskInfos ) { if ( info.isC ...

  9. centos6.5安装mongodb

    搜索正面五个文件,由于MongoDB的redhat国外镜像访问非常慢,下载安装suse版本并安装: mongodb-org-2.6.6-1.i686.rpm mongodb-org-mongos-2. ...

  10. bzoj2489

    这种题完全可以暴力找规律,暴力打表各种搞法 这里有一篇比较全面的题解:http://acm.uestc.edu.cn/bbs/read.php?tid=3698&page=1&tore ...