一种利用定长字段优化迭代查询的方法

文档序号:6609717阅读:622来源:国知局
专利名称:一种利用定长字段优化迭代查询的方法
技术领域
本发明涉及使用数据库(DBMS)进行数据管理的应用领域,特别是 大型的关系数据库管理系统,例如Sybase, oracle, mssql等等。
背景技术
查询是数据库中使用最频繁的操作,所以对于一个数据库应用系统来 说,用户最关心的就是查询效率问题。在电信网络管理系统中,为了满足 用户大数据量查询需求釆用了迭代查询的方式。迭代查询的基本思想是将一个非常大的结果集分批返回,避免一次 性获取数据过多造成内存处理困难甚至系统崩溃。迭代器是迭代查询过程 中使用的一种数据结构,其中保存了符合条件的总的记录条数、每次获取 的记录条数、已经查询的次数和剩余查询次数等等。迭代查询的具体方案如下1) 设置迭代器,并将所有符合条件的记录提取出来放入一个临时表 或内存中;2) 每次查询时,根据已经查询的次数和每次查询的记录条数计算出 本次查询的起始位置和结束位置;3) 如果是存放在临时表中,则每次查询时打开临时表并定位到本次 查询的起始位置,然后逐条读取记录直至结束位置;如果是存放在内存中, 则直接取出本次查询需要的记录即可;4) 更新迭代器并查看迭代器中剩余查询次数,如果已为0,则清除 迭代器,查询过程结束,否则开始下一次查询。结合图1所示,主要步骤包括
步骤IOI,业务模块获取迭代器;步骤102,迭代器容器分配迭代器;步骤103 ,将数据库表中的数据提取到临时表或内存中;步骤104,从临时表或内存中迭代获取数据库记录。上述查询方案存在一定的缺陷,如果将符合条件的记录放在临时表 中,则每次查询都要重新打开记录集并执行若干次NextRow操作定位到 本次查询的起始位置,这显然对查询效率造成很大的影响,而且随迭代次 数的增加查询时间也成倍增长;如果放在内存中,虽然可以节省这部分时 间开销,但当查询数据量大时会占用大量的内存空间,甚至可能导致内存 溢出。发明内容本发明所解决的技术问题在于提供一种利用定长字段优化迭代查询 的方法,以优化目前广泛使用的迭代查询方法,解决用户在进行大数据量 查询时无法获得较快的查询速度,并且会耗费大量内存等问题。为了解决上述问题,本发明提供了一种利用定长字段优化迭代查询的 方法,其特征在于,包括以下步骤(1)在数据库表中设置一个定长的主键字段;(2 )根据具体要求从数据库中取出所有符合条件的记录的主键字段 的值并保存在一个磁盘文件中;(3) 设置迭代器,并通过迭代器对数据库表进行分批查询,查询过 程中通过读取》兹盘文件中的主4走字段的值来构造SQL语句;(4) 迭代查询完成后,删除所述迭代器和保存在磁盘文件中的值。 本发明所述的方法,其中,所述步骤(2)为根据网管系统的具体要求构造SQL语句从数据库中取出所有符合条 件的记录的主键字段的值,并按照二进制方式保存在一个磁盘文件中。其中,所述步骤(3)包括(31) 设置迭代器,并通过迭代器获取每次查询的记录条数N,计算出本次查询的起始记录编号,根据所述定长的主键字段,所述起始记录编号直接定位到磁盘文件中对应主键字段的值的位置,顺序读取N个主键 字段的值;(32) 使用获取到的主键字段的值构造SQL语句;(33) 执行构造好的SQL语句,获取本次查询的记录集,并更新迭代器;(34) 重复步骤(31)到(33)分批查询获取记录,直到迭代器中剩 余迭代次数为0。上面所述的方法,其中,所述SQL语句,其中的where子句采用所 述主键字段的名称in (主键l,主键2…主键N)的方式构造。其中,所述步骤(4)包括(41) 迭代查询完成后,删除所述迭代器;(42) 删除步骤(2)中创建的以二进制方式保存在磁盘文件中的主 键字段的值。本发明所述的方法,其中,步骤(l)中所述数据库表为历史告警表。 其中,所述二进制为,file方式的二进制。本发明所述的方法,其中,步骤(3)中所述迭代器,为数组型迭代 器或者链表型迭代器。本发明与目前迭代查询方法相比具有以下优点.1 )每次查询只获取本批需要的记录,避免多余的NextRow才喿作,查 询速度快;2) 采用定长主键字段,文件定位速度快;3) 仅仅将主键值保存在磁盘文件中,节省程序内存。同时,本发明没有引入各种大型数据库的差异性,能满足各种大型数 据库应用系统中的查询需求。


