具体实施方式
本发明主题用符合法定要求的特征进行描述。然而,说明书本身并非旨在限制本专利的范围。相反,发明者预期所揭示主题也可结合其它现有或将来的技术以其它方式体现,包括与本文档所述步骤不同的步骤或者类似步骤的组合。此外,尽管术语“步骤”可在此使用以隐含所采用方法的不同元素,该术语仍不应被解释为暗示在此揭示的各个步骤之间的任何特定顺序,除非明确地描述了各个步骤的顺序。
纵览
本发明涉及基于对象类型的有效分层结构搜索。通过预先计算附加特定信息并将其存储在快速查找结构中,就可能快速标识满足对象检索请求的对象。此外,也可能使用这些技术来避免存储中特定操作的昂贵的对象水合。此外,可能以新的方式发挥数据库统计结构的作用,从而无需检查每个对象就能估算出合格对象的数量。
本发明提供对表格中特定类型的值,或其类型在以类型分层结构中给定类型为根的树中的值的快速检索。B-树索引具有找到一特定位置并检索具有一值(例如路径类型)的对象或一系列具有相同值的对象的能力。此外,还可能根据对象值的前缀寻找并返回都包含同一前缀的值的范围。这些属性可发挥作用来基于类型或类型分层结构作有效检索。
WinFS是在文件系统中引入对象概念的文件系统/数据存储。在该存储中的操作之一是能够基于其类型有效查找和查询对象。本发明描述如何才能非常有效地执行该操作。
本发明提供一内建功能的界面,该功能用于提供UDT分层结构类型id。分层结构类型id是在类型分层结构中唯一标识UDT类型表达式的可变二进制(varbinary)值。通过在查询中和在创建适当的已计算的列索引中使用该功能,来支持有效的UDT类型分层结构。
示例性计算环境
当在此和在权利要求书中使用时,以下术语具有以下含义:
“对象”是硬件/软件接口系统可访问的可存储信息单元,它具有在由硬件/软件接口系统外壳展现给终端用户的所有对象上共同支持的一个基本属性集。对象还具有所有类型上共同支持的包括允许引入新属性和关系的特征的属性和关系。
“操作系统”(OS)是作为应用程序和计算机硬件之间中间体的特定程序。在大多数情形中,操作系统包括外壳和内核。
“硬件/软件接口系统”是软件、或硬件和软件的组合,用作计算机系统的下层硬件组件和在该计算机系统上执行的应用程序之间的接口。硬件/软件接口系统通常包括(以及在某些实施例中仅包括)操作系统。硬件/软件接口系统还可包括虚拟机器管理器(VMM)、公共语言运行时(CLR)或其功能等效实体、Java虚拟机器或其功能对象实体、或者其它这样的替换或添加在计算机系统操作系统之上的软件组件。硬件/软件接口系统的目的是提供用户可执行应用程序的环境。任意硬件/软件接口系统的目标是使计算机系统能以有效方式使用以及利用计算机硬件。
本发明的众多实施例可在计算机上执行。图1和以下讨论旨在提供一种本发明可在其中实现的适当计算环境的简要一般说明。尽管不是必需的,本发明将在由诸如客户机工作站或服务器的计算机执行的诸如程序模块的计算机可执行指令的一般环境中进行说明。通常,程序模块包括执行特定任务或实现具体抽象数据类型的例程、程序、对象、组件、数据结构等等。此外,本领域技术人员将理解,本发明可在其它计算机系统配置中实践,包括手持式装置、多处理器系统、基于微处理器的或可编程的电器消费品、网络PC、小型计算机、大型计算机等等。本发明还可在任务由经通信网络链接的远程处理装置执行的分布式计算环境中实践。在分布式计算环境中,程序模块可被置于本地和远程存储器存储设备中。
如图1所示,示例性通用计算系统具有常规个人计算机20等,包括处理单元21、系统存储器22以及把包括系统存储器的各种系统组件耦合到处理单元21的系统总线23。系统总线23可能是若干总线结构类型中的任何一种,包括存储器总线或存储器控制器、外围总线、以及使用多种总线架构的任一种的局部总线。系统存储器包括只读存储器(ROM)24和随机存储器(RAM)25。含有帮助如启动期间在个人计算机20中元件之间信息交换的基本例程的基本输入/输出系统(BIOS)26被存储在ROM 24中。
个人计算机20还包括读取和写入硬盘(未示出)的硬盘驱动器27、读取或写入可移动磁盘29的磁盘驱动器28、以及读取或写入诸如CD ROM或其它光学介质等可移动光盘31的光盘驱动器30。硬盘驱动器27、磁盘驱动器28和光盘驱动器30分别通过硬盘驱动器接口32、磁盘驱动器接口33和光盘驱动器接口34连接至系统总线23。诸驱动器及其相关联计算机可读介质为计算机20提供计算机可执行指令、数据结构、程序模块和其它数据的非易失性储存。
尽管在此所述示例性环境采用了硬盘、可移动磁盘29和可移动光盘31,但本领域技术人员应理解也可在示例性操作环境中使用其它类型计算机可访问的能够存储数据的计算机可读介质,诸如磁盒、闪存卡、数字视频盘、Bernoulli卡、随机存取存储器(RAM)、只读存储器(ROM)等等。
包括操作系统35、一个或多个应用程序36、其它程序模块37和程序数据38的众多程序模块,可存储在硬盘、磁盘29、光盘31、ROM 24或RAM 25中。用户可通过诸如键盘40和定点装置42的输入装置把指令和信息输入个人计算机20。其它输入装置(未示出)可包括诸如话筒、游戏杆、游戏垫、卫星接收器、扫描仪等等。这些和其它输入装置常常通过与系统总线相耦合的串行端口接口46连接到处理单元21,但是它也可通过其它接口相连,如并行端口、游戏端口或通用串行总线(USB)。监视器47或其它类型的显示装置也通过诸如视频适配器48的接口和系统总线23相连。除了显示器47,个人计算机通常包括其它外围输出装置(未示出),如扬声器和打印机。图1的示例性系统还包括主机适配器55、小型计算机系统接口(SCSI)总线56、以及与SCSI总线56相连的外部存储装置62。
个人计算机20可以在使用与一台或多台远程计算机,诸如远程计算机49的逻辑连接的网络化环境中运行。远程计算机49可以是另一台个人计算机、服务器、路由器、网络PC、对等装置或其它公共网络节点,而且通常包括上述与个人计算机20相关的许多或全部元件,尽管在图1中仅显示了存储器存储装置50。图1中所描绘的逻辑连接包括局域网(LAN)51和广域网(WAN)52。这样的网络化环境在办公室、企业范围计算机网络、企业内联网和因特网上是常见的。
当用于LAN网络环境中时,个人计算机20通过网络接口或适配器53与LAN51连接。当用于WAN网络环境中时,个人计算机20通常包括调制解调器54或其它用于在诸如因特网的广域网52上建立通信的装置。可以是内置式或外置式的调制解调器54,与系统总线23通过串行端口接口46相连接。在网络化环境中,所述与个人计算机20相关的程序模块或其一部分,可以存储在远程存储器存储装置中。可以理解,所示网络连接是示例性的,也可以使用其它在计算机之间建立通信连接的装置。
尽管可以想像本发明的众多实施例特别适合于计算机化系统,但本文档中没有任何描述旨在将本发明限制在这些实施例中。相反,在此使用的术语“计算机系统”旨在包括任意和所有包括按钮、或者能够确定按钮按压或按钮按压的等效动作的装置,无论这种装置是电子、机械、逻辑的,还是实际上是虚拟的。
如图2框图所示,计算机系统200可被粗略划分成3个组件组:硬件组件202、操作系统组件204、以及应用程序组件206。
再参照图1,在某些计算机系统200中,硬件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等等),文件是由操作系统操纵的可存储信息的基本单元(例如数据、程序等),且文件组通常被组织于“文件夹”中。在微软Windows、Mac OS、以及其它操作系统中,文件夹是可作为单个信息单元被检索、移动、以及用其它方式操纵的文件集合。在某些其它操作系统中,诸如DOS、z/OS以及大多数基于Unix的操作系统中,使用的是术语“目录”而不是文件夹,且早期的Apple计算机系统(例如AppleIIe)使用术语“名录”(catalog);然而,在此使用的所有这些术语都被认为是同义的和可互换的,并旨在进一步包括所有用于分层信息存储结构的其它等效术语和引用。
如本领域技术人员所众所周知和理解的,目录(即文件夹目录)是基于树的分层结构,其中文件基于在包括树结构的节点的文件夹中的位置进行分组。例如,如图3所示,基于DOS的文件系统基本文件夹(或“根目录”)302可包括多个文件夹304,每个又可包括其它文件夹(作为该特定文件夹的“子文件夹”)306,而每个306又可包括其它文件夹308以至无限。每个这些文件夹具有一个或多个文件310,尽管在硬件/软件接口系统层上,文件夹中的单个文件除了它们在树分层结构中的位置外并没有什么相同。这种将文件组织到文件夹分层结构的方法间接地反映了用于存储这些文件的典型存储介质的物理组织(例如硬盘、软盘、CD-ROM等),并不令人惊讶。
除此之外,每个文件夹都是其子文件夹及其文件的容器-即每个文件夹都拥有其子文件夹和文件。例如,当文件夹被操作系统删除时,也删除了该文件夹的子文件夹和文件(在每个子文件夹情形中还递归地包括它自己的子文件夹和文件)。类似地,通常每个文件都仅归一个文件夹所有,即使可复制文件且该副本位于不同文件夹中,文件副本本身仍是与原始文件无直接联系的不同的独立单元(例如在操作系统层上对原始文件的改动不会被映射到副本文件中去)。在这点上,文件夹和文件实际上因此在特征上是“物理的”,因为文件夹是物理容器概念的等效实体,而文件是容器内离散而独立的物理单元概念的等效实体。
可用于本发明的用于组织、搜索、以及共享数据的存储平台被设计成包括称为对象的数据形式的所有数据类型的存储器。参见图4,根据本发明的存储平台400包括在数据库引擎414上实现的数据存储器402。在一实施例中,该数据库引擎包括带有对象关系扩展的关系数据库引擎。在一实施例中,关系数据库引擎414包括微软SQL服务器关系数据库引擎。
数据存储器402实现一数据模型404,它支持数据的组织、搜索、共享、同步、以及安全。特定数据类型在诸如模式440的模式中描述,并且存储平台400提供用于使用这些模式以及扩展这些模式的工具446,以下进行更全面描述。
在数据存储器402中实现的改变跟踪机制406提供跟踪数据存储器改变的能力。数据存储器402还提供安全能力408和升级/降级能力410。数据存储器402还提供一组应用编程接口412以向利用该存储平台的其它存储平台组件和应用程序(例如应用程序450a、450b和450c)展现数据存储器402的能力。
本发明的存储平台还包括应用编程接口(API)422,它使诸如应用程序450a、450b和450c的应用程序能够访问该存储平台的所有前述能力,并能够访问模式中所述数据。存储平台API 422可由应用程序以及与其它API的组合中使用,诸如OLE DB API 424和微软Windows Win32 API 426。
本发明的存储平台400还向应用程序提供各种服务428,包括便于用户或系统之间数据共享的同步服务430。例如,同步服务430可使得能够具有与数据存储器402相同格式的其它数据存储器430的互操作性,以及对具有其它格式的数据存储器442的访问。存储平台400还提供允许数据存储器402有与诸如Windows NTFS文件系统418的现有文件系统的互操作性的文件系统能力。
在至少某些实施例中,存储平台402还可提供具有其它能力的应用程序,这些能力用于启用数据操作并启用与其它系统的交互。这些能力可用诸如信息代理服务434和通知服务432的附加服务428的形式,以及其它实用程序436的形式体现。
在至少某些实施例中,存储平台被包括在计算机系统的硬件/软件接口系统中,或形成其一构成部分。作为示例,并非限制,本发明的存储平台可被包括在操作系统、虚拟机管理器(VMM)、公共语言运行时(CLR)或其功能等效组件、或者Java虚拟机或其功能等效组件中,或形成其一构成部分。
通过其公共存储基础以及经模式化的数据,本发明的存储平台为消费者、技术工人以及企业使得能够更有效地进行应用程序开发。它提供一个丰富并可扩展的编程表面区,不仅使这些在其数据模型中固有的能力可用,而且还包括并扩展了现有文件系统和数据库访问方法。
在本说明书及各附图中,本发明的存储平台400可称为“WinFS”。然而,使用该名字来代表存储平台完全是为了方便描述而不是旨在以任何方式进行限制。
本发明的存储平台400的数据存储器402实现了一数据模型,它支持驻留于存储器中数据的组织、搜索、共享、同步以及安全。在本发明的数据模型中,对象是存储信息的基本单元。该数据模型提供一种机制,用于声明对象和对象扩展,并用于建立对象之间的关系,以及用于组织和分类对象,如下进行更全面描述。
该数据模型允许定义类型之间子类-父类关系。子类-父类关系被这样定义:如果类型A是类型B的基类,则必然B的每个实例也是A的实例。另一种表达方式是遵从B的每个实例必然也遵从A。如果,例如A具有类型为字符串的属性名字,而B具有类型为16位整数的属性年龄,则可理解为B的任一实例必然具有名字和年龄。类型分层结构可视为以单个父类为根的树。根的分支提供第一层的子类,该层的分支提供第二层的子类等等直到本身不具有任何子类的叶端子类。该树不限于统一深度,但不能包含任何循环。一给定类型可具有零个或多个子类以及零个或一个父类。给定实例可遵从最多一个类以及该类的父类。换言之,对于树上任意层的给定实例,该实例可遵从该层上至多一个子类。
在一实施例中包括微软SQL服务器引擎的关系数据库引擎414,支持内建标量类型。内建标量类型是“固有”并“简单”的。因为用户不能定义自己的类型所以它们是固有的,而因为它们不能封装复杂结构所以它们是简单的。用户定义类型(“UDT”)通过使用户能定义复杂的结构化类型而扩展类型系统来提供固有标量类型系统之上和之外的类型可扩展性的机制。一旦由用户定义了,就可在使用内容标量类型的类型系统中的任何地方使用UDT。
该存储平台模式被映射到数据库引擎存储中的UDT类。数据存储对象被映射到从Base.Item例行得出的UDT类。扩展还被映射到UDT类并使用分层结构。根据扩展例行是Base.Extension,所有的扩展类型由此导出。
UDT是一个CLR类-它具有状态(即数据字段)和行为(即例程)。使用任一种管理语言来定义UDT-C#、VB.NET等等。UDT方法和操作符可依靠该类的实例用T-SQL调用。UDT可以是例如一行中列的类型、T-SQL中例程的参数类型、或者T-SQL中的变量类型。
以下实例示出UDT的基础。假设MapLib.dll有称为MapLib的汇编。在此汇编中,有在名字空间BaseTypes之下称为Point的类。
namespace BaseTypes
{
public class Point
{
//returns the distance from the specified point.
public double Distance(Point p)
{
//return the distance between Point p and this Point
}
//other stuff in the class
}
}
以下的T-SQL代码将类Point绑定到称为Point的SQL服务器UDT。第一步调用将MapLib汇编载入数据库的“CreateAssembly”。第二步调用“CreateType”以创建用户定义类“Point”并将其绑定到受管理类BaseTypes.Point:
CREATE ASSEMBLY MapLib
FROM‘\\mysrv\share/MapLib.dll’
go
CREATE TYPE Point
EXTERNAL NAME‘BaseTypes.Point’
go
一旦已创建,“Point”UDT就可被用作表格中的列,且可在T-SQL中调用方法,如下所示:
Create table Cities(
Name varchar(20),
State varchar(20),
Location Point)
--Retrieve the Distance of the cities
--from co-ordinates(32,23)
Declare@p point(32,23),@distance float
Select Location∷Distance(@p)
From Cities
存储平台模式到UDT类的映射在高层次上是相当直接的。一般而言,存储平台模式被映射到CLR名字空间。存储平台类型被映射到CLR类。CLR类继承映射镜像存储平台类型继承,而存储平台属性被映射到CLR类属性。
示例性实施例
典型的数据存储包括一个基本对象的表格,其中每一个都具有诸如UDT的类型。可向类型添加行为(也称为方法)。部分较新的数据存储提供继承,其中类型可用其它方法扩展以创建新的类型。例如,类型可以是诸如“.doc”或“.jpeg”的扩展。这些类型的继承扩展可以是例如“.doc2”或“.jpeg2”。本发明允许在类型上的查询(即不仅是对“.doc”而且是对“.doc”扩展的查询)。
类型的示例性继承分层结构如图5所示。在图5中,类型是“文档”500。“法律文档”510和“再审文档”530被示为是“文档”500的子类。“法律文档”510的子类是“华盛顿法律文档”520。查询可在类型(例如“文档”)和/或子类(例如“文档”和/或“法律文档”和/或“华盛顿法律文档”)上执行。
常规的搜索技术将使用带有列的表格,其中各列之一为相应对象列中每个对象的类型列。为了执行搜索,搜索引擎会遍历每一行、通过将其载入存储器来例示每个对象、以及检查该类型以确定是否有匹配。该技术非常缓慢,且没有办法确定最佳执行计划以使搜索有效。
较新的搜索技术具有经计算的各列,其中在表格中提供一具有基于其它相关联列而预先计算的值的附加列。该技术加快了搜索,但需要附加存储器来存储附加的经计算列。可提供是类型或UDT函数的称为“类型路径”的特定经计算列。这可被用以搜索任一类型或子类。
本发明的另一方面是基于类型来有效搜索一系列对象实例的能力。值是预先计算的,并需要存储足够的信息以基于其类型来区分对象实例。该值包含足够的信息以支持特定类型或类型分层结构中所有类型(都共享同一祖先)的有效搜索。此外,该值可在诸如B-树的快速访问结构或其它索引结构中使用,以基于类型或基于类型分层结构来搜索对象。
对于该系统中的每个类型,需要赋予其一个值。该值必须至少在类型分层结构的每个“层”(距根同一深度)上唯一。对于每个类型,每个父类的类型值被加到所有先前前缀操作的结果或如果未执行前缀操作的原始类型之前作前缀。同一层次上的全部元素应以相同存储格式(长度)进行存储。
当表示类型实例时,如上所述地确定值,且该值与对象一起存储。当将其存储在数据库中时,对象和预先计算值可存储在同一表格或其它存储结构的不同列中,如表格1所示。表格1是示出示例性ID及其相应文档类型的数据类型表格例子。
ID |
文档类型 |
1 |
文档实例 |
1.2 |
法律文档实例 |
1.3 |
再审文档实例 |
1.2.4 |
华盛顿法律文档实例 |
表格1
因而,给予每个类型一数字或其它标识符,如图6的经标注类型分层结构所示。如图6所示,“文档”类型被给予标识符ID=1,“法律文档”类型被给予标识符ID=2,“再审文档”类型被给予标识符ID=3,“华盛顿法律文档”类型被给予标识符ID=4。每次创建一个对象实例,可将适当的标识符附加到类型上。因此,例如“文档”会用类型路径“1”编码,“法律文档”会用“1.2”编码,而“华盛顿法律文档”会用“1.2.4”编码,如表1所示。
以下的表格2示出了存储对象名字、UDT、以及类型路径的另一示例性存储表格。每次创建一个对象实例,可将适当的标识符附加到类型上。因此,例如“文档”会用类型路径“1”编码,“法律文档”会用“1.2”编码,而“华盛顿法律文档”会用“1.2.4”编码,如表2所示。
列1-对象名字 |
UDT |
类型路径 |
Doc1 |
文档 |
1 |
Doc2 |
法律文档 |
1.2 |
Doc3 |
再审文档 |
1.3 |
Doc4 |
华盛顿法律文档 |
1.2.4 |
表格2
诸如B-树索引的快速访问存储结构可在包含预先计算值的列上创建。该索引结构期望具有有效找到包含给定值或给定值的前缀的项的能力。尽管寻找一特定值是通用的,但前缀操作通常仍仅用以寻找字符串值,诸如SQL中的LIKE‘PREFIX%’结构。该LIKE结构可使用搜索索引结构中前缀的操作来有效地计算。
可使用这样的操作来搜索被编码的分层结构的类型和子类。例如,指令“LIKE‘1.2%’”将找出任意具有以“1.2”开始的编码的对象(假设‘%’是通配符)。因而在本示例中,该示例性指令将搜索并返回“法律文档”类型和“华盛顿法律文档”类型的所有对象。
需要搜索特定类型或类型分层结构的操作可在索引上操作以识别特定类型的所有对象或源自特定类型的所有对象。索引结构上的相等匹配用于前者,而前缀匹配满足后者。该编码使得能够基于类型或类型分层结构位置的对象进行快速查找。数据库系统中的B-树通常支持这两种操作(以用于满足LIKE‘aaa%’查询的前缀能力)。
根据本发明诸方面,可有效检索数据表格的行。类型路径列上的索引可以B-树形式创建。例如,所有标识类型路径“1.2”的行都被存储在叶节点中。这些叶节点都对应于具有行的表格。当响应于例如“seek”命令沿B-树而下时可作比较。预期可使用“seek”操作来根据特定值以及特定前缀进行搜索。
可以预期可使用存储器内结构而不是数据库结构。可创建逆向索引并可使用前缀操作。此外,对每个分层结构层次可使用长度可变的编码。此外,可使用带有相同属性的一些非数字表示。
使用类型可替换性,可存储所有类型的对象,并可使用“IS OF(Type)”操作符由对象类型和子类过滤搜索。根据本发明诸方面,诸如“IS OF”的操作谓词可被映射到类型路径列中。可使用诸如“IS OF ONLY”的其它操作谓词。因而,可避免昂贵的对象水合或例示。
可使用基于类型分层结构而预先计算的值来避免水合对象以确定其类型。假设对象水合/例示是昂贵的,而按类型查询是一般的,则需要避免不符合类型限定的类型例示。如果类型以避免对象例示并仍使能全保真过滤的方法进行编码,则可改进性能。
此外,可能截取用户的类型检查请求并在内部重写它们以根据预先计算的值来执行等效操作。对存在预先计算值的所有对象可这样做。
对于在数据库系统中实现的基于类型的快速对象辨别的实施例,需要确定对象为给定类型或从该类型导出的任意类型的表格中的行数。用于解决该估算问题的常规技术包括推测、假设所有值是等概率的(即平直分布)、使用表格基数来创建估算、或使用直方图来跟踪较常出现的值和较少出现的值的范围。通常,直方图对确定有多少给定类型的值的存在是有用的。本发明的各方面估算这个直方图上的选择性。
可建立直方图来估算查询要花多长时间。直方图示出了每类对象的数量。示例性直方图如图7所示。其中,“文档”、“法律文档”、“再审文档”以及“华盛顿法律文档”类对象的示例性数量以直方图格式示出。然而,直方图并不提供类型分层结构。类型分层结构可由困难和昂贵的查找技术来确定。
本发明的诸方面涉及直方图的编码技术,使无需查找技术就可辨别类型分层结构。根据该编码技术,给予每个类型数字或其它标识符,如图6的经标注类型分层结构所示。因而,可产生一直方图,其中可使用该长度可变的编码方案来标识分层结构。例如,如图8所示以及每一个类型/子类的数字,可轻易地标识出1.2.4是1.2的子类,而1.2是1的子类。
图9示出了根据本发明产生选择性估算的示例性方法的流程图。为了估算一组对象上类型分层结构查询的选择性,需要在步骤900使用在此所述的编码,在步骤910将该编码结果存储为列,以及在步骤920在该列上创建直方图(单独在列上或者作为在列上创建索引的结果)。
然后,在步骤930,编码查询类型,描述要从类型或该类型的任意子类中检索哪些对象。对于直方图中的每个元素,在步骤940确定已编码的查询类型是否是直方图条目的前缀。如果是,则在步骤950与该直方图步骤相关联的元素数量被添加到来自直方图的其它“匹配元素”的数量中。如果它不是前缀,则在步骤960与该直方图步骤不关联的元素数量被添加到来自直方图的其它“非匹配元素”的数量中。
当处理了所有的直方图步骤时,在步骤990通过取“匹配元素”数量并除以“匹配元素”数量和“非匹配元素”数量之和来确定该分层结构的类型匹配查询的选择性估算。
因而,可能在这种二进制编码上使用直方图以确定类型分层结构中有关UDT分布的统计信息。通过在用该分层结构编码进行选择性估算期间遍历直方图,可产生相当精确的基数估算。注意,如果使用固有函数来估算所述每种算法的可选择性,应当有可能完全移除对IS OF的CLR调用而仅作固有函数上的基数估算。
根据本发明,实现了从UDT返回一类型-id的函数。另一函数则从类型-id返回分层结构的类型-id编码。诸如WinFS的存储系统最好在每个UDT-提供表格(例如对象表格)上创建一已计算列。在一实施例中,预期IS OF标量包含一附加/替换谓词。例如,可使用UDT valref来寻找包含该UDT的基表。然后可使用基表的已计算列来确定包括一标量表达式的已计算列的存在性。如果发现了这样的一个列,则可添加隐式谓词。
假设每个UDT类型都是一小(例如4字节)固定长度值。此外,分层结构的类型-id也可被定义为父类型-id串联到字符串或二进制字段。如果包含UDT的每一行还具有标识该分层结构编码的已计算列,则在该新列上可创建一索引。可使用范围前缀操作来实现返回给定类型分层结构中所有UDT的操作,并可使用类型-id上的精确匹配来解决非分层结构匹配。
示例性分层结构类型id可提供为以下函数:
函数 |
参数 |
结论 |
HIERARCHICAL_TYPE_ID |
(UDT_expression) |
包含沿从类型分层结构的根到最特别类型的UDT_expression的路径上类型的类型id串联的varchar值。该varchar值可包含非印刷字符。 |
UDT_expression可以是任意的用户定义类型值的表达式。HIERARCHICAL_TYPE_ID函数最好是确定并精确的。这提供了在使用分层结构类型id导出的已计算列上建立索引的能力。预期该已计算列不必是持续的。
要确定类型路径是否是另一路径的前缀,系统在内部使用利用现有的LIKE前缀扫描能力建立的HAS_PREFIX运算符。该前缀扫描能力被用来实现形式为“character_expression LIKE‘prefix_string%’”的条件匹配,其中prefix_string是某些不包含任意诸如%的通配符的恒定字符串。该HAS_PREFIX运算符最好不是用户可见的。如果索引可用,则HAS_PREFIX可使用一索引扫描。
分层结构类型id值最好较短以减少必须存储在索引中的数据量。对于WinFS模式中的类型,分层结构类型id最好小于100个字符。
给定一内部类型id而检索一分层结构类型id的函数最好比较快,因为它是在索引创建期间使用的。
当其实例仍然保留在数据库中(即如果在表格定义中使用仍然存在的它或其祖先)时,最好不要丢弃或以其它方式删除一类型。否则,包含被丢弃类型的分层结构类型id的索引条目可能保留在索引中,但将不可能解释它们。此外,在丢弃一类型后添加新类型可导致与现有实例相同的分层结构类型id,从而出现错误。
分层结构类型id的内部格式最好应是长度为4字节倍数的可变二进制值,包含沿从类型分层结构的根到最特别类型的UDT_expression的路径上类型的类型id(例如在内部存储为4字节整数)串联。
在带有其值为用户定义类型的属性的较大表格的情形中,最好是支持对其属性值具有特定类型或是给定类型的子类的行的快速检索。为了支持该情形中的快速搜索,可在使用HIERARCHICAL_TYPE_ID创建的已计算列上创建一索引。
假设UDT的类型分层结构如下:
CREATE TYPE person_t EXTERNAL NAME[asm]:[Person]
CREATE TYPE employee_t EXTERNAL NAME[asm]:[Employee]UNDER person_t
CREATE TYPE hourly_employee_t EXTERNAL NAME[asm]:[HourlyEmployee]
UNDER employee_t
CREATE TYPE salaried_employee_t EXTERNAL NAME[asm]:[SalariedEmployee]
UNDER employee_t
此外,有表格定义如下:
CREATE TABLE person(pcol person_t)
为了启用person行的快速查找而使用IS OF操作符在pcol类型上过滤,可如下添加在person表格的person.pcol的分层结构类型id上的已计算列和索引:
ALTER TABLE person ADD pcol_htid AS HIERARCHICAL_TYPE_ID(pcol)
CREATE INDEX person_htid_idx ON person(pcol_htid)
这将例如使用户在即使“person”表格很大时仍能快速找到有关计时雇员的所有信息。
如果对一给定类型所有值的快速检索有较高优先级,则可创建HIERARCHICAL_TYPE_ID上的CLUSTERED(聚类)索引。使索引CLUSTERED将分组相同类型的值、或在类型分层结构的同一子树中的值、在同一页面或盘上邻近页面上的值。
对于查询重写,预期包括通用语句,即通过HIERARCHICAL_TYPE_ID内部地实现IS OF谓词,以及从HIERARCHICAL_TYPE_ID导出的已计算列上的索引可有助于加速对使用IS OF操作符在类型上的查询。
系统在内部使用查询重写以处理被称为类型谓词的IS[NOT]OF谓词。类型谓词的所需格式定义如下:
Type_predicate∷=UDT_expression IS[NOT]OF(Type_list)
Type_list∷=user_defined_type_specification[,...n]
User_defined_type_specification∷=
Inclusive_UDT_specification|Exclusive_UDT_specification
Inclusive_UDT_specifcation∷=UDT_name
Exclusive_UDT_specification∷=ONLY UDT_name
形式为UDT_expression IS NOT OF(type_list)的表达式等于NOT(UDT_expression IS OF(type_list))。
形式为UDT_expression IS OF(type_list)的类型谓词被重写为UDT_expression是否与type_list中的条目相匹配的谓词测试的逻辑和。
要确定UDT_expression IS OF是否为Inclusive_UDT_specification的测试在重写查询中被表达为:
HIERARCHICAL_TYPE_ID(UDT_expression)HAS_PREFIX
<<constant hierarchical type id of UDT_name>>
在此,<<constant hierarchical type id of UDT_name>>是表示UDT_name的分层结构类型id的可变二进制常数。
要确定UDT_expression IS OF是否为Exclusive_UDT_specification的测试在重写查询中被表达为:
HIERARCHICAL_TYPE_ID(UDT_expression)=
<<constant hierarchical type id of UDT_name>>
应注意在以上重写条件中的HIERARCHICAL_TYPE_ID(UDT_expression)表达式将匹配从同一表达式上建立的已计算列上的索引,诸如person_htid_idx。
以下例子表示上述用于支持IS OF和IS OF(ONLY...)谓词重写规则的应用。
--寻找是任意类雇员的所有人
SELECT*FROM person WHERE pcol IS OF employee_t
--重写查询:
SELECT*FROM person
WHERE HIERARCHICAL_TYPE_ID(pcol)
HAS_PREFIX<<constant hierarchical type id of employee_t>>
--寻找所有是种类employee_t但不是其子类之一的人:
SELECT*FROM person WHERE pcol IS OF(ONLY employee_t)
--重写查询:
SELECT*FROM person
WHERE HIERARCHICAL_TYPE_ID(pcol)=<<constant hierarchical type id of employee_t>>
--寻找所有领薪雇员或计时雇员:
SELECT*FROM person WHERE pcol IS OF(hourly_employee_t,salaried_employee_t)
--重写查询:
SELECT*FROM person
WHERE
(HIERARCHICAL_TYPE_ID(pcol)
HAS_PREFIX<<constant hierarchical type id of hourly_employee_t>>
OR
HIERARCHICAL_TYPE_ID(pcol)
HAS_PREFIX<<constant hierarchical type id of salaried_employee_t>>)
预期可添加函数TYPE_ID()的过载版本以返回UDT表达式的内置类型id。
还预期可添加函数TYPE_NAME()的单个可变二进制分层结构类型id(htid)变量的过载版本以返回带有该htid的类型的字符串名。以下例子表示如何对表格的分层结构中每个不同类型的出现计数:
--计每种类型的人数:
SELECT TYPE_NAME(TYPE_ID(pcol)),TYPE_ID(pcol),count(*)
FROM person
GROUP BY TYPE_NAME(TYPE_ID(pcol)),TYPE_ID(pcol)
对分层结构类型id可提供压缩方案。这会减小从分层结构类型id的索引关键值大小。例如将它们编码为基-254整数(0-254字节为小数)并使用字节255为分隔符。则分层结构类型id将为以下形式:
<typeid><separator><typeid><separator>...<separator><typeid>在许多情形中,这将导致路径上每个typeid仅为2或3个字节而不是4个字节。
当类型谓词中的type_list具有一个以上条目时可将类型包容能力添加到查询重写中。例如,UDT_expression IS OF(person_t,employee_t)等于UDT_expression IS OF(person_t),因为employee_t是person_t的子类。
结论
在此描述的各种技术可结合硬件、软件、或适当时两者的组合实现。因而,本发明的各种方法和装置,或其中的某些方面或部分,可取包括在诸如软盘、CD-ROM、硬盘、或任何其它机器可读存储介质的有形介质中的程序代码(即指令)形式,其中当程序代码由诸如计算机的机器载入和执行时该机器成为实践本发明的装置。在程序代码在可编程计算机上执行的情形中,计算机一般将包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件)、至少一个输入装置以及至少一个输出装置。一个或多个程序最好用高级过程或面向对象的编程语言来实现,以与计算机系统通信。然而如果需要,程序也可以用汇编或机器语言实现。在任意情形中,语言可以是编译或解释语言,并与硬件实现相结合。
本发明的各方法和装置也可通过以程序代码形式体现的通信来实践,这些程序代码经诸如电线或电缆、光纤的某些传输介质或任意其它形式的传输来传送,其中当程序代码由诸如EPROM、门阵列、可编程逻辑装置(PLD)、客户计算机、录影机等的机器执行时,机器成为实践本发明的装置。当在通用处理器上实现时,程序代码结合处理器提供操作以调用本发明索引功能的唯一装置。
尽管本发明已结合各个附图的较佳实施例进行了描述,应该理解也可使用其它类似实施例,或者可对所述实施例作更改和添加用于执行本发明的相同功能而不背离本发明。例如,尽管本发明的示例性实施例在仿真个人计算机功能的数字装置的环境中描述,本发明技术人员将理解本发明并不限于本申请中所述的数字装置,而可应用于任意数量的现有或新兴的计算装置或环境,诸如有线或为无线的游戏控制台、手持式计算机、便携式计算机等,并可应用于任意数量的经通信网络连接或在网络上交互的计算装置。此外,应强调特别是随着无线网络装置的数量持续增长,可在此预期各种计算机平台,包括手持式装置操作系统和其它应用程序专用操作系统。因此,本发明不应限于任何单个实施例,而应根据所附权利要求书在幅度和范围中作解释。