具体实施方式
特别描述了主题以符合法定需求。然而,描述自身不是为了限制本权利申请的范围。而是,发明者期望所做权利要求的主题也可以以其它方式结合其它现有或将来的技术体现,以包含类似于这个文件中所描述的步骤的不同步骤或这些步骤的组合。此外,虽然可以在这里使用术语“步骤”来表示所采用方法的不同元素,但是这个术语不应该被解释为意味这里所揭示的各种步骤之间任一特定顺序,除非个别步骤的顺序被明确地描述。
WinFS是引入文件***中的对象概念的文件***/数据存储。这个存储中的一个操作是能够有效地定位和查询对象。本发明描述了如何能够非常有效地作出这个操作的各方面。
示例性计算环境
如这里和权利要求中所使用的,以下的术语有以下的意义:
“对象”是硬件/软件接口***可访问的可存储信息单元,所述硬件/软件接口***具有一组基本特征:它们通常在所有展现给最终用户的对象上被硬件/软件接口***的外壳程序所支持。对象也具有通常在包含允许引入新的属性和关系的特征的所有类型上被支持的属性和关系。
“操作***”(OS)是特定的程序,用作应用程序和计算机硬件之间的中介。在大多数情况下,操作***包含外壳和核心。
“硬件/软件接口***”是软件或硬件和软件的组合,用作计算机***下层硬件组件和在计算机***上执行的应用程序之间的中介。硬件/软件接口***一般包括操作***(在一些实施例中,可以单独地由操作***组成)。硬件/软件接口***也可以包含虚拟机管理器、通用语言执行环境(CLR)或其功能等价物、Java虚拟机(JVM)或其功能等价物或其它计算机***中位于操作***中或操作***外的这样的软件组件。硬件/软件接口***的目的是提供用户可以在其中执行应用程序的环境。任何硬件/软件接口***的目标是使得计算机***便于使用以及以有效的方式使用计算机硬件。
本发明的许多实施例可以在计算机上执行。图4和以下描述旨在提供对适用于本发明实现的计算环境的简要概述。虽然不是必须的,本发明可以在计算机可执行指令的一般环境中描述,所述计算机可执行指令诸如由计算机执行的程序模块,所述计算机诸如客户机工作站或服务器。通常,程序模块包括执行一特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。此外,本发明的技术人员会理解本发明可以用其它的计算机***配置来实现,包括手持式设备、多处理器***、基于多处理器或可编程消费电子产品、网络PC、微型计算机、大型计算机等等。本发明还可以在分布式计算环境中实现,其中在分布式计算环境中任务由通过一通信网络链接的远程处理设备执行。在分布式计算环境中,程序模块可以位于包含存储器设备的本地和远程计算机存储介质中。
如图4所示,示例的通用计算***包含一常规的个人计算机20等等,所述个人计算机包含处理单元21、***存储器22、和连接包括***存储器在内的各个***组件到处理单元21的***总线23。***总线23可以是几种类型的总线结构中的任何一种,其中这几种类型的总线结构包含:使用各种总线体系结构中任何一种的存储器总线或存储器控制器、***总线和本地总线。***存储器包括只读存储器(ROM)24和随机存取存储器(RAM)25。基本输入/输出***(BIOS)26一般被保存在ROM 24中,其中该基本输入/输出***(BIOS)133包含有助于例如在启动过程中在个人计算机20内部的元件之间传输信息的基本例程。
个人计算机20还可以包括从硬盘(未示出)中读取或写入到其中的硬盘驱动器27、从可移动磁盘29中读取或写入到其中的磁盘驱动器28和从可移动光盘31,诸如CD-ROM或者其它光介质中读取或者写入到其中的光盘驱动器30。硬盘驱动器27、磁盘驱动器28和光盘驱动器29分别通过硬盘驱动器接口32、磁盘驱动器33和光盘驱动器34被链接到***总线23上。这些驱动器和它们相关联的计算机可读介质提供对计算机可读指令、数据结构和用于个人计算机20的其它数据的非易失性存储。
虽然这里所描述的示例性环境采用了硬盘、可移动磁盘29和可移动光盘31,本领域的技术人员可以理解其它类型的用于存储计算机可访问数据的计算机可读介质也可在示例性操作环境中使用,所述的其它计算机可读介质诸如磁带盒、闪存卡、数字视频盘、Bernoulli盒式磁带、随机存取存储器(RAM)、只读存储器(ROM)等等。
许多程序模块可以存储在硬盘、磁盘29、光盘31、ROM 24或RAM 25上,包括操作***35、一个或多个应用程序36、其它程序模块37和程序数据38。用户可以通过输入设备输入命令和信息到计算机20中,输入设备诸如键盘40和指点设备42。其它输入设备(未示出)可以包括麦克风、操纵杆、游戏垫、卫星接收天线、扫描器等等。这些和其它输入设备一般通过耦合到***总线的串行口接口46连接到处理单元21,但也可能由其它接口连接,诸如并行端口、游戏端口、通用串行总线(USB)。监视器47或其它类型的显示设备也可以通过诸如视频适配器48这样的接口连接到***总线23。除监视器47外,个人计算机一般包括诸如扬声器和打印机等其它***输出设备(未示出)。图4的示例性***中也包含主机适配器55、小型计算机***接口(SCSI)总线56和连接到SCSI总线56上的外部存储设备62。
计算机20可能工作在使用到一个或多个诸如远程计算机49这样的远程计算机的逻辑连接的网络环境内。远程计算机49可以是个人计算机、服务器、路由器、网络PC、对等设备或其它公共网络节点,并且一般包括与计算机20相关的许多或所有上述元件,然而图4中仅说明了存储器存储设备50。图4所述的逻辑连接包括局域网(LAN)51以及广域网(WAN)52。这种网络环境常见于办公室、企业范围的计算机网络、内联网以及因特网。
当用于LAN网络环境时,计算机20通过网络接口或适配器53连接到局域网51。当用于WAN网络环境时,个人计算机20一般包括调制解调器54或其它装置,用于在诸如因特网或广域网52上建立通信的装置。调制解调器54可能是内置或外置的,它通过串行口接口46连接到***总线23。在网络化环境中,所述与个人计算机20相关的程序模块或其中的一部分可能存储在远程存储设备内。可以理解,所示网络连接是示例性的,并且可以使用其它用于在计算机间建立通信连接的技术。
虽然预见到本发明的许多实施例特别适用于计算机化***,但是本文件中没有东西旨在将本发明限制于这些实施例。相反地,这里所使用的术语“计算机***”意在包含任何和所有包括按钮或能够确定按钮或按钮等价物的设备,不管这样的设备本质上是电子的、机械的、逻辑的还是虚拟的。
如图5的框图中所示,计算机***200能够大体上被分成三个组件组:硬件组件202、操作***组件204和应用程序组件206。
在某些计算机***200中,再参见图4,硬件202可以格外包括中央处理单元(CPU)21、存储器(ROM 24和RAM 25)、基本输入/输出***(BIOS)26和各种输入/输出(I/O)设备,诸如键盘40、鼠标42、监视器47和/或打印机(未示出)。硬件组件202包括计算机***200的基本资源。
应用程序组件206包括各种软件程序,包括但不限于编译器、数据库***、文字处理器、视频游戏等等。应用程序提供使用计算机资源解决问题、提供解决方案和为各种用户(例如,机器、其它计算机***和/或终端用户)处理数据的方法。
操作***组件204包含操作***本身及其外壳和核心。操作***(OS)是用作应用程序和计算机硬件之间的特定程序,操作***的目的是提供用户可以执行应用程序的环境。任何操作***的目标在于使得计算机***便于使用以及以有效的方式使用计算机硬件。
操作***一般在启动时被载入到计算机***,此后管理计算机***中所有的应用程序(或简称为“应用”)。应用程序经由应用程序编程接口(API)通过请求服务与操作***交互。一些应用程序使得终端用户能够经由用户接口与操作***交互,所述用户接口诸如命令语言或图形用户界面(GUI)。
操作***传统上为应用程序执行各种服务。在多任务操作***中,其中多个程序同时运行,操作***确定哪些应用程序应该以哪种顺序运行,在允许从一个应用程序轮流切换到另一应用程序之前每个应用程序允许运行多少时间。该操作***也管理多个应用程序之间内部存储器的共享,并处理到所附硬件的输入和输入,所述硬件诸如硬盘、打印机和拨号端口。该操作***也向每个应用程序(并且在某些情况下给最终用户)发送关于操作状态和任何可能发生的错误的消息。操作***也可以卸载对批作业(例如,打印)的管理,使得开始的应用程序从该工作释放并且可以继续其它的处理和/或操作。在可以提供平行处理的计算机上,操作***也可以管理划分程序使得它可以每次在多于一个处理器上运行。
操作***的外壳是对操作***(也被称为“命令解释器”)的交互式的终端用户界面。外壳是应用程序直接访问甚至是终端用户直接访问的操作***的外层。相对于外壳,核心是直接与硬件组件交互的计算机***的最里层。
如相关领域的技术人员所理解的,“文件”是能够由操作***作为离散(可存储或可恢复)实体操纵的信息实体(包括但不限于操作***自身以及应用程序、数据集合等等)。在现代操作***(Windows、Unix、Linux、Mac OS等等)中,文件是可存储信息(例如,数据、程序等等)的基本单元,由操作***使用,文件组以“文件夹”的形式组织。在Microsoft Windows、Macintosh和其它操作***中,文件夹是文件的集合,可以被作为实体来检索、移动或操纵。在某些其它操作***中,诸如DOS、z/OS和大多数基于Unix的操作***,使用术语“目录”而非文件夹,早期的Apple计算机***(例如Apple IIe)使用术语“目录册”;然而,如这里所使用的,所有这些术语都是同意的且是可交换的,并且在这里旨在进一步包含所有其它用于或引用分层信息存储构架的等价术语。
如本领域的技术人员所公知和理解的,目录(即文件夹的目录)是基于树的分层结构,其中文件基于文件夹的位置来分组,所述文件夹包含树结构的节点。例如,如图6中所示,基于DOS的文件***基文件夹(或“根目录”)302可以包括多个文件夹304,每个文件夹可以进一步包括附加的文件夹308’直至无穷。虽然在操作***层,这些文件夹的每一个可以具有一个或多个文件,文件夹中的初始文件在树分层结构中除了位置没有共同点。不惊奇地,这个将文件组织或文件夹层次的方法间接地反映了用于存储这些文件的典型存储介质(例如硬盘、软盘、CD-ROM等等)的物理组织。
除了上述以外,每个文件夹是其子文件夹和其文件的容器-即,文件夹拥有这些子文件夹和文件。例如,当操作***删除文件夹时,它的子文件夹和文件也被删除(对于每个子文件夹,递归地包括它的子文件夹和文件)。同样地,每个文件只能被一个文件夹所拥有,虽然文件可以被拷贝且其拷贝可以位于不同的文件夹中,文件的拷贝自身是与原文件没有直接连接的独特的和分开的实体(例如,在操作***层上,对原文件的修改不会被镜像到其拷贝文件)。在这方面,文件和文件夹因此在特性上是实质“物理的”,因为文件夹是物理容器的概念等价物,文件是容器中离散的和分开的物理元素的概念等价物。
用于组织、搜索和共享可以用于本发明的数据的存储平台被设计成存储所有类型的数据,包括被称为对象的数据形式。参见图7,依照本发明的存储平台400包括在数据库引擎414上实现的数据存储402。在一个实施例中,数据库引擎包括带有对象关系扩展名的关系型数据库引擎。在一个实施例中,关系型数据库引擎414包括Microsoft SQL服务器关系型数据库引擎。
数据存储402实现支持数据组织、搜索、共享、同步和安全性的数据模型。模式中描述了特定类型的数据,诸如模式440,存储平台400为部署那些模式和扩展那些模式提供了工具446。
在数据存储402中实现的改变跟踪机制406提供了跟踪对数据存储改变的能力。数据存储402也提供安全能力和升级/降级能力410。数据存储402也提供一组应用程序编程接口412以使得数据存储402的能力可以被其它存储平台组件和使用存储平台的应用程序(例如应用程序450a、450b和450c)使用。
本发明的存储平台进一步包括应用程序编程接口(API)422,使得诸如应用程序450a、450b和450c等应用程序能够访问存储平台的所有前述能力并访问模式中所描述的数据。应用程序可以将存储平台API 422与其它API(诸如OLE DB API 424和Microsoft Windows Win32 API 426)结合使用。
本发明的存储平台400可以向应用程序提供多种服务,包括便利用户或***之间数据共享的同步服务430。例如,同步服务420可以允许和与数据存储420具有相同格式的其它数据存储440协同工作以及访问具有其它格式的数据存储442。存储平台400也为文件***提供允许数据存储402与现有文件***协同工作的能力,所述现有文件***诸如Windows NTFS文件***418。
在至少一些实施例中,存储平台420也可以提供具有附加能力的应用程序,使得能够操作数据或允许与其它***的交互。这些能力可以以附加服务428的形式体现,诸如Info Agent服务434和通知服务432以及其它工具软件436的形式。
在至少一些实施例中,存储平台体现在计算机***的硬件/软件接口中或形成计算机***的硬件/软件接口的组成部分。例如,非限制性的,本发明的存储平台可以体现在操作***、虚拟机管理(VMM)、通用语言执行环境(CLR)或其功能等价物、或Java虚拟机(JVM)或其功能等价物中,或形成它们的组成部分。
通过其通用存储基础和原理化数据,本发明的存储平台能够为消费者、知识工作者和企业提供更为有效的应用程序开发。它提供了充足的和可扩展的编程表面区域,不仅使得其数据模型中固有的能力可用,而且也包含和扩展了现有文件***和数据库访问方法。
在这里描述和各个附图中,本发明的存储平台400可以被称为“WinFS”。然而,使用这个名字来指存储平台仅仅是为了描述方便,而不是以任何方式限制本发明。
本发明的存储平台400的数据存储402实现了支持驻留在存储器中数据的组织、搜索、共享、同步和安全性数据模型。在本发明的数据模型中,“对象”是存储信息的基础单元。数据模型提供了用于宣称对象和对象扩展和用于在对象之间建立关系和用于组织和分类对象的机制。
关系型数据库引擎414,在一个实施例中包含Microsoft SQL服务器引擎,支持内置的标量类型。内置标量类型是“原生的”和“简单的”。原生的是指用户不能定义他们自己的类型,简单的是指它们不能封装一复杂结构。用户定义类型(UDT)通过使得用户能够通过定义复杂的、结构化类型来扩展类型***提供了上述类型扩展和操作原生标量类型***的机制。一旦被用户定义,UDT可以被用在内置标量类型可以使用的类型***中的任何地方。
存储平台图解被映射到数据库引擎存储中的UDT类。数据存储对象被映射到从Base.Item类型获取的UDT类。扩展还被映射到UDT类并使用继承。根扩展类型是Base.Extension,所有扩展类型都是从根扩展类型得出的。
UDT是CLR类-它具有状态(即,数据字段)和行为(即,例程)。使用任何管理语言来定义UDT-C#、VB.NET等等。UDT方法和操作符可以相对那个类型的实例在T-SQL中被调用。UDDT可以是例如行中列的类型、T-SQL中例程参数的类型或T-SQL中可变量的类型。
示例性实施例
本发明提供了称为基表(因为在这个基础上视图被定义)上的索引视图(即物化视图)的创新方法并且在可以用于增强查询的附加操作和结构中使用这种索引视图。索引视图用作-在基表上的索引。此索引可以被用作一个到基表的访问路径以便解答与索引视图和基表的结构相匹配的查询。
典型索引视图包含数据条目并且可能包含关联的子条目或者其他依赖或源于此的数据。索引视图可能包含一个传输数据的函数调用的结果。举例而言,索引视图可能包含嵌套,在这样的情况下一个条目会有多个关联的子条目。例如,假设第一基表包含名字,同时第二基表包含地址。一个在两个基表上的“联接”操作会为一个特定的名字提供一个地址。索引视图可能被以包含名字和相关地址的方式存储,正如图8中所示的索引视图500。在索引视图500中,名字“Alice”有三个相关地址:地址1、地址2和地址3。每个在示例的索引视图500中的其它名字(例如“Bob”和“Charlie”)都有一个相关地址。此索引视图被认为是嵌套的,因为多重地址与名称“Alice”相关联。移去嵌套是希望的,所以如果与Alice相关的地址中的一个改变了,这个地址可以直接被访问,并且索引视图也不需要为了反映这个变化而重新计算。其他功能的结果也可以通过这个方式被索引。
为了移除这个嵌套,唯一的聚类关键字550被构造出来,如图9所示。如图示及下面更详细的描述,关键字550为索引视图中的有嵌套的条目提供了一个单独的子条目。这样,在这个例子中的关键字550提供三个条目“Alice”,每一个条目与三个地址:地址1、地址2和地址3中的一个不同的地址相关联。这个关键字允许一个应用程序在基表和索引视图之间来回。
索引视图可被当作在有多值属性的基表上的次级索引。这样,本发明提供使用索引视图在函数调用的结果中进行搜索(正如在这个例子中被嵌套的数据)。索引在函数调用(例如一个去嵌套操作)的结果上被执行。换言之,被导出的数据(即子条目)被索引了。本发明索引复杂的结构,所以更多的索引视图可以被确定和可供使用。这为查询执行计划提供了更多的选项,导致更优化的查询。
如下文进一步的描述,在函数调用的结果上索引一个视图提供了一个索引复杂数据(例如一个嵌套集合的内容)变换的方法。一个本发明支持的可效仿的去嵌套操作是SQL Server的“交叉应用去嵌套”。具体来说,使用“交叉应用去嵌套”操作,在索引视图里的一个嵌套的级别可以被去嵌套。然而,依据本发明,任何级数的去嵌套都是可预期的。更一般的,可以预期,通过这个方法多重级别的函数调用可以被索引。
此外提供了从索引视图提供到基表的“反向联接”。这允许来自基表的字段(不出现在索引视图中)被包含在对表的查询的结果中,所述表使用被视为访问路径的索引视图来处理。从索引视图到视图在其上被定义的基表上使用反向联接。这提供了包含不在索引视图而在基表中的查询结果中的的列的方法。
所期望的是经由唯一的聚类关键字,从单表索引视图到基表支持反向联接,所述聚类关键字作为逻辑行定位符。***可以经由唯一的聚类关键字从索引视图反向联接到基表中。这些特征允许使用索引视图对表格的函数调用数据的结果的内容索引,诸如对多个集合或多个值属性的“交叉应用去嵌套”操作。
如上所述,可以对函数调用数据的结果定义索引视图(诸如交叉应用去嵌套操作)。结合反向联接能力,这允许基于包含在这些记录中的值的集合的内容来访问表格中的记录。因此,可以使用经索引的视图来创建对UDT的多重集属性的索引。例如,以下经索引的视图可以帮助加速对city的检索性能:
Create view iv_city with schemabinding as
Select a.addr.city city,a.addr.addrID addrID,person.htid,person.pid
From person cross apply unnest(pcol.addresses)a(addr)
Create unique clustered index iv_city_idx on iv_city(city,pid,addrID)
注意期望将addrID和pid用于使得索引唯一,假设addrID在单个多重集地址中是唯一的。以下例子示出通用函数调用如何可能有这个索引能力:
Create view iv_city with schemabinding as
Select a.addr.city city,a.addr.addrID addrID,person.htid,person.pid
From person cross apply FUNCTION(pcol)a(addr)
Create unique clustered index iv_city_idx on iv_city(city,pid,addrID)
在这个例子中“unnest”被表示“对这里所讨论的数据函数调用”的“FUNCTION”代替。一般地,不同的函数可以用在“FUNTION”的位置处。可能的例子包含在集合中去除嵌套数据、分解XML文档或对来自复杂结构(诸如UDT)的多个字段索引。也可能将这个机制使用于其它对数据进行处理的函数上。
查询的经索引的视图可以用于无需读基表(例如基表“person”)就回答查询。这可以是有益的,因为索引可能比基表小很多。例如期望基表“person”包含属性pcol,它是UDT。Pcol字段(地址)之一是多重集(集合值属性)。考虑表1,它是假设的“person”表。
Person |
Pid |
Htid |
Pcol |
|
Pid |
Name |
… |
Addresses |
|
1 |
N/A |
1 |
Bob | |
AddrID |
City |
… |
1 |
Bellevue | |
|
2 |
Corvallis | |
|
2 |
N/A |
2 |
Sue | |
AddrID |
City | |
3 |
Bellevue | |
|
4 |
Berkeley | |
表1
表1示出了粒度的最精细层次。对本例不是必须的列被省略并且用省略号表示。注意到在本例中pid和name是原子属性,因此只包含一个值,而地址是集合,因此包含多于一个值。City是每个成员的地址的一个字段。
在“person”表中,为每个名字示出了多个子行。例如,Bob有两个地址子行:AddrID1和2,分别对应于Bellevue和Corvallis;Sue有两个地址子行:AddrID3和4,分别对应于Bellevue和Berkeley。
考虑经索引的视图iv_city。对于“person“表中上述值,iv_city的内容如表2示出。
iv_city |
City |
AddrID |
Htid |
Pid |
|
Bellevue |
1 |
1 |
1 |
|
Bellevue |
3 |
1 |
2 |
|
Berkeley |
4 |
1 |
2 |
|
Corvallis |
2 |
1 |
1 |
表2
iv_city中每行对应于粒度尺寸数据的最精细层次中的信息。因此,经索引的视图示出现在每个子行条目在其自己的行中。注意Pid可以被用作反向到第一表反向联接。例如,iv_city中的Pid1将反向联接到“person”表的Pid1。可能对部分数据索引(即,只对感兴趣的数据,例如只对住在Bellevue的人)。
现在,考虑以下查询以发现至少在Corvallis有一个地址的所有人的名字:
Select distinct person.pid,person.pcol.name
From person cross apply unnest(Pcol.addresses)as a(addr)
Where a.addr.city=‘Corvallis’
图10示出的执行计划通过使用iv_city(对去除嵌套结果的索引视图)和基表“person”的关键人员pid的反向联接,可以回答上述的查询。
注意交叉应用去除嵌套索引视图iv_city与反向联接操作组合(如图10所示)使得可以基于包含在个人的pcol UDT字段值的地址结合中个人地址值的城市,对“person”表行进行快速关联查找。
对于给出的示例数据,对左方的索引扫描将仅识别iv_city的一行(上述示出iv_city的内容的表2中的最后一个)。Iv_city的这行与人员Bob的行联接。Bob的“person”表行接着将传递上述半联接操作符。在图10中,“nest-loopright semi-join“操作用作反向联接操作。接着会投影pid和pcol.name字段,又得出一行。没有重复,因此排序和重复消除不会改变它们的输入流。最终的结果在表3中示出:
表3
更特别地,关于来自索引视图的反向联接,假设索引视图V是N个基表(T1..TN)的函数。此外,假设V被构建成只使用选择、投影、联接、分组和集合操作。每个表T1...TN具有一个或多个在表的元数据中确定的关键字。关键字是表的一列或多列的集合,使得集合中的值唯一地识别表中的行。
假设匹配针对T1...TN定义的查询Q的行集合可以只用V中的行来识别。(Q可以是较大查询的一部分。不失一般性地,考虑Q是自立的查询。)即使Q的结果的行可以通过参考V来识别,这不意味着从Q得出的行可以整个从V构建。情况可以是期望应该出现在Q的结果中一些列值出现在T1...TN的之一中。
从索引视图V到在其上定义视图的基表T(T1...TN的之一)的反向联接被定义为在V和T之间对T的任何关键字和来自T的那个关键字的V中的字段的等价联接。反向联接在其上执行的关键字可以是但不限于单列或多列主关键字或单列或多列候选关键字。关键字可以或可以不具有索引。如果关键字不具有索引,那么索引可以或可以不被聚类。虽然这里将反向联接描述成在基表的聚类关键字上执行,本发明包含了对任何类型的关键字做反向联接的能力。
作为反向联接的一个例子,考虑使用下述SQL语句来定义表:
Create table emp(eno int,name varchar(30),salary money)
定义基表“emp”将使用对eno排序的经聚类的访问路径来存储,如下:
Create unique clustered index eno_idx on emp(eno)
Eno是emp的关键字。现在,考虑索引视图定义如下:
Create view highpaid with schemabinding as
Select eno,salary
From dbo.emp e
Where salary>200000.00
Create unique clustered index on highpaid(eno)
现在,考虑以下查询:
Select eno,name,salary from emp where salary>300000.00
作为如何使用索引视图“highpaid”与反向联接来解决这个查询的例子,图11中所示的访问计划将提供对查询的示例性回答。如图11中所示,从索引视图“highpaid”选出的行对于关键词eno被“反向联接”到基表“emp”,其中使用“nested-loop-join”操作作为反向联接操作。因此术语“反向联接”被用于描述对一关键字从索引视图反向到基表的联接。
预期的是任何类型的联接算法可以与反向联接一起使用(例如,nested-loop、sort-merge、hash)。
图12是在具有嵌套数据的基表中查询数据的示例性方法的流程图。在步骤600处,接收到查询。在步骤610处,基表中数据的索引视图被接收、检索或否则被生成。在步骤620处,查询优化程序确定查询是否匹配或包含匹配索引视图的查询模式。在步骤630处,如果查询或其部分匹配索引视图,那么查询优化程序生成一计划:使用匹配索引视图作为索引而非执行该函数应用。在步骤640处,如果索引视图不能传递原始查询中所请求的所有列,那么优化程序引入与原始基表的反向联接以经由聚类关键字获取丢失的列。这允许索引视图中没有的基表的字段被包含在查询结果中。
在步骤650处,如果查询或其部分不匹配任一索引视图,那么查询优化程序生成一计划:对数据应用原始函数。
本发明也允许将索引视图作为部分索引的推广,以及将索引视图作为对类型层次的部分索引。通过将索引视图与从索引视图到基表反向联接的能力相结合,本发明提供了被称为部分索引技术的推广。索引视图加反向联接能力提供了比部分索引更为有力的能力集合。
为了创建表的各行的仅一子集的索引,在索引视图定义(例如在Where短语中)中提供了适合的条件。例如,为了创建加速查找个人“Fred”的视图,定义了以下索引视图:
Create View v_fred with schemabinding as
Select pid,htid
From person
Where pcol.name=‘Fred’
Create unique clustered index i_v_fred on v_fred(htid,pid)
给出对基表的聚类关键字作反向联接的能力,以及现有查询匹配索引视图的能力,这个索引视图可以帮助回答诸如“Select*from person where pcol.name=‘Fred’”等查询。可以通过读出索引视图中的一行和将其反向联接到个人表中来解决这个查询。
此外,索引视图加上反向联接到基表的能力也可以在对象关系DVMS(数据库管理***)中支持索引一组用户定义类型(也被称为UDT或对象)。如果类型以推广的层次排列(也被称为类型层次或IS-A层次),那么可能使用索引视图加上到一表中的索引值的反向联接的能力,所述表的类型具有给定类型或其子类型之一。
为了对子类型的字段索引,其中对类型过滤的部分索引不需要或不是期望的,可以实现对经计算的列的常规索引。所期望的经计算的列的值对于没有索引的字段的类型为NULL。索引可以被聚类或不聚类。例如,为了对个人工资建立聚类索引,其中非雇员的工资字段为NULL:
Alter table person add salary as(treat pcol as employee_t).salary
Create clustered index i_sal on person(salary)
为了为给定UDT列对类型层次的子集索引(例如因为只有那个子集中的值具有期望被索引的特定属性),于是在视图定义的Where短语中的IS OF判定来创建部分索引。例如,为了对雇员工资创建索引,所述索引不包括对不是雇员的个人的索引中的记录:
Create view v-emp_sal2 with schemabinding as
Select(treat pcol as employee_t).salary salary,htid,pid
From person
Where pcol is of(employee_t)
Create unique clustered index i_emp_sal2 on v_emp_sal2(salary,htid,pid)
这个示例性索引视图对非雇员工资没有NULL条目。非雇员不被索引,因为它们更适合被视图的Where短语中的IS OF条件过滤掉。
XML字段的索引
本发明的各方面可以被用于对XML值数据字段索引。相对于存储在数据库的表中的关系型数据,XML是半结构化的:数据不是依附于先验宣称的模式,而是用表示模式信息的标签注释。为了索引和处理常规数据库***中的XML数据,它必须被分成表格式。以下例子示出了XML分段,且图4中示出了一个可能的相应表格式。
<person>
<name>Jim Smith</name>
<phones>
<home>425-601-9229</home>
<cell>425-799-1532</eell>
</phones>
…
</person>
TAG |
VALUE |
HIERARCHICALINFORMATION |
Person | |
1 |
name |
Jim Smith |
1.1 |
phones | |
1.2 |
home |
425-601-9229 |
1.2.1 |
表4
可能有各种不同的将XML分成表的格式的方式,本发明不限于使用特定的一个。然而,可以使用任何给出一XML分段输出表值格式的函数,例如这里被称为XMLTransform。
函数XMLTransform是上述的表值函数。本发明允许对在XML分段上对XMLTransform的调用的结果索引。例如,用户可能希望对TAG,VALUE和HIERARCHICAL INFORMATION列或它们的组合建立索引。
用户可以查询XML分段的一个可能的方式如下写出:
Select Value
From‘<xml...>’xmlstring cross apply XMLTransform(xmlstring)
Where Tag=‘name’and Value=‘Sam Jones’
其中‘<xml...>’表示对任一给定的XML分段。查询可以搜索XML分段以找到具有值‘Sam Jones’标记‘name’的元素。
此外,XML分段可以以数据库表中XML数据类型字段的形式提供,而非以XML文本串给出。使用XML从XML数据类型列查询的例子可以如下写出:
Select Value
From sales cross apply XMLTransform(sales.salesperson)
Where(Tag=‘cell’or Tag=‘home’)and Value like‘425%’
And sales.date=‘02/28/2004’
这假设在表sales中有列salesperson,所述表sales是类型XML分段,即sales中的每行包含被称为salesperson的XML分段。上述查询将查询sales表与查询XML分段相结合;它返回在02/28/2004结束一交易的销售人员的电话号码。
多列或字段变换
另一个示例性实施例允许对多列和/或复杂结构的多字段的索引。一般地,数据库***中的索引结构可以从复杂结构中的单列或位置索引数据。例如,关于表2所描述的例子描述了在嵌套集合中索引Address字段的机制。本发明的各方面也可以被用于对从复杂对象或一行中的多个字段导出的数据索引。
tbl_peopleaddresses |
City |
State |
ID |
Name |
|
Bellevue |
WA |
1 |
George |
|
West Lake |
WA |
2 |
Sara |
|
Berkeley |
CA |
3 |
Bob |
|
Corvallis |
OR |
4 |
Jeff |
表5
表5中的示例索引视图描述了人员和他们住处的表。对数据的函数调用可以返回如表6所示的数据。
iv_peopleaddresses |
City |
ID |
(additionalcolumn(s)) |
|
Bellevue |
1 |
… |
|
West Lake |
2 |
… |
|
Berkeley |
3 |
… |
|
Corvallis |
4 |
… |
|
WA |
1 |
… |
|
WA |
2 |
… |
|
Washington |
1 |
… |
|
Washington |
2 |
… |
|
CA |
3 |
… |
|
California |
3 |
… |
|
OR |
4 |
… |
|
Oregon |
4 |
… |
|
George |
1 |
… |
|
Sara |
2 |
… |
|
Bob |
3 |
… |
|
Jeff |
4 |
… |
|
West |
2 |
… |
|
Lake |
2 |
… |
表6
表6描述了对来自表5的数据不同种类的索引视图的结果。在这个例子中,来自表5的多列在索引视图中被一起索引。虽然这个例子使用多列,也可能使用来自诸如UDT等复杂对象的多个字段或它们两者的组合。此外,这个变换可以包含应用到数据中各列或各字段的特殊逻辑。在这个例子中,每个状态的缩写是目标变换和原始源数据的一部分。然而,每个状态的全名被作为函数调用的部分生成并且也被***到结果中。许多变换是可能的并且不限于引入对于单值的附加映射。可能的映射可以包含但不限于获取列中数据的子字符串、将来自多列或多字段的数据以相同的方式组合或从单列或字段将多个单词分成多行。表6也包含一例子,其中来自单字段的多个单词以多行的方式返回。表中附加的列可以用于包含定位符列,它使得能够反向联接或引入列以保证函数调用结果的唯一性。
这个示例性变换允许对复杂变换的结果索引。它也使得对某些查询类更为有效地查询数据。一个这样的查询可以写出如下:
Select*from tbl_peopleaddresses where SOMECOLUMNCONTAINS(‘Lake’)
or SOMECOLUMNCONTAINS(‘California’);
在这个查询中,所期望的结果是发现与单词‘Lake’或单词‘California’有些关联的人。这个关联可以是与表中的任何列的准确列匹配,或者它可以是附加、潜在的对表中的数据用户定义逻辑的结果。在这个例子中,‘Lake’是与包含‘Sara’的记录相关联的一个字段的第二个单词,而‘California’与包含‘Bob’的记录相关。这个逻辑被封装在函数‘SOMECOLUMNCONTAINS’中,但它可以用在任何搜索情况中。例如,可以使用SQL函数‘LIKE’来应用相同的逻辑,虽然其它函数可以以相似的方式使用本发明。
查询处理器可以对这个函数调用结果使用索引视图以有效地解决包含LIKE或SOMECOLUMNCONTAINS的查询。所期望的是这个逻辑只需要使用匹配逻辑来有效地发现包含对数据的这个特定函数调用结果的索引视图。
结论
这里所描述的各种***、方法和技术可以用硬件、软件或适当时用它们的组合来实现。因此,本发明的方法和装置或某些方面或其部分可以用有形介质体现的程序代码(即指令),所述有形介质诸如软盘、CD-ROM、硬盘或任何其它的机器可读存储介质,其中当程序代码被载入并且被机器(诸如计算机)执行,机器成为了实现本发明的装置。在可编程计算机上执行程序代码的情况下,计算机一般包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备和至少一个输出设备。一个或多个程序更适宜以高级过程或面向对对象的编程语言实现以与计算机***通信。然而,如果期望,程序可以以汇编或机器语言来实现。在任一情况下,语言可以是编译或解释语言并且与硬件实现相结合。
本发明的方法和装置也可以以在某些传输介质上发送的程序代码的形式体现,诸如在电线或电缆上,通过光纤或经由任何其它形式的传输,其中当接收到程序代码,将其载入到机器并由机器执行程序代码时,诸如EPPOM、门阵列、可编程逻辑器件(PLD)、客户端计算机、视频录像机等等,机器成为实现本发明的装置。当在通用处理器上实现时,程序代码与处理器相结合以提供用于执行本发明的索引功能的唯一装置。
虽然结合各种附图的优选实施例描述了本发明,应该理解可以使用其它类似的实施例,或者可以对所描述的实施例作出修改和增加以执行本发明相同的功能而不背离本发明。例如,虽然本发明的示例性实施例在数字设备仿真个人计算机功能的环境中描述,本发明的技术人员会认识到本发明不限于这种数字设备,如本应用中所描述的可以应用到任何数量的现有或新兴计算设备活环境中,诸如游戏控制台、手持式计算机、便携式计算机等等,无论有线或无线,并且可以应用到经由通信网络连接或通过网络交互的任何数量的这种计算设备。此外,应该强调的是这里期望各种计算机平台,包括手持设备操作***和其他应用程序特定操作***,尤其是随着无线网络设备的数目不断增长。因此,本发明不应被限于任何单一的实施例,而应该按照符合所附权利要求的最广宽度和范围来构造。