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. 用python获取服务器硬件信息[转]

    #!/usr/bin/env python # -*- coding: utf-8 -*- import rlcompleter, readline readline.parse_and_bind(' ...

  2. (一)为什么要学习docker

    一.docker的历史与现状 1.PAAS平台的范围和内容 1.确定产品定位和需求,确定首次迭代的范围. 2.制作界面原型. 以下是 paas 范畴 .技术选型,然后根据技术选型为每个开发者搭建开发环 ...

  3. 524. Longest Word in Dictionary through Deleting

    Given a string and a string dictionary, find the longest string in the dictionary that can be formed ...

  4. IntelliJ中的Scala入门

    IntelliJ IDE中的Scala入门 创建项目 打开IntelliJ并单击File => New => Project 在左侧面板中,选择Scala.在右侧面板中,选择IDEA. 将 ...

  5. 某考试 T2 Tree

    2 树 2.1 题目描述 给一棵n 个节点的树,节点分别编号为0 到n - 1.你可以通过如下的操作来修改这棵树:首先先删去树上的一条边,此时树会分裂为两个连通块,然后在两个连通块之间加上一条新的边使 ...

  6. BZOJ 4543 2016北京集训测试赛(二)Problem B: thr

    Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ...

  7. SQLServer出现不允许保存更改的问题解决

    如图所示: 解决方法: [工具]->[选项]

  8. Understanding Objective-C Blocks

    The aim of this tutorial is to give a gentle introduction to Objective-C blocks while paying special ...

  9. Android常用URI收藏

    转:http://www.android-study.com/jichuzhishi/338.html 以下是常用到的Intent的URI及其示例,包含了大部分应用中用到的共用Intent 一.打开一 ...

  10. xss---攻击

    xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意 ...