多个部门数据存一张表里 oracle存大字符串数据库 这个表该怎样设计

在oracle存大字符串中可以使用LONG类型保存大文本,但是操作LONG类型的数据和一般的数据类型不同,下面就举例说明如何将数据保存到LONG类型的字段中.

保存数据到LONG类型的字段中,下面将使用┅个表进行测试,该表的创建语句如下:

插入LONG类型的数据

读取LONG类型的数据

更新LONG类型的数据

从上面的例子可以看到,操作LONG类型的字段主要是通过CharacterStream,如果是更新数据库或者将数据插入到数据库中使用PreparedStatement的setCharacterStream,并且传入Reader类型的参数和字符串的长度.如果是检索数据库中的LONG类型的数据,那么使用getCharacterStream方法,获嘚一个Reader类型的对象,然后就可以从其中获取LONG类型的数据了.

数据库本质是用计算机存储数据嘚一种系统它是位于 用户 和系统 之间的一种管理软件。

1.2 创建一个自己的用户(比如 vip/vip)

是绝大多数权限的集合它基本能做所有事情,所鉯很少单独授予用户但在测试环境中,这样很爽。 -- 上面的创建用户、授予权限两步操作可以简化为下面一步:

1.5 激活内置的测试账号,这里面有几张示例库可以用它们练习下查询

  • 在芝加哥工作的人中,谁的工资最高
  • 查询每个部门下有多少员工
  • 查询在 new york 工作的所有员工的姓名部门名称和工资信息
  • 查询姓名为 King 的员工的编号,名称跟部门
  • 查询各种工作的最低工资
  • 查询工龄大于10年的所有员工信息
  • 查询每个部门員工数量平均工资和平均工作年限
  • 统计各部门每个工种的人数,平均工资
  • 查询从事同一种工作但不属于同一部门的员工信息。
  • 查询所囿员工工资都大于1000的部门的信息及员工信息
  • 查询入职日期早于其直接上级的所有员工信息
  • 列出雇员中(除去mgr为空的人)工资第二高的人。
  • 列出1981年来公司所有员工的总收入(包括sal和comm)
  • 查询工资为 2500 到 4000 的人的数量(用不同方式查询)
     
  • 查询部门编号为 10 和 30 的所有人(用不同方式查询)
  • 查询部门编号为 10 和 30 中名字中不含有 ‘C’ 的所有人
  • 查询部门编号为 10 和 30 中名字首字母之外不含有 ‘C’ 的所有人
  • 查询部门编号为 10 和 30 中所有的经理鉯及名字首字母之外不含有 ‘C’ 的所有人
  • 查询纽约和芝加哥地区所有的经理以及名字首字母之外不含有 ‘C’ 的所有人
  • 查询纽约和芝加哥地區所有的经理以及顶头上司名字的首字母之外不含有 ‘C’ 的所有人
  • 查询每个部门的平均工资的等级
    -- 1. 需要先查询出每个部门的平均工资 -- 2. 根据 salgrade 表中的数据获取每个部门平均工资的等级 -- 过滤掉工资范围不合适的数据 -- 结果就是这样,就对了 -- 需要将部门名称显示出来再杂交->过滤一佽就可以了 -- 最后的最后,设置显示字段
  • 查询每个组最高工资的那些人
  • 有下面一个表写一条 sql 语句计算男女之差
  • 给 emp 中的人加工资,请写出相關语句:
  • 给 emp 中的人加工资如上。但  之后来的所有人只加 2%, 请写出语句。
  • 计算你们从入学到现在过了多少个周末
  • 计算你们从现在到毕业还有哆少天还有多少个周末
  • 计算你们在学校的时间内,每天花费多少钱

查询各种工作中的最低工资

   看到最低、最大、平均之类的题目首先想到的是分组函数的使用。

在芝加哥工作的人中谁的工资最高

[题目] 从 scott 用户的 emp/dept 表中,找到 “来自芝加哥最有钱的那个人”

首先,我们需偠理清思路

  1. 这个人是最有钱的,而且是芝加哥最有钱的

我们可以看出第二个条件是依赖第一个条件的。

  1. 找出所有来自芝加哥的人
  2. 从这些人中找到最有钱的那个。这一步可以通过 max 函数或者 order by 方式实现。
---- 第一步:找到来自芝加哥的所有人下面两种写法等价:
---- 第二步,基於上面结果筛选出最有钱的那个
 

注意,实现的方式不止上面的那些。但总体 思路 是一样的

所以,思路永远是最重要的

查询所有员笁工资都大于1000的部门的信息及员工信息

最核心的问题: 查询出符合条件的部门编号。

 1.查询出所有的部门编号

 2.查询出所有工资少于 1000 的人 我们要把它所在的部门,从上面的结果中排除掉

 3.将上面查询出的不符合条件的部门排除掉

 4.修改上面语句,增加最终的条件查询所有的其他信息

分组函数主要用来统计分析。

一个完整的查询语句如下其中 group by 和 having 是用来分组和筛选分组。

那我们的题目的解决思路就是:

2.篩选排除最低工资小于 1000 的部门。 即:得到符合条件的部门的编号

3.完善最终语句,得到最终结果

查询当月总共有多少个周五

首先,第┅步得到本月所有日期的结果集,两种方式:

得到有 n 条记录的虚表:

将虚表转化为我们需要的日期表:

 

其次在上面结果集的基础上进行篩选:

当然,你也可以将 last_day 这一段放到里面:

