[20171203]平均长度和虚拟列.txt

[20171203]平均长度和虚拟列.txt

--//昨天看链接https://blog.dbi-services.com/doag-2017-avg_row_len-with-virtual-columns/
--//重复测试看看.

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING           VERSION    BANNER                                                                       CON_ID
--------------------- ---------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0  12.1.0.1.0 Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production      0

2.测试:
create table t
(
GUID0 RAW(16)
,GUID1 RAW(16)
,GUID2 RAW(16)
,GUID0_CHAR as (SUBSTR(RAWTOHEX(GUID0),1,8)||'-'||
                SUBSTR(RAWTOHEX(GUID0),9,4)||'-'||
                SUBSTR(RAWTOHEX(GUID0),13,4)||'-'||
                SUBSTR(RAWTOHEX(GUID0),17,4)||'-'||
                SUBSTR(RAWTOHEX(GUID0),21,12))
,GUID1_CHAR as (SUBSTR(RAWTOHEX(GUID1),1,8)||'-'||
                SUBSTR(RAWTOHEX(GUID1),9,4)||'-'||
                SUBSTR(RAWTOHEX(GUID1),13,4)||'-'||
                SUBSTR(RAWTOHEX(GUID1),17,4)||'-'||
                SUBSTR(RAWTOHEX(GUID1),21,12))
,GUID2_CHAR as (SUBSTR(RAWTOHEX(GUID2),1,8)||'-'||
                SUBSTR(RAWTOHEX(GUID2),9,4)||'-'||
                SUBSTR(RAWTOHEX(GUID2),13,4)||'-'||
                SUBSTR(RAWTOHEX(GUID2),17,4)||'-'||
                SUBSTR(RAWTOHEX(GUID2),21,12))
);
 
insert into t (guid0,guid1,guid2)
select sys_guid(), sys_guid(),sys_guid()
from xmltable('1 to 10000');
commit

execute sys.dbms_stats.gather_table_stats ( OwnName => nvl('',user),TabName => 't',
Estimate_Percent => NULL,Method_Opt=> 'FOR ALL COLUMNS SIZE 1 ',Cascade => True ,No_Invalidate => false);

SCOTT@test01p> select avg_row_len from tabs where table_name='T';
AVG_ROW_LEN
-----------
        162

SCOTT@test01p> select sum(avg_col_len) from user_tab_columns where table_name='T' and column_name in ('GUID0','GUID1','GUID2');
SUM(AVG_COL_LEN)
----------------
              51

--//很明显,实际占用长度51(说明oracle考虑前面1个字节的长度指示器),而查询分析报平均总长度162.明显包括了虚拟列.
--//作者的解析oracle这样设计有它的道理,比如select * ,hash join连接的计算等.

explain plan for
select a.*, b.guid0 b_guid0 from t a, t b
where a.guid0_char=b.guid0_char;

SCOTT@test01p> @dp
PLAN_TABLE_OUTPUT
---------------------------
Plan hash value: 2135975663
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      | 10000 |  2109K|    46   (0)| 00:00:01 |
|*  1 |  HASH JOIN         |      | 10000 |  2109K|    46   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| T    | 10000 |   527K|    23   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| T    | 10000 |  1582K|    23   (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / B@SEL$1
   3 - SEL$1 / A@SEL$1

Outline Data
-------------

  /*+
      BEGIN_OUTLINE_DATA
      SWAP_JOIN_INPUTS(@"SEL$1" "B"@"SEL$1")
      USE_HASH(@"SEL$1" "B"@"SEL$1")
      LEADING(@"SEL$1" "A"@"SEL$1" "B"@"SEL$1")
      FULL(@"SEL$1" "B"@"SEL$1")
      FULL(@"SEL$1" "A"@"SEL$1")
      OUTLINE_LEAF(@"SEL$1")
      ALL_ROWS
      DB_VERSION('12.1.0.1')
      OPTIMIZER_FEATURES_ENABLE('12.1.0.1')
      IGNORE_OPTIM_EMBEDDED_HINTS
      END_OUTLINE_DATA
  */

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("A"."GUID0_CHAR"="B"."GUID0_CHAR")

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=1) "A"."GUID0_CHAR"[VARCHAR2,68], "GUID0"[RAW,16],
       "GUID0"[RAW,16], "GUID1"[RAW,16], "GUID2"[RAW,16]
   2 - "GUID0"[RAW,16]
   3 - "GUID0"[RAW,16], "GUID1"[RAW,16], "GUID2"[RAW,16]

48 rows selected.

--//select a.*, b.guid0 b_guid0 from t a, t b where a.guid0_char=b.guid0_char;

--//别名表b在前面,
--//(17+37)*10000/1024 = 527.34375K.
--//162*10000/1024=1582.03125K.

2.如果使用传统的analyze分析看看.
SCOTT@test01p> analyze table t compute statistics;
Table analyzed.

