CBO优化器是基于对当前经过特定测试的数据集中预期的行比率估计来计算基数的。此处的行数之比是一个数值,称为选择率(selectivity)。得到选择率之后,将其与输入行数进行简单相乘既可得到基数。

在理解选择性之前,必须得对user_tab_col_statistics视图有一定了解:

  1. SQL> desc user_tab_col_statistics
  2. 名称                                      是否为空? 类型
  3. ----------------------------------------- -------- ----------------------------
  4. TABLE_NAME                                         VARCHAR2(30)  表名
  5. COLUMN_NAME                                        VARCHAR2(30)  列名
  6. NUM_DISTINCT                                       NUMBER        列中distinct值的数目
  7. LOW_VALUE                                          RAW(32)       列的最小值
  8. HIGH_VALUE                                         RAW(32)       列的最大值
  9. DENSITY                                            NUMBER        当对列创建了直方图,则值不再等于1/NUM_DISTINCT。
  10. NUM_NULLS                                          NUMBER        列中的NULL值数目。
  11. NUM_BUCKETS                                        NUMBER        Number of buckets in histogram for the column
  12. LAST_ANALYZED                                      DATE          最近分析时间。
  13. SAMPLE_SIZE                                        NUMBER        分析样本大小。
  14. GLOBAL_STATS                                       VARCHAR2(3)   对分区采样,则-NO,否则-YES。
  15. USER_STATS                                         VARCHAR2(3)   统计信息由用户导入,则YES,否则-NO。
  16. AVG_COL_LEN                                        NUMBER        列的平均长度(以字节为单位)
  17. HISTOGRAM                                          VARCHAR2(15)  Indicates existence/type of histogram: NONE、FREQUENCY、HEIGHT BALANCED

下面创建一张测试表,并收集统计信息:

  1. SQL> create table audience as
  2. 2  select
  3. 3    trunc(dbms_random.value(1,13))  month_no
  4. 4  from
  5. 5    all_objects
  6. 6  where
  7. 7    rownum <= 1200
  8. 8  ;
  9. 表已创建。
  10. SQL> begin
  11. 2    dbms_stats.gather_table_stats(
  12. 3      user,
  13. 4      'audience',
  14. 5      cascade => true,
  15. 6      estimate_percent => null,
  16. 7     );ethod_opt => 'for all columns size 1'
  17. method_opt => 'for all columns size 1'
  18. 8  );
  19. 9  end;
  20. 10  /
  21. PL/SQL 过程已成功完成。

先查看一下上面表和列的统计信息:

  1. SQL> select t.TABLE_NAME, t.NUM_ROWS, t.BLOCKS, t.SAMPLE_SIZE
  2. 2    from user_tables t;
  3. TABLE_NAME   NUM_ROWS     BLOCKS SAMPLE_SIZE
  4. ---------- ---------- ---------- -----------
  5. AUDIENCE         1200          5        1200
  6. SQL> select s.table_name,
  7. s.column_name,
  8. s.num_distinct,
  9. 4         s.low_value,
  10. s.high_value,
  11. s.density,
  12. 7         s.num_nulls,
  13. 8         s.sample_size,
  14. 9         s.avg_col_len
  15. 10    from user_tab_col_statistics s;
  16. TABLE_NAME COLUMN_NAM NUM_DISTINCT LOW_VALUE  HIGH_VALUE    DENSITY  NUM_NULLS SAMPLE_SIZE AVG_COL_LEN
  17. ---------- ---------- ------------ ---------- ---------- ---------- ---------- ----------- -----------
  18. AUDIENCE   MONTH_NO             12 C102       C10D       .083333333          0        1200           3
  19. SQL> select rawtohex(1), rawtohex(12) from dual;
  20. RAWT RAWT
  21. ---- ----
  22. C102 C10D
  1. SQL> select dump(1,16),dump(12,16) from dual;
  2. DUMP(1,16)        DUMP(12,16)
  3. ----------------- -----------------
  4. Typ=2 Len=2: c1,2 Typ=2 Len=2: c1,d
  5. SQL> select utl_raw.cast_to_number('c102'),utl_raw.cast_to_number('c10d') from dual;
  6. UTL_RAW.CAST_TO_NUMBER('C102') UTL_RAW.CAST_TO_NUMBER('C10D')
  7. ------------------------------ ------------------------------
  8. 1                             12   --可以看见上面的LOW_VALUE和HIGH_VALUE的值分别就是1和12.
  1. SQL> select count(a.month_no) from AUDIENCE a;
  2. COUNT(A.MONTH_NO)
  3. -----------------
  4. 1200     --可以看见,这里的值和NUM_ROWS是一样的。
  5. SQL> select count(distinct a.month_no) from AUDIENCE a;
  6. COUNT(DISTINCTA.MONTH_NO)
  7. -------------------------
  8. 12       --可以看见,这里的值也和NUM_DISTINCT的值是一样的。
  1. SQL> select 1/12 from dual;
  2. 1/12
  3. ----------
  4. .083333333               --这里的值和DENSITY一样的,计算公式为1/NUM_DISTINCT。