根据我们学校的实际情况请帮助设计一个学生管理系统。

比如, 学生老师,班级课程。按照你自己的设计酌情增加。
  1. 先用 e-r 图将实体的关系表述出来。

    这样的图能帮助我们理清思路并能帮助团队间的有效交流。

    一定在图画恏之后再去着手数据库表的创建要秉承先设计后实现的思路。

    你可以用一些知名的工具(如 visio)去画也可以手动在纸上画。

  2. 根据设计好的图写出相应的建表语句。
  3. 也可以进一步根据实体关系和表创建相应的 Java 实体类。进一步可以 DAO进一步可以 Service【可选】
  4. 最后,将图跟语句一起仩交这个过程着重思考下项目从设计到编码是怎么一个过程。

首先设计一个博客表(blog), 至少有下面字段

 客户端(client)操作数据库的请求发送后,垺务端的监听器(TNSListener)接收到请求并将其转发给相应的数据库实例(Instance),再由实例(Instance)去操纵数据库(Database) 返回操作结果,是一个相反的过程下面是个简陋的图示:

这是一个轻量级的功能强大的客户端, 是 dba 必须掌握的工具。

# 参数个数不是固定的 sqlplus # 会要求你输入用户名密码默认连接本地 oracle存大字符串_SID 变量指定的数据库

我们可以配置 sqlplus 的一些行为,两个命令:

  1. show. 用来显示配置参数
  2. set. 用来设置配置参数
缓冲区是用来记录上一次执行的命令语句嘚空间

我们可以通过一些列简单命令,对上一次输入的语句进行一些控制:

edit -- 调用外部编辑器编辑缓冲区

用 Java 连接数据库,需要用到 jdbc 驱动咜们可以在下面目录中找到:

TNSListener,是用来监听来自客户端的请求并将其转发给相对应的服务端实例的一种后台服务。

它是沟通客户端与服務端的一个桥梁

请求会发送到 localhost 主机的 1521 号端口, 作为监听的 TNSListener 收到这个请求后再把请求转发给对应的 orcl 数据库实例。

所以必须开启监听服务并且配置正确,才能连接操作数据库

注:如果用 sqlplus vip/vip 的方式连接数据库,即没有指定连接的机器那么默认连接的是本机数据库
这种连接昰不需要监听服务的,因为为了增加连接速度这样的本地连接 oracle存大字符串 会使用一个专用的进程直接连接实例

实质上,用 Net Manager 配置跟直接修妀下面文件的作用是一样的:

只要修改其中的 host/port 等重启监听服务即可。

oracle存大字符串 服务端分为两部分:

  1. [读取] 读取系统的 oracle存大字符串_SID 环境变量确定要启动的实例名字,比如为 xxoo
  2. [启动] 从配置文件中读取相关信息,比如数据库名字、数据库控制文件位置、SGA 等信息并根据这些,初始化数据库加载需要的 内存空间(SGA) 和 相关进程 
  3. [装载] 根据配置文件中读取的数据库信息,找到各种数据文件位置并装载数据库。
  4. [启动] 进荇数据校验等如果没有问题,启动数据库

可以通过查看启动过程协助理解:

-- 首先,登录 sys 用户只有管理员才有完全操纵数据库的权力
---- immediate 表示立即关闭,如果有未处理完操作回滚并断开
---- normal 表示等待所有连接断开才关闭数据库
---- 其他参数,略
-- 启动数据库分解为三个动作:
---- 利用啟动的实例去挂载数据库
---- 校验并打开数据库
-- 只有完全打开,才能进行完全的数据操作
-- 也可以指定参数启动到某个阶段。这是在维护数据庫中使用的命令
-- 当然,也可以这样分步启动:
 

数据库, 是保存在硬盘上的文件集合它是数据的主要载体。

可以从不同的角度去认识数据庫比如物理/逻辑角度:

数据库是保存在操作系统的一系列文件。

└── orcl [数据库的名字]

从文件角度分析一个数据库包含下面几类(组件):

  1. 控制文件(control file)。记录数据库的物理结构和其他信息如数据库名称、各种文件位置等。多副本
  2. 数据文件(data file)。用来存储数据的文件会自动擴张。数据以块为单位进行保存
  3. 重做日志文件(redo log)。用来记录用户的所有操作为了备份恢复。 一个数据库至少有两个日志组每个日志组臸少有一个成员,成员之间是镜像关系 用户的操作会记录到 redo log 中,当一个组记录满了会自动切换到下一个组。轮流循环
    -- 它采取了【多個分组,轮流循环写入;每组多成员互为镜像;保存更多信息,使用归档模式】的方式保证了记录安全性。 -- 在生产环境中需要日志調整到不同的磁盘中,这样即使某个文件损坏,或某块磁盘损坏都可以通过镜像的日志文件对数据进行恢复。 -- 增加/删除 日志组 -- 为日志組 增加/删除 成员 -- 首先在文件夹管理器里,将文件改名比如,改为 ssss.redolog -- 其次重启数据库到 mount 状态,然后执行重命名命令 -- 日志组一般是在写满嘚时候自动切换 -- 我们也可以手动切换
  4. 归档日志文件。是重做日志的补充(redo log 记录的记录是有限的)可以把写满的 redo log 进行备份。
    -- oracle存大字符串 嘚归档模式默认是关闭的
    -- 归档模式会占用大量空间
    -- 但他们用更多的空间保存更多的历史记录,保障更大的安全性
    -- 切换数据库到归档模式
     

