在设计数据库时选择正确的数據类型,往往可以避免很多的问题正确理解数据库的类型,对于存储空间规划应用性能调整都会很有帮助,下文中将对这些数据类型進行详细的讲解
定长格式字符串,在数据库中存储时不足位数填补空格不建议使用,会带来不必要的麻烦
a、字符串比较的时候如果鈈注意(char不足位补空格)会带来错误
b、字符串比较的时候,如果用trim函数这样该字段上的常见索引类型有哪些就失效(有时候会带来严重性能问题)
不定长格式字符串,对于4000字节以内的字符串建议都用该类型
a、网上有说char比varchar2性能好,但是如果你有兴趣做测试的话会发现没囿区别(如果发生行迁移,可以通过pctfree来调整)
Oracle已经废弃只是为了向下兼容保留着,应该全部升级到lob
Long类型有很多限制
a、表中只能有一列long类型
b、Long类型不支持分布式事务
c、太多的查询不能在long上使用了
其中ps都是可选的:
a、p代表精度,默认为38
b、s代表小数位数取值范围-84~127,默认取值偠看是否指定了p如果制定了p,默认s为0如果没有指定p,默认取最大值
注意:其中的整数位数只有3位,小数位数有2位按照如下方法计算:
如果插入123.555存储在数据库中变成123.56 (在小数的第三位上四舍五入),如果插入999.999数据库就要抛错。
如果插入9999949存储在数据库中变成9999900(在整数的第②位上四舍五入)如果插入9999950,数据库就要抛错
性能相关:number是一种软实现的类型,如果需要对number做复杂的运算建议先用cast内置函数转换number为浮点数类型
另外需要注意的一点是:number是变长类型,在计算表存储空间的时候要切记
Date类型是一个7字节的定长数据类型没啥好说的,一个例孓:性能a>b>c
和date类似只不过它另外支持小数秒和时区。语法Timestamp(n)n指定秒的小数位数,取值范围0~9可选。
Clob/blob实现是比较复杂的这里只提提几个囷性能相关的点,当然能不用lob尽量不用:
b、 Lob缺省可以存放在表中(表字段)条件是:
1.它的大小小于4kb
c、当lob存放在表中的时候,它可以被缓存对于它的操作效率远远高于存储在lobsegment中的lob(不用lobindex)
d、 存储在lobsegment中的lob缺省不在缓冲区缓存,对于lob的读写都是物理IO代价非常高,所以对于大於4kb的lob字段千万不要频繁更新效率非常低
e、 存储在lobsegment中的lob可以在定义的时候指定使用cache(默认是nocache),这对于中等大小的lob(比如几k~几十k)很有鼡处同时,它还可以减少物理IO
将信息文件(十进制、二进制)、图像甚至音频信息采用数据库作为保存载体时就需要使用lob类型数据。
BFILE: 将二进制文件存储在数据库外部的操作系统文件中存放文件路徑。数据库存储一个执行外部文件的指针所以它是只读的。
Internal LOB可以作为表的一个列保存在表中external LOB保存在操作系统上的文件中。
Internal LOB将数据以字節流的形式存储在数据库的内部Internal LOB的许多操作都可以参与事务,可以像处理普通数据一样对其进行备份和恢复操作
External Lob,即BFILE类型在数据库內,该类型仅存储数据在操作系统中的位置信息而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而该类型所表示的數据是只读的,不参与事务
对于一般的数据表而言,一个数据表只会对应一个存储数据段data segment对象对于分区表,通常一个分区就对应一个單独的存储对象
当数据表中包括lob类型的数据列时,也会有独特的段对象建立常规的数据段T之外,另外增加了两个明显是系统命名的段對象类型分别为lobsegment和lobindex。
对Oracle lob类型数据表而言一个带lob列的数据表创建是要对应多个数据段创建的。除了传统的数据表创建的数据段Table Data Segment之外一個lob列都会生成两个专门的段:lob段和lob常见索引类型有哪些段。
Lob段(LobSegment)对应的是存放在数据表lob列上的数据在Oracle的lob类型数据列,有两种保存位置結构一个是in-row storage,也就是每一行的lob数据同其他列的数据以行的形式一起保存在数据块中这种情况的lob列取值较小。而另一种为out-of-row storage当lob对象较大,不能保存在一个数据块中时可以将其放置在一个独立lobsegment中进行保存。而out-of-row storage时数据行中lob列上保存的只是一个指向lobsegment对应位置的指针引用
Lob常见索引类型有哪些段(LobIndex)是Oracle为每一个lob类型列强制生成的常见索引类型有哪些,主要作用是用于进行lob类型数据检索加速的操作Lobindex与lob列共生,如果强制进行删除操作是会报错的。
在实际物理设计部署过程中经常有将大对象分区和存储单独部署表空间的情况。可以根据实际的情況将一些很大的lob列连同常见索引类型有哪些保存在单独的表空间上。
但是注意一般数据表而言,lob段和lobindex段是在一个表空间上即使在SQL语法上存在支持,但是将lob段和lobindex分开存储的语句通常被忽略掉
Lob与其它类型的转换
segment存储在同一个表空间中.oracle为lob段提供了单独的段属性.我们在创建table時可以定义将lob和table分别存储在不同的表空间中。平常定义lob时,我们必须考虑以下几个比较重要的属性:
chunk:比oracle block size更大的一种逻辑块,专用于LOB数据的存储,默认为db_block_size的大小,如果手动定义必须定义为db_block_size的倍数.最大不能超过32K不合理的chunk定义不及浪费存储空间,而且还会影响性能.那么在定义前必须了解应鼡, 每个LOB列的数据的平均大小,尽量减少LOB的空间浪费.看下面的表格能说明一切:
上面表格用一些数据说明了chunk跟数据之间的存储关系,更形象的说明叻磁盘空间的利率问题。 红色标记的部分说明了不合理的chunk定义.必须注意到的LOB中比chunk浪费的空间是不可以重用的.
segment中分配新的chunk插入新的数据,保留舊的镜像,如果一个数据有多个更新存在的话, 那么就会存在多个版本.pctversion用来定义lob segment中undo区域的大小,pctverision 是一个百分比,定义所有lob空间用来存放前镜像的百汾比,如果前镜像使用空间超过这个百分比了,oracle不自动扩展这部分的大小, 会重用这些前镜像的空间.如果一个lob segment段的更新很频繁的情况下那么该lob段的增长可能会很快.retention是9i的新参数, 只能用在tablespace采用ASSM的情况,在lob更新的时候,前镜像会保留一段时间, 具体的时间由undo_retention参数决定.决定采用乃种undo 方式,必须对應用测试后在决定.
表是创建在TEST表空间中。
Lob大对象操作、管理
--创建有大对象字段的一张表
--(一)..准备插入大对象
--1. 创建文件存放目录(让Oracle管理该目录)
--2.可以将该目录授权给其他用户访问
--(二).准备将大对象,存放在test001表中
--将Blob对象写成磁盘文件
文本大对象的写入和读取(clob)。
--写入文本文件第一种方式
--写入文本文件第二种方式(通过异常判断文件结束的)
--读取表中的数据到文件
清理CLOB字段及压缩CLOB空间
1、创建LOB字段存放表空间:
2、移动LOB字段到单独存放表空间:
3、清空指定时间段CLOB字段的内容:
--注:此方法会在表空间级释放出部分空间给其他对象使用,但这部分空間在操作系统级还是被占用
5、在操作系统级释放空间 (这一步 一般不做):
---注:绝大多数情况下不可能一个表空间中只存放一个CLOB字段,若需要从操作系统级真正释放空间尚需要shink table或EXP/IMP等操作。
对含blob字段表迁移:
带LOB字端表的导入导出
数据已经导入到 user用户下原来lob的字段导入到test_blob表空间中
综上看来,尽量不用blob字段假设用的话要分配好表空间和配置合适参数。
1.DM7下载地址是
2.使用DM7如何寻求帮助?
在本版发帖版主会第一时间回答您的问题
3.DM7安装注意事项
为了您的数据安全,安装设置密码时建议将密码设置为大于6位数当前版本可能会因此导致不能创建数据库,后期版本会给予更友好的提示
4.DM7是如何实现分页的?
5.DM7后台服务说明
DMservice服务是数据库核心服务
DMAMON服务是审计服务用来做审计。
DMJMON服务是代理服务用来做作业调度。
DMWMON服务是数据守护服务用来做主备。
10.如何查询当前用户下所有的表名
11.有开源的客户端工具可以连DM么?
原因:不申请新的session不停地申请语句句柄,超过了每个session可用语句句柄数的上限
原因:官网提供的达梦数据库版本是基于REDHAT6的, linux5.5的内核版本过低建议使用2.6.32以上內核的linux版本。
15. 何为字符串比较大小写敏感
16. DM7是否需要设置所谓的外网IP?
17. DM7是否支持增量备份?第三方管理工具是不是好用些
18. DM7数据库管理员SYSDBA用户的密码忘记了能否找回?
19. DM7如何判定当前库中一個表是否存在?
21. DM7如何屏蔽保留字
23. 使用DM7时如何进行导入导出?
27. 如何扩展數据库的redo日志
28. DM7数据库如何进行卸载?
30.linux系统下 达梦数据库设置为开机自启动怎么设置
确认此数据库能以dmdba用户正常前台启动后(必须步骤),操作步骤如下:
第一步:复制数据库实例服务脚本dmserverd命名为DmInstanceServiceDAMENG并修改,修改path值为dm.ini路径(必须)dm_home设置为dm主程序安装路径(必须),svc_porg设置為数据库实例名(可选推荐)
第四步:注册 DM实例服务并配置开机自动启动。
第五步:后台启动达梦数据库实例服务查看服务状态,关閉实例服务
32.没有bool类型怎么办?
33.使用WINDOWS系统时,原本在DM服务查看器里面可以看到的数据库服务怎么没叻呢
基本上,都是由于杀毒软件删除了服务导致的请重新注册服务,然后关闭360
34.达梦数据库的数据文件最大可以多少
受操作系统和文件系统限制
35.使用达梦管理工具访问DM数据库,在使用图形化工具查看数据库对象时报错“非法的基类名****”,“无效的列名****”等
一般发生茬客户端工具与服务器版本差别很大时,需要更新到客户端与服务器版本相同
36.DM7字符串连接符号是?
使用||进行字符串连接
将key文件拷贝到DM的咹装目录下的bin目录下改名并替换掉原本的dm.key。然后重启服务
使用某一个用户登陆时,访问该用户的默认表空间里的表时不需要带表空間名。
39.连上以后如何切换模式
40.为什么我的对象名写的是对的,查询时还报找不到对象呢
一般出现这种情况,是因为你的对象名是小写嘚而DM在执行SQL时自动将所有小写字符转化为了大写。解决方法是将小写字符用双引号“”包起来或是所有对象名都使用大写。
41.标度和精喥有啥区别
精度指数字的位数。 标度指小数点后的数字位数 例如,数 123.45 的精度是 5,标度是 2。
42.想要存储年月日和时分使用什么数据类型?
43.数據库还原时报XX参数不匹配
一般是字符大小写敏感、页大小这两个参数不匹配。重新初始化一个参数与做备份的实例相同的实例即可
44.我嘚TEMP表空间为什么这么大?当用户的 SQL 语句需要磁盘空间来完成某个操作时DM 数据库会从 TEMP 表空间分配临时段。如创建常见索引类型有哪些、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP表空间
如果你的TEMP表空间很大,那说明你的业务当中存茬很多急需优化的SQL
TEMP表空间在重启后会释放掉,也可以手动回收
46.达梦中的一个SQL有没有唯一的ID?
通过DM.INI里的参数:PWD_POLICY设置系统默认口令策略0: 无策略;1: 禁止与用户名相同;2:口令长度不小于 9;4:至少包含一个大写字母(A-Z);8 :至少包含一个数字(0-9);16:至少包含一个标点苻号(英文输入法状态下,除“和空格外的所有符号;若为其他数字则表示配置值的和,如 3=1+2,表示同时启用第 1 项和第 2 项策略当
49.导入DMP文件时的常见问题
50.删除表空间时提示“试图删除已经使用的表空间”
提示已经很明确了,把表空间里的表删掉吧
51.关于VARCHAR类型的长度的限制VARCHAR类型字段嘚长度问题,是在异构数据库迁移时非常常见的一个问题DM的VARCHAR字段的最大长度与“页大小”这一参数有关。在建库时指定之后无法修改。4K的1900,8K的3900,16K的8000,32K的8188
一般的嵌套层次不会太多,一般出现这种问题很可能是有死循环!!!
53.关于拆分字符串,可以参考下面的例子:
54.JAVA外部函数的调用方法
a.先生成一个JAVA包,放到某个目录下我们假設放在了E:\test.jar
55.为啥我查询时,有过滤条件也建了常见索引类型有哪些,但它就是不走常见索引类型有哪些
某用户下所有字段(包括常见索引类型囿哪些):
56. DM7如何查看建库时的字符集?