MSQL优化基础(Join 选择率)

原创 2015年07月11日 09:58:49

案例一 准备数据

drop table t1;
drop table t2;
create table t1 (id number ,c1 number);
create table t2 (id number , c1 number);
begin 
   for i in 1000..10000 loop
     for j in 1..100 loop
      insert into t1 values (mod(i,10),i);
	  insert into t2 values (mod(i,8),i);
	 end loop;
	end loop;
	commit;
end;

exec dbms_stats.gather_table_stats(null, 'T1', method_opt=>'for all columns size 1');
exec dbms_stats.gather_table_stats(null, 'T2',method_opt=>'for all columns size 1');


select table_name, column_name, num_distinct ,histogram  from user_tab_columns where table_name in ('T1','T2');
TABLE_NAME                     COLUM NUM_DISTINCT HISTOGRAM
------------------------------ ----- ------------ ---------------
T1                             ID              10 NONE
T1                             C1            9002 NONE
T2                             ID               8 NONE
T2                             C1            8999 NONE


select table_name ,num_rows from user_tables where table_name in ('T1','T2');
TABLE_NAME                       NUM_ROWS
------------------------------ ----------
T1                                 896690
T2                                 895692


案例二 join选择率 =

join选择率= 1/最大值(RS1.J1.NDV, RS2.J1.NDV)
Join Card = RS1.Card*RS2.Card*oin选择率


set autot on 
select * from t1, t2 where t1.c1=1000 and t2.c1=1001 and t1.id=t2.id;
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |   991 | 11892 |   690   (7)| 00:00:09 |
|*  1 |  HASH JOIN         |      |   991 | 11892 |   690   (7)| 00:00:09 |
|*  2 |   TABLE ACCESS FULL| T2   |   100 |   600 |   344   (7)| 00:00:05 |
|*  3 |   TABLE ACCESS FULL| T1   |   100 |   600 |   346   (7)| 00:00:05 |
---------------------------------------------------------------------------

join选择率= 1/最大值(RS1.J1.NDV, RS2.J1.NDV)  = 1/10
Join Card = RS1.Card*RS2.Card*oin选择率
          896690*1/9002*895692*1/8999*1/10  = 991.443024
 
和 rows 991 一致   试验环境    10.2g



案例三  join选择率 <,<= , > , >=

join选择率= 0.05
Join Card = RS1.Card*RS2.Card*oin选择率

explain plan for select * from t1, t2 where t1.c1=1000 and t2.c1=1001 and t1.id<t2.id;
select * from table(dbms_xplan.display())

----------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      |   496 |  5952 |   692   (7)| 00:00:09 |
|   1 |  MERGE JOIN         |      |   496 |  5952 |   692   (7)| 00:00:09 |
|   2 |   SORT JOIN         |      |   100 |   600 |   345   (7)| 00:00:05 |
|*  3 |    TABLE ACCESS FULL| T2   |   100 |   600 |   344   (7)| 00:00:05 |
|*  4 |   SORT JOIN         |      |   100 |   600 |   347   (7)| 00:00:05 |
|*  5 |    TABLE ACCESS FULL| T1   |   100 |   600 |   346   (7)| 00:00:05 |


896690*1/9002*895692*1/8999*0.05= 495.721512  

和rows一样  正确   试验环境 10.2g 


补充

/*+ cardinality(t1,100000)*/  可以用这个hint 指定表的cardinality的大小
/*+ cardinality(@"SEL$1",100000)*/   指定结果集cardinality的大小    @"SEL$1" 是别名




相关文章推荐

MSQL优化基础(frequence直方图选择率)

123123

MSQL优化基础(无直方图选择率)

案例一 无直方图  range 内 = 的选择率 选择率=1/NDV×非空率 非空率=(表行数-NUM_NULLS)/表行数 col column_name format a10; col NUM_D...

MSQL优化基础(height_blanced直方图选择率)

NDV>255, 并且数据分布不均衡,则倾向搜集 height_blanced直方图

(1)oracle单表选择率(selectivity)——计算执行计划的基数

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

MSQL优化基础(正确取到执行计划)

1.前台 pl/sql F5 , explain plan for 方式得到的计划,如果有绑定变量时候不准, 而且是预估值不是实际情况的 2.对于执行过的SQL:     如果我们想获取该语句的实际执...

msql优化

一、MyISAM优缺点 优点: 1.能够快速查询唯一键 2.支持全文索引 3.选择count(*)的速度很快 4.磁盘空间占用小 缺点: 1.表级别锁定,如果写入操作的总时间占到5%以上...

msql优化--索引优化

关于数据库优化指标主要为:响应时间,扫描行数,返回行数。对于响应时间,主要体现在服务器级别,服务器性能,网络响应速度等;索引主要为了减少扫描行数;根据limit来限制返回行数。       ...

Left join优化规则的研究

  • 2008年11月19日 18:01
  • 34KB
  • 下载

Hive 基础之:分区、桶、Sort Merge Bucket Join

Hive 已是目前业界最为通用、廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能、稳定性等方面来说,Hive 的地位尚不可撼动。 其实这篇博文主要是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MSQL优化基础(Join 选择率)
举报原因:
原因补充:

(最多只允许输入30个字)