老方块Oracle--数值类型性能考虑
我们在设计数据库表,或者在使用SQL,写程序时都会经常用到数值类型。比如常见的number、int、float。
float是浮点类型,也属于数值类型,我们最常用的是number类型。
他的格式是number(p,s)p是精度,代表有效位,s刻度代表精确到小数点前/后多少位。
e.g.
如果输入数据是15.123,那么number(4,2)的输出值==15.12
如果输入数据是12345.678,那么number(5,-2)的输出值==12300.
很多人只知道数值类型,但是很多人对他的性能并没有多少了解,也没注意到一些重要的细节。
有些数值,对精度要求不高。刘翔的110米栏,世界纪录是多少?12.81,跑步的类型可以设置成number(4,2)
p=4,精度,也就是有效位
s=2,可以保留两位小数点
由精度引申出两种重要的数值类型:number和float类型。而int是number的特例。
到了oracle 10g新引进了两种数值类型binary_float 和binary_double,都是浮点类型
除了数据准确性外,它对存储空间有影响。我们说精度越低,存储的空间越小,性能越高。但是,空间节约对于性能的提高是非常有限的。浮点类型还有更重要的因素来影响性能
浮点运算机制跟number的运算机制是完全不同的,浮点的性能要高很多
从浮点的内部机制来说起,浮点数是一个有理数子集中一个数的数字表示,通常用于在计算机上近似一个任意的实数。硬件的计算速度比软件(软件的计算,其实也是靠硬件来计算的),那CPU来计算数值快还是ORACLE软件来计算数值快?当然是cpu。
那我们的浮点类型 和number类型是用什么来计算的?浮点类型是cpu,number是oracle来计算的。
浮点是硬件来计算的,NUMBER类型,是由软件来计算的,知道两者区别了吧。而且他们两者的性能差至少1个数量级,如果大家不信,那我就给大家来做做实验,让大家相信
第1步:
create table number_tuning
( num_type number,
float_type binary_float,
double_type binary_double
)
/

先创建了测试表number_tuning,表中有3个字段,其中一字段是NUMBER类型,另两字段分别是浮点类型,上面创建的表有3个字段吧,分别是1个number类型,和2个浮点类型
第2步:
insert /*+ APPEND */ into number_tuning
select rownum, rownum, rownum
from all_objects
/
commit;

向表中插入初始化数据,插入的值都是rownum,也就是每行的行号.接下来我们开始来测试性能,看哪种类型计算快,我们是不是要设置计时器?
第3步:
set timing on
select sum(ln(num_type)) from number_tuning;
select sum(ln(float_type)) from number_tuning;
select sum(ln(double_type)) from number_tuning;

用了一个合计的函数SUM和一个对数函数LN来计算数值类型,计算3种数值类型,看看,这3条语句分别计算了多少时间
number-->1.81, float-->0.21, double-->0.03
浮点类型的运算,比number要快很多,实验的效果明显,长见识啊
问,我们的DBA没有注意这些细节,如果我们的业务表已经设置成NUMBER类型了,我又不想把表结构的NUMBER类型转换成浮点类型,又想提高计算效率,该怎么办?
答:
第4步 select sum(ln(cast( num_type as binary_double ) ))
from number_tuning;
计算的列是number类型,但是使用了cast函数,将number类型转成浮点类型了,cast函数可以强制在各种类型间转换

用来0.09s(原来是1.81)
那我们能不能像浮点类型一样,也启用硬件运算呢?Oracle是不是该提供一种浮点机制的整型呢?
10g新特征,pls_integer类型。如果我们需要整型字段,pls_integer类型可以提高性能,因为pls_integer类型是硬件计算的
求第二大值(四种方法)SQL应该怎么写?
主要要学的是思路
第1步:
create table t (x int);
insert into t values();
insert into t values();
insert into t values();
insert into t values();
insert into t values();
commit;
第二大是 7

select x
from ( select x, rownum r
from ( select x from t order by x desc )
where rownum <= 2 )
where r = 2;

7求出来了。
我们看最外围的SELECT,我们叫主查询(父查询),主查询里面的所有SELECT,我们叫子查询
生成顺序,先子后父,1,2,3。子查询是默认的NO_EXPAND模式,NO_EXPAND是SQL的提示