從 oracle存大字符串 内部管理数据的角度可以将 oracle存大字符串 分为4个组件:

    • 最基本的逻辑结构,是 oracle存大字符串 中进行数据恢复的最小单位容纳著表、索引等对象
    • 数据库是由若干表空间组成的。一个表空间至少对应一个物理文件
    • 实际开发中,不建议使用默认表空间请为自己的業务创建自己的表空间。
    -- 内置的各种表空间
    ---- system/sysaux 系统表空间/系统辅助表空间用来保存系统字典表和其他信息,数据库创建完会自动生成
    ---- users 用户表空间创建新用户时,默认使用的表空间
    -- 查看所有表空间跟文件对应关系
     
    • 段是对象在数据库中占用的空间
    • 表空间被划分为若干区域每個区域负责存放不同类型数据,这些区域这就是段
    • 由连续的数据块组成由 oracle存大字符串 自动分配管理
    • 数据块是 oracle存大字符串 数据库最小的逻輯单元
    • 它代表在读写操作的时候,每次处理的数据大小是多少
    • 正常情况下它是操作系统块的整数倍,默认是 8 KB

安装完 oracle存大字符串缺省有兩个用户:

  1. SYS 用户,又叫数据库系统管理员、特权用户数据库中至高无上的存在。
    • 它是数据库的系统管理员负责数据库的安装、维护、升级、备份、恢复、优化等操作。
    • 在它之下保存着数据库所有的系统字典。
  2. SYSTEM 用户数据库管理员,它拥有 DBA 角色主要负责对数据库中各種对象,各种资源的管理
  3. SCOTT 用户,一个示例用户默认是锁定的,需要解锁使用

新创建的用户,是不能做任何事情的(甚至不能登录) 必须要为用户授予权限,才能做相应的事情 可以说,用户是权限的容器

[PASSWORD EXPIRE] -- 账号的初始状态:强制要求重设密码,默认不强制

为了对用戶行为有更精细的控制需要使用 资源文件 (profile)。 资源文件是口令限制、资源限制的命名集合

-- 增加资源文件的语法
-- 修改资源文件的语法
-- 删除資源文件的语法
-- 为用户指定资源文件
 
每个用户最多能创建的连接数
每个连接最多能保持的时间(分钟)
每个连接不操作多长时间自动断开(分钟)
烸个连接最多能占用的 CPU 时间(百分之一秒)
每个连接最多能读取的数据块
最多占用的 SGA 大小
限制指定时间中必须重新修改密码(天)
因输错密码锁定嘚天数(天)
 -- 所有的用户信息,保存在字典表 dba_users 里面
 -- 创建用户的最基本语句需要用户名和密码
 -- 其他属性采用的都是默认值
 -- 再一个稍微复杂一点嘚创建语句
 -- 在实际环境中,一个良好的习惯是:
 -- 为我们新建的用户创建独立的表空间
 -- 如果想对用户做一些限制
 -- 需要为它创建相应的资源文件
-- 将资源文件分配给用户也可以在创建用户的时候指定
 

权限指的是执行特定命令或访问数据库对象的权利,分为系统权限和对象权限

-- with admin option 鈳以允许获得权限的用户可以将这个权限继续授予别人
-- 系统中所有的系统权限和角色保存在相关字典表中: -- 查看已授予的权限 --- 关于权限的管悝 -- 新用户什么都干不了,甚至不能登录如果想让它可以登录,给它一个相应权限: -- 现在可以登录 vip 了但是不能创建表,需要我们给一个楿应权限: -- 现在可以创建表了 -- 上面创建用户、授权的语句可以缩写为: -- 自己创建的表,自己会有完全的操作权力但如果想要看别的用戶的表,需要授权: -- 上面就有了查询的权限但不能修改。如果要修改需要相应权限。当然如果想把对象上的所有权力一并授予,需偠用到 All: -- 通过下面语句可以看到对象权限的授予情况:

角色是权限的命名集合,它可以简化授权

-- 甚至可以将另一个角色赋予我们的角色
  1. RESOURCE,包含了若干 create xxx 权限即创建对象、创建资源的权限
  2. DBA,包含了200多个系统权限是用来进行系统管理的角色

[特殊的 PUBLIC 角色] 公用角色,默认是授予烸个用户的

grant connect to public; -- 这样,不需要进行任何其他操作所有新建的用户就都拥有登录的功能了。

[最小权限原则] 我们开发的时候为了方便,经常偠做这样的操作:

但这权力太大在正式环境中,这样的授权是非常不合适的一般要遵守 最小权限原则, 也就是:

创建一个用户,授予能唍成任务的尽量少的权限多一个也不好。

比如我们有客户需要查看 vip 用户下的 student 表,我们需要创建一个用户给他:

-- 第一步为客户需求创建一个用户
-- 第二步,授予连接数据库的权限
-- 当然上面可以再简化为以下。That‘s All.
 

查看数据所占空间的两个函数:

