专利名称:一种支持iec61850对象查询的sql接口实现方法
技术领域:
本发明属于电网数字化管理领域,提供了支持IEC61850对象查询的声明性SQL查询接口,实现了电网内层次化对象和关系型数据的快速检索和管理。
背景技术:
电网中实时数据的管理是实现电网智能化的关键技术,电网中的实时数据包括了传统的关系型数据和电网管理特有的IEC61850对象类型的数据,对这些数据的管理是指建立一个满足实时性需求的数据管理平台,向用户提供数据检索和数据管理功能,允许用户在高层数据结构上工作。传统的电网数据管理中间件基于关系型和IEC61850对象型的嵌入式实时数据库管理系统,采用跨平台C/C++编程,应用程序通过调用底层C/C++函数接口进行存储管理操作。开发人员需要掌握底层数据存储的实现,了解底层数据存储的细节,编写的应有程序不具备通用性,平台移植困难。传统的电网数据管理中间件对于IEC61850对象型数据的查询没有提供平台级的支持,缺少对IEC61850对象进行查询和管理的通用方法。IEC61850标准允许对象多层嵌套,查询IEC61850对象时需要开发人员指定具体的存储、寻径和遍历方法。传统的电网数据管理中间件缺少统一的查询优化机制,由于采用线性存储方法以及线性查找策略,系统的平均查询时间复杂度为Ο(η) (η为表中记录个数)。在数据量极大的时候会危及到系统的实时特性,因此需要开发人员对每一种数据查询进行单独的优化。
发明内容
本发明的目的是针对传统的电网数据管理中间件系统的不足,对传统的电网数据管理中间件系统进行理论上的规范和功能上的扩展,包括规范了 IEC61850对象的数据模型;利用共享内存实现了主存数据的管理,使用关系型数据字典管理主存数据库的元数据; 在传统SQL语言的基础上根据规范后的IEC61850对象的数据模型扩展出对象查询的SQL 算子,通过声明性语言检索层次化对象;采用改良的内存B+树索引实现了统一的查询优化,并实现了索引对于通用数据类型的支持,提出索引内存管理机制用于快速序列化索引, 降低系统的平均查询开销至0 (logn),提高了 CPU缓存命中率。1.为电网实时数据管理设计了一种支持IEC61850对象查询的数据服务系统,该系统涉及关系型和IEC61850对象型数据的检索和管理、主存管理、针对层次化对象数据检索、对SQL算子的扩充以及为提高检索效率而采取的索引机制。2.规范了 IEC61850对象的层次化树状数据结构和存储方式,根据其结构和存储方式定义了 IEC61850对象的检索和操作方法。3.实现了关系型数据的元数据管理,包括数据字典的的创建、加载和销毁等功能。4.实现了主存管理功能,对于处于不同进程空间内的主存利用映射机制来管理共享内存。
5.扩充了标准SQL算子,使其支持IEC61850对象的表示和对象操作方法的表示。6.实现了支持通用数据类型的主存数据索引,考虑了 CPU缓存级的检索优化,针对系统的主存模型发明了用于快速序列化索引的数据结构。为了实现以上目的,本发明采取以下技术方案,
一种支持IEC61850对象查询的SQL接口实现方法,其特征是,电网系统中包括以下功能模块,
1、数据存储模块根据电网系统中的IEC61850对象建立数据模型,包括数据类型的层次化操作方法和关系型数据的元数据管理;采用数据表的形式存储元数据、配置文件、普通数据和IEC61850对象;利用数据字典实现所述元数据管理,包括向上层调用程序提供的接口和数据字典的加载、卸载及管理功能。系统采用数据表的形式存储元数据、配置文件、普通数据和IEC61850对象,索引将存储在特定的索引结构中。所有数据都存放于系统空间中。2、查询模块为一种支持IEC61850对象查询的数据服务接口,针对IEC61850对象对于现有SQL算子进行扩充,根据所述数据模型建立适用于对象的层次化操作算子;所述现有SQL算子进行扩充采用的分析方法包括使用LEX的词法分析方法和使用YACC的语法分析方法。根据现有的SQL标准算子和针对IEC61850对象操作的扩展算子,使用LEX工具构造词法分析器,使用YACC工具构造语法分析器。使用结果集对象封装系统返回的查询结果,结果集对象提供游标机制,便于调用者检索查询结果。3、主存管理模块为支持对象存储的主存管理模式,采用共享内存的方式实现,包括共享内存的分配、释放和映射以及共享内存的使用和管理;
系统采用共享内存的方式对主存进行管理,主存管理在逻辑上将整个系统划分为系统空间和程序空间。系统空间是一个物理上的连续区域,其逻辑结构由系统内的数据结构所确定,程序如需调用系统空间的数据,需要事先进行注册和链接。4、索引模块为支持通用数据类型的主存索引机制,包括索引的空间管理、一致性维护和提供给所述查询模块的接口。所述索引模块支持索引数据类型和索引数据的分离机制,利用一个数据结构来刻画数据类型和节点类型,支持动态数据类型的索引构建。所述索弓I模块利用索引节点所采用的链接机制。所述索引模块采用B+树作为基本数据结构,支持索引的快速序列化和空间回收
释放管理。考虑到CPU缓存同主存之间的速度差,本发明中的索引将采用B+树作为基本数据结构,并对其进行功能上的改进,包括分离数据类型和数据;实现索引的数据类型无关性从而支持IEC61850对象数据快速检索;构建节点内部数据结构对索引内存进行管理,支持索引的快速序列化(即将树状结构保存至硬盘)和空间回收释放管理。本发明所达到的有益效果
本发明与现有技术相比具有下面的优点 1.提供声明性语言接口访问数据
现有技术提供C/C++接口,要求开发人员掌握底层数据存储的实现,如此编写的应有程序不具备通用性,平台移植困难,且对于IEC61850对象的编程需要手工解析、寻径。本发明通过扩展传统SQL算子提供声明性语言接口访问关系型数据以及IEC61850对象类型数据。声明性接口的优点在于查询接口统一,可以方便地跨平台;查询过程对用户透明,允许用户工作在高层数据结构上;查询返回结果支持过程化语言调用。2.提供多进程空间数据服务
在现有技术中数据管理模块跟应用程序是绑定的,增加新的应用时需要将应用程序同数据管理模块重新联编。本发明通过共享内存的方式将系统进程空间和应用进程空间分离,系统空间负责提供数据服务,不同的应用程序可以使用数据管理系统所提供的服务。3.提供索引机制加速数据检索
传统的数据管理系统没有统一的优化策略,本发明通过索引提供统一的数据优化策略,传统的索引技术不支持动态类型,需要动态内存分配支持。本发明通过一个数据结构实现数据和数据类型的分离,从而实现索引对于任意类型的支持;通过偏移量实现物理上连续的内存的结构化,并模拟出逻辑上的指针进行索弓丨操作。
图1为系统体系结构图,示意系统在内存中的组织结构;
图2为索引插入流程图,示意在索引中插入一个元素的逻辑过程; 图3为索引删除流程图,示意在索引中删除一个元素的逻辑过程。
具体实施例方式下面根据说明书附图对本发明的技术方案进一步详细阐述,包括系统体系结构、 数据字典的管理、共享存储机制、SQL算子的实现、IEC61850对象的查询处理和索引实现机制。1.系统体系结构
系统的体系结构如图1所示,其核心部分是数据字典和索引模块的共享存储机制。数据字典用于描述元数据信息,索引采用独立的数据结构进行描述和管理(详见索引部分的说明)。系统进程和应用程序进程处于不同的进程空间,为了使得各个应用程序能够使用系统提供的数据服务,本发明采用共享存储空间的方式对主存空间进行了管理。2.数据字典
数据字典主要用来管理系统的元数据,本发明中的元数据信息包括系统中每张表的属性,表中每一个属性列的信息和索引信息。数据字典模块对外提供了操作接口,可以方便地对数据字典进行管理,外部函数只需要通过包含diet, h文件就可以调用数据字典提供的操作。元数据是描述整个系统基本信息的数据,数据字典模块作为描述元数据的功能模块, 包含整个系统的全部信息,是本系统中的主管理模块,其功能包括计算系统所需要的共享内存、负责申请和释放共享内存、初始化索引配置信息和索引。(1)数据字典的结构
数据字典包括关系字典,属性字典和索引字典。其中关系字典用于描述表的信息,包括表的ID、表名、表中域的个数、所容纳最多表的个数、更新时间、版本号和数据字典中域名表的偏移量等;属性字典用于描述表的每一个属性的信息,包括所在表的ID、域名表的ID、域名表的域名、域名表域的类型、域名表域的长度、域名表在内存中的偏移量和本域索引的偏移量。索引字典将在索引部分说明。(2)数据字典的管理
数据字典的管理模块包含了多个对数据字典进行操作的函数。使用这些函数,可以获得表的ID、表名、表中域的个数、所容纳最多表的个数、更新时间、版本号、数据字典中域名表的偏移量等表级基本信息;还能获得本域所在表的ID、域名表的ID、域名表的域名、域名表域的类型、域名表域的长度、域名表在内存中的偏移量、本域索引的偏移量等属性级信息。在系统初始化时,数据字典管理模块负责把关系字典、属性字典、索引字典和索引本身加载并映射到共享内存空间中。3.共享存储机制
应用程序拥有独立的进程空间,彼此不能互相访问。为了不同的应用程序能够共享数据字典和索引数据,本发明采取了共享内存的策略为每个索引分配一块共享内存,数据字典分配一块共享内存,如果应用程序需要使用数据字典和索引模块所提供的功能,只需要把该共享内存映射到当前应用的进程空间中去。本发明同时提供了在Windows和LINUX下的共享内存机制实现。(1) Linux下共享内存的实现
Linux下通过mmap系统调用实现共享内存进程首先分配一块共享内存,然后通过 mmap系统调用将共享内存映射到自己的地址空间,即可对共享内存视作当前进程空间中的内存进行操作。共享内存的并发维护由操作系统自动实现,当完成通信之后,所有进程都将脱离共享内存,并且由其中一个进程释放该共享内存块。(2) Windows下共享内存的实现
在Win32平台中,采用内存映射文件的方式来实现共享内存Windows中的内存映射文件机制允许在WIN32进程中保留一段内存区域,可以把文件映射到这段虚拟内存中。因此我们把需要映射到应用进程空间内的数据字典和索引作成目标文件注入到应用进程空间中去。4.支持IEC61850对象的SQL算子扩充 (1) IEC61850对象的数据模型
IEC61850对象采用树状数据结构,除根节点外,每个节点有且只有一个父亲节点,但可以拥有多个子节点,其树状数据结构信息通过表内标识实现。鉴于其存储方式的局限, IEC61850的基本操作包括获取父节点、获取孩子节点个数、获取第一个孩子节点和获取下一个孩子节点。通过这些基本操作,本发明重构出针对IEC61850对象的检索操作,规定了 “向上”和“向下”两种操作方向,规定了 from和to两个起止关键字,这将在扩展的SQL算子中得到体现。(2)实现SQL算子的词法分析模块
本发明采用LEX工具进行词法分析,通过正则表达式识别Token,识别的内容包括输入串中的标识符、整型数字、浮点型数字、字符串和时间日期。词法分析器负责向语法分析器返回识别出的每个TOKEN并给出token的“值”信息。本发明中的关键字信息包括select、 from、where> update、set、and、delete、object up、down、insert、into、values、create、 index、on和drop。其中object、up、down三个关键字是标准SQL所不具备的,在本发明中用于扩展支持IEC61850对象的SQL表示。
(3)实现SQL算子的语法分析模块
本发明采用Bison作为语法分析的工具,语法信息通过BCNF (巴克斯范式)进行描述。 针对数据检索和管理需求,本发明中实现了标准SQL语言的一个子集,并对其进行了支持 IEC61850对象的算子级扩展。采用BCNF对该语言集进行了描述,Bison工具会自动对BCNF 进行解析并形成一颗语法树,树的每一个节点对应着一个操作,当规约至根节点时,语法树便建立完成。(4)针对IEC61850对象的SQL算子扩充
对象查询主要扩充了对象在SQL语言中表示形式和对象操作的方向,对象的路径在 SQL语言中通过“.”给出,其类型通过“”给出,其操作方向有“自上而下”和“自下而上” 两种。其中“down”关键字表示是自上而下查询,“up”关键字表示自下而上的查询,“from” 关键字表示对象路径的起始,“to”关键字表示对象路径的终止。如果某个对象所属的类型唯一则不用指定该类型,否则需要指定该类型。(5) SQL 语句
本发明中的SQL语句包括,查询语句、更新语句、插入语句、删除语句、创建索引语句, 删除索引语句和对象查询语句。查询语句SELECTFIELD_LIST FROM TABLE_NAME WHERE PREDICATE,该语句用于检索由TABLE_NAME指定的表中符合WHERE PREDICATE指定的条件的由FIELD_LIST指定的列。更新语句UPDATETBALE_NAME SET EXPRESSI0N_LIST WHERE PREDICATE该语句用于用EXPRESSI0N_LIST去更新由TABLE_NAME指定的表中符合WHERE PREDICATE条件的元组。插入语句INSERTINTO TABLE_NAME (FIELD_LIST) VALUES (VALUE_LIST)该语句用于向TABLE_NAME指定的表中插入值为VALUE_LIST所描述的具体属性的元组。删除语句DELETEFROM TABLE_NAME WHERE_PREDICATE 该语句用于删除由 TABLE_ NAME指定的表中符合WHERE_PREDICATE指定的条件的元组。创建索引语句CREATEINDEX ON TABLE_NAME (FIELD_NAME)该语句用于在由 TABLE_NAME和FIELD_NAME共同确定的列上创建索引。删除索引语句DR0PINDEX ON TABLE_NAME (FIELD_NAME)该语句用于在由 TABLE_NAME和FIELD_NAME共同确定的列上删除索引。自上而下的对象查询语句Select object down from A:a. B:b. C:c该语句用于自上而下地寻找C类型的对象C。自下而上的对象查询语句Select object up from A: a to D:d该语句用于自下而上地从A类型的对象a寻找其祖辈节点直到D类型的对象d结束。(6) SQL语言的返回结果
本发明使用结果集描述和存储SQL语言的查询返回结果,结果集提供的接口包括返回记录数、返回当前记录的oid、返回当前结果集的tid、读取指定列的值和遍历结果集。5.通用数据类型主存索引
索引提供了效率极高的访问路径,是实时数据处理的关键部分。本发明考虑到实时监控查询频繁修改相对较少的特性,采用B+树作为具体实现索引功能的数据结构,并对其进行了改进。为了支持对象类型的索引,本发明对数据类型和数据进行了分离,为了支持快速序列化,本发明通过内建的数据结构描述索引结构信息。为了支持空间可重用,本发明通过链表实施对节点空间的管理。(1)对通用数据类型的支持
本发明通过TypeClass类来描述索引中的数据类型,以此剥离数据类型和数据。数据类型对上层操作透明,上层操作完全以字节为单位而不管二进制数据的具体语义。对于数据的具体语义,则由TypeClass类型进行解析,其通用类型包括整形、浮点型、字符串型、对象类型和用户自定义类型,TypeClass负责维护复杂数据类型的结构和比较函数。 TypeClass数据结构提供的主要方法有获取和设置当前数据在内存中的位置、获取和设置当前数据的值以及对数据进行比较。(2)快速序列化索引
索引采用的数据结构是树,由于每次加载重新建树的代价较高,本发明实现了一种迅速高效的序列化机制,该序列化机制是内嵌于数据结构的,采用数组结构和相对位移来实现树结构。从物理上看一棵树就是一个大数组,本身就是序列化好的结构,存取时只需要简单的将一整块内存的数据存入磁盘或者将磁盘数据读入一块内存区域;在逻辑上则通过一组函数模拟出节点指针,用以虚拟逻辑上的树。本发明通过额外的结构信息类来维护数据结构,用以支持多进程间的地址映射,在每一个进程空间中都能够准确地读取数据。本发明中的节点通过NodeClass数据结构进行描述,包括节点本指针、父指针、孩子节点指针和指向同一层邻居节点的指针。在物理上这些指针都是偏移量,在逻辑上通过一个指针转换函数将绝对地址转换为指针,通过NodeClass提供的方法,可以获得当前节点的父节点,子节点和邻居节点。(3)索引查询及插入删除过程
本发明的索引采用B+树结构实现,对传统B+树作了一些改进以适应系统需求,在本发明的B+树中,节点为一组单调递增元素,元素由两部分构成,分别是关键字和子指针,叶子节点没有子指针,取而代之的是关键字的oid,也就是最终需要返回的查询结果。除了根之外,每个节点都包含最少L个元素最多U个元素,在本系统中U=2L-1。对于所有内部节点, 子指针的数目等于其元素个数,父亲节点中对应该节点的关键字为该节点的最大值。所有的叶子都在相同的高度上,每次查询都需要查询至叶子节点才会停止。对于相同数据,当作不同的元素来处理,查询时需要在叶子节点中遍历相同元素。叶子节点通过双向链表链接起来,整个链表逻辑上就是一个单调递增的有序队列。头指针为空的则为叶子节点链表的起始节点,尾指针为空的则为叶子节点链表的终止节点。查询以最典型的类似二叉排序树的方法进行,从根开始,找到一个范围值的关键字,然后在其子节点中继续查找,如此迭代, 直到找到符合条件的第一个叶子节点,通过叶子链表的遍历最终返回查询结果。B+树的维护过程如图2和图3所示,在插入和删除元素时根据阈值对B+树的节点进行维护,以确保除了根节点以外,每个节点的个数不多于上限U,不少于下限L。所采取的维护策略则是当由于增加数据而造成节点个数超过上限U的时候,则对节点进行分裂,当由于删减数据而造成节点个数少于下限L的时候,或者移动邻节点的数据填补当前节点的缺额,使得当前节点的个数高于下限L,或者跟邻节点进行合并,但要选择那些合并之后节点个数不能超出上限U的节点进行合并。
图2所示索引的插入过程,系统先根据关键字信息寻找到第一个符合要求的叶子节点,否则返回。如果当前叶子节点中存在空位多于一个则进入插入过程,否则新建一个节点。插入过程首先找到插入位置,如果当前插入的值大于该节点的最大值,则需要递归地调整父亲节点的最大值,此时如果没有新建节点,则插入过程终止,整个插入完成。如果有新建节点,需要分裂当前节点,分裂过程把当前节点分裂至新建节点,然后从新建节点中提取其最大值作为新元素,插入其父节点中,迭代这个过程直到根节点。如果根节点需要分裂, 则新建一个节点当做根节点。图3所示索引的删除过程,系统首先根据关键字信息寻找到第一个符合要求的叶子节点,然后再叶子节点中定位到元素i,如果没有这个元素,则删除失败,否则进入删除流程。如果该元素是树根中的唯一元素,则删除根节点,删除过程终止,否则进入一般删除过程,一般删除过程首先确定到待删元素,然后先删掉找到的元素。如果删除的是节点最后一个元素,需要调整父节点元素,如果删除之后的元素数目大于设定的最小阈值,则删除过程结束,否则,需要启动合并过程,合并过程首先找到待合并节点combine。如果待合并节点 combine内元素数目大于阈值,则从中移动一个元素到被删节点,保持平衡,删除结束,否则需要合并两个节点,合并节点后从其父节点中删除被合并节点,此时启动迭代过程删除父节点中的一个元素,直至根节点。(4)索引节点空间回收
索引在删除、合并的过程中会出现空闲节点,本发明利用一个空闲节点链表存储这些空闲节点,以备节点分裂之用。系统提供分配、释放空闲节点的方法=GetNewNode用于获取一个空闲节点,如果当前的空闲节点链表上存在空闲节点,则该方法取出第一个空闲节点返回,并调整空闲节点链表的首指;如果空闲节点链表为空,则从当前索引的后部返回一个空节点。如果后续空间不够则返回NULL。FreeNode方法用于释放一个指定节点node,将该节点中的信息清空,再将其加入空闲节点链表中供随时调用。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
权利要求
1.一种支持IEC61850对象查询的SQL接口实现方法,其特征是,电网系统中包括以下功能模块,数据存储模块根据电网系统中的IEC61850对象建立数据模型,包括数据类型的层次化操作方法和关系型数据的元数据管理;采用数据表的形式存储元数据、配置文件、普通数据和IEC61850对象;查询模块为一种支持IEC61850对象查询的数据服务接口,针对IEC61850对象对于现有SQL算子进行扩充,根据所述数据模型建立适用于对象的层次化操作算子;主存管理模块为支持对象存储的主存管理模式,采用共享内存的方式实现,包括共享内存的分配、释放和映射以及共享内存的使用和管理;索引模块为支持通用数据类型的主存索引机制,包括索引的空间管理、一致性维护和提供给所述查询模块的接口。
2.根据权利要求1所述的一种支持IEC61850对象查询的SQL接口实现方法,其特征是,利用数据字典实现所述元数据管理,包括向上层调用程序提供的接口和数据字典的加载、卸载及管理功能。
3.根据权利要求1所述的一种支持IEC61850对象查询的SQL接口实现方法,其特征是,所述现有SQL算子进行扩充采用的分析方法包括使用LEX的词法分析方法和使用YACC 的语法分析方法。
4.根据权利要求1所述的一种支持IEC61850对象查询的SQL接口实现方法,其特征是,所述索引模块支持索引数据类型和索引数据的分离机制,利用一个数据结构来刻画数据类型和节点类型,支持动态数据类型的索引构建。
5.根据权利要求1所述的一种支持IEC61850对象查询的SQL接口实现方法,其特征是,所述索引模块利用索引节点所采用的链接机制。
6.根据权利要求1所述的一种支持IEC61850对象查询的SQL接口实现方法,其特征是,所述索引模块采用B+树作为基本数据结构,支持索引的快速序列化和空间回收释放管理。
7.根据权利要求1所述的一种支持IEC61850对象查询的SQL接口实现方法,其特征是,使用结果集对象封装系统返回的查询结果,结果集对象提供游标机制,为调用者检索查询结果。
全文摘要
本发明公开了一种支持IEC61850对象查询的SQL接口实现方法,电网系统中包括以下功能模块,数据存储模块根据电网系统中的IEC61850对象建立数据模型;查询模块针对IEC61850对象对于现有SQL算子进行扩充,根据所述数据模型建立适用于对象的层次化操作算子;主存管理模块为支持对象存储的主存管理模式,采用共享内存的方式实现,包括共享内存的分配、释放和映射以及共享内存的使用和管理;索引模块包括索引的空间管理、一致性维护和提供给所述查询模块的接口。本发明提供了支持IEC61850对象查询的声明性SQL查询接口,实现了电网内层次化对象和关系型数据的快速检索和管理。
文档编号G06F17/30GK102163232SQ20111009623
公开日2011年8月24日 申请日期2011年4月18日 优先权日2011年4月18日
发明者张海滨, 张进伟, 朱广蔚, 潘洪湘, 秦小麟, 郑桂能 申请人:南京航空航天大学, 国电南瑞科技股份有限公司