图1是现有技术的迭代查询方法流程图2是本发明实施例所述的一种利用定长字段优化迭代查询的方法 流程图3是本发明实施例所述的电信网络管理系统中的历史告警表利用 定长字段优化迭代查询的方法流程图。
具体实施例方式
本发明的目的是介绍一种利用定长字段优化迭代查询的方法,优化目 前广泛使用的迭代查询方法,使得用户在进行大数据量查询时能获得较快 的查询速度,且不会耗费大量内存。以下对具体实施方式
进行详细描述, 但不作为对本发明的限定。
如图2所示,本发明所述的迭代查询方法操作步骤如下
步骤201,在表中加入一个定长的主键字段,用来唯一标识一条记录;
步骤202,从数据库中取出所有满足条件的记录的主键字段值并保存 在一个》兹盘文件中;
步骤203,设置迭代器,并使用迭代器进行分批查询;
步骤204,迭代查询完成,删除迭代器和保存主4定值的二进制文件。
上述方法所述的系统中应该定义一个全局的迭代器池,可以为数组或链表。
需要使用迭代器时,如果是数组,就从全局迭代池中取一个空闲结点 并初始化各分量。如果是链表,则创建一个迭代器结点并插入到全局迭代 器链表中
删除迭代器时,如果系统使用的是数组,将本次使用的迭代器各个分 量清0即可。
如果使用的是链表,则从链表中删除该迭代器结点。
所述方法,其中方法所述步骤203中设置迭代器,并使用迭代器进行 分批查询,包括以下几个步骤
3.1) 通过迭代器获取每次查询的记录条数N,并计算出本次查询的 起始记录编号。因为采用了定长的主键字段,所以可以根据起始记录编号 直接定位到文件中对应主键的位置,顺序读取N个主键值;
3.2 )使用获取到的主键值构造sql语句,sql语句的where子句采用主 键名称in(主键l,主键2…主键N)的方式构造;
3.3) 执行构造好的sql语句,获取本次查询的记录集,并更新迭代器;
3.4) 重复步骤3.1)到3.3)分批获耳又记录,直到迭代器中剩余迭代 次数为0。
所述方法,其中方法所述步骤204中迭代查询完成,删除迭代器和保 存主键值的二进制文件,包括以下几个步骤
4.1 )根据迭代器id从全局迭代器緩冲池中查找并删除本次使用的迭 代器结点 ,
4.2) 删除步骤2)中创建的保存主4建值的二进制文件。
下面实施例以电信网络管理系统中的常见表一一 "历史告警"为例, 结合图3详细说明本发明优化后的迭代查询的步骤。
1、 创建一个历史告警表HistoryAlarm,表中包括一个id字段,并在 该字段上建立索引或者将该字段作为主键。
2、 从数据库中获取所有符合条件的记录并存放在磁盘文件中。
2.1 )根据网管系统具体应用要求构造查询历史告警表的where条件, 然后通过where条件构造sql语句查询符合条件的记录的id信息。
2.2)将步骤1)中查询出来的id信息按照二进制方式写入文件中, 因为id的长度一定,所以每个值在二进制文件中占用相同的字节数。具 体实现中采用FILE方式打开二进制文件,因为如果采用fstream方式打开 二进制文件写入速度会慢很多。
3、 设置迭代器,并使用迭代器进行分批查询
3.1) 从迭代器中获取本次查询的记录个数N并计算出获取本次查询 的开始位置;
3.2) 以只读方式打开保存id信息的二进制文件;
3.3 )根据步骤3.1)中获取的本次查询开始位置和主键字段的长度计 算出本次查询所需主键在文件中的起始位置;
3.4) 根据步骤3.3)计算出来的文件起始位置定位二进制文件到指定 id,然后顺序读取N个id值;
3.5) 使用步骤3.4)获取到的id构造如下sql语句
select * from History Alarm where id in (id—1,id一2,id一3.. .id—N)
3.6) 使用构造好的sql语句打开结果集获取本次查询的记录;
3.7) 按照上述步骤分批获取历史告警数据,直到迭代器中剩余查询 次数为0。
4、根据迭代器id号删除迭代器。
5 、删除保存历史告警表主键值的二进制文件。
按照本发明所述的迭代查询方法,应用于电信网络管理系统历史告警 查询。与普通的迭代获取方式相对比,在查询20万条记录的时候效率提 高2倍,在数据量达到百万以上的时候可以提高几十倍,数据量越大的时 候效率提高越明显。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质 的情况下,熟悉本领域的技术人员可根据本发明做出各种相应的改变和变 形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
权利要求
1、一种利用定长字段优化迭代查询的方法,其特征在于,包括以下步骤(1)在数据库表中设置一个定长的主键字段;(2)根据具体要求从数据库中取出所有符合条件的记录的主键字段的值并保存在一个磁盘文件中;(3)设置迭代器,并通过迭代器对数据库表进行分批查询,查询过程中通过读取磁盘文件中的主键字段的值来构造SQL语句;(4)迭代查询完成后,删除所述迭代器和保存在磁盘文件中的值。
2、 如权利要求l所述的方法,其特征在于,所述步骤(2)为根据网管系统的具体要求构造SQL语句从数据库中取出所有符合条 件的记录的主键字段的值,并按照二进制方式保存在一个磁盘文件中。
3、 如权利要求2所述的方法,其特征在于,所述步骤(3)包括(31) 设置迭代器,并通过迭代器获取每次查询的记录条数N,计算 出本次查询的起始记录编号,根据所述定长的主键字段,所述起始记录编 号直接定位到磁盘文件中对应主键字段的值的位置,顺序读取N个主键 字段的值;(32) 使用获取到的主键字段的值构造SQL语句;(33) 执行构造好的SQL语句,获取本次查询的记录集,并更新迭代器;(34) 重复步骤(31 )到(33)分批查询获取记录,直到迭代器中剩 余迭代次^:为0。
4、 如权利要求2或3所述的方法,其特征在于,所述SQL语句,其 中的where子句采用所述主键字段的名称in (主键1,主键2...主键N)的方式构造。
5、 如权利要求3所述的方法,其特征在于,所述步骤(4)包括(41) 迭代查询完成后,删除所述迭代器;(42) 删除步骤(2)中创建的以二进制方式保存在^f兹盘文件中的主 键字段的值。
6、 如权利要求1所述的方法,其特征在于,步骤(1 )中所述数据库 表为历史告警表。
7、 如权利要求2所述的方法,其特征在于,所述二进制为,file方式 的二进制。
8、 如权利要求1所述的方法,其特征在于,步骤(3 )中所述迭代器, 为数组型迭代器或者链表型迭代器。
全文摘要
本发明公开了一种利用定长字段优化迭代查询的方法,包括(1)在数据库表中设置一个定长的主键字段;(2)根据具体要求从数据库中取出所有符合条件的记录的主键字段的值并保存在一个磁盘文件中;(3)设置迭代器,并通过迭代器对数据库表进行分批查询,查询过程中通过读取磁盘文件中的主键字段的值来构造SQL语句;(4)迭代查询完成后,删除所述迭代器和保存在磁盘文件中的值。本发明以优化目前广泛使用的迭代查询方法,解决用户在进行大数据量查询时无法获得较快的查询速度,并且会耗费大量内存等问题。
文档编号G06F17/30GK101149738SQ20071011063
公开日2008年3月26日 申请日期2007年6月6日 优先权日2007年6月6日
发明者鲁春怀 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1