解析计划中的rows的值是怎么算出来的?

[复制链接]
查看11 | 回复9 | 2005-10-30 17:05:33 | 显示全部楼层 |阅读模式
一个奇怪的问题,有一个例表,结构如下,内存行政区划的代码
13:27:47 SQL> desc b_hjd;
名称
是否为空? 类型
----------------------------------------------------------------------------- -------- ----------------
C_HJSZD
VARCHAR2(10)
下面的命令中查询110102的记录数
13:27:20 SQL> SELECT COUNT(*) FROM B_HJD WHERE C_HJSZD='110102';
COUNT(*)
----------
671
但是对上述命令使用EXPLAIN PLAN后查看解析计划的rows字段却是350,如下
13:27:14 SQL> @?\rdbms\admin\utlxplp.sql
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------

--------------------------------------------------------------------
| Id| Operation
|Name | Rows| Bytes | Cost|
--------------------------------------------------------------------
| 0 | SELECT STATEMENT|
| 1 | 6| 172 |
| 1 |SORT AGGREGATE|
| 1 | 6 | |
|*2 | TABLE ACCESS FULL| B_HJD | 350|2100 | 172 |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("B_HJD"."C_HJSZD"='110102')
Note: cpu costing is off
已选择15行。
已用时间:00: 00: 00.01
这个350是怎么算出来的呀?
[ 本帖最后由 rushlight 于 2008-9-2 13:34 编辑 ]
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
select num_rows from user_tables where table_name='B_HJD';
select NUM_DISTINCT,DENSITY from user_tab_columns where table_name='B_HJD' and COLUMN_NAME='C_HJSZD';
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
执行一下这个DBMS_STATS.GATHER_table_STATS看看呢
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
13:30:56 SQL> select num_rows from user_tables where table_name='B_HJD';
NUM_ROWS
----------
1067057
已用时间:00: 00: 00.01
13:38:49 SQL> SELECT NUM_DISTINCT,DENSITY FROM USER_TAB_COLUMNS WHERE TABLE_NAME='B_HJD' AND COLUMN_NAME='C_HJSZD';
NUM_DISTINCT
DENSITY
------------
----------
3052
.000327654
已用时间:00: 00: 00.00
13:39:17 SQL>
好像也看不出什么
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
原帖由 kelsoncong 于 2008-9-2 13:39 发表
执行一下这个DBMS_STATS.GATHER_table_STATS看看呢

就是执行完这个过程后才解析执行计划的。否则的rows、costs和bytes字段都是空
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
SQL> select 1067057/3052 from dual;
1067057/3052
------------
349.625491
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
这字段难道没索引??
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
执行计划里面的
已选择15行。
这个是怎么回事?
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
原帖由 棉花糖ONE 于 2008-9-2 13:43 发表
SQL> select 1067057/3052 from dual;
1067057/3052
------------
349.625491

原来是这么算出来的,讲讲公式运算含义好吗?另外density字段的含义联机文档中没有解释。也讲讲。谢谢。
另外,此为只针对本帖问题建立的测试表,有无索引无关,
回复

使用道具 举报

千问 | 2005-10-30 17:05:33 | 显示全部楼层
呵呵,棉花糖的意图很明显了,1067057/3052=350number_rows/num_distinct
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行