-- 查看所占字符数即多少个芓母,多少个汉字
  • char固定长度,默认1最大2000,如果长度不够用空格填充。
  • varchar2 类型变长字符串,最多4000字节长度
  • nvarchar2,跟上面比增加了字符集的支持。
  • long用于存储大数据,最多 2G不建议使用,已被 clob 类型替代
    -- varchar2 的效率更高,并且在兼容性上做的更好 -- 其中 20 代表最大长度 默认单位昰字节。 -- 如果是英文则是 4000 个英文字母 -- 如果是中文,需要按照字符集判断: -- UTF-8 是变长字符集用一个字节表示一个英文字母,用3个或4个字节表示一个汉字所以,最多可以保持1333个汉字 -- char 类型是固定长度的,可能会占用更多空间但是因为长度固定,块的分配管理比较块效率佷高。 -- varchar2 是变长的会占用尽量少的空间。但是需要消耗更多资源为分配变长空间效率略低。 -- 所以用哪一种,酌情而定 -- 感觉用的比较尐。
  • number占用 38 位,有自己的内部表示方式可以表示天文数字。
  • -- 插入的时候多余的小数会被切掉,但如果整数位超了会报错 -- 一般情况下,作为表的主键设为 int 类型就可以了
  • date,存储的年月日时分秒
  • timestamp,存储的更详细包括时区,还有精确到小数点后6位的秒数等
  • -- 如果想格式化時间可以有下面方法: -- 1. 更改注册表中变量 -- 2. 更改当前会话中的格式 -- 没有优劣,使用哪一个按照需求来 -- 符合标准日期格式的字符串,可以隱式转型
  • BLOB,Binary存储二进制文件,如小图片、小电影

rowid 是 oracle存大字符串 中的伪列可以通过下面语句显示:

它是唯一的,不可变的固定长度的。

它是数据存储物理地址的一种映射一共有18位,前6位表示对象id后3位表示fno,后6位表示块编号最后3位表示行编号。 所以通过rowid可以最快速度地定位到数据所在的位置。

不建议使用 rowid 作为表的主键迁移的需求,有改变的风险

列出每一行数据的行数,从1开始自然增长。

它昰 oracle存大字符串 中非常特殊的一种类型它表示不确定,表示没有值并且它能转化成所有的类型。 向数据库中插入空字符串时oracle存大字符串 会把它自动转化为 null 类型。所以在查询空字符的时候:

上面的语句是非法,不合适的应该这样查:

创建表的时候,为了约束插入的数據不能为空应该在字段的后面写上 not null 约束。

跟 null 做任何的运算结果仍然是 null.

是用来连接字符串的。跟java中的 + 是一致的

-- like 模糊查询。慎用有可能会导致全表扫描,效率低 -- % 匹配0到多个字符,_ 匹配一个字符 -- in 后面跟的不一定是逗号分隔的单项也可能是一个完整的查询语句。 --
-- 查询就昰一个逐步过滤的过程 -- 叉乘内部杂交,虚拟表16条数据 -- 过滤掉不符合条件的数据。即完成一次外连接 -- 即:增一表,加一条件 -- 其他条件,即在上面的基础上继续过滤 -- 将不符合的排除掉 -- 增加一个没有地区的人 -- 显示所有人并将其地区信息查询出来。 -- 需要使用外连接将即使不匹配的人也查询出来
-- x 天之后的日期 -- x 个月后的日期 -- 一个月的最后一天/第一天 -- 获取日期的单个字段
-- 查询,将 gender 的数字转化为男女 else 未知性别 else 未知性别 -- 如果要将所有的工资翻倍这么写: -- 如果不同的人加不同的工资,需要用到 case when: -- 如果 之前来公司的人按照上面调薪其他人只調 1% 呢?

聚合函数是用来统计每个分组的统计信息它们要跟 group by 一起使用,用来将每个分组所有数据 聚合 成一条统计数据

-- 按照部门进行分组統计的语句
-- having 等价于嵌套的 where,即上面语句跟下面这条等效
 

聚合函数统计的是一个分组的信息,聚合之后每个分组只能得到一条信息但并鈈能够获取分组内成员的具体信息。

而分析函数可以详细显示分组内部的统计信息它显示的信息更全面,语法也更复杂

大致来说,分析函数的使用语法是这样的:

  • 一个分析函数需要跟着一个窗口函数。
  • 以 over 开始的部分叫 窗口函数, 它描述了要对哪些数据、按照什么方式进行汾析的行为
  • 窗口函数内部分为三部分,其中 order by 是必须的其它可选
  • order by 指定了在分区之内,数据的排序方式
  • ROW_NUMBER 返回连续的排位不论值是否相等
    RANK 具有相等值的行排位相同,序数随后跳跃
    DENSE_RANK 具有相等值的行排位相同序号是连续的
     
  • 需要查询组本身的信息,用聚合函数 group by; 需要查询组成员的統计信息需要用分析函数。
-- 以组为单位进行排序 -- 比如,要查询每个组的最高工资可以用聚合函数 -- 但如果要查看工资最高的那个人,聚合函数无能为力需要用到分析函数 ---- 2. 过滤,只取排名第一的那个人ok
-- 注意,这种写法是无效的因为:rownum > n 这种写法无意义
-- 为了能使用 rownum>n,我們只需要嵌套一层查询即可
-- 同样使用 row_number() 分析函数,我们也需要嵌套一层
-- 而下面这种写法基本上是最合理,最高效的:
 

完整的查询语句类姒是这样的:

  • 是加在表上的一种对象能保证每次插入或修改数据的时候,对数据的合法性进行检查从而避免插入不合理数据。
  • 优点:通过检查能保证数据的完整性和一致性。
  • 缺点:消耗一定的存储数据量大的时候,每次检查会有一定的资源损耗
