具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本领域的技术人员更好的理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,在本领域普通技术人员没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的保护范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。
需要说明的是,CPU密集型操作是指需要消耗较多的CPU的计算机操作,并且CPU密集型操作生成的IO查询语句为并行IO查询语句;非CPU密集型操作是指需要消耗较少的CPU的计算机操作,并且非CPU密集型操作生成的IO查询语句为串行IO查询语句。
根据本发明的实施例,提供了一种数据库索引处理方法,该数据库索引处理方法用于将数据库索引的串行IO查询语句更改为并行IO查询语句。该数据库索引处理方法可以运行在计算机处理设备上。
图1是根据本发明第一实施例的数据库索引处理方法的流程图。
如图1所示,该方法包括如下的步骤S101至步骤S103:
步骤S101,获取数据库索引的串行IO查询语句。
使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如,雇员(employee)表的姓名(name)列。如果要按姓查找特定职员,与必须搜索数据库表中的所有行相比,索引可以帮助用户更快地获得该信息。索引包括唯一索引、主键索引和聚簇索引。使用索引查询数据库表包括索引查询(IndexSeek)和全索引扫描(IndexScan),其中,IndexSeek仅从索引里取出相关的行进行查询。
数据库索引存储在数据库的索引表中。串行IO查询语句用于在串行IO执行数据库索引的查询。需要说明的是,在执行索引查询指令时,由于索引查询指令为表扫描的查询指令,而表扫描的查询指令消耗较少的CPU,因此CPU将该操作判断为非CPU密集型操作,进而生成串行IO查询语句。
进一步地,索引可以包括具有第一列索引和第二列索引的聚簇索引,这样,可以通过以下方式获取数据库索引的串行IO查询语句:
方式1,获取数据库中聚簇索引的第一列索引的串行IO查询语句,并且获取数据库中聚簇索引的第二列索引的串行IO查询语句。这样,可以将数据库索引的第一列索引和第二列索引均由串行IO查询语句改写为并行IO查询语句,由于并行IO查询可以降低索引查询消耗的时间,因此,将串行IO查询语句改写为并行IO查询语句可以提高索引查询的速度,进而可以减轻查询索引时造成的串行IO的堵塞。
方式2,获取数据库中聚簇索引的第一列索引的串行IO查询语句,或者获取数据库中聚簇索引的第二列索引的串行IO查询语句。这样,可以仅仅将部分数据库索引由串行IO查询语句改写为并行IO查询语句,由于并行IO查询可以降低索引查询消耗的时间,因此,将部分串行IO查询语句改写为并行IO查询语句可以提高索引查询的速度,进而可以减轻查询索引时造成的串行IO的堵塞。
例如,SELECT SessionKey FROM dbo.FactSession,即为从FactSession聚簇索引中获取SessionKey列索引。
步骤S102,将串行IO查询语句更改为并行IO查询语句。
并行IO查询语句用于在并行IO执行数据库索引的查询。需要说明的是,在本发明实施例中,将串行IO查询语句更改为并行IO查询语句可以通过将索引查询的非CPU密集型操作(即表扫描操作)转化为CPU密集型操作(如聚合类操作和表连接操作等),这样,CPU密集型操作可以触发CPU生成并行IO查询语句。
例如,索引查询的表扫描操作转化后得到表连接操作,CPU可以判断该表连接操作为消耗CPU较多的CPU密集型操作,进而该表连接操作可以触发CPU生成并行IO查询语句。
步骤S103,基于并行IO查询语句在并行IO执行索引的查询。
这样,并行IO查询语句可以快速扫描数据库索引,从而提高了数据库索引的扫描效率,并且减轻了数据库索引在扫描时造成的IO的堵塞。
图2是根据本发明第二实施例的数据库索引处理方法的流程图。
如图2所示,该数据库索引处理方法包括如下的步骤S201至步骤S206,该实施例可以作为图1所示实施例的优选实施方式。
步骤S201,获取数据库索引的串行IO查询语句。使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如,雇员(employee)表的姓名(name)列。如果要按姓查找特定职员,与必须搜索数据库表中的所有行相比,索引可以帮助用户更快地获得该信息。索引包括唯一索引、主键索引和聚簇索引。使用索引查询数据库表包括索引查询(IndexSeek)和全索引扫描(IndexScan),其中,IndexSeek仅从索引里取出相关的行进行查询。
数据库索引存储在数据库的索引表中。串行IO查询语句用于在串行IO执行数据库索引的查询。需要说明的是,在执行索引查询指令时,由于索引查询指令为表扫描的查询指令,而表扫描的查询指令消耗较少的CPU,因此CPU将该操作判断为非CPU密集型操作,进而生成串行IO查询语句。
进一步地,索引可以包括具有第一列索引和第二列索引的聚簇索引,这样,可以通过以下方式获取数据库索引的串行IO查询语句:
方式1,获取数据库中聚簇索引的第一列索引的串行IO查询语句,并且获取数据库中聚簇索引的第二列索引的串行IO查询语句。这样,可以将数据库索引的第一列索引和第二列索引均由串行IO查询语句改写为并行IO查询语句,由于并行IO查询可以降低索引查询消耗的时间,因此,将串行IO查询语句改写为并行IO查询语句可以提高索引查询的速度,进而可以减轻查询索引时造成的串行IO的堵塞。
方式2,获取数据库中聚簇索引的第一列索引的串行IO查询语句,或者获取数据库中聚簇索引的第二列索引的串行IO查询语句。这样,可以仅仅将部分数据库索引由串行IO查询语句改写为并行IO查询语句,由于并行IO查询可以降低索引查询消耗的时间,因此,将部分串行IO查询语句改写为并行IO查询语句可以提高索引查询的速度,进而可以减轻查询索引时造成的串行IO的堵塞。
例如,SELECT SessionKey FROM dbo.FactSession,即为从FactSession聚簇索引中获取SessionKey列索引。
在本发明实施例中,优选地,可以通过步骤S202至S205将串行IO查询语句更改为并行IO查询语句:
步骤S202,获取预先创建的临时表。
在本发明实施例中,临时表中可以包括预先设置的临时数据,其中,临时表中的临时数据可以为任意的阿拉伯数字,或者临时表中的临时数据可以为任意列名,或者临时表中的临时数据可以为任意的英文字母等,并且临时表中的所有的临时数据可以相同或者相异,例如,临时表中的临时数据可以全部为1。
需要说明的是,预先创建的临时表的列数和行数可以为任意的,但是临时表的列数和行数越多,经过运算之后得到的数据占用的内存空间更大,即临时表的列数和行数越多,经过运算之后得到的数据消耗更多的内存,而临时表的列数和行数越少,经过运算之后得到的数据占用的内存空间更小,即临时表的列数和行数越少,经过运算之后得到的数据消耗更少的内存。因此,优选地,获取预先创建的临时表可以包括获取预先创建的具有单个行和单个列的临时表。
步骤S203,获取索引表中的索引。
在本发明实施例中,获取索引表中的索引可以是获取索引表中的全部索引,或者可以是获取索引表中聚簇索引的某几列索引。
步骤S204,由临时表中的临时数据和索引表中的索引运算得到中间数据。
具体地,在本发明实施例中,由临时表中的临时数据和索引表中的索引运算得到中间数据可以包括:
步骤1,获取以临时数据为集合元素的第一集合。
例如,当临时表为一个具有一行、两列的临时表,并且该临时表的第一行第一列的临时数据为A,该临时表的第一行第二列的临时数据为B时,则上述临时数据组成的第一集合可以表示为TMP1={A,B},优选地,TMP2={A}。
步骤2,获取以索引为集合元素的第二集合。
例如,以数据库索引表中的索引集合元素的第二集合可以表示为Index={Index1,Index2,Index3,Index4}。
步骤3,将第一集合和第二集合进行叉乘运算以得到笛卡尔集合。
例如,TMP1×Index={(A,Index1),(A,Index2),(A,Index3),(A,Index4),(B,Index1),(B,Index2),(B,Index3),(B,Index4)}。在本发明实施例中,笛卡尔集合中的元素为中间数据,其中,该中间数据包含了数据库索引的全部信息,即通过该中间数据可以进行数据库索引的查询。
优选地,TMP2×Index={(A,Index1),(A,Index2),(A,Index3),(A,Index4)}。与TMP1×Index相比较,该TMP2×Index不仅包含了全部的数据库索引,而且该TMP2×Index可以节约一倍的数据库存储空间。
步骤S205,根据中间数据将串行IO查询语句更改为并行IO查询语句。
由于TMP1×Index和该TMP2×Index的运算需要消耗较多的CPU,因此CPU判断出上述操作为CPU密集型操作,这样,上述操作可以触发CPU生成并行IO查询语句,进而达到提高索引的查询效率、加快索引的扫描速度的效果。
步骤S206,同图1所示实施例的步骤S103,在此不再赘述。
例如,SELECT SessionKey FROM dbo.FactSession,#tmp1,该程序用于将存放数据库索引的FactSession表和预先设定的临时表tmp1进行表连接操作,并且表连接操作得到的结果中选择SessionKey列索引进行索引的查询。
从以上的描述中,可以看出,本发明实现了将查询数据库索引表中的索引这一非CPU密集型操作转化为CPU密集型操作,例如,对数据库索引表中的索引和预先设定的临时表中的临时数据进行笛卡尔运算,从而触发了CPU生成并行IO查询语句,避免了生成并执行串行IO查询语句时数据库索引会卡在IO上并造成IO的堵塞的问题,进而达到了提高数据库索引的扫描效率、加快数据库索引的读写速度的效果。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
根据本发明的实施例,提供了一种数据库索引处理装置,该数据库索引处理装置用于将数据库索引的串行IO查询语句更改为并行IO查询语句。需要说明的是,本发明实施例所提供的数据库索引处理装置可以用于执行本发明实施例的数据库索引处理方法,本发明实施例的数据库索引处理方法也可以通过本发明实施例的数据库索引处理装置来执行。
图3是根据本发明第一实施例的数据库索引处理装置的结构示意图。
如图3所示,该装置包括:获取单元10、更改单元20、查询单元30。
获取单元10用于获取数据库索引的串行IO查询语句。
使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如,雇员(employee)表的姓名(name)列。如果要按姓查找特定职员,与必须搜索数据库表中的所有行相比,索引可以帮助用户更快地获得该信息。索引包括唯一索引、主键索引和聚簇索引。使用索引查询数据库表包括索引查询(IndexSeek)和全索引扫描(IndexScan),其中,IndexSeek仅从索引里取出相关的行进行查询。
数据库索引存储在数据库的索引表中。串行IO查询语句用于在串行IO执行数据库索引的查询。需要说明的是,在执行索引查询指令时,由于索引查询指令为表扫描的查询指令,而表扫描的查询指令消耗较少的CPU,因此CPU将该操作判断为非CPU密集型操作,进而生成串行IO查询语句。
更改单元20用于将串行IO查询语句更改为并行IO查询语句。
并行IO查询语句用于在并行IO执行数据库索引的查询。需要说明的是,在本发明实施例中,将串行IO查询语句更改为并行IO查询语句可以通过将索引查询的非CPU密集型操作(即表扫描操作)转化为CPU密集型操作(如聚合类操作和表连接操作等),这样,CPU密集型操作可以触发CPU生成并行IO查询语句。
例如,索引查询的表扫描操作转化后得到表连接操作,CPU可以判断该表连接操作为消耗CPU较多的CPU密集型操作,进而该表连接操作可以触发CPU生成并行IO查询语句。
查询单元30用于基于并行IO查询语句在并行IO执行索引的查询。
这样,并行IO查询语句可以快速扫描数据库索引,从而提高了数据库索引的扫描效率,并且减轻了数据库索引在扫描时造成的IO的堵塞。
图4是根据本发明第二实施例的数据库索引处理装置的结构示意图。
如图4所示,该实施例可以作为图3所示实施例的优选实施方式,该实施例的数据库索引处理装置包括第一实施例的获取单元10、更改单元20和查询单元30,其中,更改单元20包括第一获取模块201和第二获取模块202、运算模块203和更改模块204。
查询单元30的作用与第一实施例中的相同,在此不再赘述。
获取单元10还用于获取数据库索引的串行IO查询语句,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构,例如,雇员(employee)表的姓名(name)列。如果要按姓查找特定职员,与必须搜索数据库表中的所有行相比,索引可以帮助用户更快地获得该信息。索引包括唯一索引、主键索引和聚簇索引。使用索引查询数据库表包括索引查询(IndexSeek)和全索引扫描(IndexScan),其中,IndexSeek仅从索引里取出相关的行进行查询。
数据库索引存储在数据库的索引表中。串行IO查询语句用于在串行IO执行数据库索引的查询。需要说明的是,在执行索引查询指令时,由于索引查询指令为表扫描的查询指令,而表扫描的查询指令消耗较少的CPU,因此CPU将该操作判断为非CPU密集型操作,进而生成串行IO查询语句。
第一获取模块201用于获取预先创建的临时表。
在本发明实施例中,临时表中可以包括预先设置的临时数据,其中,临时表中的临时数据可以为任意的阿拉伯数字,或者临时表中的临时数据可以为任意列名,或者临时表中的临时数据可以为任意的英文字母等,并且临时表中的所有的临时数据可以相同或者相异,例如,临时表中的临时数据可以全部为1。
需要说明的是,预先创建的临时表的列数和行数可以为任意的,但是临时表的列数和行数越多,经过运算之后得到的数据占用的内存空间更大,即临时表的列数和行数越多,经过运算之后得到的数据消耗更多的内存,而临时表的列数和行数越少,经过运算之后得到的数据占用的内存空间更小,即临时表的列数和行数越少,经过运算之后得到的数据消耗更少的内存。因此,优选地,获取预先创建的临时表可以包括获取预先创建的具有单个行和单个列的临时表。
第二获取模块202用于获取索引表中的索引。
在本发明实施例中,获取索引表中的索引可以是获取索引表中的全部索引,或者可以是获取索引表中聚簇索引的某几列索引。
运算模块203用于由临时表中的临时数据和索引表中的索引运算得到中间数据。
进一步地,索引可以包括具有第一列索引和第二列索引的聚簇索引,这样,获取单元10可以包括第三获取模块和第四获取模块,并且可以通过以下方式获取数据库索引的串行IO查询语句:
方式1,第三获取模块获取数据库中聚簇索引的第一列索引的串行IO查询语句,并且第四获取模块获取数据库中聚簇索引的第二列索引的串行IO查询语句。这样,可以将数据库索引的第一列索引和第二列索引均由串行IO查询语句改写为并行IO查询语句,由于并行IO查询可以降低索引查询消耗的时间,因此,将串行IO查询语句改写为并行IO查询语句可以提高索引查询的速度,进而可以减轻查询索引时造成的串行IO的堵塞。
方式2,第三获取模块获取数据库中聚簇索引的第一列索引的串行IO查询语句,或者第四获取模块获取数据库中聚簇索引的第二列索引的串行IO查询语句。这样,可以仅仅将部分数据库索引由串行IO查询语句改写为并行IO查询语句,由于并行IO查询可以降低索引查询消耗的时间,因此,将部分串行IO查询语句改写为并行IO查询语句可以提高索引查询的速度,进而可以减轻查询索引时造成的串行IO的堵塞。
例如,SELECT SessionKey FROM dbo.FactSession,即为从FactSession聚簇索引中获取SessionKey列索引。
具体地,在本发明实施例中,运算模块可以包括:第一获取子模块、第二获取子模块和叉乘子模块。
第一获取子模块用于获取以临时数据为集合元素的第一集合。
例如,当临时表为一个具有一行、两列的临时表,并且该临时表的第一行第一列的临时数据为A,该临时表的第一行第二列的临时数据为B时,则上述临时数据组成的第一集合可以表示为TMP1={A,B},优选地,TMP2={A}。
第二获取子模块用于获取以索引为集合元素的第二集合。
例如,以数据库索引表中的索引集合元素的第二集合可以表示为Index={Index1,Index2,Index3,Index4}。
叉乘子模块用于将第一集合和第二集合进行叉乘运算以得到笛卡尔集合。
例如,TMP1×Index={(A,Index1),(A,Index2),(A,Index3),(A,Index4),(B,Index1),(B,Index2),(B,Index3),(B,Index4)}。在本发明实施例中,笛卡尔集合中的元素为中间数据,其中,该中间数据包含了数据库索引的全部信息,即通过该中间数据可以进行数据库索引的查询。
优选地,TMP2×Index={(A,Index1),(A,Index2),(A,Index3),(A,Index4)}。与TMP1×Index相比较,该TMP2×Index不仅包含了全部的数据库索引,而且该TMP2×Index可以节约一倍的数据库存储空间。
更改模块204用于根据中间数据将串行IO查询语句更改为并行IO查询语句。
由于TMP1×Index和该TMP2×Index的运算需要消耗较多的CPU,因此CPU判断出上述操作为CPU密集型操作,这样,上述操作可以触发CPU生成并行IO查询语句,进而达到提高索引的查询效率、加快索引的扫描速度的效果。
例如,SELECT SessionKey FROM dbo.FactSession,#tmp1,该程序用于将存放数据库索引的FactSession表和预先设定的临时表tmp1进行表连接操作,并且表连接操作得到的结果中选择SessionKey列索引进行索引的查询。
从以上的描述中,可以看出,本发明实现了将查询数据库索引表中的索引这一非CPU密集型操作转化为CPU密集型操作,例如,对数据库索引表中的索引和预先设定的临时表中的临时数据进行笛卡尔运算,从而触发了CPU生成并行IO查询语句,避免了生成并执行串行IO查询语句时数据库索引会卡在IO上并造成IO的堵塞的问题,进而达到了提高数据库索引的扫描效率、加快数据库索引的读写速度的效果。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。