1、假如在上面创建了一张表,里面包含1200个人,如何才能确定其中有多少人的生日是在12月份。

  1. SQL> select count(*) from AUDIENCE where month_no=12;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |   100 |   300 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO"=12)

可以看见CBO计算出1200里面,12月份生日的人是100人(在ID=2行的rows)。这和我们通常所理解的是一样的,我们知道月份只有12个,在1200人中在某一个月出生的人,算概率也是100人(CBO也是这样做得)。

计算方法为:DENSITY * NUM_ROWS = 1 / 12 * 1200 = 100。

2、现在假设有10%的人不记得自己的生日了,那么CBO会怎么计算呐?

  1. SQL> drop table audience purge;
  2. 表已删除。
  3. SQL> create table audience as
  4. 2  select
  5. 3    rownum        id,
  6. 4    trunc(dbms_random.value(1,13))  month_no
  7. 5  from
  8. 6    all_objects
  9. 7  where
  10. 8    rownum <= 1200;
  11. 表已创建。
  12. SQL> update
  13. 2    audience
  14. 3  set  month_no = null
  15. 4  where  mod(id,10) = 0;         --10%的用户不记得自己的生日。
  16. 已更新120行。
  17. SQL> commit;
  18. 提交完成。
  19. SQL> begin
  20. 2    dbms_stats.gather_table_stats(
  21. 3      user,
  22. 4      'audience',
  23. 5      cascade => true,
  24. 6      estimate_percent => null,
  25. 7      method_opt => 'for all columns size 1'
  26. 8    );
  27. 9  end;
  28. 10  /
  29. PL/SQL 过程已成功完成。
  30. SQL> select t.TABLE_NAME, t.NUM_ROWS, t.BLOCKS, t.SAMPLE_SIZE from user_tables t;
  31. TABLE_NAME   NUM_ROWS     BLOCKS SAMPLE_SIZE
  32. ---------- ---------- ---------- -----------
  33. AUDIENCE         1200          5        1200
  34. SQL> select s.table_name,
  35. 2         s.column_name,
  36. 3         s.num_distinct,
  37. 4         s.low_value,
  38. 5         s.high_value,
  39. 6         s.density,
  40. 7         s.num_nulls,
  41. 8         s.sample_size,
  42. 9         s.avg_col_len
  43. 10    from user_tab_col_statistics s;
  44. TABLE_NAME COLUMN_NAM NUM_DISTINCT LOW_VALUE  HIGH_VALUE    DENSITY  NUM_NULLS SAMPLE_SIZE AVG_COL_LEN
  45. ---------- ---------- ------------ ---------- ---------- ---------- ---------- ----------- -----------
  46. AUDIENCE   MONTH_NO             12 C102       C10D       .083333333        120        1080           3   --这里可以看见,NUM_NULLS的值确实为120。
  47. AUDIENCE   ID                 1200 C102       C20D       .000833333          0        1200           4
  1. SQL> select count(*) from AUDIENCE where month_no=12;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |    90 |   270 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO"=12)

调整后的选择率:DENSITY * ((NUM_ROWS-NUM_NULLS)/NUM_ROWS) = 1 / 12 * ((1200 - 120) / 1200) = 0.075。

返回的记录数(ROWS):调整后的选择率 * NUM_ROWS = 0.075 * 1200 = 90行。

或者我们可以换一种方法思考,通过前面可以很容易的知道12分月有100人生日(其中这里就包含了不记得生日的人)。然后1200人中有10%的人不记得自己的生日,也就是120,那么12月份不记得自己生日的人就平摊到10个人,100-10=90。

3、现在假如我们想知道在6、7、8月份生日的人有多少呐?

  1. SQL> select count(*) from AUDIENCE where month_no in(6,7,8);
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |   270 |   810 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO"=6 OR "MONTH_NO"=7 OR "MONTH_NO"=8)

