SQLAnywhere[ASA]数据库(以下简称ASA)中的数据库文件,是如何存储普通的表的记录行呢?插入、更新、删除时,记录行的存储会有什么变化? 了解了这些,才能更好的理解如何对ASA数据库进行调优,尤其是物理存储方面。

1. ASA数据库尽一切可能对数据行连续存储

数据库文件中小于单个页面的记录行总是存储在单个页里,如果当前页没有足够的空间容纳新的记录行,数据库会将新行写到新的页里。例如,当一个新行需要600字节,但是当前页空闲空间只有500字节,那么,ASA会把这600字节的新行放到新的数据页里。

为了达到连续存储 的目的,ASA每次分配8个页面,称为一个块(block),如,当它需要一个新页时,它会一次性分配8个页面,把这8个页面放到一个块结构里。会使用一个空闲页位图来查找数据库表空间里头可用的连续页块,执行连续扫描,按组读取64KB,使用位图查找相关页面。这就比每次只读取单个页面要快得多。

2.ASA存储数据的顺序是任意的

ASA定位到具体的页号,插入数据的顺序是按照它接收时的顺序来的。它为每一个数据行找到一个具体的页,但是具体是哪一个页,并不一定严格按照接收时的顺序递增。e.g. 可能某一行太大,启动一个新页来存储,紧接着,一行比较小,可能会存储到以前有剩余空间的旧页里头,因而顺序并不严格一致。

表中的记录行并没有进行排序,要取得顺序结果,要依赖于order by子句,这与所有的RDBMS是一致的。

3. ASA不会为NULL空值列预留空间

缺省情况下,无论ASA何时插入一行,它只会保留插入时使用的那么大的空间。它不会预留更多的空间便于将来的更新。

改变此行为的唯一办法是在CREATE TABLE时使用PCTFREE子句.如果没有设定此值,将会采用默认值。该默认值存储到系统表:ISYSTAB里。

查看一个表的碎片程度,CALL sa_table_fragmentation( ) 会得到所有的表的情况。

4. 插入完成以后,行ID不会发生变化。

每一个数据行都有唯一的行ID,一旦插入完成,就不会发生变化。在更新的时候,如果数据行所在页没有足够的空闲空间,则会发生行链接,一个记录行会发生跨页存储,导致性能上的下降。

5. 数据库文件永远不会自动收缩

数据库会重用以前的空间,ASA会记录所有页的空闲空间,插入时,会搜索所有现存页的空闲空间记录,如果有足够的空间,即把记录插入到目标页,找不到时,会启动一个新页,完成插入操作。

在所有的数据库操作中,在执行了多次删除记录的操作,但是没有新的足够小的记录来重用这些删除操作后产生的新的空闲空间,这就是表碎片产生的一个重要原因,消除表碎片,可以提高扫描表记录的性能,使用语句:

REORGANIZE TABLE

即可达到目的。

对整个数据库的unload, reload则会重新整理整个数据库的碎片,也会有一次性能的提升。