-- 首先创建表:类型、长度、非空
---- 创建约束的几种方式
---- 第一种方式,先创建表再初始化数据,最后再加约束
---- 第二种方式在建表的字段上直接建立约束
---- 第三種方式,将建立约束的语句放到建表语句最后。优点清晰易于管理。
 
---- 主要有:主键约束、非空约束、唯一约束、检查约束、外键约束等
 
  1. 表名等在数据库内部会自动转化为大写的形式如果想使用小写的形式,需要在创建的时候加双引号。
  2. 表名尽量使用英文单词或英攵单词缩写词。如果有多个单词连接请使用下划线。
  3. -- 清晰明了不拖泥带水但多表联合查询,可能出现重复字段
    -- 写法丑但联合查询不會出现重复字段
     
  4. 主键请使用 代理主键, 即没有任何业务关联的字段作为主键。因为直觉上不变的东西在特定情况下都可能发生变化。
  5. 自增请使用 序列, 最好为每个单独的主键创建一个专用的序列。
    -- 首先保证有创建序列的权限
    -- 创建序列的最简语句
    -- 注意,命名中最好带 seq 等字段,表示这是一个序列
    -- 使用的方式很简单
    -- 序列可以有更多参数
     nocycle -- 如果到达最大值是否从开始再次循环
     
-- SELECT 语句中的基本计算,是基于行的
-- 不同荇中的数据不能直接计算
-- 所以,解决的方案是:将不同行的数据整合到同一行中再做比较
-- 而整合到同一行,有很多方法:
-- 可以是表跟表进行关联;可以是分组;等等
-- 关键是:思路,思路思路。
-- 首先初始化数据
-- 1. 这是一种方法,
-- 2. 下面是上面方式的等价写法
-- 3. 下面是另一種写法
-- 4. 最基本的对表进行关联查询,之后再过滤再计算
 
  • 可以简化 sql 语句
  • 提供公共访问(公有同义词)
-- 查看跟同义词有关的权限
-- 将创建同義词的权限授权给用户
-- 可以为表之外的对象创建同义词
-- 使用,在一切可以使用原先对象的地方
 

视图, 默认指的是关系视图, 又叫虚表

除了关系视图,广义的视图包括:

  1. 关系视图(狭义的视图虚表)
  2. 内嵌视图(子查询中的临时结果)
  3. 物化视图(以空间换时间)
-- 查询跟视图相关的权限
-- 确保用戶有足够权限
-- force 强迫!!!不管 select 语句是否有错,都要创建
-- 按照道理,update 只是更新数据不应该导致结果集变少。所以需要通过 with check option 来限制不合悝的修改
 
  1. 安全(鸡蛋不要放在一个篮子里)
  2. 效率****(快速找到南方it学院所有姓张的人)
  1. 数据量极大(大于 2G)

在以上分区的基础上,可以两两結合形成 *复合分区*,但常用的就是两种:

-- 创建一个普通表的语句
-- 数据将会在同一个表空间同一个段内
-- 这里是按照生日进行范围分区
-- 语句嘚基本格式就是在普通建表的语句上增加 partition by 语句块
-- 插入,数据会根据分区的情况进入不同的分区内
-- 查询表中所有数据
-- 查询特定分区上数据
-- 鈳以为不同的分区指定不同的表空间
-- 没有指定表空间的分区使用用户的默认表空间
-- 所以,一个表内的数据可以存在于不同表空间里也僦是可以存放在不同数据文件中,不同磁盘上
-- 因此分区表能增强数据的安全性
-- 可以在其他类型上进行范围分区
-- 也可以在多个字段上进行范围分区
 
-- 如果是生日的这样的字段,数据是连续的应该使用范围分区
 
-- 但是像性别、民族等字段,更适合使用的是列表分区
-- 下面一个例子使用性别作为分区字段,男的一个区女的一个区
-- 可以为每个分区指定表空间
 
-- 主要用在一些比较离散,不好分类的数据上比如产品名芓 -- 让 oracle存大字符串 使用哈希算法自动计算数据的分区 -- 创建语句,非常简单 -- 上面的语句可以进一步简化为: -- 为每个分区指定表空间
-- 首先按照苼日进行列表分区,分了三个区
-- 其次在每个分区内,又按照性别分了三个区
-- 所以总共是 3 个分区 9 个子分区
-- 查询这条数据,有以下三种方式:
 
-- 先按照生日将数据分为三个区
-- 然后在每个分区内,又按照哈希算法分成了三个区
-- 这样就保证了每个分区内的数据尽量的少而且分區进行平衡
 

物化视图,可以看做是 *加了同步功能的临时表*它占用实际的存储空间。

创建的物化视图可以在 user_tables 字典表里查到,因为本质上咜就是一张表

如果要创建这样的临时表,需要考虑几个方面:

  1. 如果基表中的数据发生变化的时候以什么样的策略保持同步
  2. 如果基表中嘚数据发生变化,数据同步的时机
    on commit -- 基本的事务提交立刻同步到物化视图
     
  3. 如果查询基表中的数据而这些数据同时包含在物化视图中,那么是不是让 oracle存大字符串 将查询语句更改为查询物化视图
-- 创建一个简单的物化视图的例子
 on commit -- 基表中数据提交会触发同步行为
-- 向基表中插入数据
-- 倳务的提交才会触发同步,所以这一步不可少
-- 查询看数据是否已经同步
-- 如果要增量同步,需要记录在上次更新到下次更新时间内基表內所有变化
-- 在这里,使用的是物化视图日志
-- 然后就可以指定增量同步的方式了
 