6、7、8月份的选择率:6月份选择率 + 7月份选择率 + 8月份选择率 = 0.075 * 3 = 0.225

返回的记录数(ROWS):6、7、8月份的选择率 * NUM_ROWS = 0.225 * 1200 = 270行。

4、下面来一个更复杂一点的,我们想知道不在6、7、8月份生日的人有多少呐?

  1. SQL> select count(*) from AUDIENCE where month_no not in(6,7,8);
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |   674 |  2022 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO"<>6 AND "MONTH_NO"<>7 AND "MONTH_NO"<>8)

选择率:1 - 6、7、8月份的选择率 = 1 - 0.075 * 3

返回记录数:(1-0.075*3)*1200 = 930。

month_no in{specific list} 的基数 + month_no not in{specific list} 的基数 = NUM_ROWS,这里计算出来是相等的,但是在数据库中看见的却不想等,需要注意!

5、现在我们求8月份以后出生的人,不包含8月份。

  1. SQL> select count(*) from AUDIENCE where month_no>8;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |   393 |  1179 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO">8)

选择率:((HIGH_VALUE - LIMIT) / (HIGH_VALUE - LOW_VALUE)) * ((NUM_ROWS - NUM_NULLS) / NUM_ROWS)

返回的记录数:选择率 * NUM_ROWS = ((HIGH_VALUE - LIMIT) / (HIGH_VALUE - LOW_VALUE)) * ((NUM_ROWS - NUM_NULLS) / NUM_ROWS) * NUM_ROWS = round(((12-8)/(12-1))*((1200-120)/1200)*1200) = 393。

如果是求8月份以后出生的人,包含8月份。

  1. SQL> select count(*) from AUDIENCE where month_no>=8;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |   483 |  1449 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO">=8)

选择率:((HIGH_VALUE - LIMIT) / (HIGH_VALUE - LOW_VALUE) + 1 / DENSITY) * ((NUM_ROWS - NUM_NULLS) / NUM_ROWS)

返回记录数:选择率 * NUM_ROWS = ((HIGH_VALUE - LIMIT) / (HIGH_VALUE - LOW_VALUE) + 1 / DENSITY) * ((NUM_ROWS - NUM_NULLS) / NUM_ROWS) * NUM_ROWS = round(((12-8)/(12-1)+1/12)*((1200-120)/1200)*1200) = 483。

如果是<8,选择率:((LIMIT - LOW_VALUE) / (HIGH_VALUE - LOW_VALUE)) * ((NUM_ROWS - NUM_NULLS) / NUM_ROWS)

如果是<=8,选择率:((LIMIT - LOW_VALUE) / (HIGH_VALUE - LOW_VALUE) + 1 / DENSITY) * ((NUM_ROWS - NUM_NULLS) / NUM_ROWS)

6、现在我们想知道6月份到8月份出生的人的数量?

  1. SQL> select count(*) from AUDIENCE where month_no>=6 and month_no<=8;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |   376 |  1128 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO">=6 AND "MONTH_NO"<=8)

选择率:((HIGH_LIMIT - LOW_LIMIT) / (HIGH_VALUE - LOW_VALUE) + 1 / DENSITY + 1 / DENSITY) * ((NUM_ROWS - NUM_NULLS) / NUM_ROWS)

返回记录数:round(((8-6)/(12-1)+1/12+1/12)*((1200-120)/1200)*1200) = 376。

