具体实施方式
为了使本技术领域的人员更好地理解本发明实施例的方案,下面结合附图和实施方式对本发明实施例作进一步的详细说明。
参照图1是本发明方法的总体流程图,包括如下步骤:
步骤101,将电网模型沿时间轴的变动划分为若干个连续的状态断面(即状态断面链),在每个状态断面中以增量的形式记录该断面中新建、修改和删除的电网模型的图形拓扑和属性。状态断面可以是每次对电网模型的修改(例如新建一档线路或者拆除一个杆塔),也可以是每个工程投产(包含多个设备的新建、修改或者删除),还可以是以天、周或者月等时间为单位、累计该时间范围内的所有修改。
1、电网状态断面的定义
电网状态断面的划分,参照图2是本发明实施例以状态断面方式记录电网模型修改过程的原理图,其中图2a)所示,电网模型的修改历史过程从初始状态断面1开始,每次对电网模型的修改都被记录在一个状态断面中,依次为状态断面2、3。。。n-3、n-2、n-1、n、n+1、n+2。例如在状态断面n-1的基础上,电网模型修改集合n就保存在状态断面n中。图2b)所示,电网模型的修改是采用增量记录的形式保存在电网模型数据表中。例如修改集合n的各条记录是记录在状态断面n中。
2、版本化电网模型的数据库表设计
参照图3本发明实施例数据库表设计的原理图,将电网模型对象划分为图形拓扑对象和属性对象两部分,分别存储于图形拓扑表和属性表。其中图形拓扑表存储电网模型的图形位置、图形属性和拓扑连接属性,属性表存储其他属性信息。对于每个电网模型对象的一次编辑操作,图形拓扑表和属性表中各保存了一条记录,分别记录对图形拓扑和属性的修改,两条记录的状态断面内码相同。
状态断面表记录了每个电网状态断面的状态断面内码、名称、前一状态断面内码,即图2中的状态1、状态n-2、状态n-1、状态n等分别对应于该表的一条记录。状态断面内码唯一标识了该状态断面,是表的主键,也是图形拓扑表和属性表的外键。
图形拓扑表的各个字段定义如下:图形表内码是电网模型的图形对象的唯一编码,状态断面内码是该电网模型对象发生新建、修改或者删除操作所处的状态断面的唯一编码。一个电网对象在几个状态断面中被修改,这个表中就存在对应的几条记录。图形表内码和状态断面内码组成联合主键,用于唯一表示本次修改。属性表内码是指向关联的属性表记录的外键。
属性表的各个字段定义如下:属性表内码是电网模型的属性对象的唯一编码,状态断面内码是该电网模型对象发生新建、修改或者删除操作所处的状态断面的唯一编码。一个电网对象在几个状态断面中被修改,这个表中就存在对应的几条记录。属性表内码和状态断面内码组成联合主键,用于唯一表示本次修改。
修改字段表示该条记录在状态断面中的修改方式,具体含义如下表所示。其中共有6种不同的状态值,用数值来区分,也可以用字符串来表示,用数值表示的系统性能比字符串高。
3、电网状态断面在数据库中的存储
参照图4实施例状态断面方式存储的示意图,是一个假设的场景,用来描述状态断面存储方式的示例。在这个场景中,假定电网模型在5天中经过5次修改,每一天进行了一次修改,每次修改保存于当天的断面中。图3a)是每次修改的内容,每个图框中是当天修改后的结果。图3b)是在电网模型数据表中的记录内容,该数据表包括对象内码、状态断面内码、修改标志和对象属性。其中,对象内码和状态断面内码组成联合主键,修改标志用来区分新增、修改和删除。需要指出的是,这个数据表是用于原理示意性的,对于电网GIS系统而言,这个数据表具体对应了图形表、拓扑表和属性表,每个表都具有对象内码、状态断面内码、修改标志和其他属性字段。
第一天,新增对象A,保存于状态断面n-2中。在电网模型数据表中,增加了一条记录(A,n-2,新建,属性),其中A是对象内码,n-2是状态断面内码,修改标志是新建。
第二天,新增对象B,保存于状态断面n-1中。在电网模型数据表中,增加了一条记录(B,n-1,新建,属性),其中B是对象内码,n-1是状态断面内码,修改标志是新建。
第三天,新增对象C,保存于状态断面n中。在电网模型数据表中,增加了一条记录(C,n,新建,属性),其中C是对象内码,n是状态断面内码,修改标志是新建。
第四天,修改对象A,删除对象B,新增对象D,保存于状态断面n+1中。在电网模型数据表中,增加了三条记录。第一条记录(A,n+1,修改,新属性),表示对象A在状态断面n+1中被修改为新属性。第二条记录(B,n+1,删除)表示对象B在状态断面n+1中D。
第五天,修改对象A,修改对象D,保存于状态断面n+2中。在电网模型数据表中,增加了两条记录。第一条记录(A,n+2,修改,新属性),表示对象A在状态断面n+2中再次修改。第二条记录(D,n+2,修改,新属性)表示对象D在状态断面n+2中被修改成新属性。
步骤102,加载从起始断面到结束断面的电网模型数据。这个过程由查找基线索引表和创建增量索引表,从索引表加载图形拓扑表和属性表等处理过程组成。
1、基线索引表和增量索引表的数据库库设计和示例
参照图5是本发明实施例基线索引表和增量索引表的原理图,由“基线索引总表”、“增量索引总表”和“索引分表”组成。“基线索引总表”是基线索引的总表,“增量索引总表”是增量索引的总表,“索引分表”是具体的每个基线索引和增量索引的记录集合。
基线索引是记录从初始状态断面(内码为1)到经常访问状态断面的(对象内码,状态断面内码,修改标志)的索引字段组列表。基线索引是定期自动或者人工请求生成的,例如每日、每周或者每个月生成一次。
增量索引是对于最后一个基线状态断面之后的数据加载,以及相邻基线状态断面间的数据加载,动态创建从最近基线状态断面到待加载状态断面的增量形式的主键索引表,形式也是(对象内码,状态断面内码,修改标志)的索引字段组列表。
在图5的示例中,具有1个基线索引和2个增量索引。
“基线1”是从“初始断面1”到“结束断面n”的所有有效对象的列表,即包含3条记录,(A,n-2,新建)、(B,n-1,新建)、(C,n,新建)。
“增量1”是从“状态断面n(不包含)”到“状态断面n+1”之间所有有效对象的列表,即包含在状态断面n+1中的三条修改记录,(A,n+1,修改),(B,n+1,删除),(D,n+1,新建)。
“增量2“是从“状态断面n(不包含)”到“状态断面n+2”之间所有有效对象的列表,即包含在状态断面n+1和状态断面n+2中的三条修改记录,(A,n+2,修改),(B,n+1,删除),(D,n+2,修改)。由于A分别在n+2的修改晚于在n+1的修改,因此增量索引记录的是A在n+2的修改,而不是A在n+1的修改。同理,增量索引记录的是D在n+2的修改,而不是D在n+1的新建。
2、加载过程的原理
在加载电网模型的图形拓扑表和属性表时,先查找可以使用的基线索引表,如果刚好匹配就直接使用基线索引表,否则就在基线索引表的基础上执行增量查询、生成增量索引表;然后用索引表与图形拓扑表和属性表进行联合,快速定位到需要的图形和属性表记录。
参照图6是本发明实施例从基线索引表和增量索引表联合进行加载的流程图,主要步骤包括:
步骤10,开始加载过程,输入待加载的开始状态断面内码(StartStateID)和结束状态断面内码(EndStateID);
步骤20,判断是否是从起始断面开始加载。如果开始状态断面内码为1(即StartStateID==1?),就是表示从最开始的断面加载,这样就能够和某一个基线状态断面匹配;
步骤30,查找基线索引总表,比较起始断面内码值,找到小于待加载的开始断面内码值的最大的基线索引。如果没有找到,转步骤50),构造增量索引表。如果找到,转步骤40);
步骤40,找到基线索引后,把基线索引表内码值保存于BaseCacheID中,用于步骤60)和步骤80)的查询;把基线索引的结束状态断面内码保存于BaseEndStateID中;
步骤50,从待加载开始状态断面(StartStateID)或者已经找到的基线断面结束状态的下一个状态(BaseEndState+1)开始,直到加载结束状态断面内码(EndState ID)构造增量索引表。索引表的内码保存于DeltaCacheID中。如果EndStateID等于BaseEndStateID,则基线索引表即能够满足加载要求,忽略该步骤,不需要增量索引表;
步骤60,构造SQL语句,将图形拓扑表和索引分表进行联合,联合的条件为“图形拓扑表的图形内码=索引分表的对象内码”并且“图形拓扑表的状态断面内码=索引分表的状态断面内码”并且“索引分表的基线或者增量索引内码等于BaseCacheID或者DeltaCacheID”;
步骤65,按照图形表内码递增排序,按照状态断面内码递减排序,确保对于每个图形对象而言,时间排在后面修改记录先出现、覆盖时间排在前面的修改记录;
步骤70,循环加载图形拓扑表和索引分表的联合记录集,对于每个图形内码,只加载第一个有效的记录。如果每个图形内码的第一条记录是新建或者修改,加载该记录;如果修改标志为“删除”,图形内码对应的记录已经被删除,不需要加载。如果修改标志为“临时”(4)或者“待修改”(8),该记录为无效记录,则忽略;
步骤80,构造SQL语句,将属性表和索引表进行联合,类似于步骤60)的处理过程,区别是联合条件为将“索引表的属性表内码”等于“属性表的属性表内码”,并且“索引表的状态断面内码”等于“属性表的状态断面内码”进行联合。为了清晰起见,图5的索引分表中未标识出属性对象内码;
步骤85,按属性表内码递增排序,按状态断面内码递减排序,确保对于每个属性对象而言,时间排在后面修改记录先出现、覆盖时间排在前面的修改记录;
步骤90,循环加载属性表和索引分表的联合记录集,处理方式类似与步骤70)。
3、构造基线索引表的处理过程,参照图7是本发明实施例查找或者新建基线索引的流程。
步骤10,输入状态断面序列内码(StateLineageID)、结束状态断面内码(StateID)。从状态断面序列内码(StateLineageID)能够查询到从初始状态断面(1)一直到结束状态断面(StateID)的所有的状态断面内码;
步骤20,调用检查基线总表的函数,根据结束状态断面内码查找是否存在匹配的基线,将查找到的基线内码保持于ExistCacheID中;
步骤30,检查ExistCacheID是否为0。如果为0,表明没有找到已经存在的基线索引,转步骤40,新建基线索引。如果不等于0,表明已经存在基线索引,转步骤80;
步骤40,通过Sequence分配新的基线索引表内码,保存于NewCacheID变量中。
步骤45,在基线总表中插入新的记录,索引内码为NewCacheID,结束断面内码为StateID,表示本次新建的基线。
步骤50,检查是否在基线总表产生了重复主键的异常。因为可能有多个用户同时访问数据库,请求创建相同的基线索引。在基线索引总表中,结束状态断面内码是作为唯一值索引(UniqueIndex),因此只有第一个人在步骤45)中能够插入新的记录,后续的插入操作将产生异常。如果产生异常,转步骤60),否则转步骤70)
步骤60,插入基线总表产生了异常。调用检查基线总表的函数,再次查找是否存在匹配的基线,将返回值保存于ExistCacheID中。
步骤65,检查ExistCacheID是否等于0。如果是等于0,转步骤85)出错处理,否则转步骤80)。
步骤70,调用插入基线索引分表的函数(见下面的“4插入基线索引分表的处理过程”),从初始状态断面(1)到结束断面(EndState)中有效的对象的(图形对象内码,状态断面内码,修改标志)字段组插入索引分表中。
步骤75,在基线索引总表中记录构造索引表的花费时间和索引分表中的记录数目,这些值将用于对索引表性能的分析。
步骤80,基线索引已经存在,不需要创建,把找到的基线索引内码ExistCacheID保存于CacheID中。
步骤85,出错处理,设置CacheID等于0,表示无效的索引。
步骤90,设置CacheID等于NewCacheID。
步骤100,把CacheID作为返回值,该值为新建或者查找的基线索引的内码。
4、插入基线索引分表的处理过程,该流程用于插入基线索引分表的处理过程,输入参数为状态断面链内码(StateLineageID)、起始状态断面内码(StartStateID)、结束状态断面内码(StateID)、基线或者增量索引内码(CacheID)。
步骤10,构造SQL语句,将图形拓扑表和状态断面链表进行联合,联合条件为图形拓扑表的状态断面内码(STATE_ID)等于状态断面链表的状态断面内码(STATE_ID),并且状态断面链内码等于StateLineageID,并且状态断面内码大于StartStateID且小于等于StateID;
步骤20,按图形内码递增、状态断面内码递减排序,确保相同图形内码的记录,对应后面状态断面的记录先加载;
步骤25,初始化上次访问的图形对象内码LastGID为空;
步骤30,对SQL查询结果的记录集进行循环;
步骤40,忽略修改标志为4(临时)和8(待修改)的记录,继续循环;
步骤50,判断LastGID为空或者当前记录的图形内码不等于LastGID,如果条件为假,转步骤70;
步骤60,把该记录的(索引内码CacheID、图形内码G_ID、状态断面内码STATE_ID,修改标志FLAGS、属性表内码DEV_ID)字段组写入索引分表中;
步骤65,记录LastGID等于当前记录的图形内码,确保一个图形内码只插入第一条有效的记录;
步骤70,继续步骤30的循环;
本发明利用基线索引和增量索引大幅度优化加载速度的原理,本发明在两个方面大幅度优化的加载速度:
1、定期为经常访问的状态断面(即基线状态断面)创建电网模型数据记录的主键索引表(即基线索引表),在加载时用对该索引表的单次遍历扫描取代对从初始状态断面到待访问断面的多次遍历扫描,使扫描时间基本等于常量。
以加载从状态断面1到状态断面n为例,如果没有基线索引表,加载时将遍历从状态断面1到状态断面n的所有修改记录。假如数据库中一共有m个对象,在极端情况下从状态断面1到状态断面n中每个断面都修改一次,一共就有m×n条记录需要遍历。也就是说,每加载一次,都需要遍历m×n条记录。如果使用了预先生成好的基线索引,由于基线索引对于每个对象只记录最后一次的修改断面值,因此只有m条记录需要遍历,I/O访问量只有全部遍历的1/n,因此大幅度减少遍历的I/O访问量。并且n值越大,即电网修改的次数越频繁,优化提升的幅度越大。
2、采用基线索引和增量索引合并的方式,处理基线以后的数据加载,能够重复利用基线带来的固定扫描量的性能提升。对于在查找对于最后一个基线状态断面之后的数据加载,以及相邻基线状态断面间的数据加载,动态创建从最近基线状态断面到待加载状态断面的增量形式的主键索引表(即增量索引表),在加载时扫描基线索引表和增量索引表合并后的主键集合。根据电网修改的变化频度,可以每日、每周或者每月生成基线。例如对于配电网GIS系统,可以每日晚上自动生成基线,这样加载今日或者以前任何一天的数据都可以在前一日基线的基础上,访问当天的增量索引即可。对于输电网GIS系统,由于变动较为缓慢,可以每月最后一天晚上自动生成基线,这样加载历史上任何一天的数据都可以在前一月基线的基础上,访问当月的增量索引即可。
以上对本发明实施方式进行了详细介绍,本文中应用了具体实施方式对本发明进行了阐述,以上实施例的说明只是用于帮助理解本发明的系统及方法;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。