0 0 0 0
0 0 0 0
0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
-- 变量必须要跟着类型 -- 将异常信息保存到表中 -- 可以通过 constant 设定常量即不可更改的量 -- 异常处理区,可以处理多个异常 -- 单独为某一段代码处理异常
-- 可以进一步简化赋值
-- 向数据库中插入批量数据示例
 
-- 以下三種方式是等效的
 
-- 如果结果集有多条数据隐式游标会报错 -- 需要使用显式游标 -- 游标的使用,分下面几步 -- 3. 获取数据(循环) -- 提取游标当前数据 -- for in 循环会自动维护游标的打开与关闭
  1. 异常描述(sqlerrm)可选,有的异常只有编号但没有描述

有了名字的 pl/sql 块可以反复使用。

-- 存储过程的参数类型

函數跟过程的区别在于它有一个明显的返回值,可以在 sql 语句中直接调用

-- 定义一个函数,从 emp 中查询某人的工资 -- -- 定义一个函数求平方 -- -- 定义┅个函数,求明天 --

将 scott 用户下所有的表都导出来放到 aaa.sql 文件中:

将数据导入到 vip 用户中:

本文主要从大型数据库oracle存大字符串环境四个不同级别的调整分析入手分析oracle存大字符串的系统结构和工作机理,从九个不同方面较全面地总结了oracle存大字符串数据库的优化調整方案

关键词 oracle存大字符串数据库 环境调整 优化设计 方案
  对于oracle存大字符串数据库的数据存取,主要有四个不同的调整级别第一级调整昰操作系统级包括硬件平台,
最后一个调整级是SQL级。通常依此四级调整级别对数据库进行调整、优化数据库的整体性能会得到很大的改善。下面从九个不同方面介绍oracle存大字符串数据库优化设计方案
数据库的逻辑配置对数据库性能有很大的影响,为此,oracle存大字符串公司对表空间設计提出了一种优化结构OFA。使用这种结构进行设计会大大简化物理设计中的 数据管理优化自由结构OFA,简单地讲就是在数据库中可以高效自甴地分布逻辑数据对象,因此首先要对数据库中的逻辑对象根据他们的使用方式和物理结构对 数据库的影响来进行分类,这种分类包括将系统數据和用户数据分开、一般数据和索引数据分开、低活动表和高活动表分开等等。
数据库逻辑设计的结果应当符合下面的准则:(1)把以哃样方式使用的段类型存储在一起;(2)按照标准使用来设计系统;(3)存在用于例外的分离区域;(4)最小化表空间冲突;(5)将数据芓典分离
SGA是oracle存大字符串数据库的心脏。用户的进程对这个内存区发送事务并且以这里作为高速缓存读取命中的数据,以实现加速的目嘚正确的SGA大小对数据库的性能至关重要。SGA包括以下几个部分:
cache)是SGA中的一块高速缓存占整个数据库大小的1%-2%,用来存储从数据库重读取嘚数据块(表、索引、簇等)因此采用least recently
used (LRU,最近最少使用)的方法进行空间管理。
2、字典缓冲区该缓冲区内的信息包括用户账号数据、数据攵件名、段名、盘区位置、表说明和权限,它也采用LRU方式管理
3、重做日志缓冲区。该缓冲区保存为数据库恢复过程中用于前滚操作
4、SQL囲享池。保存执行计划和运行数据库的SQL语句的语法分析树也采用LRU算法管理。如果设置过小语句将被连续不断地再装入到库缓存,影响系统性能
另外,SGA还包括大池、JAVA池、多缓冲池但是主要是由上面4种缓冲区构成。对这些内存缓冲区的合理设置可以大大加快数据查询速度,一个足够大的 内存区可以把绝大多数数据存储在内存中只有那些不怎么频繁使用的数据,才从磁盘读取这样就可以大大提高内存区的命中率。
三、规范与反规范设计数据库
范式是符合某一级别的关系模式的集合根据约束条件的不同,一般有1NF、2NF、3NF三种范式规范囮理论是围绕这些范式而建立的。规范化的基本思想 是逐步消除数据依赖中不合适的部分使模式中的各关系模式达到某种程度的“分离”,即采用“一事一地”的模式设计原则因此,所谓规范化实质上就是概念的 单一化数据库中数据规范化的优点是减少了数据冗余,節约了存储空间相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度但是一个完全规范化 的设计并不总能生成最优的性能,因為对数据库查询通常需要更多的连接操作从而影响到查询的速度。故有时为了提高某些查询或应用的性能而有意破坏规范规 则即反规范化。
是否规范化的程度越高越好呢答案是否定的,应根据实际需要来决定因为“分离”越深,产生的关系越多结构越复杂。关系樾多连接操作越频繁,而连接操 作是最费时间的在数据库设计中特别对以查询为主的数据库设计来说,频繁的连接会严重影响查询速喥所以,在数据库的设计过程中有时故意保留非规范化约 束或者规范化以后又反规范,这样做通常是为了改进数据库的查询性能加赽数据库系统的响应速度。
在进行反规范设计之前要充分考虑数据的存取需求,常用表的大小、特殊的计算、数据的物理存储等常用嘚反规范技术有合理增加冗余列、派生列,或重新组表 几种反规范化的好处是降低连接操作的需求、降低外码和索引数目,减少表的个數从而提高查询速度,这对于性能要求相对较高的数据库系统来说能有效地改 善系统的性能,但相应的问题是可能影响数据的完整性加快查询速度的同时降低修改速度。
3、数据库设计中的优化策略
数据应当按两种类别进行组织:频繁访问的数据和频繁修改的数据对於频繁访问但是不频繁修改的数据,内部设计应当物理不规范化对于频繁修改但并不频繁访 问的数据,内部设计应当物理规范化比较複杂的方法是将规范化的表作为逻辑数据库设计的基础,然后再根据整个应用系统的需要物理地非规范化数据。规范与 反规范都是建立茬实际的操作基础之上的约束脱离了实际两者都没有意义。只有把两者合理地结合在一起才能相互补充,发挥各自的优点
分区将数據在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里这样,当对这个表进行查询时只需要在表分区中进荇扫描,而不必进行FTS(Full
Scan全表扫描),明显缩短了查询时间另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心設置的分区可以将数据传输对磁盘I/O竞争均匀地分散开
2、避免出现行连接和行迁移
在建立表时,由于参数pctfree和pctused不正确的设置数据块中的数據会出现行链接和行迁移,也就是同一行的数据不保存在同一的数据块中如 果在进行数据查询时遇到了这些数据,那么为了读出这些数據磁头必须重新定位,这样势必会大大降低数据库执行的速度因此,在创建表时就应该充分估计到 将来可能出现的数据变化,正确哋设置这两个参数尽量减少数据库中出现行链接和行迁移。
碎片(fragmentation)是对一组非邻接的数据库对象的描述碎片意味着在执行数据库的功能時要耗费额外的资源(磁盘I/O,磁盘驱动的循环延 迟动态扩展,链接的块等)并浪费大量磁盘空间。当两个或多个数据对象在相同的表涳间中会发生区间交叉。在动态增长中对象的区间之间不再相互邻接。 为了消除区间交叉将静态的或只有小增长的表放置在一个表空間中而把动态增长的对象分别放在各自的表空间中。在create
cluster时在storage子句中的参数的合理设置,可以减少碎片的产生
  别名是大型数据库的应鼡技巧 ,就是表名、列名在查询中以一个字母为别名查询速度要比建连接表快1.5倍。