7、下面看两个谓词的情况下,CBO是怎么计算选择率的。

  1. SQL> drop table audience purge;
  2. 表已删除。
  3. SQL> create table audience as
  4. 2  select
  5. 3  rownum id,
  6. 4  trunc(dbms_random.value(1,13))month_no,
  7. 5  trunc(dbms_random.value(1,16))eu_country
  8. 6  from
  9. 7  all_objects
  10. 8  where
  11. 9  rownum <= 1200;
  12. 表已创建。
  13. SQL> begin
  14. 2  dbms_stats.gather_table_stats(
  15. 3  user,
  16. 4  'audience',
  17. 5  cascade => true,
  18. 6  estimate_percent => null,
  19. 7  method_opt => 'for all columns size 1'
  20. 8  );
  21. 9  end;
  22. 10  /
  23. PL/SQL 过程已成功完成。
  24. SQL> select t.TABLE_NAME, t.NUM_ROWS, t.BLOCKS, t.SAMPLE_SIZE from user_tables t;
  25. TABLE_NAME   NUM_ROWS     BLOCKS SAMPLE_SIZE
  26. ---------- ---------- ---------- -----------
  27. AUDIENCE         1200          6        1200
  28. SQL> select s.table_name,
  29. 2         s.column_name,
  30. 3         s.num_distinct,
  31. 4         s.low_value,
  32. 5         s.high_value,
  33. 6         s.density,
  34. 7         s.num_nulls,
  35. 8         s.sample_size,
  36. 9         s.avg_col_len
  37. 10    from user_tab_col_statistics s;
  38. TABLE_NAME COLUMN_NAM NUM_DISTINCT LOW_VALUE  HIGH_VALUE    DENSITY  NUM_NULLS SAMPLE_SIZE AVG_COL_LEN
  39. ---------- ---------- ------------ ---------- ---------- ---------- ---------- ----------- -----------
  40. AUDIENCE   EU_COUNTRY           15 C102       C110       .066666667          0        1200           3
  41. AUDIENCE   MONTH_NO             12 C102       C10D       .083333333          0        1200           3
  42. AUDIENCE   ID                 1200 C102       C20D       .000833333          0        1200           4
  1. SQL> select count(*) from audience where month_no=12 and eu_country=8;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     6 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     6 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |     7 |    42 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("EU_COUNTRY"=8 AND "MONTH_NO"=12)

选择率:month_no选择率 * eu_contry选择率 = 1/12 * 1/15

返回记录:round(1/12*1/15*1200) = 7。

  1. SQL> select count(*) from audience where month_no=12 or eu_country=8;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     6 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     6 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |   173 |  1038 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO"=12 OR "EU_COUNTRY"=8)

选择率:month_no选择率 + eu_contry选择率 - month_no选择率 * eu_contry选择率 = 1/12+1/15-1/12*1/15

返回记录:round((1/12+1/15-1/12*1/15)*1200) = 173。

  1. SQL> select count(*) from audience where month_no<>12;
  2. 执行计划
  3. ----------------------------------------------------------
  4. Plan hash value: 3337892515
  5. -------------------------------------------------------------------------------
  6. | Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  7. -------------------------------------------------------------------------------
  8. |   0 | SELECT STATEMENT   |          |     1 |     3 |     3   (0)| 00:00:01 |
  9. |   1 |  SORT AGGREGATE    |          |     1 |     3 |            |          |
  10. |*  2 |   TABLE ACCESS FULL| AUDIENCE |  1100 |  3300 |     3   (0)| 00:00:01 |
  11. -------------------------------------------------------------------------------
  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------
  14. 2 - filter("MONTH_NO"<>12)

选择率:1- month_no选择率 = 1- 1/12

返回记录:(1-1/12)*1200 = 1100。

8、总结:

  1. 单个谓词过滤:
  2. =  基数计算公式 :1/num_distinct*(num_rows-num_nulls),如果有直方图,基数计算公式=(num_rows-num_nulls)*density
  3. >  基数计算公式:(high_value-limit)/(high_value-low_value)*(num_rows-num_nulls)
  4. >= 基数计算公式:((high_value-limit)/(high_value-low_value)+1/num_distinct)*(num_rows-num_nulls)  因为有=,所以要加上=的选择率,=的选择率为1/num_distinct
  5. <  基数计算公式:(limit-low_value)/(high_value-low_value)*(num_rows-num_nulls)
  6. <= 基数计算公式:((limit-low_value)/(high_value-low_value)+1/num_distinct)*(num_rows-num_nulls)
  7. between ... and ... 的基数计算公式等价于 xxx<= high_limit ,xxxx>=low_limit
  8. 基数计算公式:((high_limit-low_limit)/(high_value-low_value)+2/num_distinct)*(num_rows-num_nulls)
  9. low_limit<xxx and xxx<high_limit 基数计算公式:(high_limit-low_limit)/(high_value-low_value)*(num_rows-num_nulls)
  10. low_limit<=xxx and xxx<high_limit 基数计算公式:(high_limit-low_limit)/(high_value-low_value)+1/num_distinct)*(num_rows-num_nulls)
  11. 双谓词,多谓词:
  12. A AND B 选择率计算公式=A选择率*B选择率
  13. A OR B  选择率计算公式=A+B-(A AND B)
  14. NOT A   选择率计算公式=1-A选择率

转:http://blog.csdn.net/zq9017197/article/details/8540817