子查询按类型分:
o 标准子查询
o 关联子查询
o inline view
标准子查询或者称为标量子查询:没有关联别SELECT语句的子查询。
里面两个SELECT的WHERE条件有没有关联到其他SELECT,其中一个甚至没有where。
中间层的子查询被where rownum <=2过滤了
ORACLE中,ROWNUM像一个隐藏的字段。记录的是行数。
SELECT ROWNUM,A.* FROM TABLE A 就出来了
可以查第几条数据
注意;rownum,见"1"眼定终身。条件里只有包含1,才能运行,否则不能
例如下面的错误用法:
select x from t order by x desc ) where rownum >= 5;——>错误
因为没有包含1 第2种方法:既然是求第2大的值,最大值给T掉,那第2大的值就是老大
select max(x)
from t
where x < (select max(x) from t)
/
运行效果与上面求7类似
第3种方法:这方法不推荐,性能不好,又不好掌握。
select *
from t
where (select count(*)
from t t2
where t2.x > t.x ) =
/
已经学过了标准子查询,接下来学习下关联子查询和inline view
inline view(内联视图):from后的子查询我们有个称号叫inline view
inline view相当于是一个临时表
关联子查询的定义:如果子查询中的条件跟其他高辈分的SELECT有关联,就变成关联子查询了
大家看,这个WHERE条件,是t2的x跟父查询的x关联了,所以叫关联子查询
关联子查询在求出最里层的子查询的结果集时,必然会关联到关联的父查询
大家看,父查询中5个值里,只有7满足子查询中有一个值大于他
第4种方法:
select x
from ( select x, row_number() over ( order by x desc ) r
from t
)
where r =
/
row_number() over ( order by x desc )这是分析函数的格式
分析函数 OVER (PARTITION BY X ORDER BY Y ) RN,后面RN是分析函数的别名,这里OVER里面,可以设置分组和排序,学习下分析函数,非常有用,性能也相对较好
老方块Oracle--数值类型性能考虑的更多相关文章
- oracle数据库数值类型
---恢复内容开始--- 内容摘自网络 Oracle的数值类型有int,number,float,decimal,numberic等. NUMBER类型 定义 定义格式NUMBER (prec ...
- oracle中的常用函数、字符串函数、数值类型函数、日期函数,聚合函数。
一.字符串的常用函数. --一.oracle 字符串常用函数 --1. concat 连接字符串的函数,只能连接[两个]字符串. 字符写在括号中,并用逗号隔开! --2."||"符 ...
- oracle字段类型
oracle 字段类型CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 byt ...
- 转载:oracle 自定义类型 type / create type
标签:type create oracle object record 一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarc ...
- Oracle SQL语句性能优化方法大全
Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...
- oracle 自定义类型 type / create type
一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...
- .Net判断一个对象是否为数值类型探讨总结(高营养含量,含最终代码及跑分)
前一篇发出来后引发了积极的探讨,起到了抛砖引玉效果,感谢大家参与. 吐槽一下:这个问题比其看起来要难得多得多啊. 大家的讨论最终还是没有一个完全正确的答案,不过我根据讨论结果总结了一个差不多算是最终版 ...
- .Net判断一个对象是否为数值类型
这乍一听是个很简单的事,但突然搞起来还真有点无从下手的感觉. 首先当然是通过GetType()方法反射获取其类型信息,然后对其进行分析,但是类型信息Type中并没有简单地给出这么一个属性进行判断. 老 ...
- MySQL数据类型——数值类型
1.1.1 整型 整型 占用字节 范围 范围 tinyint 1 -27~27-1 -128~127 smallint 2 -215~215-1 -32768~32767 mediumint 3 -2 ...
随机推荐
- 面向对象【day08】:问答式面相对象(四)
本节内容 1.什么是面向对象编程 2.什么是市类?什么是对象?又有什么关系? 3.什么时候适用面向对象? 4.self就是调用当前方法的对象 5.封装.继承.多态 6.字段方法 1.什么是面向对象编程 ...
- 面向对象【day08】:静态方法、类方法、属性方法(九)
本节内容 概述 静态方法 类方法 属性方法 总结 一.概述 前面我们已经讲解了关于类的很多东西,今天讲讲类的另外的特性:静态方法(staticmethod).类方法(classmethod).属性方法 ...
- Elasticsearch入门篇
推荐博客: 阮一峰大神:http://www.ruanyifeng.com/blog/2017/08/elasticsearch.html ElasticSearch 权威指南(中文版):https: ...
- 转--python 中写单例
原文地址 原文地址2 Python中的单例模式的几种实现方式的及优化 阅读目录(Content) 单例模式 实现单例模式的几种方式 1.使用模块 2.使用装饰器 3.使用类 4.基于__new__方法 ...
- es6三个点运算符
...扩展运算符:可以将数组或对象里面的值展开 const b = {a:1,b:2} console.log({...b,c:3}); //{a:1,b:2,c:3} 一定程度上可以替代apply方 ...
- Wannafly挑战赛17D 01序列2
传送门 先考虑二进制下为3倍数的数的共同特点自己手玩去,可以发现这些数奇数二进制位上的1个数(记为\(a\))和偶数二进制位上的1个数(记为\(b\))在模3意义下相等(\(a \equiv b (m ...
- luogu P3760 [TJOI2017]异或和
传送门 对于每个二进制位考虑有多少区间和这一位上为1 从前往后扫每个前缀和,如果当前这个前缀和某一个二进制位上为1,因为区间和由这个前缀和减去前面的前缀和得来,如果减去了这一位为0的前缀和,那么 减去 ...
- Android NetworkInterface 的 name
user@android:/$ ls /sys/class/net/ dummy0 lo p2p0 rev_rmnet0 rev_rmnet1 rev_rmnet2 rev_rmnet3 rmnet0 ...
- 使用layer 弹出对话框 子父页面相互参数传递 父页面获取子页面参数实例
一.先看效果: 1.点击三个点的图标弹出了子页面: 2.子页面调用父页面方法,图一调用父页面方法,图二得到父页面var变量. 3.选择之后,关闭弹框,父页面得到子页面单选框选择的v ...
- sklearn中的回归器性能评估方法(转)
explained_variance_score() mean_absolute_error() mean_squared_error() r2_score() 以上四个函数的相同点: 这些函数都有一 ...
关联子查询的定义:如果子查询中的条件跟其他高辈分的SELECT有关联,就变成关联子查询了
