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" 是别名




nginx优化的一些建议

1.1隐藏Nginx header里版本号信息 1、查看版本号 curl -I 127.0.0.1 HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Sat, 14 ...
  • qq_36663951
  • qq_36663951
  • 2017年12月14日 09:15
  • 129

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

案例一 无直方图  range 内 = 的选择率 选择率=1/NDV×非空率 非空率=(表行数-NUM_NULLS)/表行数 col column_name format a10; col NUM_D...
  • night_person_
  • night_person_
  • 2015年07月01日 15:43
  • 213

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

NDV>255, 并且数据分布不均衡,则倾向搜集 height_blanced直方图
  • night_person_
  • night_person_
  • 2015年07月07日 16:06
  • 317

SparkShell实战

1、Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spark的用户程序,包含了一个Driver Program 和集群中多个的Executor; l驱动程序(...
  • oanqoanq
  • oanqoanq
  • 2016年03月27日 20:34
  • 3951

Spark入门实战系列--3.Spark编程模型(上)--概念及SparkShell实战

【注】该系列文章以及使用到安装包/测试数据 可以在《倾情大奉送–Spark入门实战系列》获取1 Spark编程模型 1.1 术语定义 应用程序(Application): 基于Spark的用户程序...
  • yirenboy
  • yirenboy
  • 2015年08月13日 09:14
  • 3910

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

123123
  • night_person_
  • night_person_
  • 2015年07月03日 09:24
  • 246

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

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

spark学习之-----spark编程模型

1、Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spark的用户程序,包含了一个Driver Program 和集群中多个的Executor; l驱动程序(...
  • chenxun2009
  • chenxun2009
  • 2018年01月30日 17:51
  • 97

实战3.Spark编程模型(上)--编程模型及SparkShell实战

1、Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spark的用户程序,包含了一个Driver Program 和集群中多个的Executor; l驱动程序(Dri...
  • xiangxizhishi
  • xiangxizhishi
  • 2017年09月11日 00:12
  • 95
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MSQL优化基础(Join 选择率)
举报原因:
原因补充:

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