oracle单表选择率(selectivity)——计算执行计划的基数的更多相关文章

  1. Oracle 单表选择率

    听了猫大师的课,对Oracle CBO又加深了一步理解: 单表选择率: selectivity=1/ndv*a4nulls ocard来自dba_tables.num_rows ndv 来自dba_t ...

  2. Oracle单表的简单查询

    Oracle单表的简单查询 查看表结构 desc emp; 查询所有列 Select * from emp; 查找所以部门编号(查指定的列) select deptnofrom emp; 查找编号不同 ...

  3. Oracle单表的复杂查询

    Oracle单表的复杂查询 select avg(sal),max(sal),deptnofrom empgroupby deptno; orderby deptno; 查询工资高于500或者是岗位为 ...

  4. Oracle单表去重复(二)

    Oracle单表去重 去重有两层含义,一:是记录完全一样.二:是符合一定条件的认为是重复. 根据表的数量,去重可划分为:单表去重和多表关联去重.   对于去重,一般最容易想到的是用distinct,而 ...

  5. 【转】Oracle索引列NULL值引发执行计划该表的测试示例

    有时开发进行表结构设计,对表字段是否为空过于随意,出现诸如id1=id2,如果允许字段为空,因为Oracle中空值并不等于空值,有可能得到意料之外的结果.除此之外,最关键的是,NULL会影响oracl ...

  6. Oracle单表去重复(一)

    去重有两层含义,一:是记录完全一样:二:是符合一定条件的认为是重复. 根据表的数量,去重可划分为:单表去重和多表关联去重.   对于去重,一般最容易想到的是用distinct,而distinct只能对 ...

  7. oracle中查看sql语句的执行计划

    1.在pl/sql中打开cmd命令容器 2.在cmd命令窗口中输入:explain plan for select * from t; 3.查看sql语句的执行计划:select * from tab ...

  8. Oracle - 单表查询相关

    -- 单表查询 -- 查询表的所有数据, *代表所有 -- select * from [表名]; -- 查询表中指定字段的值 -- select [字段1], [字段2] ... from [表名] ...

  9. Oracle单表备份三种方案

    备份方案一: 1. 备份 create table [备份名] as select * from [表名]; 2. 恢复 truncate table org_group; insert into o ...

随机推荐

  1. 遍历页面上主从表中从table中的内容

    //如果在建VL的时候没有建访问器.从主表行拿到从表VO的行级不太好搞的 OAAdvancedTableBean innerTable = (OAAdvancedTableBean)webBean.f ...

  2. Get和Load的区别----hibernate

    Get和Load的区别

  3. 014PHP文件处理——文件指针控制fseek rewind ftell feof fpassthru

    <?php /** * 文件指针控制fseek rewind ftell feof fpassthru */ //feof()判断文件读取是否超出文件长度 /*$file = fopen('a. ...

  4. HDU 3720 深搜 枚举

    DES:从23个队员中选出4—4—2—1共4种11人来组成比赛队伍.给出每个人对每个职位的能力值.给出m组人在一起时会产生的附加效果.问你整场比赛人员的能力和最高是多少. 用深搜暴力枚举每种类型的人选 ...

  5. jsp 简单标签开发

    实现simpleTag接口的标签通常称为是简单标签,简单标签一共定义了5个方法 setJspContext方法 setParent方法 getParent方法 setJspBody方法 doTag方法 ...

  6. DBLookupComboBox 的初始值

    http://www.yourdelphi.com/topic_234544_e6b7.htm 试下在form的oncreate中加入 dblookupcombobox1.keyvalue:=tabl ...

  7. hdu 1253 胜利大逃亡 (代码详解)解题报告

    胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示 ...

  8. SharePoint 2013的100个新功能之网站管理(一)

    一:设置盘 网站操作现在被替换为新的(设置)盘子.一些新的操作像添加一个应用.添加一个页面或设计管理器被添加而像创建网站则从菜单中移除了. 二:移除以其他用户身份登录 在SharePoint 2013 ...

  9. 企业信息管理软件 OA、CRM、PM、HR 财务、ERP等

    本文就企业信息管理软件做一个记录. 最近公司要开发物料管理系统....于是查找一些资料 Excel垄断企业信息管理软件二三十年无人撼动:OA.CRM.PM.HR软件不温不火难以普及. 已有的信息化市场 ...

  10. Wrapper class webservice.jaxws.SayHi is not found. Have you run APT to generate them?

    最近在研究webservice,利用jdk来实现简单的webservice发布,但是运行时却发生了这样的异常,如下: Exception in thread "main" com. ...