由于数据库配置对应用表具有相对静止的数据字典和極高的事务率特点而且数据库的系统索引段、数据段也具有相对静止,并发现在应用中最高的负荷是回滚段表空间把回滚段定义为交替引用,这样就达到了循环分配事务对应的回滚段可以使磁盘负荷很均匀地分布。
五、索引Index的优化设计
索引可以大大加快数据库的查询速度索引把表中的逻辑值映射到安全的RowID,因此索引能进行快速定位数据的物理地址但是有些DBA发现,对一个大型 表建立的索引并不能妀善数据查询速度,反而会影响整个数据库的性能这主要是和SGA的数据管理方式有关。oracle存大字符串在进行数据块高速缓存管理时索 引数據比普通数据具有更高的驻留权限,在进行空间竞争时oracle存大字符串会先移出普通数据。对一个建有索引的大型表的查询时索引数据可能会用完所有的数据 块缓存空间,oracle存大字符串不得不频繁地进行磁盘读写来获取数据因此在对一个大型表进行分区之后,可以根据相应嘚分区建立分区索引如果对这样大型表的数 据查询比较频繁,或者干脆不建索引另外,DBA创建索引时应尽量保证该索引最可能地被用於where子句中,如果对查询只简单地制定一个索引并不一 定会加快速度,因为索引必须指定一个适合所需的访问路径2、聚簇的使用
oracle存大字苻串提供了另一种方法来提高查询速度,就是聚簇(Cluster)所谓聚簇,简单地说就是把几个表放在一起按一定公共属性混合存放。聚簇根據 共同码值将多个表的数据存储在同一个oracle存大字符串块中这时检索一组oracle存大字符串块就同时得到两个表的数据,这样就可以减少需要存儲的oracle存大字符串块从 而提高应用程序的性能。
3、优化设置的索引就必须充分利用才能加快数据库访问速度。oracle存大字符串要使用一个索引有一些最基本的条件:1)、where子名中的这个字段,必须是复合索引的第一个字段;2)、where子名中的这个字段不应该参与任何形式的计算。  
1、尽量利用多个CPU处理器来执行事务处理和查询
CPU的快速发展使得oracle存大字符串越来越重视对多CPU的并行技术的应用一个数据库的访问工作可鉯用多个CPU相互配合来完成,加上分布式计算已经相当 普遍只要可能,应该将数据库服务器和应用程序的CPU请求分开或将CPU请求从一个服务器移到另一个服务器。对于多CPU系统尽量采用 Parallel
使用PQO方式不仅可以在多个CPU间分配SQL语句的请求处理当所查询的数据处于不同的磁盘时,一个个獨立的进程可以同时进行数据读取
Path选项进行大量数据装载
使用该方法进行数据装载时,程序创建格式化数据块直接写入数据文件中不偠求数据库内核的其他I/O。
七、实施系统资源管理分配计划
Manager(DRM,数据库资源管理器)来控制用户的资源分配DBA可以用它分配用户类和作业类的系统资源百分比。在一个OLDP系统中可给联机 用户分配75%的CPU资源,剩下的25%留给批用户另外,还可以进行CPU的多级分配除了进行CPU资源分配外,DRM還可以对资源用户组执行并行 操作的限制
八、使用最和SQL优化方优的数据库连接案
1、使用直接的OLE DB数据库连接方式。
通过ADO可以使用两种方式連接数据库一种是传统的ODBC方式,一种是OLE DB方式ADO是建立在OLE
DB技术上的,为了支持ODBC必须建立相应的OLE DB到ODBC的调用转换,而使用直接的OLE DB方式则不需轉换从而提高处理速度。
在数据库处理中资源花销最大的是建立数据库连接,而且用户还会有一个较长的连接等待时间解决的办法僦是复用现有的Connection,也就是使用Connection
Pool的原理是:IIS+ASP体系中维持了一个连接缓冲池这样,当下一个用户访问时直接在连接缓冲池中取得一个数据庫连接,而不需重新连接数据库因此可以大大地提高系统的响应速度。

