2012年(17)
分类: 虚拟化
2012-07-20 10:44:20
数据库(RDBMS中的“DB”)是存储信息的仓库,以一种简单的、规则的方式进行组织:
1、数据库中的数据集组织为表。每个表由行和列组成。
2、表中每行为一个记录。记录可包含几段信息;表中每一列对应这些信息中的一段。
3、 SQL管理者作为服务器是允许通过插入、检索、修改或删除记录来使用数据库。
4、“关系”一词表示一种特殊种类的DB,它通过寻找相互之间的共同元素使存放在一个表中
的信息关联到存放在另一个表中的信息。关系数据库的能力在于它能够从这些表中方便地取
出数据,并将关联各表中的信息相结合得出问题的答案,这些答案只依据单个表的信息是不
可能得到的。
SQL采用的是客户机/服务器体系结构:
1、数据库服务器位于存放您的数据的机器上的程序。它监听从网络上传过来的客户机的请求
并根据这些请求访问数据库的内容,以便向客户机提供它们所要求的信息。服务器提供并发
控制,使两个用户不能同时修改相同的记录。所有客户机的请求都通过服务器处理,服务器
分类辨别谁准备做什么,何时做。如果多个客户机希望同时访问相同的表,它们不必互相裁
决和协商,只要发送自己的请求给服务器并让它仔细确定完成这些请求的顺序即可。
2、客户机是连接到数据库服务器的程序,这些程序告诉服务器需要什么信息的查询。
使用数据库涉及几个步骤:
1) 创建(初始化)数据库。
2) 创建数据库中的表。
3) 对表进行数据插入、检索、修改或删除。
SELECT语句的一般形式为:
SELECT 选择哪些列 FROM一个或多个表 WHERE数据必须满足的条件:如对查询结果进行
排序、限制查询结果、计算并命名输出的列值、使用日期、模式匹配、生成汇总。
DELETE FROM tbl_name WHERE要删除的记录
WHERE要更新的记录
以上是现在使用的通常形式;这里要说的是SQL管理者的具体实现方法。我记得在05年时
就用.NET,C#,SQL编写了足球预测软件。它可以自动采集网上的7天的300多家博彩公司的
足球倍率数据与相关信息来预测晚上的比赛。它可以自动学习前面已经结束的比赛结果。比
如英超联赛已打100场,用前面50场来预测第51场的比分。。。每个博彩公司倍率算法都不一
样,有上百种算法,计算预测概率,最后不断学习修正,找到最佳点。最后用已打的100场来
预测将开打的这场。在这软件使用了联想数据库,学习,推理,奇怪突变倍率反推等。准确
率75%;绝杀的没错过。数据库到了10G时,就很慢了长达10多分钟。我当时装了4GB的内存
条,预测计算都是放到内存中立体交叉运算;超过100场的内存不够而崩溃。对于当时的软硬
件相当无语;为此我离开电脑界长达6年;去从事研究世界的本源,质子的结构,4种力的统
一;而得出的结论却相当郁闷;否定相对论、量子力学。今年重回电脑界,决心重建软硬件
系统;使电脑具有智能。
在编程序方面,我还是强烈建议用A汇编语言!即使A语言也包含了C语言。A汇编只有20多
条强大易记的指令,程序的部分语句是中文等自然语言。用汇编对底层有深刻的体会,灵
活,精悍。
在数据库方面,我还在构思一条强大的SQL指令。它支持并行千核流处理模式,一条SQL
汇编指令在0.1秒时间内可查询10亿行记录并输出需要的结果。
我不知道有多少人了解数据库的底层构造?也就是说,数据库、表、字段是如何构造
的?SQL语句又是如何实现的? SQL管理者是一个服务器进程(内核线程)。 它和文件管理
者类同,它实现的是遵循SNP简单对象通信协议来处理 SQL消息。
一、数据库的构造:
在APO中,数据库是一个文件目录型的对象描述文档;根节点是表集或表目录节点数组[n];
表集节点是表目录节点数组[m];表节点是字段文件数组[k]。总节点数 <= 4G;K <= 1024
数据库文件头的定义: 64Z。
UJKT {
BU20Z DXBU; // 数据库标识。
BU32 FJDHU; // 所属目录的ID号。
BU32 JDHU; // 所属目录中本节点的ID号。
BU32 HWBWV; // 描述数据库的表集或表的名字哈希数组在外部硬盘逻辑空间的簇位置。
BU32 HQUWV; // 描述数据库的表集或表的名字哈希数组在DDR内存的簇位置。
BU36Z WJMZ; // 最大36字符的数据库名字。
}
DXBU{ // 数据库标识
BU48 UJID; // 数据库的出生时间标识,单位10mS。
BU32 BBID; // 数据库版本号或种类的细分或进化标识。
BU16 VLID; // 数据库种类。
BU16 UDDX; // 描述数据库的初始大小(根节点下表集或表的数目)。
BU16 i_nlink; // 与本数据库的链接数
BU16 i_count; // 引用计数器
BU16 FWQX; // 描述数据库的访问权限。
BU16 UID; // 描述数据库的拥有者标识。
BU16 GID; // 描述数据库的用户组标识。
BU32 ZHFWUJ; // 数据库最后访问时间标识,单位秒。
BU32 ZHXGUJ; // 数据库最后修改时间标识,单位秒。
BU32 WBWV; // 数据库的表集或表的ID数组在外部硬盘逻辑空间的簇位置。
BU32 QUWV; // 数据库的表集或表的点ID数组在DDR内存的簇位置。
}
表集的子节点是表目录,表目录的子节点是表。一个数据库可有最大4G张表。表的字段数最
大1K,即最大有1K个字段文件;记录行数是动态增长的。创建一个表时;初始会有950272位
图用于记录的描述,可管理到约95万行记录。超过95万行后再申请分配一个新单元。。。
表的节点描述符(文件头)定义: 64Z。
BMT {
BU20Z DXBU; // 表标识。
BU32 FJDHU; // 所属表目录的ID号。
BU32 JDHU; // 所属表目录中本节点的ID号。
BU32 HWBWV; // 描述表的子节点(字段)名字数组在外部硬盘逻辑空间的簇位置。
BU32 HQUWV; // 描述表的子节点(字段)名字数组在DDR内存的簇位置。
BU36Z WJMZ; // 最大36字符的表名与服务器的URL名等。
}
表的唯一标识:
DXBU{ // 表标识
BU48 UJID; // 表的出生时间标识,单位10mS。
BU32 BBID; // 表版本号或种类的细分或进化标识。
BU16 VLID; // 表种类。
BU16 UDDX; // 描述表的初始大小(字段的数目)。
BU16 i_nlink; // 与本表的链接数
BU16 i_count; // 引用计数器
BU16 FWQX; // 描述表的访问权限。
BU16 UID; // 描述表的拥有者标识。
BU16 GID; // 描述表的用户组标识。
BU32 ZHFWUJ; // 表最后访问时间标识,单位秒。
BU32 ZHXGUJ; // 表最后修改时间标识,单位秒。
BU32 WBWV; // 描述表的子节点ID(字段)数组在外部硬盘逻辑空间的簇位置。
BU32 QUWV; // 描述表的子节点ID(字段)数组在DDR内存的簇位置。
}
表、表目录、表集、数据库都是目录。目录的子节点ID数组只有一个簇,所以一个目录最
多有32K项。知道节点ID就能定位到其节点描述符;从而列出目录的所有项。如果知道文件的
路径与名字,.XX1.XX2.XX3.文件名字。则先从根目录找到XX1哈希值相同的子目录,从而找
到子目录的ID。。。其实,先以文件名字在DDR的节点描述符缓存里并行查找是最快的。通常
命中率有99%。
表的子节点ID(字段)数组只有最大1K个字段文件,所以其簇的结构:
BMCJG{
BU4KZ JDZU; // 表的子节点ID(字段)数组(最大1K项)。
BU64Z JDWT; // 管理表下的字段的1K位图,占64Z。
BU1KZ JDWT; // 字段的长度(小于等于254Z字符)与高8位类型。
BU32 BWBWV; // 描述表的记录位图在外部硬盘逻辑空间的起始单元位置。
BU32 BQUWV; // 描述表的记录位图在DDR内存的起始单元位置。
BU956Z BUWV; // 备用
BU58KZ JDWT; // 表的初始记录位图,管理表下的最初950272条记录。
}
字段的数据流结构:
ZDT{
BU20Z DXBU; // 字段标识。
BU32 FJDHU; // 所属数据库中的表节点的ID号。
BU32 JDHU; // 所属数据库中本节点的ID号。
BU32 CUVVB; // 字段数据流的簇指针表的指针。
BU32 KWT; //
BU36Z WJMZ; // 最大36字符的字段名字。
}
字段的唯一标识:
DXBU{ // 字段标识
BU48 UJID; // 字段的出生时间标识,单位10mS。
BU32 BBI; // 字段版本号或种类的细分或进化标识。
BU16 VLID; // 字段所属种类。/打开对象的方式/
BU16 IUDX; // 描述字段的初始大小(字符数)。
BU16 i_nlink;// 与本字段建立链接的文件数
BU16 i_count;// 引用计数器
BU16 FWQX; // 描述字段的访问权限。
BU16 UID; // 描述字段的拥有者标识。
BU16 GID; // 描述字段的用户组标识。
BU32 ZHFWUJ; // 字段最后访问时间标识,单位秒。
BU32 ZHXGUJ; // 字段最后修改时间标识,单位秒。
BU32 WBWV; // 描述字段数据流在外部硬盘逻辑空间的起始簇位置。
BU32 QUWV; // 描述字段数据流在DDR内存的起始簇位置。
}
如果字段的长度小于等于32位或是数值类型,则字段的数据流就是本源。否则,字段的
本源需增加32位哈希值,以加快查询速度。新建一条记录、一个字段、一张表、一个表目
录、一个表目录集、一个数据库、可以说是新建一个对象;其实就是在相应的管理位图查找
一个空位、分配、占用;单周期的汇编指令就搞定了。同理,删除一个对象也是一样。例
如:
新建一张表,有字段1、。。。。
(请您) 新建: 分区.数据库名字.表目录集名字.表目录名字.表名字(字段1,。。)
隐含不用写 谓词 消息内容
客户端程序会分析你的脚本命令字符串把它转换为服务器能懂的消息格式发给服务器进程。
SQL管理者的查询语句:
查询:分区.数据库名字.表目录集名字.表目录名字.表名字(字段名称1,。。。)
条件: XXX;
用星号(*)为从一个表中取出所有的字段。条件XXX是数据必须满足的条件:如对某字
段中为XXX的查询结果进行排序、限制查询结果、计算并命名输出的列值、使用日期、模式匹
配、生成汇总等。
。。。。。。。。待续