SAP Sybase SQLAnywhere[ASA]数据库中数据行的存储机制的更多相关文章

  1. 【HANA系列】SAP HANA SQL取表中每行最小值

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL取表中每 ...

  2. 检验Excel中数据是否与数据库中数据重复

    #region 记录Excel中的重复列 /// <summary> /// 记录Excel中的重复列 /// </summary> /// <param name=&q ...

  3. 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction

    今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...

  4. Tomcat启动时加载数据到缓存---web.xml中listener加载顺序(例如顺序:1、初始化spring容器,2、初始化线程池,3、加载业务代码,将数据库中数据加载到内存中)

    最近公司要做功能迁移,原来的后台使用的Netty,现在要迁移到在uap上,也就是说所有后台的代码不能通过netty写的加载顺序加载了. 问题就来了,怎样让迁移到tomcat的代码按照原来的加载顺序进行 ...

  5. JAVA对数据库进行操作,实现数据库中数据的插入,查询,更改,删除操作

    (—)通过mysql workbench 创建一个数据库,在这里命名为company,然后建一个tb_employee表 (二)以下是java代码对表tb_employee的操作 1 创建一个Empl ...

  6. springboot实现数据库中数据导出Excel功能

    [转载]原文地址:https://blog.csdn.net/wilson_m/article/details/79021458 功能介绍 网上查找了一堆的数据导出代码,可能是自己基础比较薄弱的原因还 ...

  7. 使用IO流将数据库中数据生成一个文件,结果使用Notepad++打开部分数据结尾出现NUL

    场景描述: 项目中通过java代码中从数据库中查询一系列数据,对数据做相应处理,然后通过字符流将数据写如一个新生成的文件中,将该项目部署在linux服务器上,最后生成的文件拿到本地使用notepad+ ...

  8. SAP 修改表和表中数据

    平时修改表中数据的方式有一下几种: 1.一般就是通过SE11或者是SE16进去,找到那条记录,然后将模式变成EDIT,然后修改保存. 2.通过SQL语句在程序中实现数据库表的修改操作 3.通过SE16 ...

  9. SQL Server中中数据行批量插入脚本的存储实现

        看到博友SQL Server MVP桦仔的一篇博文“将表里的数据批量生成INSERT语句的存储过程的实现”.我仔细看来博文中的两个存储代码,自我感觉两个都不太满意,都是生成的单行模式的插入,数 ...

随机推荐

  1. kafka术语

    kafka 架构Terminology(术语) broker(代理) Kafka集群包含一个或多个服务器,这种服务器被称为broker Topic  每条发布到Kafka集群的消息都有一个类别,这个类 ...

  2. python 复习-2

    把一个数字的list从小到大排序,然后写入文件,然后从文件中读取出来文件件内容,然后反序,再追加到文件的下一行中 """把一个数字的list从小到大排序,然后写入文件,然 ...

  3. 【转】重装Ubuntu时如何保留/home分区中的数据

    Windows系统可以在重装时只格式化C盘,从而保留其他分区的数据. Ubuntu系统也可以,只要在安装系统时分出一个/home分区.你可以把Ubuntu的“/”分区看为Windows的C盘,重装Ub ...

  4. 给定n个数字,问能否使这些数字相加得到h【折半查找/DFS】

    A Math game Time Limit: 2000/1000MS (Java/Others) Memory Limit: 256000/128000KB (Java/Others) Submit ...

  5. 长安大学第四届“迎新杯”程序设计竞赛 F 打铁的箱子【数学/进制思维/折半枚举】

    题目描述 作为彩虹岛上最擅长打铁的人,

  6. Jenkins配置git进行构建失败:Error cloning remote repo 'origin'的解决思路

    说明:这个没有实际的解决方法,只提供一个思路去解决. 操作系统:windows 背景:在配置的节点之后,由于是windows的系统,运行git克隆地址,使用的是SSH协议地址.出现如下的错误: Err ...

  7. 用NSLogger代替NSLog输出调试信息

    安装 NSLogger分为两部分,LoggerClient和NSLogger Viewer,你的App需要导入前者,后者是一个独立的mac应用,NSLogger所有的调试信息将输出到这个应用中. 安装 ...

  8. eos wasm虚拟机相关接口定义实现

    wasm虚拟机相关接口定义实现 执行流程 controller::push_transaction()  // 事务 -> transaction_context::exec()  // 事务 ...

  9. Fatal error: Call to a member function read() on a non-object in

    是你的路径出问题了系统 > 系统基本参数 > 站点设置 里面的<站点根网址:和 网页主页链接:>系统 > 系统基本参数 > 核心设置 <DedeCMS安装目录 ...

  10. MyEclipse 中自定义日期格式

    从数据库中读出Data数据: 而想实现的是这样: 解决办法: 1. 在这个类里添加自定义的变量birthf: public abstract class AbstractUsers implement ...