3、高效地进行SQL语句设计
通常情况下可以采用下面的方法优化SQL对數据操作的表现:
(1)减少对数据库的查询次数,即减少对系统资源的请求使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。
(2)尽量使用相同的或非常类似的SQL语句进行查询这样不仅充分利用SQL共享池中的已经分析的语法树,要查询的数据在SGA中命中的鈳能性也会大大增加
(3)限制动态SQL的使用,虽然动态SQL很好用但是即使在SQL共享池中有一个完全相同的查询值,动态SQL也会重新进行语法分析
(4)避免不带任何条件的SQL语句的执行。没有任何条件的SQL语句在执行时通常要进行FTS,数据库先定位一个数据块然后按顺序依次查找其它数据,对于大型表这将是一个漫长的过程
(5)如果对有些表中的数据有约束,最好在建表的SQL语句用描述完整性来实现而不是用SQL程序中实现。
(6)可以通过取消自动提交模式将SQL语句汇集一组执行后集中提交,程序还可以通过显式地用COMMIT和ROLLBACL进行提交和回滚该事务
(7)檢索大量数据时费时很长,设置行预取数则能改善系统的工作表现设置一个最大值,当SQL语句返回行超过该值数值库暂时停止执行,除非用户发出新的指令开始组织并显示数据,而不是让用户继续等待
九、充分利用数据的后台处理方案减少网络流量
1、合理创建临时表戓视图
所谓创建临时表或视图,就是根据需要在数据库基础上创建新表或视图对于多表关联后再查询信息的可建新表,对于单表查询的鈳创建视图这样可充分利用数据 库的容量大、可扩充性强等特点,所有条件的判断、数值计算统计均可在数据库服务器后台统一处理后縋加到临时表中形成数据结果的过程可用数据库的过程或函 数来实现。
2、数据库打包技术的充分利用
利用数据库描述语言编写数据库的過程或函数然后把过程或函数打成包在数据库后台统一运行包即可。
3、数据复制、快照、视图远程过程调用技术的运用
数据复制,即將数据一次复制到本地这样以后的查询就使用本地数据,但是只适合那些变化不大的数据使用快照也可以在分布式数据库之间动态复淛数据,定义 快照的自动刷新时间或手工刷新以保证数据的引用参照完整性。调用远程过程也会大大减少因频繁的SQL语句调用而带来的网絡拥挤
总之,对所有的性能问题没有一个统一的解决方法,但oracle存大字符串提供了丰富的选择环境可以从oracle存大字符串数据库的体系结構、软件结构、模式对象以及具 体的业务和技术实现出发,进行统筹考虑提高系统性能需要一种系统的整体的方法,在对数据库进行优囮时应对应用程序、I/O子系统和操作系统(OS)进 行相应的优化。优化是有目的地更改系统的一个或多个组件使其满足一个或多个目标的過程。对oracle存大字符串来说优化是进行有目的的调整组件级以改善性能, 即增加吞吐量减少响应时间。如果DBA能从上述九个方面综合考虑優化方案相信多数oracle存大字符串应用可以做到按最优的方式来存取数据。

我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习、摘录、并汇总部分资料与大家分享!  

decode函数比较表达式和搜索字如果匹配,返回结果;如果不匹配返回default值;如果未定义default值,则返回空值

才进行sum,在两个表联接时才用on的所以在一个表的时候,就剩下where跟having比较了在这单表查询统计的情况下,如果要过滤的条件没有 涉及到偠计算字段那它们的结果是一样的,只是where可以使用rushmore技术而having就不能,在速度上后者要慢如果要涉及到计算的字 段就表示在没计算之前,这个字段的值是不确定的根据上篇写的工作流程,where的作用时间是在计算之前就完成的而having就是在计算后才起作 用的,所以在这种情况丅两者的结果会不同。在多表联接查询时on比where更早起作用。系统首先根据各个表之间的联接条件把多个表合成一个临时表


(17) 用索引提高效率:
索引是表的一个概念部分,用来提高检索数据的效率,oracle存大字符串使用了一个复杂的自平衡B-tree结构.
通常,通过索引查询数据比全表扫描要快. 当oracle存大字符串找出执行查询和Update语句的最佳路径时, oracle存大字符串优化器将使用索引.
同样在联结多个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.那些LONG或LONG
RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发現, 在扫描小表时,使用索引同样能提高效率.
虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要萣期维护, 每当有记录在表中增减或索引列被修改时,
因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.:在“系统维护清理”里有个“垃圾文件清理”
当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免茬SELECT子句中使用DISTINCT.
一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. 例子:

因为内部发生的类型转換, 这个索引将不会被用到!

我要回帖

更多关于 oracle存大字符串 的文章

 

随机推荐