具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本发明实施例提供了一种IP区间查找装置,该装置可以通过计算机设备实现其功能。
图1是根据本发明实施例的IP区间查找装置的示意图。如图1所示,该IP区间查找装置包括第一获取单元10、第二获取单元30和查找单元50。
第一获取单元10用于获取用于进行IP区间查找的多个IP地址。
IP区间查找可以是用于查找IP地址所在的区间,由于IP地址的总个数为固定值,通常一段IP区间对应一段地理信息。例如,北京的IP地址分布在IP区间A中,上海的IP地址分布在IP区间B中,当对IP地址进行区间查找时,如果确定IP地址在IP区间A中时,则可以确定该IP地址对应的用户在北京市。对IP地址进行区间查找是通过IP数据库对IP地址进行查找,将IP地址与IP数据库中的IP区间进行匹配。当有多个IP地址进行IP区间查找时,获取该多个IP地址,以便于对该多个IP地址进行IP区间查找。
第二获取单元30用于获取多个IP地址的统计信息,统计信息包括多个IP地址中IP地址的数量。
在获取到多个IP地址之后,获取该多个IP地址的统计信息,其中,该统计信息可以是预先建立的统计信息。该统计信息包括多个IP地址的IP地址的数量。从该统计信息中可以得到IP地址的数量。例如,将获取到的多个IP地址放置于IP列表中,在执行IP区间查找时,可以先获取该IP列表需要进行查询的IP语句相关列的统计信息,以得到需要进行IP区间查找的IP地址的个数。
查找单元50用于基于IP地址的数量采用多个匹配条件同时对多个IP地址执行IP区间查找,其中,多个匹配条件为用于对多个IP地址执行IP区间查找的条件。
在获取到多个IP地址的统计信息之后,IP数据库可以基于该统计信息中的IP地址的数量通过优化引擎生成快速查找计划,即,采用多个匹配条件同时对IP地址进行查找匹配,减少匹配的次数。其中,匹配条件可以是IP区间对应的值,例如,IP区间为0.0.0.1~1.0.0.0,则0.0.0.1和1.0.0.0对应的值可以作为匹配条件,用于判断IP地址是否处于该区间内。由于在现有技术中,IP数据库不知道IP地址的数量,在执行区间查找时,会将IP地址与IP区间的每一个界限值进行匹配判断,例如,在查询区间值(ip between beginIp and EndIp)时,首先从IP数据库的IPLocation表中为driver表里的每一行查找出IP>=BeginIp的所有行(SeekPredicates),再从查找出来的所有行进行筛选比较IP<=EndIP(Predicate),这样会导致筛选查询的数据量特别大。
本发明实施例中,通过将IP地址的统计信息传输给优化引擎,使得优化引擎得知IP地址为多个,则将IP地址与多个匹配条件进行匹配,在查找时的Seek条件为IP>=BeginIP and IP<=EndIP,从而减少查找匹配的次数,提高了IP地址区间查找的速度。
根据本发明实施例,通过获取多个IP地址的统计信息,统计信息包括多个IP地址中IP地址的数量,基于IP地址的数量采用多个匹配条件同时对多个IP地址执行IP区间查找,解决了对IP区间匹配的速度慢的问题,达到了提高IP地址区间查找的速度的效果。
需要说明的是,本发明实施例中,用于进行IP地址区间查找的数据库可以采用SqlServer数据库,也可以采用其他数据库。本发明实施例的IP区间查找也可以用于对值的区间查找。
图2是根据本发明实施例优选的IP区间查找装置的示意图。该实施例的IP区间查找装置可以作为上述实施例的IP区间查找装置的一种优选实施方式。如图2所示,该IP区间查找装置包括第一获取单元10、第二获取单元30和查找单元50。其中,查找单元50包括确定模块501、建立模块503和第一查找模块505。
确定模块501用于从统计信息确定多个IP地址中IP地址的数量。
建立模块503用于当多个IP地址中IP地址的数量大于1时,建立所有IP区间对应的值的临时表。
第一查找模块505用于通过临时表对多个IP地址执行IP区间查找。
在获取到多个IP地址的统计信息之后,确定多个IP地址中IP地址的数量,如果IP地址的数量大于1,则建立所有IP区间对应的值的临时表,可以是在内存中建立所有IP区间对应的值的临时表。将该临时表作为匹配条件,对多个IP地址进行匹配。由于该临时表中包含有所有IP区间对应的值,且该临时表位内存中的临时表,在进行IP地址区间查找时,可以进一步提高查找的速度。
优选地,获取的多个IP地址为IP列表,IP区间查找装置还包括:第三获取单元,用于在获取多个IP地址的统计信息之前,获取IP列表的过滤条件,过滤条件用于对IP列表进行过滤;判断单元,用于判断IP列表是否具有索引;建立单元,用于当判断出IP列表不具有索引时,建立过滤条件对应的索引,过滤条件对应的索引用于过滤掉IP列表中不满足过滤条件的IP地址;以及确定单元,用于将过滤条件对应的索引作为统计信息。
获取的多个IP地址可以是存储在IP列表中的多个IP地址。判断IP列表是否具有索引,即判断该IP列表是否存在统计信息,如果有,则可以直接利用IP列表的索引执行IP区间查找;如果没有,则可以建立IP列表的过滤条件对应的索引,即过滤索引。具体地,可以是根据需要执行的SQl选择所有表e_session里用到的列:包含所有匹配列,以及选择列。采取以匹配列为键值,并包含所有选择列的方式建立索引。
根据本发明实施例,通过建立IP列表的过滤条件对应的索引,并将该索引作为统计信息,进行IP区间查找,进一步提高了IP区间查找的速度。
进一步地,如果判断出IP列表具有索引,可以进一步判断该索引是否为聚簇索引或者索引覆盖,如果是,则可以利用该索引进行IP区间查找;反之,则建立索引覆盖的索引,利用建立后的索引进行IP区间查找。
具体地,若筛选列不为IP列表的聚簇索引,或不是索引覆盖(索引包含了所需要筛选的条件和选择的所有列)的情况,也会生成比较糟糕的全表扫描,对于数据仓库等增量按周期进行处理的系统来说,是个严重的负担。
优选地,查找单元50包括:选取模块,用于利用过滤条件对应的索引从多个IP地址选取满足过滤条件的IP地址;以及第二查找模块,用于对满足过滤条件的IP地址执行IP区间查找。
由于IP列表中并不是所有的IP地址均需要进行区间查找,对不满足条件IP(例如已经进行过区间查找的IP地址)进行过滤,只对满足条件的IP地址进行查找,从而减少查找的次数,提高查找效率。
建立索引覆盖的过滤索引(过滤掉表里面不满足条件的记录行,只保留满足条件的行)。如上例中,假如Updatetime列不是聚簇,也无相关的索引,表e_session的聚簇列为id自增长列,则可建立过滤索引,仅包含条件updatetime>’2013-03-05’的所有记录行,选取Select和条件里的所有列,保证索引覆盖,相应Sql为:CREATENONCLUSTERED INDEX FIX_UpdateTime ON E_session(updatetime)WHEREupdatetime>'2013-05-03'。
在上例中,注意过滤索引的使用,仅在SqlServer2008SP2以后的版本才可直接使用,使用时,也需要对相关的Sql加上option recompile的字样,保证此行Sql的执行计划重新编绎,否则不会走新建的过滤索引,若是2008SP2以前的版本,可以考虑使用动态Sql的方式进行,保证执行时动态的编绎执行计划。
在有了上面两步的操作后,SQLServer在分析执行计划里,便能通过建立的过滤索引,对匹配源(IP列表)做快速的选取操作,SqlServer能使用其建立索引附带建立的统计信息,分析相关列的组合值及其出现的可能性,便能正确预估出需要查询的IP地址的行数。当分析出预估行数比较多时,SQLServer的分析引擎便会认为可能会多次查找,而区间值的查找都是在IPLocation的区间索引上进行,所以肯定会有重绕的可能性,便会产生Index Spool(Eager Spool)的算子,在内存中建立所有区间值的临时表,用于对区间进行快速匹配的优化。
优选地,IP区间查找装置还包括:去重单元,用于在获取用于IP进行区间查找的多个IP地址之后,对获取的多个IP地址进行去重,其中,查找单元还用于基于IP地址的数量采用多个匹配条件同时对去重后的多个IP地址执行IP区间查找。
由于获取的多个IP地址中,会存在重复的IP地址,对重复的IP地址进行去重,并利用多个匹配条件对去重后的IP地址进行IP区间查找。可以进一步减少查找的次数,进一步提高IP区间查找的速度。
本发明实施例还提供了一种IP区间查找方法。该方法可以运行在计算机设备上。需要说明的是,本发明实施例的IP区间查找方法可以通过本发明实施例所提供的IP区间查找装置来执行,本发明实施例的IP区间查找装置也可以用于执行本发明实施例所提供的IP区间查找方法。
图3是根据本发明实施例的IP区间查找方法的流程图。如图3所示,该IP区间查找方法包括步骤如下:
步骤S302,获取用于进行IP区间查找的多个IP地址。
IP区间查找可以是用于查找IP地址所在的区间,由于IP地址的总个数为固定值,通常一段IP区间对应一段地理信息。例如,北京的IP地址分布在IP区间A中,上海的IP地址分布在IP区间B中,当对IP地址进行区间查找时,如果确定IP地址在IP区间A中时,则可以确定该IP地址对应的用户在北京市。对IP地址进行区间查找是通过IP数据库对IP地址进行查找,将IP地址与IP数据库中的IP区间进行匹配。当有多个IP地址进行IP区间查找时,获取该多个IP地址,以便于对该多个IP地址进行IP区间查找。
步骤S304,获取多个IP地址的统计信息。统计信息包括多个IP地址中IP地址的数量。
在获取到多个IP地址之后,获取该多个IP地址的统计信息,其中,该统计信息可以是预先建立的统计信息。该统计信息包括多个IP地址的IP地址的数量。从该统计信息中可以得到IP地址的数量。例如,将获取到的多个IP地址放置于IP列表中,在执行IP区间查找时,可以先获取该IP列表需要进行查询的IP语句相关列的统计信息,以得到需要进行IP区间查找的IP地址的个数。
步骤S306,基于IP地址的数量采用多个匹配条件同时对多个IP地址执行IP区间查找。其中,多个匹配条件为用于对多个IP地址执行IP区间查找的条件。
在获取到多个IP地址的统计信息之后,IP数据库可以基于该统计信息中的IP地址的数量通过优化引擎生成快速查找计划,即,采用多个匹配条件同时对IP地址进行查找匹配,减少匹配的次数。其中,匹配条件可以是IP区间对应的值,例如,IP区间为0.0.0.1~1.0.0.0,则0.0.0.1和1.0.0.0对应的值可以作为匹配条件,用于判断IP地址是否处于该区间内。由于在现有技术中,IP数据库不知道IP地址的数量,在执行区间查找时,会将IP地址与IP区间的每一个界限值进行匹配判断,例如,在查询区间值(ip between beginIp and EndIp)时,首先从IP数据库的IPLocation表中为driver表里的每一行查找出IP>=BeginIp的所有行(SeekPredicates),再从查找出来的所有行进行筛选比较IP<=EndIP(Predicate),这样会导致筛选查询的数据量特别大。
本发明实施例中,通过将IP地址的统计信息传输给优化引擎,使得优化引擎得知IP地址为多个,则将IP地址与多个匹配条件进行匹配,在查找时的Seek条件为IP>=BeginIP and IP<=EndIP,从而减少查找匹配的次数,提高了IP地址区间查找的速度。
根据本发明实施例,通过获取多个IP地址的统计信息,统计信息包括多个IP地址中IP地址的数量,基于IP地址的数量采用多个匹配条件同时对多个IP地址执行IP区间查找,解决了对IP区间匹配的速度慢的问题,达到了提高IP地址区间查找的速度的效果。
需要说明的是,本发明实施例中,用于进行IP地址区间查找的数据库可以采用SqlServer数据库,也可以采用其他数据库。本发明实施例的IP区间查找也可以用于对值的区间查找。
图4是根据本发明实施例优选的IP区间查找方法的流程图。该实施例的IP区间查找方法可以是上述实施例的IP区间查找方法的一种优选实施方式。如图4所示,该IP区间查找方法包括步骤如下:
步骤S402、步骤S404分别与图3所示的步骤S302、步骤S304相同,这里不做赘述。
步骤S406,从统计信息确定多个IP地址中IP地址的数量。
步骤S408,如果多个IP地址中IP地址的数量大于1,则建立所有IP区间对应的值的临时表。
步骤S410,通过临时表对多个IP地址执行IP区间查找。
在获取到多个IP地址的统计信息之后,确定多个IP地址中IP地址的数量,如果IP地址的数量大于1,则建立所有IP区间对应的值的临时表,可以是在内存中建立所有IP区间对应的值的临时表。将该临时表作为匹配条件,对多个IP地址进行匹配。由于该临时表中包含有所有IP区间对应的值,且该临时表位内存中的临时表,在进行IP地址区间查找时,可以进一步提高查找的速度。
优选地,获取的多个IP地址为IP列表,在获取多个IP地址的统计信息之前,IP区间查找方法还包括:获取IP列表的过滤条件,过滤条件用于对IP列表进行过滤;判断IP列表是否具有索引;如果判断出IP列表不具有索引,则建立过滤条件对应的索引,过滤条件对应的索引用于过滤掉IP列表中不满足过滤条件的IP地址;以及将过滤条件对应的索引作为统计信息。
获取的多个IP地址可以是存储在IP列表中的多个IP地址。判断IP列表是否具有索引,即判断该IP列表是否存在统计信息,如果有,则可以直接利用IP列表的索引执行IP区间查找;如果没有,则可以建立IP列表的过滤条件对应的索引,即过滤索引。具体地,可以是根据需要执行的SQl选择所有表e_session里用到的列:包含所有匹配列,以及选择列。采取以匹配列为键值,并包含所有选择列的方式建立索引。
根据本发明实施例,通过建立IP列表的过滤条件对应的索引,并将该索引作为统计信息,进行IP区间查找,进一步提高了IP区间查找的速度。
进一步地,如果判断出IP列表具有索引,可以进一步判断该索引是否为聚簇索引或者索引覆盖,如果是,则可以利用该索引进行IP区间查找;反之,则建立索引覆盖的索引,利用建立后的索引进行IP区间查找。
具体地,若筛选列不为IP列表的聚簇索引,或不是索引覆盖(索引包含了所需要筛选的条件和选择的所有列)的情况,也会生成比较糟糕的全表扫描,对于数据仓库等增量按周期进行处理的系统来说,是个严重的负担。
优选地,基于数量采用多个匹配条件同时对多个IP地址执行IP区间查找包括:利用过滤条件对应的索引从多个IP地址选取满足过滤条件的IP地址;以及对满足过滤条件的IP地址执行IP区间查找。由于IP列表中并不是所有的IP地址均需要进行区间查找,对不满足条件IP(例如已经进行过区间查找的IP地址)进行过滤,只对满足条件的IP地址进行查找,从而减少查找的次数,提高查找效率。
建立索引覆盖的过滤索引(过滤掉表里面不满足条件的记录行,只保留满足条件的行)。如上例中,假如Updatetime列不是聚簇,也无相关的索引,表e_session的聚簇列为id自增长列,则可建立过滤索引,仅包含条件updatetime>’2013-03-05’的所有记录行,选取Select和条件里的所有列,保证索引覆盖,相应Sql为:CREATENONCLUSTERED INDEX FIX_UpdateTime ON E_session(updatetime)WHEREupdatetime>'2013-05-03'。
在上例中,注意过滤索引的使用,仅在SqlServer2008SP2以后的版本才可直接使用,使用时,也需要对相关的Sql加上option recompile的字样,保证此行Sql的执行计划重新编绎,否则不会走新建的过滤索引,若是2008SP2以前的版本,可以考虑使用动态Sql的方式进行,保证执行时动态的编绎执行计划。
在有了上面两步的操作后,SQLServer在分析执行计划里,便能通过建立的过滤索引,对匹配源(IP列表)做快速的选取操作,SqlServer能使用其建立索引附带建立的统计信息,分析相关列的组合值及其出现的可能性,便能正确预估出需要查询的IP地址的行数。当分析出预估行数比较多时,SQLServer的分析引擎便会认为可能会多次查找,而区间值的查找都是在IPLocation的区间索引上进行,所以肯定会有重绕的可能性,便会产生Index Spool(Eager Spool)的算子,在内存中建立所有区间值的临时表,用于对区间进行快速匹配的优化。
优选地,在获取用于IP进行区间查找的多个IP地址之后,IP区间查找方法还包括:对获取的多个IP地址进行去重,其中,基于统计信息对多个IP地址执行IP区间查找包括:基于统计信息对去重后的多个IP地址执行IP区间查找。
由于获取的多个IP地址中,会存在重复的IP地址,对重复的IP地址进行去重,并利用多个匹配条件对去重后的IP地址进行IP区间查找。可以进一步减少查找的次数,进一步提高IP区间查找的速度。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。