SCOTT@test01p> select avg_row_len from tabs where table_name='T';
AVG_ROW_LEN
-----------
         54

SCOTT@test01p> select sum(avg_col_len) from user_tab_columns where table_name='T' and column_name in ('GUID0','GUID1','GUID2');
SUM(AVG_COL_LEN)
----------------
              48

--//传统analyze的分析不包括前面的长度指示器.而平均长度计算仅仅包括前面的fb,cc长度(占3个字节),以及前面长度指示器.
--//这样3+17*3 = 54字节.

时间: 2024-09-20 17:29:57

[20171203]平均长度和虚拟列.txt的相关文章

PostgreSQL 索引虚拟列 - 表达式索引 - JOIN提速

标签 PostgreSQL , join , 表达式索引 , 虚拟列索引 , 静态数据 , immutable函数 背景 CASE: 使用虚拟索引,响应时间从2.3秒下降到0.3毫秒 业务系统在设计时,为了减少数据冗余,提升可读性,通常需要将不同的数据放到不同的表. 在查询时,通过多表JOIN来补齐需要查询或在过滤的内容. 比如这样的例子: 有两张表,分别有1千万和100万数据,当用户查询时,需要补齐那100万表中的某个字段进行过滤. create table a (id int, bid in

Oracle数据创建虚拟列和复合触发器的方法_oracle

本文我们主要介绍Oracle数据库的虚拟列和复合触发器方面的相关知识,包括虚拟列和复合触发器的创建等,并给出了创建示例,接下来就让我们来一起了解这一过程吧. 一.虚拟列 Oralce 的虚拟列解决了以前很多需要使用触发器或者需要通过代码进行计算统计才能产生的数据信息.以前每次对其他的列进行统计,产生新列的时候都是采用在select 语句中通过统计计算增加新列的方法,执行效率很低,而且由于使查询SQL语句变得冗长.复杂很容易出错.严重的降低了开发效率和程序的执行效率.Oralce虚拟列的引入解决了

linq的相关技术生成-linq 虚拟列 怎么实现

问题描述 linq 虚拟列 怎么实现 在Sql中我们可以虚拟出来列例如: SELECT A ,B , C , C AS D FROM TABLE 其中的D是不存在表中的列,但是查询的时候可以虚拟出来 现在我想知道我是这个功能在linq中可以实现吗?怎么实现谢谢!

[20160220]12c视图一些字段显示128列.txt

[20160220]12c视图一些字段显示128列.txt --今天在家里做一些测试时,无意中发现视图显示字段名index_name占用很大的宽度,仔细检查才发现视图里面的显示长度已经是128列. SYS@test> @ver1 PORT_STRING          VERSION     BANNER                                                                        CON_ID -----------------

[20151103]versions伪列.txt

[20151103]versions伪列.txt --经常忘记做一个记录. SELECT versions_starttime, versions_endtime, versions_xid, versions_operation,        versions_startscn, versions_endscn, empno, ename, job, mgr, hiredate,        sal, comm, deptno   FROM emp        VERSIONS BETW

Oracle之虚拟列及虚拟列索引

Oracle之虚拟列及虚拟列索引 1. 为什么要使用虚拟列        (1)可以为虚拟列创建索引(oracle为其创建function index)        (2)可以搜集虚拟列的统计信息statistics,为CBO提供一定的采样分析.       (3)可以在where 后面使用虚拟列作为选择条件       (4)只在一处定义,不存储多余数据,查询是动态生成. 2. 语法 [sql] view plain copy  HR@bear> create table inv(   2 

[20170628]12C ORA-54032.txt

[20170628]12C ORA-54032.txt https://hourim.wordpress.com/2017/06/24/ora-54032-column-to-be-renamed-is-used-in-a-virtual-column-expression/ --//重复测试: SCOTT@test01p> @ ver1 PORT_STRING                    VERSION        BANNER                           

[20111215]sys.col_usage$和intcol# = 1001的问题.txt

[20111215]sys.col_usage$和intcol# = 1001的问题.txt 讨论链接:http://www.itpub.net/thread-1454515-1-1.html col_usage$字典基表,其目的在于监控column在SQL语句作为predicate的情况,col_usage$的出现完善了CBO中柱状图自动收集的机制. SMON会每15分钟将shared pool中的predicate columns的数据刷新到col_usage$基表中(until perio

[20131220]频率直方图的简单探究.txt

[20131220]频率直方图的简单探究.txt http://allthingsoracle.com/histograms-part-1-why/http://www.itpub.net/thread-1816475-1-1.html 昨天本想看12c的混合直方图的相关信息,无意之中发现以上链接,Jonathan Lewis给出很好的例子,newkid的翻译写的很清晰,自己再按照上面的介绍写一些例子做一些测试. 我的测试环境11.2.0.3,建立测试环境: SYS@test> @verBANN